From 78ad4f670bf84be5e43c351fcbe7b58342afd7e4 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 4 Dec 2019 21:08:09 +0800 Subject: [PATCH 01/43] Fix bug --- libs/events.js | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/events.js b/libs/events.js index 8fbbc4e9..061ba278 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1122,6 +1122,7 @@ events.prototype.__precompile_getArray = function () { } events.prototype.__precompile_text = function (text) { + if (typeof text != 'string') return text; return text.replace(/\${(.*?)}/g, function (word, value) { return "${" + core.replaceValue(value) + "}"; }); From 52b0617944ba3d534ce28a4f3e63c2635f9c927c Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 4 Dec 2019 23:17:17 +0800 Subject: [PATCH 02/43] norefresh --- _server/MotaAction.g4 | 12 ++++++------ libs/events.js | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index c309d06d..8ed4eadd 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -589,27 +589,27 @@ return code; */; setValue_s - : '数值操作' ':' '名称' idString_e '值' expression '刷新状态栏和显伤' Bool Newline + : '数值操作' ':' '名称' idString_e '值' expression '不刷新状态栏' Bool Newline /* setValue_s tooltip : setValue:设置勇士的某个属性、道具个数, 或某个变量/Flag的值 helpUrl : https://h5mota.com/games/template/_docs/#/event?id=setvalue%EF%BC%9A%E8%AE%BE%E7%BD%AE%E5%8B%87%E5%A3%AB%E7%9A%84%E6%9F%90%E4%B8%AA%E5%B1%9E%E6%80%A7%E3%80%81%E9%81%93%E5%85%B7%E4%B8%AA%E6%95%B0%EF%BC%8C%E6%88%96%E6%9F%90%E4%B8%AA%E5%8F%98%E9%87%8Fflag%E7%9A%84%E5%80%BC colour : this.dataColor -Bool_0 = Bool_0 ? ', "refresh": true' : ''; +Bool_0 = Bool_0 ? ', "norefresh": true' : ''; var code = '{"type": "setValue", "name": "'+idString_e_0+'", "value": "'+expression_0+'"' + Bool_0 + '},\n'; return code; */; addValue_s - : '数值增减' ':' '名称' idString_e '+=' expression '刷新状态栏和显伤' Bool Newline + : '数值增减' ':' '名称' idString_e '+=' expression '不刷新状态栏' Bool Newline /* addValue_s tooltip : addValue:增减勇士的某个属性、道具个数, 或某个变量/Flag的值 helpUrl : https://h5mota.com/games/template/_docs/#/event?id=addValue%ef%bc%9a%e5%a2%9e%e5%87%8f%e5%8b%87%e5%a3%ab%e7%9a%84%e6%9f%90%e4%b8%aa%e5%b1%9e%e6%80%a7%e3%80%81%e9%81%93%e5%85%b7%e4%b8%aa%e6%95%b0%ef%bc%8c%e6%88%96%e6%9f%90%e4%b8%aa%e5%8f%98%e9%87%8f%2fFlag%e7%9a%84%e5%80%bc colour : this.dataColor -Bool_0 = Bool_0 ? ', "refresh": true' : ''; +Bool_0 = Bool_0 ? ', "norefresh": true' : ''; var code = '{"type": "addValue", "name": "'+idString_e_0+'", "value": "'+expression_0+'"' + Bool_0 + '},\n'; return code; */; @@ -3398,7 +3398,7 @@ ActionParser.prototype.parseAction = function() { this.next = MotaActionBlocks['setValue_s'].xmlText([ this.tryToUseEvFlag_e('idString_e', [data.name]), MotaActionBlocks['evalString_e'].xmlText([data.value]), - data.refresh || false, + data.norefresh || false, this.next]); break; case "setValue2": @@ -3406,7 +3406,7 @@ ActionParser.prototype.parseAction = function() { this.next = MotaActionBlocks['addValue_s'].xmlText([ this.tryToUseEvFlag_e('idString_e', [data.name]), MotaActionBlocks['evalString_e'].xmlText([data.value]), - data.refresh || false, + data.norefresh || false, this.next]); break; case "setEnemy": diff --git a/libs/events.js b/libs/events.js index 061ba278..1dcc3ce0 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1582,7 +1582,7 @@ events.prototype._action_setVolume = function (data, x, y, prefix) { events.prototype._action_setValue = function (data, x, y, prefix) { this.setValue(data.name, data.value, prefix); - if (data.refresh) { + if (!data.norefresh) { if (core.status.hero.hp <= 0) { core.status.hero.hp = 0; core.updateStatusBar(); @@ -1600,7 +1600,7 @@ events.prototype._action_setValue2 = function (data, x, y, prefix) { events.prototype._action_addValue = function (data, x, y, prefix) { this.addValue(data.name, data.value, prefix); - if (data.refresh) { + if (!data.norefresh) { if (core.status.hero.hp <= 0) { core.status.hero.hp = 0; core.updateStatusBar(); From 43b6a883af8a101cc8ef4d5bba2229999326793a Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 4 Dec 2019 23:18:23 +0800 Subject: [PATCH 03/43] norefresh --- _docs/event.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_docs/event.md b/_docs/event.md index 899978e8..e91d34f6 100644 --- a/_docs/event.md +++ b/_docs/event.md @@ -486,7 +486,8 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam ![](img/events/13.jpg) -从V2.6.5开始,默认`addValue`不会刷新状态栏、地图显伤和自动事件,除非设置了`"refresh": true`。 +从V2.6.5开始,当设置了`"norefresh": true`后可以不刷新状态栏、地图显伤和自动事件,从而加速事件执行。 + 在刷新的情况下,如果hp被设置成了0或以下,将触发lose事件,直接死亡。 @@ -509,7 +510,7 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam ![](img/events/14.jpg) -从V2.6.5开始,默认`addValue`不会刷新状态栏、地图显伤和自动事件,除非设置了`"refresh": true`。 +从V2.6.5开始,当设置了`"norefresh": true`后可以不刷新状态栏、地图显伤和自动事件,从而加速事件执行。 ### setEnemy:设置怪物属性 From c1e5d4f1f0c04257ba1ea55334d73dd08f2e7cb6 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 4 Dec 2019 23:22:01 +0800 Subject: [PATCH 04/43] norefresh --- _server/editor_blockly.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 29630e30..53c3d500 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -219,10 +219,10 @@ editor_blockly = function () { ], '值块':[ MotaActionBlocks['addValue_s'].xmlText([ - MotaActionBlocks['idString_1_e'].xmlText(['status','生命']) + MotaActionBlocks['idString_1_e'].xmlText(['status','生命']), '', false ]), MotaActionBlocks['setValue_s'].xmlText([ - MotaActionBlocks['idString_1_e'].xmlText(['status','生命']) + MotaActionBlocks['idString_1_e'].xmlText(['status','生命']), '', false ]), MotaActionBlocks['expression_arithmetic_0'].xmlText(), MotaActionBlocks['evFlag_e'].xmlText(), From 614fa252f72e20f86a0eb81afb87efd5c6da86fa Mon Sep 17 00:00:00 2001 From: tocque <364004564@qq.com> Date: Fri, 6 Dec 2019 21:46:28 +0800 Subject: [PATCH 05/43] add hard check --- libs/ui.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libs/ui.js b/libs/ui.js index 43b0f399..8cf6a663 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2522,6 +2522,10 @@ ui.prototype._drawSLPanel_drawRecord = function(title, data, x, y, size, cho, hi }, { ctx: 'ui', x: x-size/2, y: y+15, size: size, centerX: data.hero.loc.x, centerY: data.hero.loc.y }); + if (core.isPlaying() && core.getFlag("hard") != data.hero.flags.hard) { + core.fillRect('ui', x-size/2, y+15, size, size, [0, 0, 0, 0.4], 2); + core.fillText('ui', data.hard, x, parseInt(y+22+size/2), core.dom.hard.style.color, this._buildFont(30,true)); + } var v = core.formatBigNumber(data.hero.hp,true)+"/"+core.formatBigNumber(data.hero.atk,true)+"/"+core.formatBigNumber(data.hero.def,true); var v2 = "/"+core.formatBigNumber(data.hero.mdef,true); if (core.calWidth('ui', v + v2, this._buildFont(10, false)) <= size) v += v2; From a4b8e752faf602841154bfbc374f958f7de354d1 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 20 Dec 2019 23:14:56 +0800 Subject: [PATCH 06/43] spread the editor --- _server/css/editor.css | 8 ++++---- _server/css/editor_mode.css | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/_server/css/editor.css b/_server/css/editor.css index 92172a43..04edff1a 100644 --- a/_server/css/editor.css +++ b/_server/css/editor.css @@ -239,15 +239,15 @@ body { position: absolute; left: 900px; top: 10px; - width: 440px; - height: 630px; + right: 0; + bottom: 0; /* border: 1px solid rgb(238, 13, 13); */ } #iconLib { position: absolute; - width: 435px; - height: 620px; + right: 0; + bottom: 0; left: 5px; top: 5px; overflow: auto; diff --git a/_server/css/editor_mode.css b/_server/css/editor_mode.css index d521a617..33f1a9bd 100644 --- a/_server/css/editor_mode.css +++ b/_server/css/editor_mode.css @@ -7,7 +7,7 @@ .leftTab { overflow: auto; position: absolute; - height: 630px; + bottom: 0; } .leftTab > * { From 108599d8f962fa47d020e5b4072af976b8a9e3fe Mon Sep 17 00:00:00 2001 From: cafel176 <48304406+cafel176@users.noreply.github.com> Date: Mon, 23 Dec 2019 10:46:12 +0800 Subject: [PATCH 07/43] =?UTF-8?q?Delete=20=E5=8A=A8=E7=94=BB=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=99=A8.exe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 常用工具/动画编辑器.exe | Bin 56320 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 常用工具/动画编辑器.exe diff --git a/常用工具/动画编辑器.exe b/常用工具/动画编辑器.exe deleted file mode 100644 index 8c4cb3158d190ac6a184f30585af610b97d144bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56320 zcmeFadth8uwLiYknaRA8OfyL{Nz5NSYQ}1p00%^qm%(wveXDv<*#j(wU@f z2nh)f0V_h~Ayq&?@dY9XiYQ#fCn$>I15rUx9+%&}ii!^qp})^(?Q`awnFMUP{=UEa z$9Ew6thM&qYpuQZ+H3E9&Y9`TO;;0&N^Px6XVPuJv~B2H0LV|JI$O+#L+aA0P792*Rl#QQ!7sBc0?b!xVJ=0f z2kBRQXq%}D)ZN!AHMCwyOr)T#{uPL$&LjLxFq0KZMW)_02pjw}CZuuc{t-H6CM!X= z#-Yemp%`MlFiou*M7@9N1anBP=Ou9oq?eRA~CP9Rysrl>H7q*kf2dQ&a6`=U)XeFF#{zv&;q@cYez0rb{yM*RapxfTpS5b(f2 znAfobg}kIU!-Rndz^TVT0BHgUWrEp{VbBBtKqz(y0)P;82m*jG#vup*0s>dd5CDXj zLl6LjQimV_`W8?hLf_!oShjCv;4#g9UgB|mwI;wTHdqTVlRz=fCQJlu9fM+EtZvDR zbu0);%-P65xraIlgh;7+I}Ry^H5phMlepVD9#FjAH*T6yH4q2?)NNY0*)PJ9sMdt3 zrJN6{u2bcqU{0j4c^WiA$fwpC?DGs=CS+W6I z3eElz1}qCEXR<0db(J%6Nen_@0F%iNGt~HcL!p&?%zjci9D&Kt2F)Z~5cxHj3z^+ZkfB{8V%qWJuH1PwoCau#^ZWIO5*HgllJnoWuZ zPXw4b3B>@$m~q8R5?ql1jH=(v%q56O@SFWCE3A`2&@j~TvwXhwzAVjrI{=piGN*uI zohoFi1bGd~r;$8Q$g4CNJUL{f0&;^VhrCvk7vzzfG5vv$l-CvBK1IGtyfJ|kM-H(yx z$E+Br1kL2!4VdC6r=ciC4;-Zw>NpWAgnvej*^gQ2=la)eq1!Nw%HkGW7MZFm&3>|a zYAbXt^T;z8A3t+pWsVITAjbv{kONDnJ@(MKPTf`yOy@duI@f{eTnFZ$Ixq*-fjRIF z%z<=Z4z>exupO9s<4I_V*j=P@vmYy>zdww^TZOslw_pU^Bp_HL7KGV&+=3Fo7-qk< zf^{oV#3R$@d1z+;ai|Vhm~9aYb1Ra;JVaUwSZi_h2o757K$sk;*cidEvXObV6h>)r5}ZukTHKE$rOw2D2B)-to@k55rKl%PJmViilRBk7h&gVod>vh zu%8mA$7`EhNflSZI%85iJ~p`vJhvq~Q6_hz7$Ubc>F)w6(BS!$aALf+*p*P3Ct*^> zI7gO6S>2SycG9?i4`m73M_DJt(}&?oSKJ7L(iDO{KxBvw23hp?Pza&0)eA5kHZU4{ z0a^P{%>Af>qx!{(15^Sh!eOI35t%76M6N*={SX=vXz&8Ign8wVeMIK5fwa=*5!L2d z=x)S9ECl8piYPTWM9D`y4CIz3dKd(~kP_a*FtFVq3q1^i4pP?93YauG!4?@J*C302I4>g5;4oVr%`mWmw9@7gwTA%%9I;9`45dhxgO^hB z5f1~orHLK}K`)_%_b?1>H^@Q{gP<2v*3k?D8w|40{Ul@$12%8o+3EE3Fvvm+ zA>ukF8f2lzSkRl<@_#tSlrhLcTP)~JlzTK|%m#xjv=Blg#<&V& z9I~+JM^66XYlja%J2upN5*GO~f6PBU81q|LdLq9z<8q@@3f?`eh9s*DEi(}m1LJ|} z!>C;~hE!D9)C?BEh};~Fmle#JjexTG%E1>au&~}n$^x-~g@q)N!IBio>_$ylFkTj# z^CX5O7VO^-X|X^oWFZMh;ui9GB#Tz$qLsPmI6>p_EPItEWICb4!Xo1evXJT`;~S

96o$F7PPT} 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


S7BvA;(7u_D_1U=iWVNHLy@zECi17{%zF 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 Date: Mon, 23 Dec 2019 10:46:43 +0800 Subject: [PATCH 08/43] fix some bug --- 常用工具/动画编辑器.exe | Bin 0 -> 56320 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 常用工具/动画编辑器.exe diff --git a/常用工具/动画编辑器.exe b/常用工具/动画编辑器.exe new file mode 100644 index 0000000000000000000000000000000000000000..f6423db680f849d56226eb709a5af7ee0ebd2ae7 GIT binary patch literal 56320 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 literal 0 HcmV?d00001 From a93289bba7ce085afdbd315318fa706905e025b8 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 25 Dec 2019 16:14:55 +0800 Subject: [PATCH 09/43] Unzip support --- _docs/api.md | 11 +- editor-mobile.html | 1 + editor.html | 1 + index.html | 1 + libs/loader.js | 225 ++- libs/thirdparty/LICENSE.md | 261 +++- libs/thirdparty/zip.js | 2895 ++++++++++++++++++++++++++++++++++++ libs/utils.js | 54 + 8 files changed, 3377 insertions(+), 72 deletions(-) create mode 100644 libs/thirdparty/zip.js diff --git a/_docs/api.md b/_docs/api.md index 4b938e8d..58ff0bfa 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -2166,7 +2166,16 @@ core.same(a, b) 如果a和b都是数组,则会递归依次比较数组中的值;如果都是对象亦然。 -core.utils.http(type, url, formData, success, error, mimeType, responseType) +core.unzip(blobOrUrl, success, error, convertToText) +解压一个zip文件。 +blobOrUrl为传入的二进制zip文件Blob格式,或zip文件的地址。 +success为成功后的回调,接收 文件名-文件内容 形式的对象,即 +{"filename1": ..., "filename2": ...} +error为失败的回调,接收参数message为错误信息。 +convertToText如果为true则会将每个文件内容转成纯文本而不是二进制格式。 + + +core.http(type, url, formData, success, error, mimeType, responseType) 发送一个异步HTTP请求。 type为'GET'或者'POST';url为目标地址;formData如果是POST请求则为表单数据。 success为成功后的回调,error为失败后的回调。 diff --git a/editor-mobile.html b/editor-mobile.html index fe371abd..ba8ca496 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -585,6 +585,7 @@ + + + diff --git a/libs/loader.js b/libs/loader.js index 5d4da850..b7e265ae 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -50,7 +50,11 @@ loader.prototype._loadIcons = function () { } loader.prototype._loadMaterialImages = function (callback) { - this.loadImages(core.materials, core.material.images, callback); + if (main.useCompress) { + this.loadImagesFromZip('project/images/materials.zip', core.materials, core.material.images, callback); + } else { + this.loadImages(core.materials, core.material.images, callback); + } } loader.prototype._loadExtraImages = function (callback) { @@ -60,14 +64,18 @@ loader.prototype._loadExtraImages = function (callback) { if (images.indexOf("hero.png") < 0) images.push("hero.png"); - this.loadImages(images, core.material.images.images, callback); + if (main.useCompress) { + this.loadImagesFromZip('project/images/images.zip', images, core.material.images.images, callback); + } else { + this.loadImages(images, core.material.images.images, callback); + } } loader.prototype._loadAutotiles = function (callback) { core.material.images.autotile = {}; var keys = Object.keys(core.material.icons.autotile); var autotiles = {}; - this.loadImages(keys, autotiles, function () { + var _callback = function () { keys.forEach(function (v) { core.material.images.autotile[v] = autotiles[v]; }); @@ -77,13 +85,18 @@ loader.prototype._loadAutotiles = function (callback) { }); callback(); - }); + } + if (main.useCompress) { + this.loadImagesFromZip('project/images/autotiles.zip', keys, autotiles, _callback); + } else { + this.loadImages(keys, autotiles, _callback); + } } loader.prototype._loadTilesets = function (callback) { core.material.images.tilesets = {}; core.tilesets = core.tilesets || []; - core.loader.loadImages(core.clone(core.tilesets), core.material.images.tilesets, function () { + var _callback = function () { // 检查宽高是32倍数,如果出错在控制台报错 for (var imgName in core.material.images.tilesets) { var img = core.material.images.tilesets[imgName]; @@ -95,7 +108,12 @@ loader.prototype._loadTilesets = function (callback) { } } callback(); - }); + } + if (main.useCompress) { + this.loadImagesFromZip('project/images/tilesets.zip', core.tilesets, core.material.images.tilesets, _callback); + } else { + this.loadImages(core.tilesets, core.material.images.tilesets, _callback); + } } loader.prototype.loadImages = function (names, toSave, callback) { @@ -122,6 +140,34 @@ loader.prototype.loadImages = function (names, toSave, callback) { } } +loader.prototype.loadImagesFromZip = function (url, names, toSave, callback) { + if (!names || names.length == 0) { + if (callback) callback(); + return; + } + + core.unzip(url + "?v=" + main.version, function (data) { + var cnt = 1; + names.forEach(function (name) { + if (name.indexOf('.') < 0) name += '.png'; + if (name in data) { + var img = new Image(); + var url = URL.createObjectURL(data[name]); + cnt++; + img.onload = function () { + cnt--; + URL.revokeObjectURL(url); + if (cnt == 0 && callback) callback(); + } + img.src = url; + toSave[name] = img; + } + }); + cnt--; + if (cnt == 0 && callback) callback(); + }); +} + loader.prototype.loadImage = function (imgName, callback) { try { var name = imgName; @@ -144,58 +190,74 @@ loader.prototype.loadImage = function (imgName, callback) { } loader.prototype._loadAnimates = function () { - core.animates.forEach(function (t) { - core.http('GET', 'project/animates/' + t + ".animate", null, function (content) { - try { - content = JSON.parse(content); - var data = {}; - data.ratio = content.ratio; - data.se = content.se; - data.images = []; - data.images_rev = []; - content.bitmaps.forEach(function (t2) { - if (!t2) { - data.images.push(null); - } - else { - try { - var image = new Image(); - image.src = t2; - data.images.push(image); - } catch (e) { - main.log(e); - data.images.push(null); - } - } - }) - data.frame = content.frame_max; - data.frames = []; - content.frames.forEach(function (t2) { - var info = []; - t2.forEach(function (t3) { - info.push({ - 'index': t3[0], - 'x': t3[1], - 'y': t3[2], - 'zoom': t3[3], - 'opacity': t3[4], - 'mirror': t3[5] || 0, - 'angle': t3[6] || 0, - }) - }) - data.frames.push(info); - }) - core.material.animates[t] = data; + if (main.useCompress) { + core.unzip('project/animates/animates.zip?v=' + main.version, function (animates) { + for (var name in animates) { + if (name.endsWith(".animate")) { + var t = name.substring(0, name.length - 8); + if (core.animates.indexOf(t) >= 0) + core.loader._loadAnimate(t, animates[name]); + } } - catch (e) { + }, null, true); + } else { + core.animates.forEach(function (t) { + core.http('GET', 'project/animates/' + t + ".animate?v=" + main.version, null, function (content) { + core.loader._loadAnimate(t, content); + }, function (e) { main.log(e); core.material.animates[t] = null; + }, "text/plain; charset=x-user-defined") + }) + }'application/zip' +} + +loader.prototype._loadAnimate = function (name, content) { + try { + content = JSON.parse(content); + var data = {}; + data.ratio = content.ratio; + data.se = content.se; + data.images = []; + data.images_rev = []; + content.bitmaps.forEach(function (t2) { + if (!t2) { + data.images.push(null); } - }, function (e) { - main.log(e); - core.material.animates[t] = null; - }, "text/plain; charset=x-user-defined") - }) + else { + try { + var image = new Image(); + image.src = t2; + data.images.push(image); + } catch (e) { + main.log(e); + data.images.push(null); + } + } + }) + data.frame = content.frame_max; + data.frames = []; + content.frames.forEach(function (t2) { + var info = []; + t2.forEach(function (t3) { + info.push({ + 'index': t3[0], + 'x': t3[1], + 'y': t3[2], + 'zoom': t3[3], + 'opacity': t3[4], + 'mirror': t3[5] || 0, + 'angle': t3[6] || 0, + }) + }) + data.frames.push(info); + }) + core.material.animates[name] = data; + } + catch (e) { + main.log(e); + core.material.animates[name] = null; + } } ////// 加载音频 ////// @@ -204,9 +266,19 @@ loader.prototype._loadMusic = function () { core.loader.loadOneMusic(t); }); - core.sounds.forEach(function (t) { - core.loader.loadOneSound(t); - }); + if (main.useCompress && core.musicStatus.audioContext) { + core.unzip('project/sounds/sounds.zip?v=' + main.version, function (data) { + for (var name in data) { + if (core.sounds.indexOf(name) >= 0) { + core.loader._loadOneSound_decodeData(name, data[name]); + } + } + }); + } else { + core.sounds.forEach(function (t) { + core.loader.loadOneSound(t); + }); + } // 直接开始播放 core.playBgm(main.startBgm); } @@ -222,19 +294,8 @@ loader.prototype.loadOneMusic = function (name) { loader.prototype.loadOneSound = function (name) { if (core.musicStatus.audioContext != null) { - core.http('GET', 'project/sounds/' + name, null, function (data) { - try { - core.musicStatus.audioContext.decodeAudioData(data, function (buffer) { - core.material.sounds[name] = buffer; - }, function (e) { - main.log(e); - core.material.sounds[name] = null; - }) - } - catch (e) { - main.log(e); - core.material.sounds[name] = null; - } + core.http('GET', 'project/sounds/' + name + "?v=" + main.version, null, function (data) { + core.loader._loadOneSound_decodeData(name, data); }, function (e) { main.log(e); core.material.sounds[name] = null; @@ -247,6 +308,30 @@ loader.prototype.loadOneSound = function (name) { } } +loader.prototype._loadOneSound_decodeData = function (name, data) { + if (data instanceof Blob) { + var blobReader = new zip.BlobReader(data); + blobReader.init(function () { + blobReader.readUint8Array(0, blobReader.size, function (uint8) { + core.loader._loadOneSound_decodeData(name, uint8.buffer); + }) + }); + return; + } + try { + core.musicStatus.audioContext.decodeAudioData(data, function (buffer) { + core.material.sounds[name] = buffer; + }, function (e) { + main.log(e); + core.material.sounds[name] = null; + }) + } + catch (e) { + main.log(e); + core.material.sounds[name] = null; + } +} + loader.prototype.loadBgm = function (name) { name = core.getMappedName(name); if (!core.material.bgms[name]) return; diff --git a/libs/thirdparty/LICENSE.md b/libs/thirdparty/LICENSE.md index 33ec4fdc..667f1d31 100644 --- a/libs/thirdparty/LICENSE.md +++ b/libs/thirdparty/LICENSE.md @@ -1,3 +1,238 @@ +lzstring +============ + +MIT License + +Copyright (c) 2013 pieroxy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +localforage +============ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014 Mozilla + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +mid +============ + Copyright (c) 2010, Matt Westcott & Ben Firshman All rights reserved. @@ -21,4 +256,28 @@ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +zip +============ + + Copyright (c) 2013 Gildas Lormeau. All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + 3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, + INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/libs/thirdparty/zip.js b/libs/thirdparty/zip.js new file mode 100644 index 00000000..f7f68f47 --- /dev/null +++ b/libs/thirdparty/zip.js @@ -0,0 +1,2895 @@ +/* + Copyright (c) 2013 Gildas Lormeau. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + + 3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, + INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +(function(obj) { + "use strict"; + + var ERR_BAD_FORMAT = "File format is not recognized."; + var ERR_CRC = "CRC failed."; + var ERR_ENCRYPTED = "File contains encrypted entry."; + var ERR_ZIP64 = "File is using Zip64 (4gb+ file size)."; + var ERR_READ = "Error while reading zip file."; + var ERR_WRITE = "Error while writing zip file."; + var ERR_WRITE_DATA = "Error while writing file data."; + var ERR_READ_DATA = "Error while reading file data."; + var ERR_DUPLICATED_NAME = "File already exists."; + var CHUNK_SIZE = 512 * 1024; + + var TEXT_PLAIN = "text/plain"; + + var appendABViewSupported; + try { + appendABViewSupported = new Blob([ new DataView(new ArrayBuffer(0)) ]).size === 0; + } catch (e) { + } + + function Crc32() { + this.crc = -1; + } + Crc32.prototype.append = function append(data) { + var crc = this.crc | 0, table = this.table; + for (var offset = 0, len = data.length | 0; offset < len; offset++) + crc = (crc >>> 8) ^ table[(crc ^ data[offset]) & 0xFF]; + this.crc = crc; + }; + Crc32.prototype.get = function get() { + return ~this.crc; + }; + Crc32.prototype.table = (function() { + var i, j, t, table = []; // Uint32Array is actually slower than [] + for (i = 0; i < 256; i++) { + t = i; + for (j = 0; j < 8; j++) + if (t & 1) + t = (t >>> 1) ^ 0xEDB88320; + else + t = t >>> 1; + table[i] = t; + } + return table; + })(); + + // "no-op" codec + function NOOP() {} + NOOP.prototype.append = function append(bytes, onprogress) { + return bytes; + }; + NOOP.prototype.flush = function flush() {}; + + function blobSlice(blob, index, length) { + if (index < 0 || length < 0 || index + length > blob.size) + throw new RangeError('offset:' + index + ', length:' + length + ', size:' + blob.size); + if (blob.slice) + return blob.slice(index, index + length); + else if (blob.webkitSlice) + return blob.webkitSlice(index, index + length); + else if (blob.mozSlice) + return blob.mozSlice(index, index + length); + else if (blob.msSlice) + return blob.msSlice(index, index + length); + } + + function getDataHelper(byteLength, bytes) { + var dataBuffer, dataArray; + dataBuffer = new ArrayBuffer(byteLength); + dataArray = new Uint8Array(dataBuffer); + if (bytes) + dataArray.set(bytes, 0); + return { + buffer : dataBuffer, + array : dataArray, + view : new DataView(dataBuffer) + }; + } + + // Readers + function Reader() { + } + + function TextReader(text) { + var that = this, blobReader; + + function init(callback, onerror) { + var blob = new Blob([ text ], { + type : TEXT_PLAIN + }); + blobReader = new BlobReader(blob); + blobReader.init(function() { + that.size = blobReader.size; + callback(); + }, onerror); + } + + function readUint8Array(index, length, callback, onerror) { + blobReader.readUint8Array(index, length, callback, onerror); + } + + that.size = 0; + that.init = init; + that.readUint8Array = readUint8Array; + } + TextReader.prototype = new Reader(); + TextReader.prototype.constructor = TextReader; + + function Data64URIReader(dataURI) { + var that = this, dataStart; + + function init(callback) { + var dataEnd = dataURI.length; + while (dataURI.charAt(dataEnd - 1) == "=") + dataEnd--; + dataStart = dataURI.indexOf(",") + 1; + that.size = Math.floor((dataEnd - dataStart) * 0.75); + callback(); + } + + function readUint8Array(index, length, callback) { + var i, data = getDataHelper(length); + var start = Math.floor(index / 3) * 4; + var end = Math.ceil((index + length) / 3) * 4; + var bytes = obj.atob(dataURI.substring(start + dataStart, end + dataStart)); + var delta = index - Math.floor(start / 4) * 3; + for (i = delta; i < delta + length; i++) + data.array[i - delta] = bytes.charCodeAt(i); + callback(data.array); + } + + that.size = 0; + that.init = init; + that.readUint8Array = readUint8Array; + } + Data64URIReader.prototype = new Reader(); + Data64URIReader.prototype.constructor = Data64URIReader; + + function BlobReader(blob) { + var that = this; + + function init(callback) { + that.size = blob.size; + callback(); + } + + function readUint8Array(index, length, callback, onerror) { + var reader = new FileReader(); + reader.onload = function(e) { + callback(new Uint8Array(e.target.result)); + }; + reader.onerror = onerror; + try { + reader.readAsArrayBuffer(blobSlice(blob, index, length)); + } catch (e) { + onerror(e); + } + } + + that.size = 0; + that.init = init; + that.readUint8Array = readUint8Array; + } + BlobReader.prototype = new Reader(); + BlobReader.prototype.constructor = BlobReader; + + // Writers + + function Writer() { + } + Writer.prototype.getData = function(callback) { + callback(this.data); + }; + + function TextWriter(encoding) { + var that = this, blob; + + function init(callback) { + blob = new Blob([], { + type : TEXT_PLAIN + }); + callback(); + } + + function writeUint8Array(array, callback) { + blob = new Blob([ blob, appendABViewSupported ? array : array.buffer ], { + type : TEXT_PLAIN + }); + callback(); + } + + function getData(callback, onerror) { + var reader = new FileReader(); + reader.onload = function(e) { + callback(e.target.result); + }; + reader.onerror = onerror; + reader.readAsText(blob, encoding); + } + + that.init = init; + that.writeUint8Array = writeUint8Array; + that.getData = getData; + } + TextWriter.prototype = new Writer(); + TextWriter.prototype.constructor = TextWriter; + + function Data64URIWriter(contentType) { + var that = this, data = "", pending = ""; + + function init(callback) { + data += "data:" + (contentType || "") + ";base64,"; + callback(); + } + + function writeUint8Array(array, callback) { + var i, delta = pending.length, dataString = pending; + pending = ""; + for (i = 0; i < (Math.floor((delta + array.length) / 3) * 3) - delta; i++) + dataString += String.fromCharCode(array[i]); + for (; i < array.length; i++) + pending += String.fromCharCode(array[i]); + if (dataString.length > 2) + data += obj.btoa(dataString); + else + pending = dataString; + callback(); + } + + function getData(callback) { + callback(data + obj.btoa(pending)); + } + + that.init = init; + that.writeUint8Array = writeUint8Array; + that.getData = getData; + } + Data64URIWriter.prototype = new Writer(); + Data64URIWriter.prototype.constructor = Data64URIWriter; + + function BlobWriter(contentType) { + var blob, that = this; + + function init(callback) { + blob = new Blob([], { + type : contentType + }); + callback(); + } + + function writeUint8Array(array, callback) { + blob = new Blob([ blob, appendABViewSupported ? array : array.buffer ], { + type : contentType + }); + callback(); + } + + function getData(callback) { + callback(blob); + } + + that.init = init; + that.writeUint8Array = writeUint8Array; + that.getData = getData; + } + BlobWriter.prototype = new Writer(); + BlobWriter.prototype.constructor = BlobWriter; + + function launchProcess(process, reader, writer, offset, size, crcType, onprogress, onend, onreaderror, onwriteerror) { + var chunkIndex = 0, index, outputSize = 0, + crcInput = crcType === 'input', + crcOutput = crcType === 'output', + crc = new Crc32(); + function step() { + var outputData; + index = chunkIndex * CHUNK_SIZE; + if (index < size) + reader.readUint8Array(offset + index, Math.min(CHUNK_SIZE, size - index), function(inputData) { + var outputData; + try { + outputData = process.append(inputData, function(loaded) { + if (onprogress) + onprogress(index + loaded, size); + }); + } catch (e) { + onreaderror(e); + return; + } + if (outputData) { + outputSize += outputData.length; + writer.writeUint8Array(outputData, function() { + chunkIndex++; + setTimeout(step, 1); + }, onwriteerror); + if (crcOutput) + crc.append(outputData); + } else { + chunkIndex++; + setTimeout(step, 1); + } + if (crcInput) + crc.append(inputData); + if (onprogress) + onprogress(index, size); + }, onreaderror); + else { + try { + outputData = process.flush(); + } catch (e) { + onreaderror(e); + return; + } + if (outputData) { + if (crcOutput) + crc.append(outputData); + outputSize += outputData.length; + writer.writeUint8Array(outputData, function() { + onend(outputSize, crc.get()); + }, onwriteerror); + } else + onend(outputSize, crc.get()); + } + } + + step(); + } + + function inflate(sn, reader, writer, offset, size, computeCrc32, onend, onprogress, onreaderror, onwriteerror) { + var crcType = computeCrc32 ? 'output' : 'none'; + launchProcess(new obj.zip.Inflater(), reader, writer, offset, size, crcType, onprogress, onend, onreaderror, onwriteerror); + } + + function deflate(sn, reader, writer, level, onend, onprogress, onreaderror, onwriteerror) { + var crcType = 'input'; + launchProcess(new obj.zip.Deflater(), reader, writer, 0, reader.size, crcType, onprogress, onend, onreaderror, onwriteerror); + } + + function copy(sn, reader, writer, offset, size, computeCrc32, onend, onprogress, onreaderror, onwriteerror) { + var crcType = 'input'; + launchProcess(new NOOP(), reader, writer, offset, size, crcType, onprogress, onend, onreaderror, onwriteerror); + } + + // ZipReader + + function decodeASCII(str) { + var i, out = "", charCode, extendedASCII = [ '\u00C7', '\u00FC', '\u00E9', '\u00E2', '\u00E4', '\u00E0', '\u00E5', '\u00E7', '\u00EA', '\u00EB', + '\u00E8', '\u00EF', '\u00EE', '\u00EC', '\u00C4', '\u00C5', '\u00C9', '\u00E6', '\u00C6', '\u00F4', '\u00F6', '\u00F2', '\u00FB', '\u00F9', + '\u00FF', '\u00D6', '\u00DC', '\u00F8', '\u00A3', '\u00D8', '\u00D7', '\u0192', '\u00E1', '\u00ED', '\u00F3', '\u00FA', '\u00F1', '\u00D1', + '\u00AA', '\u00BA', '\u00BF', '\u00AE', '\u00AC', '\u00BD', '\u00BC', '\u00A1', '\u00AB', '\u00BB', '_', '_', '_', '\u00A6', '\u00A6', + '\u00C1', '\u00C2', '\u00C0', '\u00A9', '\u00A6', '\u00A6', '+', '+', '\u00A2', '\u00A5', '+', '+', '-', '-', '+', '-', '+', '\u00E3', + '\u00C3', '+', '+', '-', '-', '\u00A6', '-', '+', '\u00A4', '\u00F0', '\u00D0', '\u00CA', '\u00CB', '\u00C8', 'i', '\u00CD', '\u00CE', + '\u00CF', '+', '+', '_', '_', '\u00A6', '\u00CC', '_', '\u00D3', '\u00DF', '\u00D4', '\u00D2', '\u00F5', '\u00D5', '\u00B5', '\u00FE', + '\u00DE', '\u00DA', '\u00DB', '\u00D9', '\u00FD', '\u00DD', '\u00AF', '\u00B4', '\u00AD', '\u00B1', '_', '\u00BE', '\u00B6', '\u00A7', + '\u00F7', '\u00B8', '\u00B0', '\u00A8', '\u00B7', '\u00B9', '\u00B3', '\u00B2', '_', ' ' ]; + for (i = 0; i < str.length; i++) { + charCode = str.charCodeAt(i) & 0xFF; + if (charCode > 127) + out += extendedASCII[charCode - 128]; + else + out += String.fromCharCode(charCode); + } + return out; + } + + function decodeUTF8(string) { + return decodeURIComponent(escape(string)); + } + + function getString(bytes) { + var i, str = ""; + for (i = 0; i < bytes.length; i++) + str += String.fromCharCode(bytes[i]); + return str; + } + + function getDate(timeRaw) { + var date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & 0x0000ffff; + try { + return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, + (time & 0x001F) * 2, 0); + } catch (e) { + } + } + + function readCommonHeader(entry, data, index, centralDirectory, onerror) { + entry.version = data.view.getUint16(index, true); + entry.bitFlag = data.view.getUint16(index + 2, true); + entry.compressionMethod = data.view.getUint16(index + 4, true); + entry.lastModDateRaw = data.view.getUint32(index + 6, true); + entry.lastModDate = getDate(entry.lastModDateRaw); + if ((entry.bitFlag & 0x01) === 0x01) { + onerror(ERR_ENCRYPTED); + return; + } + if (centralDirectory || (entry.bitFlag & 0x0008) != 0x0008) { + entry.crc32 = data.view.getUint32(index + 10, true); + entry.compressedSize = data.view.getUint32(index + 14, true); + entry.uncompressedSize = data.view.getUint32(index + 18, true); + } + if (entry.compressedSize === 0xFFFFFFFF || entry.uncompressedSize === 0xFFFFFFFF) { + onerror(ERR_ZIP64); + return; + } + entry.filenameLength = data.view.getUint16(index + 22, true); + entry.extraFieldLength = data.view.getUint16(index + 24, true); + } + + function createZipReader(reader, callback, onerror) { + var inflateSN = 0; + + function Entry() { + } + + Entry.prototype.getData = function(writer, onend, onprogress, checkCrc32) { + var that = this; + + function testCrc32(crc32) { + var dataCrc32 = getDataHelper(4); + dataCrc32.view.setUint32(0, crc32); + return that.crc32 == dataCrc32.view.getUint32(0); + } + + function getWriterData(uncompressedSize, crc32) { + if (checkCrc32 && !testCrc32(crc32)) + onerror(ERR_CRC); + else + writer.getData(function(data) { + onend(data); + }); + } + + function onreaderror(err) { + onerror(err || ERR_READ_DATA); + } + + function onwriteerror(err) { + onerror(err || ERR_WRITE_DATA); + } + + reader.readUint8Array(that.offset, 30, function(bytes) { + var data = getDataHelper(bytes.length, bytes), dataOffset; + if (data.view.getUint32(0) != 0x504b0304) { + onerror(ERR_BAD_FORMAT); + return; + } + readCommonHeader(that, data, 4, false, onerror); + dataOffset = that.offset + 30 + that.filenameLength + that.extraFieldLength; + writer.init(function() { + if (that.compressionMethod === 0) + copy(inflateSN++, reader, writer, dataOffset, that.compressedSize, checkCrc32, getWriterData, onprogress, onreaderror, onwriteerror); + else + inflate(inflateSN++, reader, writer, dataOffset, that.compressedSize, checkCrc32, getWriterData, onprogress, onreaderror, onwriteerror); + }, onwriteerror); + }, onreaderror); + }; + + function seekEOCDR(eocdrCallback) { + // "End of central directory record" is the last part of a zip archive, and is at least 22 bytes long. + // Zip file comment is the last part of EOCDR and has max length of 64KB, + // so we only have to search the last 64K + 22 bytes of a archive for EOCDR signature (0x06054b50). + var EOCDR_MIN = 22; + if (reader.size < EOCDR_MIN) { + onerror(ERR_BAD_FORMAT); + return; + } + var ZIP_COMMENT_MAX = 256 * 256, EOCDR_MAX = EOCDR_MIN + ZIP_COMMENT_MAX; + + // In most cases, the EOCDR is EOCDR_MIN bytes long + doSeek(EOCDR_MIN, function() { + // If not found, try within EOCDR_MAX bytes + doSeek(Math.min(EOCDR_MAX, reader.size), function() { + onerror(ERR_BAD_FORMAT); + }); + }); + + // seek last length bytes of file for EOCDR + function doSeek(length, eocdrNotFoundCallback) { + reader.readUint8Array(reader.size - length, length, function(bytes) { + for (var i = bytes.length - EOCDR_MIN; i >= 0; i--) { + if (bytes[i] === 0x50 && bytes[i + 1] === 0x4b && bytes[i + 2] === 0x05 && bytes[i + 3] === 0x06) { + eocdrCallback(new DataView(bytes.buffer, i, EOCDR_MIN)); + return; + } + } + eocdrNotFoundCallback(); + }, function() { + onerror(ERR_READ); + }); + } + } + + var zipReader = { + getEntries : function(callback) { + // look for End of central directory record + seekEOCDR(function(dataView) { + var datalength, fileslength; + datalength = dataView.getUint32(16, true); + fileslength = dataView.getUint16(8, true); + if (datalength < 0 || datalength >= reader.size) { + onerror(ERR_BAD_FORMAT); + return; + } + reader.readUint8Array(datalength, reader.size - datalength, function(bytes) { + var i, index = 0, entries = [], entry, filename, comment, data = getDataHelper(bytes.length, bytes); + for (i = 0; i < fileslength; i++) { + entry = new Entry(); + if (data.view.getUint32(index) != 0x504b0102) { + onerror(ERR_BAD_FORMAT); + return; + } + readCommonHeader(entry, data, index + 6, true, onerror); + entry.commentLength = data.view.getUint16(index + 32, true); + entry.directory = ((data.view.getUint8(index + 38) & 0x10) == 0x10); + entry.offset = data.view.getUint32(index + 42, true); + filename = getString(data.array.subarray(index + 46, index + 46 + entry.filenameLength)); + entry.filename = ((entry.bitFlag & 0x0800) === 0x0800) ? decodeUTF8(filename) : decodeASCII(filename); + if (!entry.directory && entry.filename.charAt(entry.filename.length - 1) == "/") + entry.directory = true; + comment = getString(data.array.subarray(index + 46 + entry.filenameLength + entry.extraFieldLength, index + 46 + + entry.filenameLength + entry.extraFieldLength + entry.commentLength)); + entry.comment = ((entry.bitFlag & 0x0800) === 0x0800) ? decodeUTF8(comment) : decodeASCII(comment); + entries.push(entry); + index += 46 + entry.filenameLength + entry.extraFieldLength + entry.commentLength; + } + callback(entries); + }, function() { + onerror(ERR_READ); + }); + }); + }, + close : function(callback) { + if (callback) + callback(); + }, + }; + + callback(zipReader); + } + + // ZipWriter + + function encodeUTF8(string) { + return unescape(encodeURIComponent(string)); + } + + function getBytes(str) { + var i, array = []; + for (i = 0; i < str.length; i++) + array.push(str.charCodeAt(i)); + return array; + } + + function createZipWriter(writer, callback, onerror, dontDeflate) { + var files = {}, filenames = [], datalength = 0; + var deflateSN = 0; + + function onwriteerror(err) { + onerror(err || ERR_WRITE); + } + + function onreaderror(err) { + onerror(err || ERR_READ_DATA); + } + + var zipWriter = { + add : function(name, reader, onend, onprogress, options) { + var header, filename, date; + + function writeHeader(callback) { + var data; + date = options.lastModDate || new Date(); + header = getDataHelper(26); + files[name] = { + headerArray : header.array, + directory : options.directory, + filename : filename, + offset : datalength, + comment : getBytes(encodeUTF8(options.comment || "")) + }; + header.view.setUint32(0, 0x14000808); + if (options.version) + header.view.setUint8(0, options.version); + if (!dontDeflate && options.level !== 0 && !options.directory) + header.view.setUint16(4, 0x0800); + header.view.setUint16(6, (((date.getHours() << 6) | date.getMinutes()) << 5) | date.getSeconds() / 2, true); + header.view.setUint16(8, ((((date.getFullYear() - 1980) << 4) | (date.getMonth() + 1)) << 5) | date.getDate(), true); + header.view.setUint16(22, filename.length, true); + data = getDataHelper(30 + filename.length); + data.view.setUint32(0, 0x504b0304); + data.array.set(header.array, 4); + data.array.set(filename, 30); + datalength += data.array.length; + writer.writeUint8Array(data.array, callback, onwriteerror); + } + + function writeFooter(compressedLength, crc32) { + var footer = getDataHelper(16); + datalength += compressedLength || 0; + footer.view.setUint32(0, 0x504b0708); + if (typeof crc32 != "undefined") { + header.view.setUint32(10, crc32, true); + footer.view.setUint32(4, crc32, true); + } + if (reader) { + footer.view.setUint32(8, compressedLength, true); + header.view.setUint32(14, compressedLength, true); + footer.view.setUint32(12, reader.size, true); + header.view.setUint32(18, reader.size, true); + } + writer.writeUint8Array(footer.array, function() { + datalength += 16; + onend(); + }, onwriteerror); + } + + function writeFile() { + options = options || {}; + name = name.trim(); + if (options.directory && name.charAt(name.length - 1) != "/") + name += "/"; + if (files.hasOwnProperty(name)) { + onerror(ERR_DUPLICATED_NAME); + return; + } + filename = getBytes(encodeUTF8(name)); + filenames.push(name); + writeHeader(function() { + if (reader) + if (dontDeflate || options.level === 0) + copy(deflateSN++, reader, writer, 0, reader.size, true, writeFooter, onprogress, onreaderror, onwriteerror); + else + deflate(deflateSN++, reader, writer, options.level, writeFooter, onprogress, onreaderror, onwriteerror); + else + writeFooter(); + }, onwriteerror); + } + + if (reader) + reader.init(writeFile, onreaderror); + else + writeFile(); + }, + close : function(callback) { + + var data, length = 0, index = 0, indexFilename, file; + for (indexFilename = 0; indexFilename < filenames.length; indexFilename++) { + file = files[filenames[indexFilename]]; + length += 46 + file.filename.length + file.comment.length; + } + data = getDataHelper(length + 22); + for (indexFilename = 0; indexFilename < filenames.length; indexFilename++) { + file = files[filenames[indexFilename]]; + data.view.setUint32(index, 0x504b0102); + data.view.setUint16(index + 4, 0x1400); + data.array.set(file.headerArray, index + 6); + data.view.setUint16(index + 32, file.comment.length, true); + if (file.directory) + data.view.setUint8(index + 38, 0x10); + data.view.setUint32(index + 42, file.offset, true); + data.array.set(file.filename, index + 46); + data.array.set(file.comment, index + 46 + file.filename.length); + index += 46 + file.filename.length + file.comment.length; + } + data.view.setUint32(index, 0x504b0506); + data.view.setUint16(index + 8, filenames.length, true); + data.view.setUint16(index + 10, filenames.length, true); + data.view.setUint32(index + 12, length, true); + data.view.setUint32(index + 16, datalength, true); + writer.writeUint8Array(data.array, function() { + writer.getData(callback); + }, onwriteerror); + }, + }; + + callback(zipWriter); + } + + function onerror_default(error) { + console.error(error); + } + obj.zip = { + Reader : Reader, + Writer : Writer, + BlobReader : BlobReader, + Data64URIReader : Data64URIReader, + TextReader : TextReader, + BlobWriter : BlobWriter, + Data64URIWriter : Data64URIWriter, + TextWriter : TextWriter, + createReader : function(reader, callback, onerror) { + onerror = onerror || onerror_default; + + reader.init(function() { + createZipReader(reader, callback, onerror); + }, onerror); + }, + createWriter : function(writer, callback, onerror, dontDeflate) { + onerror = onerror || onerror_default; + dontDeflate = !!dontDeflate; + + writer.init(function() { + createZipWriter(writer, callback, onerror, dontDeflate); + }, onerror); + }, + }; + +})(this); + +// -- Inflate.js + +/* + Copyright (c) 2013 Gildas Lormeau. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + + 3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, + INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This program is based on JZlib 1.0.2 ymnk, JCraft,Inc. + * JZlib is based on zlib-1.1.3, so all credit should go authors + * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) + * and contributors of zlib. + */ + +(function(global) { + "use strict"; + + // Global + var MAX_BITS = 15; + + var Z_OK = 0; + var Z_STREAM_END = 1; + var Z_NEED_DICT = 2; + var Z_STREAM_ERROR = -2; + var Z_DATA_ERROR = -3; + var Z_MEM_ERROR = -4; + var Z_BUF_ERROR = -5; + + var inflate_mask = [ 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, + 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff ]; + + var MANY = 1440; + + // JZlib version : "1.0.2" + var Z_NO_FLUSH = 0; + var Z_FINISH = 4; + + // InfTree + var fixed_bl = 9; + var fixed_bd = 5; + + var fixed_tl = [ 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, + 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, + 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, + 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, + 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, + 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, + 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, + 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, + 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, + 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, + 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, + 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, + 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, + 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, + 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, + 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, + 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, + 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, + 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, + 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, + 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, + 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, + 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, + 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, + 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, + 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, + 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, + 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, + 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, + 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, + 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, + 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, + 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, + 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, + 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, + 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, + 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255 ]; + var fixed_td = [ 80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, + 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, + 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577 ]; + + // Tables for deflate from PKZIP's appnote.txt. + var cplens = [ // Copy lengths for literal codes 257..285 + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 ]; + + // see note #13 above about 258 + var cplext = [ // Extra bits for literal codes 257..285 + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112 // 112==invalid + ]; + + var cpdist = [ // Copy offsets for distance codes 0..29 + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ]; + + var cpdext = [ // Extra bits for distance codes + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 ]; + + // If BMAX needs to be larger than 16, then h and x[] should be uLong. + var BMAX = 15; // maximum bit length of any code + + function InfTree() { + var that = this; + + var hn; // hufts used in space + var v; // work area for huft_build + var c; // bit length count table + var r; // table entry for structure assignment + var u; // table stack + var x; // bit offsets, then code stack + + function huft_build(b, // code lengths in bits (all assumed <= + // BMAX) + bindex, n, // number of codes (assumed <= 288) + s, // number of simple-valued codes (0..s-1) + d, // list of base values for non-simple codes + e, // list of extra bits for non-simple codes + t, // result: starting table + m, // maximum lookup bits, returns actual + hp,// space for trees + hn,// hufts used in space + v // working area: values in order of bit length + ) { + // Given a list of code lengths and a maximum table size, make a set of + // tables to decode that set of codes. Return Z_OK on success, + // Z_BUF_ERROR + // if the given code set is incomplete (the tables are still built in + // this + // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set + // of + // lengths), or Z_MEM_ERROR if not enough memory. + + var a; // counter for codes of length k + var f; // i repeats in table every f entries + var g; // maximum code length + var h; // table level + var i; // counter, current code + var j; // counter + var k; // number of bits in current code + var l; // bits per table (returned in m) + var mask; // (1 << w) - 1, to avoid cc -O bug on HP + var p; // pointer into c[], b[], or v[] + var q; // points to current table + var w; // bits before this table == (l * h) + var xp; // pointer into x + var y; // number of dummy codes added + var z; // number of entries in current table + + // Generate counts for each bit length + + p = 0; + i = n; + do { + c[b[bindex + p]]++; + p++; + i--; // assume all entries <= BMAX + } while (i !== 0); + + if (c[0] == n) { // null input--all zero length codes + t[0] = -1; + m[0] = 0; + return Z_OK; + } + + // Find minimum and maximum length, bound *m by those + l = m[0]; + for (j = 1; j <= BMAX; j++) + if (c[j] !== 0) + break; + k = j; // minimum code length + if (l < j) { + l = j; + } + for (i = BMAX; i !== 0; i--) { + if (c[i] !== 0) + break; + } + g = i; // maximum code length + if (l > i) { + l = i; + } + m[0] = l; + + // Adjust last length count to fill out codes, if needed + for (y = 1 << j; j < i; j++, y <<= 1) { + if ((y -= c[j]) < 0) { + return Z_DATA_ERROR; + } + } + if ((y -= c[i]) < 0) { + return Z_DATA_ERROR; + } + c[i] += y; + + // Generate starting offsets into the value table for each length + x[1] = j = 0; + p = 1; + xp = 2; + while (--i !== 0) { // note that i == g from above + x[xp] = (j += c[p]); + xp++; + p++; + } + + // Make a table of values in order of bit lengths + i = 0; + p = 0; + do { + if ((j = b[bindex + p]) !== 0) { + v[x[j]++] = i; + } + p++; + } while (++i < n); + n = x[g]; // set n to length of v + + // Generate the Huffman codes and for each, make the table entries + x[0] = i = 0; // first Huffman code is zero + p = 0; // grab values in bit order + h = -1; // no tables yet--level -1 + w = -l; // bits decoded == (l * h) + u[0] = 0; // just to keep compilers happy + q = 0; // ditto + z = 0; // ditto + + // go through the bit lengths (k already is bits in shortest code) + for (; k <= g; k++) { + a = c[k]; + while (a-- !== 0) { + // here i is the Huffman code of length k bits for value *p + // make tables up to required level + while (k > w + l) { + h++; + w += l; // previous table always l bits + // compute minimum size table less than or equal to l bits + z = g - w; + z = (z > l) ? l : z; // table size upper limit + if ((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table + // too few codes for + // k-w bit table + f -= a + 1; // deduct codes from patterns left + xp = k; + if (j < z) { + while (++j < z) { // try smaller tables up to z bits + if ((f <<= 1) <= c[++xp]) + break; // enough codes to use up j bits + f -= c[xp]; // else deduct codes from patterns + } + } + } + z = 1 << j; // table entries for j-bit table + + // allocate new table + if (hn[0] + z > MANY) { // (note: doesn't matter for fixed) + return Z_DATA_ERROR; // overflow of MANY + } + u[h] = q = /* hp+ */hn[0]; // DEBUG + hn[0] += z; + + // connect to last table, if there is one + if (h !== 0) { + x[h] = i; // save pattern for backing up + r[0] = /* (byte) */j; // bits in this table + r[1] = /* (byte) */l; // bits to dump before this table + j = i >>> (w - l); + r[2] = /* (int) */(q - u[h - 1] - j); // offset to this table + hp.set(r, (u[h - 1] + j) * 3); + // to + // last + // table + } else { + t[0] = q; // first table is returned result + } + } + + // set up table entry in r + r[1] = /* (byte) */(k - w); + if (p >= n) { + r[0] = 128 + 64; // out of values--invalid code + } else if (v[p] < s) { + r[0] = /* (byte) */(v[p] < 256 ? 0 : 32 + 64); // 256 is + // end-of-block + r[2] = v[p++]; // simple code is just the value + } else { + r[0] = /* (byte) */(e[v[p] - s] + 16 + 64); // non-simple--look + // up in lists + r[2] = d[v[p++] - s]; + } + + // fill code-like entries with r + f = 1 << (k - w); + for (j = i >>> w; j < z; j += f) { + hp.set(r, (q + j) * 3); + } + + // backwards increment the k-bit code i + for (j = 1 << (k - 1); (i & j) !== 0; j >>>= 1) { + i ^= j; + } + i ^= j; + + // backup over finished tables + mask = (1 << w) - 1; // needed on HP, cc -O bug + while ((i & mask) != x[h]) { + h--; // don't need to update q + w -= l; + mask = (1 << w) - 1; + } + } + } + // Return Z_BUF_ERROR if we were given an incomplete table + return y !== 0 && g != 1 ? Z_BUF_ERROR : Z_OK; + } + + function initWorkArea(vsize) { + var i; + if (!hn) { + hn = []; // []; //new Array(1); + v = []; // new Array(vsize); + c = new Int32Array(BMAX + 1); // new Array(BMAX + 1); + r = []; // new Array(3); + u = new Int32Array(BMAX); // new Array(BMAX); + x = new Int32Array(BMAX + 1); // new Array(BMAX + 1); + } + if (v.length < vsize) { + v = []; // new Array(vsize); + } + for (i = 0; i < vsize; i++) { + v[i] = 0; + } + for (i = 0; i < BMAX + 1; i++) { + c[i] = 0; + } + for (i = 0; i < 3; i++) { + r[i] = 0; + } + // for(int i=0; i 257)) { + if (result == Z_DATA_ERROR) { + z.msg = "oversubscribed distance tree"; + } else if (result == Z_BUF_ERROR) { + z.msg = "incomplete distance tree"; + result = Z_DATA_ERROR; + } else if (result != Z_MEM_ERROR) { + z.msg = "empty distance tree with lengths"; + result = Z_DATA_ERROR; + } + return result; + } + + return Z_OK; + }; + + } + + InfTree.inflate_trees_fixed = function(bl, // literal desired/actual bit depth + bd, // distance desired/actual bit depth + tl,// literal/length tree result + td// distance tree result + ) { + bl[0] = fixed_bl; + bd[0] = fixed_bd; + tl[0] = fixed_tl; + td[0] = fixed_td; + return Z_OK; + }; + + // InfCodes + + // waiting for "i:"=input, + // "o:"=output, + // "x:"=nothing + var START = 0; // x: set up for LEN + var LEN = 1; // i: get length/literal/eob next + var LENEXT = 2; // i: getting length extra (have base) + var DIST = 3; // i: get distance next + var DISTEXT = 4;// i: getting distance extra + var COPY = 5; // o: copying bytes in window, waiting + // for space + var LIT = 6; // o: got literal, waiting for output + // space + var WASH = 7; // o: got eob, possibly still output + // waiting + var END = 8; // x: got eob and all data flushed + var BADCODE = 9;// x: got error + + function InfCodes() { + var that = this; + + var mode; // current inflate_codes mode + + // mode dependent information + var len = 0; + + var tree; // pointer into tree + var tree_index = 0; + var need = 0; // bits needed + + var lit = 0; + + // if EXT or COPY, where and how much + var get = 0; // bits to get for extra + var dist = 0; // distance back to copy from + + var lbits = 0; // ltree bits decoded per branch + var dbits = 0; // dtree bits decoder per branch + var ltree; // literal/length/eob tree + var ltree_index = 0; // literal/length/eob tree + var dtree; // distance tree + var dtree_index = 0; // distance tree + + // Called with number of bytes left to write in window at least 258 + // (the maximum string length) and number of input bytes available + // at least ten. The ten bytes are six bytes for the longest length/ + // distance pair plus four bytes for overloading the bit buffer. + + function inflate_fast(bl, bd, tl, tl_index, td, td_index, s, z) { + var t; // temporary pointer + var tp; // temporary pointer + var tp_index; // temporary pointer + var e; // extra bits or operation + var b; // bit buffer + var k; // bits in bit buffer + var p; // input data pointer + var n; // bytes available there + var q; // output window write pointer + var m; // bytes to end of window or read pointer + var ml; // mask for literal/length tree + var md; // mask for distance tree + var c; // bytes to copy + var d; // distance back to copy from + var r; // copy source pointer + + var tp_index_t_3; // (tp_index+t)*3 + + // load input, output, bit values + p = z.next_in_index; + n = z.avail_in; + b = s.bitb; + k = s.bitk; + q = s.write; + m = q < s.read ? s.read - q - 1 : s.end - q; + + // initialize masks + ml = inflate_mask[bl]; + md = inflate_mask[bd]; + + // do until not enough input or output space for fast loop + do { // assume called with m >= 258 && n >= 10 + // get literal/length code + while (k < (20)) { // max bits for literal/length code + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + t = b & ml; + tp = tl; + tp_index = tl_index; + tp_index_t_3 = (tp_index + t) * 3; + if ((e = tp[tp_index_t_3]) === 0) { + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); + + s.window[q++] = /* (byte) */tp[tp_index_t_3 + 2]; + m--; + continue; + } + do { + + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); + + if ((e & 16) !== 0) { + e &= 15; + c = tp[tp_index_t_3 + 2] + (/* (int) */b & inflate_mask[e]); + + b >>= e; + k -= e; + + // decode distance base of block to copy + while (k < (15)) { // max bits for distance code + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + t = b & md; + tp = td; + tp_index = td_index; + tp_index_t_3 = (tp_index + t) * 3; + e = tp[tp_index_t_3]; + + do { + + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); + + if ((e & 16) !== 0) { + // get extra bits to add to distance base + e &= 15; + while (k < (e)) { // get extra bits (up to 13) + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + d = tp[tp_index_t_3 + 2] + (b & inflate_mask[e]); + + b >>= (e); + k -= (e); + + // do the copy + m -= c; + if (q >= d) { // offset before dest + // just copy + r = q - d; + if (q - r > 0 && 2 > (q - r)) { + s.window[q++] = s.window[r++]; // minimum + // count is + // three, + s.window[q++] = s.window[r++]; // so unroll + // loop a + // little + c -= 2; + } else { + s.window.set(s.window.subarray(r, r + 2), q); + q += 2; + r += 2; + c -= 2; + } + } else { // else offset after destination + r = q - d; + do { + r += s.end; // force pointer in window + } while (r < 0); // covers invalid distances + e = s.end - r; + if (c > e) { // if source crosses, + c -= e; // wrapped copy + if (q - r > 0 && e > (q - r)) { + do { + s.window[q++] = s.window[r++]; + } while (--e !== 0); + } else { + s.window.set(s.window.subarray(r, r + e), q); + q += e; + r += e; + e = 0; + } + r = 0; // copy rest from start of window + } + + } + + // copy all or what's left + if (q - r > 0 && c > (q - r)) { + do { + s.window[q++] = s.window[r++]; + } while (--c !== 0); + } else { + s.window.set(s.window.subarray(r, r + c), q); + q += c; + r += c; + c = 0; + } + break; + } else if ((e & 64) === 0) { + t += tp[tp_index_t_3 + 2]; + t += (b & inflate_mask[e]); + tp_index_t_3 = (tp_index + t) * 3; + e = tp[tp_index_t_3]; + } else { + z.msg = "invalid distance code"; + + c = z.avail_in - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= c << 3; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + + return Z_DATA_ERROR; + } + } while (true); + break; + } + + if ((e & 64) === 0) { + t += tp[tp_index_t_3 + 2]; + t += (b & inflate_mask[e]); + tp_index_t_3 = (tp_index + t) * 3; + if ((e = tp[tp_index_t_3]) === 0) { + + b >>= (tp[tp_index_t_3 + 1]); + k -= (tp[tp_index_t_3 + 1]); + + s.window[q++] = /* (byte) */tp[tp_index_t_3 + 2]; + m--; + break; + } + } else if ((e & 32) !== 0) { + + c = z.avail_in - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= c << 3; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + + return Z_STREAM_END; + } else { + z.msg = "invalid literal/length code"; + + c = z.avail_in - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= c << 3; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + + return Z_DATA_ERROR; + } + } while (true); + } while (m >= 258 && n >= 10); + + // not enough input or output--restore pointers and return + c = z.avail_in - n; + c = (k >> 3) < c ? k >> 3 : c; + n += c; + p -= c; + k -= c << 3; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + + return Z_OK; + } + + that.init = function(bl, bd, tl, tl_index, td, td_index) { + mode = START; + lbits = /* (byte) */bl; + dbits = /* (byte) */bd; + ltree = tl; + ltree_index = tl_index; + dtree = td; + dtree_index = td_index; + tree = null; + }; + + that.proc = function(s, z, r) { + var j; // temporary storage + var tindex; // temporary pointer + var e; // extra bits or operation + var b = 0; // bit buffer + var k = 0; // bits in bit buffer + var p = 0; // input data pointer + var n; // bytes available there + var q; // output window write pointer + var m; // bytes to end of window or read pointer + var f; // pointer to copy strings from + + // copy input/output information to locals (UPDATE macro restores) + p = z.next_in_index; + n = z.avail_in; + b = s.bitb; + k = s.bitk; + q = s.write; + m = q < s.read ? s.read - q - 1 : s.end - q; + + // process input and output based on current state + while (true) { + switch (mode) { + // waiting for "i:"=input, "o:"=output, "x:"=nothing + case START: // x: set up for LEN + if (m >= 258 && n >= 10) { + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + r = inflate_fast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, s, z); + + p = z.next_in_index; + n = z.avail_in; + b = s.bitb; + k = s.bitk; + q = s.write; + m = q < s.read ? s.read - q - 1 : s.end - q; + + if (r != Z_OK) { + mode = r == Z_STREAM_END ? WASH : BADCODE; + break; + } + } + need = lbits; + tree = ltree; + tree_index = ltree_index; + + mode = LEN; + /* falls through */ + case LEN: // i: get length/literal/eob next + j = need; + + while (k < (j)) { + if (n !== 0) + r = Z_OK; + else { + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + tindex = (tree_index + (b & inflate_mask[j])) * 3; + + b >>>= (tree[tindex + 1]); + k -= (tree[tindex + 1]); + + e = tree[tindex]; + + if (e === 0) { // literal + lit = tree[tindex + 2]; + mode = LIT; + break; + } + if ((e & 16) !== 0) { // length + get = e & 15; + len = tree[tindex + 2]; + mode = LENEXT; + break; + } + if ((e & 64) === 0) { // next table + need = e; + tree_index = tindex / 3 + tree[tindex + 2]; + break; + } + if ((e & 32) !== 0) { // end of block + mode = WASH; + break; + } + mode = BADCODE; // invalid code + z.msg = "invalid literal/length code"; + r = Z_DATA_ERROR; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + case LENEXT: // i: getting length extra (have base) + j = get; + + while (k < (j)) { + if (n !== 0) + r = Z_OK; + else { + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + len += (b & inflate_mask[j]); + + b >>= j; + k -= j; + + need = dbits; + tree = dtree; + tree_index = dtree_index; + mode = DIST; + /* falls through */ + case DIST: // i: get distance next + j = need; + + while (k < (j)) { + if (n !== 0) + r = Z_OK; + else { + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + tindex = (tree_index + (b & inflate_mask[j])) * 3; + + b >>= tree[tindex + 1]; + k -= tree[tindex + 1]; + + e = (tree[tindex]); + if ((e & 16) !== 0) { // distance + get = e & 15; + dist = tree[tindex + 2]; + mode = DISTEXT; + break; + } + if ((e & 64) === 0) { // next table + need = e; + tree_index = tindex / 3 + tree[tindex + 2]; + break; + } + mode = BADCODE; // invalid code + z.msg = "invalid distance code"; + r = Z_DATA_ERROR; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + case DISTEXT: // i: getting distance extra + j = get; + + while (k < (j)) { + if (n !== 0) + r = Z_OK; + else { + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + dist += (b & inflate_mask[j]); + + b >>= j; + k -= j; + + mode = COPY; + /* falls through */ + case COPY: // o: copying bytes in window, waiting for space + f = q - dist; + while (f < 0) { // modulo window size-"while" instead + f += s.end; // of "if" handles invalid distances + } + while (len !== 0) { + + if (m === 0) { + if (q == s.end && s.read !== 0) { + q = 0; + m = q < s.read ? s.read - q - 1 : s.end - q; + } + if (m === 0) { + s.write = q; + r = s.inflate_flush(z, r); + q = s.write; + m = q < s.read ? s.read - q - 1 : s.end - q; + + if (q == s.end && s.read !== 0) { + q = 0; + m = q < s.read ? s.read - q - 1 : s.end - q; + } + + if (m === 0) { + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + } + } + + s.window[q++] = s.window[f++]; + m--; + + if (f == s.end) + f = 0; + len--; + } + mode = START; + break; + case LIT: // o: got literal, waiting for output space + if (m === 0) { + if (q == s.end && s.read !== 0) { + q = 0; + m = q < s.read ? s.read - q - 1 : s.end - q; + } + if (m === 0) { + s.write = q; + r = s.inflate_flush(z, r); + q = s.write; + m = q < s.read ? s.read - q - 1 : s.end - q; + + if (q == s.end && s.read !== 0) { + q = 0; + m = q < s.read ? s.read - q - 1 : s.end - q; + } + if (m === 0) { + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + } + } + r = Z_OK; + + s.window[q++] = /* (byte) */lit; + m--; + + mode = START; + break; + case WASH: // o: got eob, possibly more output + if (k > 7) { // return unused byte, if any + k -= 8; + n++; + p--; // can always return one + } + + s.write = q; + r = s.inflate_flush(z, r); + q = s.write; + m = q < s.read ? s.read - q - 1 : s.end - q; + + if (s.read != s.write) { + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + mode = END; + /* falls through */ + case END: + r = Z_STREAM_END; + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + case BADCODE: // x: got error + + r = Z_DATA_ERROR; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + + default: + r = Z_STREAM_ERROR; + + s.bitb = b; + s.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + s.write = q; + return s.inflate_flush(z, r); + } + } + }; + + that.free = function() { + // ZFREE(z, c); + }; + + } + + // InfBlocks + + // Table for deflate from PKZIP's appnote.txt. + var border = [ // Order of the bit length code lengths + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; + + var TYPE = 0; // get type bits (3, including end bit) + var LENS = 1; // get lengths for stored + var STORED = 2;// processing stored block + var TABLE = 3; // get table lengths + var BTREE = 4; // get bit lengths tree for a dynamic + // block + var DTREE = 5; // get length, distance trees for a + // dynamic block + var CODES = 6; // processing fixed or dynamic block + var DRY = 7; // output remaining window bytes + var DONELOCKS = 8; // finished last block, done + var BADBLOCKS = 9; // ot a data error--stuck here + + function InfBlocks(z, w) { + var that = this; + + var mode = TYPE; // current inflate_block mode + + var left = 0; // if STORED, bytes left to copy + + var table = 0; // table lengths (14 bits) + var index = 0; // index into blens (or border) + var blens; // bit lengths of codes + var bb = [ 0 ]; // bit length tree depth + var tb = [ 0 ]; // bit length decoding tree + + var codes = new InfCodes(); // if CODES, current state + + var last = 0; // true if this block is the last block + + var hufts = new Int32Array(MANY * 3); // single malloc for tree space + var check = 0; // check on output + var inftree = new InfTree(); + + that.bitk = 0; // bits in bit buffer + that.bitb = 0; // bit buffer + that.window = new Uint8Array(w); // sliding window + that.end = w; // one byte after sliding window + that.read = 0; // window read pointer + that.write = 0; // window write pointer + + that.reset = function(z, c) { + if (c) + c[0] = check; + // if (mode == BTREE || mode == DTREE) { + // } + if (mode == CODES) { + codes.free(z); + } + mode = TYPE; + that.bitk = 0; + that.bitb = 0; + that.read = that.write = 0; + }; + + that.reset(z, null); + + // copy as much as possible from the sliding window to the output area + that.inflate_flush = function(z, r) { + var n; + var p; + var q; + + // local copies of source and destination pointers + p = z.next_out_index; + q = that.read; + + // compute number of bytes to copy as far as end of window + n = /* (int) */((q <= that.write ? that.write : that.end) - q); + if (n > z.avail_out) + n = z.avail_out; + if (n !== 0 && r == Z_BUF_ERROR) + r = Z_OK; + + // update counters + z.avail_out -= n; + z.total_out += n; + + // copy as far as end of window + z.next_out.set(that.window.subarray(q, q + n), p); + p += n; + q += n; + + // see if more to copy at beginning of window + if (q == that.end) { + // wrap pointers + q = 0; + if (that.write == that.end) + that.write = 0; + + // compute bytes to copy + n = that.write - q; + if (n > z.avail_out) + n = z.avail_out; + if (n !== 0 && r == Z_BUF_ERROR) + r = Z_OK; + + // update counters + z.avail_out -= n; + z.total_out += n; + + // copy + z.next_out.set(that.window.subarray(q, q + n), p); + p += n; + q += n; + } + + // update pointers + z.next_out_index = p; + that.read = q; + + // done + return r; + }; + + that.proc = function(z, r) { + var t; // temporary storage + var b; // bit buffer + var k; // bits in bit buffer + var p; // input data pointer + var n; // bytes available there + var q; // output window write pointer + var m; // bytes to end of window or read pointer + + var i; + + // copy input/output information to locals (UPDATE macro restores) + // { + p = z.next_in_index; + n = z.avail_in; + b = that.bitb; + k = that.bitk; + // } + // { + q = that.write; + m = /* (int) */(q < that.read ? that.read - q - 1 : that.end - q); + // } + + // process input based on current state + // DEBUG dtree + while (true) { + switch (mode) { + case TYPE: + + while (k < (3)) { + if (n !== 0) { + r = Z_OK; + } else { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + t = /* (int) */(b & 7); + last = t & 1; + + switch (t >>> 1) { + case 0: // stored + // { + b >>>= (3); + k -= (3); + // } + t = k & 7; // go to byte boundary + + // { + b >>>= (t); + k -= (t); + // } + mode = LENS; // get length of stored block + break; + case 1: // fixed + // { + var bl = []; // new Array(1); + var bd = []; // new Array(1); + var tl = [ [] ]; // new Array(1); + var td = [ [] ]; // new Array(1); + + InfTree.inflate_trees_fixed(bl, bd, tl, td); + codes.init(bl[0], bd[0], tl[0], 0, td[0], 0); + // } + + // { + b >>>= (3); + k -= (3); + // } + + mode = CODES; + break; + case 2: // dynamic + + // { + b >>>= (3); + k -= (3); + // } + + mode = TABLE; + break; + case 3: // illegal + + // { + b >>>= (3); + k -= (3); + // } + mode = BADBLOCKS; + z.msg = "invalid block type"; + r = Z_DATA_ERROR; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + break; + case LENS: + + while (k < (32)) { + if (n !== 0) { + r = Z_OK; + } else { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + if ((((~b) >>> 16) & 0xffff) != (b & 0xffff)) { + mode = BADBLOCKS; + z.msg = "invalid stored block lengths"; + r = Z_DATA_ERROR; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + left = (b & 0xffff); + b = k = 0; // dump bits + mode = left !== 0 ? STORED : (last !== 0 ? DRY : TYPE); + break; + case STORED: + if (n === 0) { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + + if (m === 0) { + if (q == that.end && that.read !== 0) { + q = 0; + m = /* (int) */(q < that.read ? that.read - q - 1 : that.end - q); + } + if (m === 0) { + that.write = q; + r = that.inflate_flush(z, r); + q = that.write; + m = /* (int) */(q < that.read ? that.read - q - 1 : that.end - q); + if (q == that.end && that.read !== 0) { + q = 0; + m = /* (int) */(q < that.read ? that.read - q - 1 : that.end - q); + } + if (m === 0) { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + } + } + r = Z_OK; + + t = left; + if (t > n) + t = n; + if (t > m) + t = m; + that.window.set(z.read_buf(p, t), q); + p += t; + n -= t; + q += t; + m -= t; + if ((left -= t) !== 0) + break; + mode = last !== 0 ? DRY : TYPE; + break; + case TABLE: + + while (k < (14)) { + if (n !== 0) { + r = Z_OK; + } else { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + table = t = (b & 0x3fff); + if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) { + mode = BADBLOCKS; + z.msg = "too many length or distance symbols"; + r = Z_DATA_ERROR; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); + if (!blens || blens.length < t) { + blens = []; // new Array(t); + } else { + for (i = 0; i < t; i++) { + blens[i] = 0; + } + } + + // { + b >>>= (14); + k -= (14); + // } + + index = 0; + mode = BTREE; + /* falls through */ + case BTREE: + while (index < 4 + (table >>> 10)) { + while (k < (3)) { + if (n !== 0) { + r = Z_OK; + } else { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + blens[border[index++]] = b & 7; + + // { + b >>>= (3); + k -= (3); + // } + } + + while (index < 19) { + blens[border[index++]] = 0; + } + + bb[0] = 7; + t = inftree.inflate_trees_bits(blens, bb, tb, hufts, z); + if (t != Z_OK) { + r = t; + if (r == Z_DATA_ERROR) { + blens = null; + mode = BADBLOCKS; + } + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + + index = 0; + mode = DTREE; + /* falls through */ + case DTREE: + while (true) { + t = table; + if (index >= 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) { + break; + } + + var j, c; + + t = bb[0]; + + while (k < (t)) { + if (n !== 0) { + r = Z_OK; + } else { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + // if (tb[0] == -1) { + // System.err.println("null..."); + // } + + t = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 1]; + c = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 2]; + + if (c < 16) { + b >>>= (t); + k -= (t); + blens[index++] = c; + } else { // c == 16..18 + i = c == 18 ? 7 : c - 14; + j = c == 18 ? 11 : 3; + + while (k < (t + i)) { + if (n !== 0) { + r = Z_OK; + } else { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + n--; + b |= (z.read_byte(p++) & 0xff) << k; + k += 8; + } + + b >>>= (t); + k -= (t); + + j += (b & inflate_mask[i]); + + b >>>= (i); + k -= (i); + + i = index; + t = table; + if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) { + blens = null; + mode = BADBLOCKS; + z.msg = "invalid bit length repeat"; + r = Z_DATA_ERROR; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + + c = c == 16 ? blens[i - 1] : 0; + do { + blens[i++] = c; + } while (--j !== 0); + index = i; + } + } + + tb[0] = -1; + // { + var bl_ = []; // new Array(1); + var bd_ = []; // new Array(1); + var tl_ = []; // new Array(1); + var td_ = []; // new Array(1); + bl_[0] = 9; // must be <= 9 for lookahead assumptions + bd_[0] = 6; // must be <= 9 for lookahead assumptions + + t = table; + t = inftree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl_, bd_, tl_, td_, hufts, z); + + if (t != Z_OK) { + if (t == Z_DATA_ERROR) { + blens = null; + mode = BADBLOCKS; + } + r = t; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + codes.init(bl_[0], bd_[0], hufts, tl_[0], hufts, td_[0]); + // } + mode = CODES; + /* falls through */ + case CODES: + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + + if ((r = codes.proc(that, z, r)) != Z_STREAM_END) { + return that.inflate_flush(z, r); + } + r = Z_OK; + codes.free(z); + + p = z.next_in_index; + n = z.avail_in; + b = that.bitb; + k = that.bitk; + q = that.write; + m = /* (int) */(q < that.read ? that.read - q - 1 : that.end - q); + + if (last === 0) { + mode = TYPE; + break; + } + mode = DRY; + /* falls through */ + case DRY: + that.write = q; + r = that.inflate_flush(z, r); + q = that.write; + m = /* (int) */(q < that.read ? that.read - q - 1 : that.end - q); + if (that.read != that.write) { + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + mode = DONELOCKS; + /* falls through */ + case DONELOCKS: + r = Z_STREAM_END; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + case BADBLOCKS: + r = Z_DATA_ERROR; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + + default: + r = Z_STREAM_ERROR; + + that.bitb = b; + that.bitk = k; + z.avail_in = n; + z.total_in += p - z.next_in_index; + z.next_in_index = p; + that.write = q; + return that.inflate_flush(z, r); + } + } + }; + + that.free = function(z) { + that.reset(z, null); + that.window = null; + hufts = null; + // ZFREE(z, s); + }; + + that.set_dictionary = function(d, start, n) { + that.window.set(d.subarray(start, start + n), 0); + that.read = that.write = n; + }; + + // Returns true if inflate is currently at the end of a block generated + // by Z_SYNC_FLUSH or Z_FULL_FLUSH. + that.sync_point = function() { + return mode == LENS ? 1 : 0; + }; + + } + + // Inflate + + // preset dictionary flag in zlib header + var PRESET_DICT = 0x20; + + var Z_DEFLATED = 8; + + var METHOD = 0; // waiting for method byte + var FLAG = 1; // waiting for flag byte + var DICT4 = 2; // four dictionary check bytes to go + var DICT3 = 3; // three dictionary check bytes to go + var DICT2 = 4; // two dictionary check bytes to go + var DICT1 = 5; // one dictionary check byte to go + var DICT0 = 6; // waiting for inflateSetDictionary + var BLOCKS = 7; // decompressing blocks + var DONE = 12; // finished check, done + var BAD = 13; // got an error--stay here + + var mark = [ 0, 0, 0xff, 0xff ]; + + function Inflate() { + var that = this; + + that.mode = 0; // current inflate mode + + // mode dependent information + that.method = 0; // if FLAGS, method byte + + // if CHECK, check values to compare + that.was = [ 0 ]; // new Array(1); // computed check value + that.need = 0; // stream check value + + // if BAD, inflateSync's marker bytes count + that.marker = 0; + + // mode independent information + that.wbits = 0; // log2(window size) (8..15, defaults to 15) + + // this.blocks; // current inflate_blocks state + + function inflateReset(z) { + if (!z || !z.istate) + return Z_STREAM_ERROR; + + z.total_in = z.total_out = 0; + z.msg = null; + z.istate.mode = BLOCKS; + z.istate.blocks.reset(z, null); + return Z_OK; + } + + that.inflateEnd = function(z) { + if (that.blocks) + that.blocks.free(z); + that.blocks = null; + // ZFREE(z, z->state); + return Z_OK; + }; + + that.inflateInit = function(z, w) { + z.msg = null; + that.blocks = null; + + // set window size + if (w < 8 || w > 15) { + that.inflateEnd(z); + return Z_STREAM_ERROR; + } + that.wbits = w; + + z.istate.blocks = new InfBlocks(z, 1 << w); + + // reset state + inflateReset(z); + return Z_OK; + }; + + that.inflate = function(z, f) { + var r; + var b; + + if (!z || !z.istate || !z.next_in) + return Z_STREAM_ERROR; + f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; + r = Z_BUF_ERROR; + while (true) { + // System.out.println("mode: "+z.istate.mode); + switch (z.istate.mode) { + case METHOD: + + if (z.avail_in === 0) + return r; + r = f; + + z.avail_in--; + z.total_in++; + if (((z.istate.method = z.read_byte(z.next_in_index++)) & 0xf) != Z_DEFLATED) { + z.istate.mode = BAD; + z.msg = "unknown compression method"; + z.istate.marker = 5; // can't try inflateSync + break; + } + if ((z.istate.method >> 4) + 8 > z.istate.wbits) { + z.istate.mode = BAD; + z.msg = "invalid window size"; + z.istate.marker = 5; // can't try inflateSync + break; + } + z.istate.mode = FLAG; + /* falls through */ + case FLAG: + + if (z.avail_in === 0) + return r; + r = f; + + z.avail_in--; + z.total_in++; + b = (z.read_byte(z.next_in_index++)) & 0xff; + + if ((((z.istate.method << 8) + b) % 31) !== 0) { + z.istate.mode = BAD; + z.msg = "incorrect header check"; + z.istate.marker = 5; // can't try inflateSync + break; + } + + if ((b & PRESET_DICT) === 0) { + z.istate.mode = BLOCKS; + break; + } + z.istate.mode = DICT4; + /* falls through */ + case DICT4: + + if (z.avail_in === 0) + return r; + r = f; + + z.avail_in--; + z.total_in++; + z.istate.need = ((z.read_byte(z.next_in_index++) & 0xff) << 24) & 0xff000000; + z.istate.mode = DICT3; + /* falls through */ + case DICT3: + + if (z.avail_in === 0) + return r; + r = f; + + z.avail_in--; + z.total_in++; + z.istate.need += ((z.read_byte(z.next_in_index++) & 0xff) << 16) & 0xff0000; + z.istate.mode = DICT2; + /* falls through */ + case DICT2: + + if (z.avail_in === 0) + return r; + r = f; + + z.avail_in--; + z.total_in++; + z.istate.need += ((z.read_byte(z.next_in_index++) & 0xff) << 8) & 0xff00; + z.istate.mode = DICT1; + /* falls through */ + case DICT1: + + if (z.avail_in === 0) + return r; + r = f; + + z.avail_in--; + z.total_in++; + z.istate.need += (z.read_byte(z.next_in_index++) & 0xff); + z.istate.mode = DICT0; + return Z_NEED_DICT; + case DICT0: + z.istate.mode = BAD; + z.msg = "need dictionary"; + z.istate.marker = 0; // can try inflateSync + return Z_STREAM_ERROR; + case BLOCKS: + + r = z.istate.blocks.proc(z, r); + if (r == Z_DATA_ERROR) { + z.istate.mode = BAD; + z.istate.marker = 0; // can try inflateSync + break; + } + if (r == Z_OK) { + r = f; + } + if (r != Z_STREAM_END) { + return r; + } + r = f; + z.istate.blocks.reset(z, z.istate.was); + z.istate.mode = DONE; + /* falls through */ + case DONE: + return Z_STREAM_END; + case BAD: + return Z_DATA_ERROR; + default: + return Z_STREAM_ERROR; + } + } + }; + + that.inflateSetDictionary = function(z, dictionary, dictLength) { + var index = 0; + var length = dictLength; + if (!z || !z.istate || z.istate.mode != DICT0) + return Z_STREAM_ERROR; + + if (length >= (1 << z.istate.wbits)) { + length = (1 << z.istate.wbits) - 1; + index = dictLength - length; + } + z.istate.blocks.set_dictionary(dictionary, index, length); + z.istate.mode = BLOCKS; + return Z_OK; + }; + + that.inflateSync = function(z) { + var n; // number of bytes to look at + var p; // pointer to bytes + var m; // number of marker bytes found in a row + var r, w; // temporaries to save total_in and total_out + + // set up + if (!z || !z.istate) + return Z_STREAM_ERROR; + if (z.istate.mode != BAD) { + z.istate.mode = BAD; + z.istate.marker = 0; + } + if ((n = z.avail_in) === 0) + return Z_BUF_ERROR; + p = z.next_in_index; + m = z.istate.marker; + + // search + while (n !== 0 && m < 4) { + if (z.read_byte(p) == mark[m]) { + m++; + } else if (z.read_byte(p) !== 0) { + m = 0; + } else { + m = 4 - m; + } + p++; + n--; + } + + // restore + z.total_in += p - z.next_in_index; + z.next_in_index = p; + z.avail_in = n; + z.istate.marker = m; + + // return no joy or set up to restart on a new block + if (m != 4) { + return Z_DATA_ERROR; + } + r = z.total_in; + w = z.total_out; + inflateReset(z); + z.total_in = r; + z.total_out = w; + z.istate.mode = BLOCKS; + return Z_OK; + }; + + // Returns true if inflate is currently at the end of a block generated + // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + // implementation to provide an additional safety check. PPP uses + // Z_SYNC_FLUSH + // but removes the length bytes of the resulting empty stored block. When + // decompressing, PPP checks that at the end of input packet, inflate is + // waiting for these length bytes. + that.inflateSyncPoint = function(z) { + if (!z || !z.istate || !z.istate.blocks) + return Z_STREAM_ERROR; + return z.istate.blocks.sync_point(); + }; + } + + // ZStream + + function ZStream() { + } + + ZStream.prototype = { + inflateInit : function(bits) { + var that = this; + that.istate = new Inflate(); + if (!bits) + bits = MAX_BITS; + return that.istate.inflateInit(that, bits); + }, + + inflate : function(f) { + var that = this; + if (!that.istate) + return Z_STREAM_ERROR; + return that.istate.inflate(that, f); + }, + + inflateEnd : function() { + var that = this; + if (!that.istate) + return Z_STREAM_ERROR; + var ret = that.istate.inflateEnd(that); + that.istate = null; + return ret; + }, + + inflateSync : function() { + var that = this; + if (!that.istate) + return Z_STREAM_ERROR; + return that.istate.inflateSync(that); + }, + inflateSetDictionary : function(dictionary, dictLength) { + var that = this; + if (!that.istate) + return Z_STREAM_ERROR; + return that.istate.inflateSetDictionary(that, dictionary, dictLength); + }, + read_byte : function(start) { + var that = this; + return that.next_in.subarray(start, start + 1)[0]; + }, + read_buf : function(start, size) { + var that = this; + return that.next_in.subarray(start, start + size); + } + }; + + // Inflater + + function Inflater() { + var that = this; + var z = new ZStream(); + var bufsize = 512; + var flush = Z_NO_FLUSH; + var buf = new Uint8Array(bufsize); + var nomoreinput = false; + + z.inflateInit(); + z.next_out = buf; + + that.append = function(data, onprogress) { + var err, buffers = [], lastIndex = 0, bufferIndex = 0, bufferSize = 0, array; + if (data.length === 0) + return; + z.next_in_index = 0; + z.next_in = data; + z.avail_in = data.length; + do { + z.next_out_index = 0; + z.avail_out = bufsize; + if ((z.avail_in === 0) && (!nomoreinput)) { // if buffer is empty and more input is available, refill it + z.next_in_index = 0; + nomoreinput = true; + } + err = z.inflate(flush); + if (nomoreinput && (err === Z_BUF_ERROR)) { + if (z.avail_in !== 0) + throw new Error("inflating: bad input"); + } else if (err !== Z_OK && err !== Z_STREAM_END) + throw new Error("inflating: " + z.msg); + if ((nomoreinput || err === Z_STREAM_END) && (z.avail_in === data.length)) + throw new Error("inflating: bad input"); + if (z.next_out_index) + if (z.next_out_index === bufsize) + buffers.push(new Uint8Array(buf)); + else + buffers.push(new Uint8Array(buf.subarray(0, z.next_out_index))); + bufferSize += z.next_out_index; + if (onprogress && z.next_in_index > 0 && z.next_in_index != lastIndex) { + onprogress(z.next_in_index); + lastIndex = z.next_in_index; + } + } while (z.avail_in > 0 || z.avail_out === 0); + array = new Uint8Array(bufferSize); + buffers.forEach(function(chunk) { + array.set(chunk, bufferIndex); + bufferIndex += chunk.length; + }); + return array; + }; + that.flush = function() { + z.inflateEnd(); + }; + } + + // 'zip' may not be defined in z-worker and some tests + var env = global.zip || global; + env.Inflater = env._jzlib_Inflater = Inflater; +})(this); diff --git a/libs/utils.js b/libs/utils.js index 059f48d6..8506a8b9 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -1166,6 +1166,54 @@ utils.prototype._export = function (floorIds) { console.log(content); } +utils.prototype.unzip = function (blobOrUrl, success, error, convertToText) { + var _error = function (msg) { + main.log(msg); + if (error) error(msg); + } + + if (!window.zip) { + return _error("zip.js not exists!"); + } + + if (typeof blobOrUrl == 'string') { + return core.http('GET', blobOrUrl, null, function (data) { + core.unzip(data, success, error, convertToText); + }, _error, 'application/zip', 'blob'); + } + + if (!(blobOrUrl instanceof Blob)) { + return _error("Should use Blob or URL as input"); + } + + zip.createReader(new zip.BlobReader(blobOrUrl), function (reader) { + reader.getEntries(function (entries) { + core.utils._unzip_readEntries(entries, function (data) { + reader.close(function () { + if (success) success(data); + }); + }, convertToText); + }); + }, _error); +} + +utils.prototype._unzip_readEntries = function (entries, success, convertToText) { + var results = {}; + if (entries == null) { + return success(results); + } + var length = entries.length; + entries.forEach(function (entry) { + entry.getData(convertToText ? new zip.TextWriter('utf8') : new zip.BlobWriter(), function (data) { + results[entry.filename] = data; + length--; + if (length == 0) { + success(results); + } + }); + }); +} + utils.prototype.http = function (type, url, formData, success, error, mimeType, responseType) { var xhr = new XMLHttpRequest(); xhr.open(type, url, true); @@ -1193,6 +1241,12 @@ utils.prototype.http = function (type, url, formData, success, error, mimeType, else xhr.send(); } +utils.prototype.httpAndZip = function (url, success, error) { + this.http('GET', url, null, function (data) { + + }, error, null, 'blob'); +} + // LZW-compress // https://gist.github.com/revolunet/843889 function lzw_encode(s) { From bb6ad9e6d0be56c6835750609c6990a0197d761c Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 25 Dec 2019 16:21:49 +0800 Subject: [PATCH 10/43] zip --- editor-mobile.html | 2 +- editor.html | 2 +- index.html | 2 +- libs/loader.js | 2 +- libs/thirdparty/zip.min.js | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 libs/thirdparty/zip.min.js diff --git a/editor-mobile.html b/editor-mobile.html index ba8ca496..e618eb19 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -585,7 +585,7 @@ - + - + - + diff --git a/libs/loader.js b/libs/loader.js index b7e265ae..9e23b0f5 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -209,7 +209,7 @@ loader.prototype._loadAnimates = function () { core.material.animates[t] = null; }, "text/plain; charset=x-user-defined") }) - }'application/zip' + } } loader.prototype._loadAnimate = function (name, content) { diff --git a/libs/thirdparty/zip.min.js b/libs/thirdparty/zip.min.js new file mode 100644 index 00000000..ad0d681f --- /dev/null +++ b/libs/thirdparty/zip.min.js @@ -0,0 +1 @@ +!function(g){"use strict";var a,y="File format is not recognized.",o="File contains encrypted entry.",l="File is using Zip64 (4gb+ file size).",d="Error while reading zip file.",e="Error while reading file data.",h=524288,f="text/plain";try{a=0===new Blob([new DataView(new ArrayBuffer(0))]).size}catch(t){}function i(){this.crc=-1}function _(){}function m(t,e){var i,n;return i=new ArrayBuffer(t),n=new Uint8Array(i),e&&n.set(e,0),{buffer:i,array:n,view:new DataView(i)}}function t(){}function n(n){var r,a=this;a.size=0,a.init=function(t,e){var i=new Blob([n],{type:f});(r=new s(i)).init(function(){a.size=r.size,t()},e)},a.readUint8Array=function(t,e,i,n){r.readUint8Array(t,e,i,n)}}function r(s){var _,i=this;i.size=0,i.init=function(t){for(var e=s.length;"="==s.charAt(e-1);)e--;_=s.indexOf(",")+1,i.size=Math.floor(.75*(e-_)),t()},i.readUint8Array=function(t,e,i){var n,r=m(e),a=4*Math.floor(t/3),o=4*Math.ceil((t+e)/3),l=g.atob(s.substring(a+_,o+_)),f=t-3*Math.floor(a/4);for(n=f;nt.size)throw new RangeError("offset:"+e+", length:"+i+", size:"+t.size);return t.slice?t.slice(e,e+i):t.webkitSlice?t.webkitSlice(e,e+i):t.mozSlice?t.mozSlice(e,e+i):t.msSlice?t.msSlice(e,e+i):void 0}(a,t,e))}catch(t){n(t)}}}function u(){}function c(n){var r;this.init=function(t){r=new Blob([],{type:f}),t()},this.writeUint8Array=function(t,e){r=new Blob([r,a?t:t.buffer],{type:f}),e()},this.getData=function(e,t){var i=new FileReader;i.onload=function(t){e(t.target.result)},i.onerror=t,i.readAsText(r,n)}}function b(e){var a="",o="";this.init=function(t){a+="data:"+(e||"")+";base64,",t()},this.writeUint8Array=function(t,e){var i,n=o.length,r=o;for(o="",i=0;i<3*Math.floor((n+t.length)/3)-n;i++)r+=String.fromCharCode(t[i]);for(;i>16,i=65535&t;try{return new Date(1980+((65024&e)>>9),((480&e)>>5)-1,31&e,(63488&i)>>11,(2016&i)>>5,2*(31&i),0)}catch(t){}}(t.lastModDateRaw),1!=(1&t.bitFlag)?(!n&&8==(8&t.bitFlag)||(t.crc32=e.view.getUint32(i+10,!0),t.compressedSize=e.view.getUint32(i+14,!0),t.uncompressedSize=e.view.getUint32(i+18,!0)),4294967295!==t.compressedSize&&4294967295!==t.uncompressedSize?(t.filenameLength=e.view.getUint16(i+22,!0),t.extraFieldLength=e.view.getUint16(i+24,!0)):r(l)):r(o)}function v(h,t,v){function _(){}_.prototype.getData=function(_,r,d,u){var c=this;function b(t,e){var i,n;u&&(i=e,(n=m(4)).view.setUint32(0,i),c.crc32!=n.view.getUint32(0))?v("CRC failed."):_.getData(function(t){r(t)})}function w(t){v(t||e)}function x(t){v(t||"Error while writing file data.")}h.readUint8Array(c.offset,30,function(t){var s,e=m(t.length,t);1347093252==e.view.getUint32(0)?(z(c,e,4,!1,v),s=c.offset+30+c.filenameLength+c.extraFieldLength,_.init(function(){var t,e,i,n,r,a,o,l,f;0===c.compressionMethod?p(0,h,_,s,c.compressedSize,0,b,d,w,x):(t=h,e=_,i=s,n=c.compressedSize,r=b,a=d,o=w,l=x,f=u?"output":"none",k(new g.zip.Inflater,t,e,i,n,f,a,r,o,l))},x)):v(y)},w)},t({getEntries:function(s){!function(n){var r=22;if(h.size=h.size?v(y):h.readUint8Array(e,h.size-e,function(t){var e,i,n,r,a=0,o=[],l=m(t.length,t);for(e=0;e>>8^i[255&(e^t[n])];this.crc=e},i.prototype.get=function(){return~this.crc},i.prototype.table=function(){var t,e,i,n=[];for(t=0;t<256;t++){for(i=t,e=0;e<8;e++)1&i?i=i>>>1^3988292384:i>>>=1;n[t]=i}return n}(),_.prototype.append=function(t){return t},_.prototype.flush=function(){},(n.prototype=new t).constructor=n,(r.prototype=new t).constructor=r,(s.prototype=new t).constructor=s,u.prototype.getData=function(t){t(this.data)},(c.prototype=new u).constructor=c,(b.prototype=new u).constructor=b,(w.prototype=new u).constructor=w,g.zip={Reader:t,Writer:u,BlobReader:s,Data64URIReader:r,TextReader:n,BlobWriter:w,Data64URIWriter:b,TextWriter:c,createReader:function(t,e,i){i=i||C,t.init(function(){v(t,e,i)},i)},createWriter:function(t,e,i,n){i=i||C,n=!!n,t.init(function(){F(t,e,i,n)},i)}}}(this),function(t){"use strict";var I=0,M=1,R=-2,L=-3,b=-4,B=-5,T=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],W=1440,r=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],a=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],w=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],x=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,112,112],h=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],v=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],C=15;function V(){var _,d,z,S,D,F;function u(t,e,i,n,r,a,o,l,f,s,_){var d,u,c,b,w,x,h,v,g,y,m,k,p,U,A;for(y=0,w=i;z[t[e+y]]++,y++,0!==--w;);if(z[0]==i)return o[0]=-1,l[0]=0,I;for(v=l[0],x=1;x<=C&&0===z[x];x++);for(v<(h=x)&&(v=x),w=C;0!==w&&0===z[w];w--);for((c=w)d+1&&(u-=d+1,p=h,xW)return L;D[b]=m=s[0],s[0]+=A,0!==b?(F[b]=w,S[0]=x,x=w>>>k-(S[1]=v),S[2]=m-D[b-1]-x,f.set(S,3*(D[b-1]+x))):o[0]=m}for(S[1]=h-k,i<=y?S[0]=192:_[y]>>k;x>>=1)w^=x;for(w^=x,g=(1<>=s[p+1],c-=s[p+1],0!=(16&d)){for(d&=15,y=s[p+2]+(u&T[d]),u>>=d,c-=d;c<15;)w--,u|=(255&l.read_byte(b++))<>=s[p+1],c-=s[p+1],0!=(16&d)){for(d&=15;c>=d,c-=d,h-=y,m<=x)0>3<(y=l.avail_in-w)?c>>3:y,b-=y,c-=y<<3,o.bitb=u,o.bitk=c,l.avail_in=w,l.total_in+=b-l.next_in_index,l.next_in_index=b,o.write=x,L;f+=s[p+2],d=s[p=3*(_+(f+=u&T[d]))]}break}if(0!=(64&d))return 0!=(32&d)?(w+=y=c>>3<(y=l.avail_in-w)?c>>3:y,b-=y,c-=y<<3,o.bitb=u,o.bitk=c,l.avail_in=w,l.total_in+=b-l.next_in_index,l.next_in_index=b,o.write=x,M):(l.msg="invalid literal/length code",w+=y=c>>3<(y=l.avail_in-w)?c>>3:y,b-=y,c-=y<<3,o.bitb=u,o.bitk=c,l.avail_in=w,l.total_in+=b-l.next_in_index,l.next_in_index=b,o.write=x,L);if(f+=s[p+2],0===(d=s[p=3*(_+(f+=u&T[d]))])){u>>=s[p+1],c-=s[p+1],o.window[x++]=s[p+2],h--;break}}else u>>=s[p+1],c-=s[p+1],o.window[x++]=s[p+2],h--}while(258<=h&&10<=w);return w+=y=c>>3<(y=l.avail_in-w)?c>>3:y,b-=y,c-=y<<3,o.bitb=u,o.bitk=c,l.avail_in=w,l.total_in+=b-l.next_in_index,l.next_in_index=b,o.write=x,I}this.init=function(t,e,i,n,r,a){c=D,p=t,U=e,w=i,A=n,x=r,z=a,b=null},this.proc=function(t,e,i){var n,r,a,o,l,f,s,_=0,d=0,u=0;for(u=e.next_in_index,o=e.avail_in,_=t.bitb,d=t.bitk,f=(l=t.write)>>=b[r+1],d-=b[r+1],0===(a=b[r])){y=b[r+2],c=H;break}if(0!=(16&a)){m=15&a,h=b[r+2],c=E;break}if(0==(64&a)){g=a,v=r/3+b[r+2];break}if(0==(32&a))return c=q,e.msg="invalid literal/length code",i=L,t.bitb=_,t.bitk=d,e.avail_in=o,e.total_in+=u-e.next_in_index,e.next_in_index=u,t.write=l,t.inflate_flush(e,i);c=Y;break;case E:for(n=m;d>=n,d-=n,g=U,b=x,v=z,c=O;case O:for(n=g;d>=b[r+1],d-=b[r+1],0!=(16&(a=b[r]))){m=15&a,k=b[r+2],c=P;break}if(0!=(64&a))return c=q,e.msg="invalid distance code",i=L,t.bitb=_,t.bitk=d,e.avail_in=o,e.total_in+=u-e.next_in_index,e.next_in_index=u,t.write=l,t.inflate_flush(e,i);g=a,v=r/3+b[r+2];break;case P:for(n=m;d>=n,d-=n,c=j;case j:for(s=l-k;s<0;)s+=t.end;for(;0!==h;){if(0===f&&(l==t.end&&0!==t.read&&(f=(l=0)t.avail_out&&(i=t.avail_out),0!==i&&e==B&&(e=I),t.avail_out-=i,t.total_out+=i,t.next_out.set(m.window.subarray(r,r+i),n),n+=i,(r+=i)==m.end&&(r=0,m.write==m.end&&(m.write=0),(i=m.write-r)>t.avail_out&&(i=t.avail_out),0!==i&&e==B&&(e=I),t.avail_out-=i,t.total_out+=i,t.next_out.set(m.window.subarray(r,r+i),n),n+=i,r+=i),t.next_out_index=n,m.read=r,e},m.proc=function(t,e){var i,n,r,a,o,l,f,s;for(a=t.next_in_index,o=t.avail_in,n=m.bitb,r=m.bitk,f=(l=m.write)>>1){case 0:n>>>=3,n>>>=i=7&(r-=3),r-=i,k=K;break;case 1:var _=[],d=[],u=[[]],c=[[]];V.inflate_trees_fixed(_,d,u,c),D.init(_[0],d[0],u[0],0,c[0],0),n>>>=3,r-=3,k=tt;break;case 2:n>>>=3,r-=3,k=Q;break;case 3:return n>>>=3,r-=3,k=nt,t.msg="invalid block type",e=L,m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e)}break;case K:for(;r<32;){if(0===o)return m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);e=I,o--,n|=(255&t.read_byte(a++))<>>16&65535)!=(65535&n))return k=nt,t.msg="invalid stored block lengths",e=L,m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);p=65535&n,n=r=0,k=0!==p?N:0!==F?et:J;break;case N:if(0===o)return m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);if(0===f&&(l==m.end&&0!==m.read&&(f=(l=0)>5&31))return k=nt,t.msg="too many length or distance symbols",e=L,m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);if(i=258+(31&i)+(i>>5&31),!y||y.length>>=14,r-=14,A=0,k=X;case X:for(;A<4+(U>>>10);){for(;r<3;){if(0===o)return m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);e=I,o--,n|=(255&t.read_byte(a++))<>>=3,r-=3}for(;A<19;)y[G[A++]]=0;if(z[0]=7,(i=E.inflate_trees_bits(y,z,S,C,t))!=I)return(e=i)==L&&(y=null,k=nt),m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);A=0,k=$;case $:for(;!(258+(31&(i=U))+(i>>5&31)<=A);){var b,w;for(i=z[0];r>>=i,r-=i,y[A++]=w;else{for(s=18==w?7:w-14,b=18==w?11:3;r>>=i)&T[s],n>>>=s,r-=s,258+(31&(i=U))+(i>>5&31)<(s=A)+b||16==w&&s<1)return y=null,k=nt,t.msg="invalid bit length repeat",e=L,m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);for(w=16==w?y[s-1]:0;y[s++]=w,0!=--b;);A=s}}S[0]=-1;var x=[],h=[],v=[],g=[];if(x[0]=9,h[0]=6,i=U,(i=E.inflate_trees_dynamic(257+(31&i),1+(i>>5&31),y,x,h,v,g,C,t))!=I)return i==L&&(y=null,k=nt),e=i,m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,m.inflate_flush(t,e);D.init(x[0],h[0],C,v[0],C,g[0]),k=tt;case tt:if(m.bitb=n,m.bitk=r,t.avail_in=o,t.total_in+=a-t.next_in_index,t.next_in_index=a,m.write=l,(e=D.proc(m,t,e))!=M)return m.inflate_flush(t,e);if(e=I,D.free(t),a=t.next_in_index,o=t.avail_in,n=m.bitb,r=m.bitk,f=(l=m.write)>4)>t.istate.wbits){t.istate.mode=13,t.msg="invalid window size",t.istate.marker=5;break}t.istate.mode=1;case 1:if(0===t.avail_in)return i;if(i=e,t.avail_in--,t.total_in++,n=255&t.read_byte(t.next_in_index++),((t.istate.method<<8)+n)%31!=0){t.istate.mode=13,t.msg="incorrect header check",t.istate.marker=5;break}if(0==(32&n)){t.istate.mode=7;break}t.istate.mode=2;case 2:if(0===t.avail_in)return i;i=e,t.avail_in--,t.total_in++,t.istate.need=(255&t.read_byte(t.next_in_index++))<<24&4278190080,t.istate.mode=3;case 3:if(0===t.avail_in)return i;i=e,t.avail_in--,t.total_in++,t.istate.need+=(255&t.read_byte(t.next_in_index++))<<16&16711680,t.istate.mode=4;case 4:if(0===t.avail_in)return i;i=e,t.avail_in--,t.total_in++,t.istate.need+=(255&t.read_byte(t.next_in_index++))<<8&65280,t.istate.mode=5;case 5:return 0===t.avail_in?i:(i=e,t.avail_in--,t.total_in++,t.istate.need+=255&t.read_byte(t.next_in_index++),t.istate.mode=6,2);case 6:return t.istate.mode=13,t.msg="need dictionary",t.istate.marker=0,R;case 7:if((i=t.istate.blocks.proc(t,i))==L){t.istate.mode=13,t.istate.marker=0;break}if(i==I&&(i=e),i!=M)return i;i=e,t.istate.blocks.reset(t,t.istate.was),t.istate.mode=12;case 12:return M;case 13:return L;default:return R}},i.inflateSetDictionary=function(t,e,i){var n=0,r=i;return t&&t.istate&&6==t.istate.mode?(r>=1< Date: Thu, 26 Dec 2019 11:00:39 +0800 Subject: [PATCH 11/43] update loader.js --- libs/loader.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libs/loader.js b/libs/loader.js index 9e23b0f5..1f5f12eb 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -148,11 +148,12 @@ loader.prototype.loadImagesFromZip = function (url, names, toSave, callback) { core.unzip(url + "?v=" + main.version, function (data) { var cnt = 1; - names.forEach(function (name) { - if (name.indexOf('.') < 0) name += '.png'; - if (name in data) { + names.forEach(function (name) { + var imgName = name; + if (imgName.indexOf('.') < 0) imgName += '.png'; + if (imgName in data) { var img = new Image(); - var url = URL.createObjectURL(data[name]); + var url = URL.createObjectURL(data[imgName]); cnt++; img.onload = function () { cnt--; From 54f82dc8a8e41d226bc46a02f29c0fa54fec6e94 Mon Sep 17 00:00:00 2001 From: cafel176 <48304406+cafel176@users.noreply.github.com> Date: Thu, 26 Dec 2019 11:01:13 +0800 Subject: [PATCH 12/43] =?UTF-8?q?Delete=20JS=E4=BB=A3=E7=A0=81=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E5=B7=A5=E5=85=B7.exe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 常用工具/JS代码压缩工具.exe | Bin 8704 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 常用工具/JS代码压缩工具.exe diff --git a/常用工具/JS代码压缩工具.exe b/常用工具/JS代码压缩工具.exe deleted file mode 100644 index f0447910ce05278399e12b4108804b690f96fad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8704 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 P_dWn#|G$gxQv`kkMc?My From 6659a42328de81e7cfb914b8962fcd1c8cd2ca43 Mon Sep 17 00:00:00 2001 From: cafel176 <48304406+cafel176@users.noreply.github.com> Date: Thu, 26 Dec 2019 11:02:05 +0800 Subject: [PATCH 13/43] update JSCompressor --- 常用工具/ICSharpCode.SharpZipLib.dll | Bin 0 -> 200704 bytes 常用工具/JS代码压缩工具.exe | Bin 0 -> 16896 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 常用工具/ICSharpCode.SharpZipLib.dll create mode 100644 常用工具/JS代码压缩工具.exe diff --git a/常用工具/ICSharpCode.SharpZipLib.dll b/常用工具/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..fe643ebc638dfc94f1149528d0e9a91ce52dc353 GIT binary patch literal 200704 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

M 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 literal 0 HcmV?d00001 From 572e0e4a52e99391cad6badd48e16a0fb19f5ead Mon Sep 17 00:00:00 2001 From: cafel176 <48304406+cafel176@users.noreply.github.com> Date: Thu, 26 Dec 2019 12:31:49 +0800 Subject: [PATCH 14/43] a --- libs/loader.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/loader.js b/libs/loader.js index 1f5f12eb..321a6024 100644 --- a/libs/loader.js +++ b/libs/loader.js @@ -148,8 +148,8 @@ loader.prototype.loadImagesFromZip = function (url, names, toSave, callback) { core.unzip(url + "?v=" + main.version, function (data) { var cnt = 1; - names.forEach(function (name) { - var imgName = name; + names.forEach(function (name) { + var imgName = name; if (imgName.indexOf('.') < 0) imgName += '.png'; if (imgName in data) { var img = new Image(); From cc80dd450d3ac31403ce8427cf60005b7191f8ed Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 26 Dec 2019 15:02:10 +0800 Subject: [PATCH 15/43] copy enemyitem & foldColNum & fix bug --- _server/editor.js | 8 +++++- _server/editor_datapanel.js | 50 +++++++++++++++++++++++++++++++++ _server/editor_file_unsorted.js | 2 ++ _server/editor_listen.js | 1 + _server/editor_materialpanel.js | 16 ++++++++--- _server/table/comment.js | 2 +- editor.html | 4 +++ libs/events.js | 14 ++++++--- libs/maps.js | 2 +- project/items.js | 8 +++--- 10 files changed, 92 insertions(+), 15 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index 252b8e4b..a56e63a8 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -82,6 +82,12 @@ function editor() { loc: null, n: -1, enemys: [] + }, + + // 复制怪物或道具属性 + copyEnemyItem : { + type: null, + data: {} } }; @@ -402,7 +408,7 @@ editor.prototype.drawInitData = function (icons) { editor.widthsX = {}; editor.uivalues.folded = core.getLocalStorage('folded', false); // editor.uivalues.folded = true; - editor.uivalues.foldPerCol = 50; + editor.uivalues.foldPerCol = core.getLocalStorage('foldPerCol', 50); // var imgNames = Object.keys(images); //还是固定顺序吧; var imgNames = ["terrains", "animates", "enemys", "enemy48", "items", "npcs", "npc48", "autotile"]; diff --git a/_server/editor_datapanel.js b/_server/editor_datapanel.js index 08678104..7019b2e3 100644 --- a/_server/editor_datapanel.js +++ b/_server/editor_datapanel.js @@ -210,7 +210,57 @@ editor_datapanel_wrapper = function (editor) { } } + editor.uifunctions.copyPasteEnemyItem_func = function () { + var copyEnemyItem = document.getElementById('copyEnemyItem'); + var pasteEnemyItem = document.getElementById('pasteEnemyItem'); + copyEnemyItem.onclick = function () { + var cls = (editor_mode.info || {}).images; + if (editor_mode.mode != 'enemyitem' || (cls != 'enemys' && cls != 'enemy48' && cls != 'items')) return; + editor.uivalues.copyEnemyItem.type = cls; + var id = editor_mode.info.id; + if (cls == 'enemys' || cls == 'enemy48') { + editor.uivalues.copyEnemyItem.data = core.clone(enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80[id]); + printf("怪物属性复制成功"); + } else { + editor.uivalues.copyEnemyItem.data = {}; + for (var x in items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a) { + if (items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a[x][id] != null) { + editor.uivalues.copyEnemyItem.data[x] = core.clone(items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a[x][id]); + } + } + printf("道具属性复制成功"); + } + } + + pasteEnemyItem.onclick = function () { + var cls = (editor_mode.info || {}).images; + if (editor_mode.mode != 'enemyitem' || !cls || cls != editor.uivalues.copyEnemyItem.type) return; + var id = editor_mode.info.id; + if (cls == 'enemys' || cls == 'enemy48') { + if (confirm("你确定要覆盖此怪物的全部属性么?这是个不可逆操作!")) { + enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80[id] = core.clone(editor.uivalues.copyEnemyItem.data); + editor.file.saveSetting('enemys', [], function (err) { + if (err) printe(err); + else printf("怪物属性粘贴成功\n请再重新选中该怪物方可查看更新后的表格。"); + }) + } + } else { + if (confirm("你确定要覆盖此道具的全部属性么?这是个不可逆操作!")) { + for (var x in editor.uivalues.copyEnemyItem.data) { + items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a[x][id] = core.clone(editor.uivalues.copyEnemyItem.data[x]); + } + editor.file.saveSetting('items', [], function (err) { + if (err) printe(err); + else printf("道具属性粘贴成功\n请再重新选中该道具方可查看更新后的表格。"); + }) + } + } + + } + + + } diff --git a/_server/editor_file_unsorted.js b/_server/editor_file_unsorted.js index c11bd4d8..7ee709c8 100644 --- a/_server/editor_file_unsorted.js +++ b/_server/editor_file_unsorted.js @@ -897,6 +897,8 @@ editor_file = function (editor, callback) { callback('出错了,要设置的文件名不识别'); } + editor.file.saveSetting = saveSetting; + return editor_file; } //editor_file = editor_file(editor); \ No newline at end of file diff --git a/_server/editor_listen.js b/_server/editor_listen.js index dec2bc2f..1e50f6af 100644 --- a/_server/editor_listen.js +++ b/_server/editor_listen.js @@ -133,6 +133,7 @@ editor_listen_wrapper = function (editor) { editor.uifunctions.newIdIdnum_func() editor.uifunctions.changeId_func() + editor.uifunctions.copyPasteEnemyItem_func(); editor.uifunctions.selectFloor_func() editor.uifunctions.saveFloor_func() diff --git a/_server/editor_materialpanel.js b/_server/editor_materialpanel.js index 2ba50d82..2c0daabe 100644 --- a/_server/editor_materialpanel.js +++ b/_server/editor_materialpanel.js @@ -29,10 +29,18 @@ editor_materialpanel_wrapper = function (editor) { * editor.dom.iconExpandBtn.onclick */ editor.uifunctions.fold_material_click = function () { - if (confirm(editor.uivalues.folded ? "你想要展开素材吗?\n展开模式下将显示全素材内容。" - : ("你想要折叠素材吗?\n折叠模式下每个素材将仅显示单列,并且每" + editor.uivalues.foldPerCol + "个自动换列。"))) { - core.setLocalStorage('folded', !editor.uivalues.folded); - window.location.reload(); + if (editor.uivalues.folded) { + if (confirm("你想要展开素材吗?\n展开模式下将显示全素材内容。")) { + core.setLocalStorage('folded', false); + window.location.reload(); + } + } else { + var perCol = parseInt(prompt("请输入折叠素材模式下每列的个数:", "50")) || 0; + if (perCol > 0) { + core.setLocalStorage('foldPerCol', perCol); + core.setLocalStorage('folded', true); + window.location.reload(); + } } } diff --git a/_server/table/comment.js b/_server/table/comment.js index 6e549b88..20783952 100644 --- a/_server/table/comment.js +++ b/_server/table/comment.js @@ -143,7 +143,7 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = { "_leaf": true, "_type": "textarea", "_range": "thiseval==null || thiseval instanceof Array || (thiseval==~~thiseval && thiseval>=0)", - "_data": "特殊属性\n\n0:无,1:先攻,2:魔攻,3:坚固,4:2连击,\n5:3连击,6:n连击,7:破甲,8:反击,9:净化,\n10:模仿,11:吸血,12:中毒,13:衰弱,14:诅咒,\n15:领域,16:夹击,17:仇恨,18:阻击,19:自爆,\n20:无敌,21:退化,22:固伤,23:重生,24:激光,25:光环\n\n多个属性例如用[1,4,11]表示先攻2连击吸血" + "_data": "特殊属性\n\n0:无,1:先攻,2:魔攻,3:坚固,4:2连击,\n5:3连击,6:n连击,7:破甲,8:反击,9:净化,\n10:模仿,11:吸血,12:中毒,13:衰弱,14:诅咒,\n15:领域,16:夹击,17:仇恨,18:阻击,19:自爆,\n20:无敌,21:退化,22:固伤,23:重生,24:激光,25:光环\n26:支援,27:捕捉\n多个属性例如用[1,4,11]表示先攻2连击吸血" }, "value": { "_leaf": true, diff --git a/editor.html b/editor.html index 6fb22aec..b1a645f7 100644 --- a/editor.html +++ b/editor.html @@ -131,6 +131,10 @@ +
+ + +
diff --git a/libs/events.js b/libs/events.js index 1dcc3ce0..a52fce8d 100644 --- a/libs/events.js +++ b/libs/events.js @@ -976,13 +976,13 @@ events.prototype.recoverEvents = function (data) { ////// 检测自动事件 ////// events.prototype.checkAutoEvents = function () { // 只有在无操作或事件流中才能执行自动事件! - if (!core.isPlaying() || core.status.lockControl && core.status.event.id != 'action') return; + if (!core.isPlaying() || (core.status.lockControl && core.status.event.id != 'action')) return; var todo = [], delay = []; core.status.autoEvents.forEach(function (autoEvent) { var symbol = autoEvent.symbol, x = autoEvent.x, y = autoEvent.y, floorId = autoEvent.floorId; // 不在当前楼层 or 已经执行过 or 正在执行中 if (autoEvent.currentFloor && floorId != core.status.floorId) return; - if (!autoEvent.multiExecute && autoEvent.executed) return; + if (!autoEvent.multiExecute && core.autoEventExecuted(symbol)) return; if (core.autoEventExecuting(symbol)) return; var prefix = floorId + "@" + x + "@" + y; try { @@ -992,7 +992,7 @@ events.prototype.checkAutoEvents = function () { } core.autoEventExecuting(symbol, true); - autoEvent.executed = true; + core.autoEventExecuted(symbol, true); var event = [ {"type": "function", "function": @@ -1022,7 +1022,13 @@ events.prototype.checkAutoEvents = function () { events.prototype.autoEventExecuting = function (symbol, value) { var name = '_executing_autoEvent_' + symbol; - if (value == null) return core.getFlag(name, false); + if (value == null) return core.hasFlag(name); + else core.setFlag(name, value || null); +} + +events.prototype.autoEventExecuted = function (symbol, value) { + var name = '_executed_autoEvent_' + symbol; + if (value == null) return core.hasFlag(name); else core.setFlag(name, value || null); } diff --git a/libs/maps.js b/libs/maps.js index a0bdeae3..b65cd2f5 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -369,7 +369,7 @@ maps.prototype._getBgFgMapArray = function (name, floorId, noCache) { return core.status[name + "maps"][floorId]; var arr = core.clone(core.floors[floorId][name + "map"] || []); - if (main.mode == 'editor' && !(uievent && uievent.isOpen)) + if (main.mode == 'editor' && !(window.editor && editor.uievent && editor.uievent.isOpen)) arr = core.clone(editor[name + "map"]) || arr; for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { diff --git a/project/items.js b/project/items.js index e800d30d..598488b7 100644 --- a/project/items.js +++ b/project/items.js @@ -39,22 +39,22 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "redPotion": { "cls": "items", "name": "红血瓶", - "text": "',生命+'+core.values.redPotion" + "text": "',生命+${core.values.redPotion}'" }, "bluePotion": { "cls": "items", "name": "蓝血瓶", - "text": "',生命+'+core.values.bluePotion" + "text": "',生命+${core.values.bluePotion}'" }, "yellowPotion": { "cls": "items", "name": "黄血瓶", - "text": "'生命+'+core.values.yellowPotion" + "text": "',生命+${core.values.yellowPotion'}" }, "greenPotion": { "cls": "items", "name": "绿血瓶", - "text": "',生命+'+core.values.greenPotion" + "text": "',生命+${core.values.greenPotion}'" }, "sword0": { "cls": "items", From 18d888a05ff3d95030bde61b0777df9ef647ccee Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 26 Dec 2019 15:29:08 +0800 Subject: [PATCH 16/43] Fix multiple appendPic bug --- _server/editor_datapanel.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/_server/editor_datapanel.js b/_server/editor_datapanel.js index 7019b2e3..a533d758 100644 --- a/_server/editor_datapanel.js +++ b/_server/editor_datapanel.js @@ -698,8 +698,8 @@ editor_datapanel_wrapper = function (editor) { editor.dom.spriteCtx.drawImage(editor.dom.sourceCtx.canvas, v.x * 32, v.y * ysize, 32, ysize, 32 * ii, editor.dom.sprite.height - ysize, 32, ysize); } var dt = editor.dom.spriteCtx.getImageData(0, 0, editor.dom.sprite.width, editor.dom.sprite.height); - var imgbase64 = editor.dom.sprite.toDataURL().split(',')[1]; - fs.writeFile('./project/images/' + editor_mode.appendPic.imageName + '.png', imgbase64, 'base64', function (err, data) { + var imgbase64 = editor.dom.sprite.toDataURL('image/png'); + fs.writeFile('./project/images/' + editor_mode.appendPic.imageName + '.png', imgbase64.split(',')[1], 'base64', function (err, data) { if (err) { printe(err); throw (err) @@ -707,6 +707,7 @@ editor_datapanel_wrapper = function (editor) { printf('追加素材成功,你可以继续追加其他素材,最后再刷新以显示在素材区'); editor.dom.sprite.style.height = (editor.dom.sprite.height = (editor.dom.sprite.height + ysize)) + "px"; editor.dom.spriteCtx.putImageData(dt, 0, 0); + core.material.images[editor.dom.selectAppend.value].src = imgbase64; }); } @@ -729,8 +730,8 @@ editor_datapanel_wrapper = function (editor) { } dt = editor.dom.spriteCtx.getImageData(0, 0, editor.dom.sprite.width, editor.dom.sprite.height); - var imgbase64 = editor.dom.sprite.toDataURL().split(',')[1]; - fs.writeFile('./project/images/' + editor_mode.appendPic.imageName + '.png', imgbase64, 'base64', function (err, data) { + var imgbase64 = editor.dom.sprite.toDataURL('image/png'); + fs.writeFile('./project/images/' + editor_mode.appendPic.imageName + '.png', imgbase64.split(',')[1], 'base64', function (err, data) { if (err) { printe(err); throw (err) @@ -738,6 +739,7 @@ editor_datapanel_wrapper = function (editor) { printf('快速追加素材成功,你可以继续追加其他素材,最后再刷新以显示在素材区'); editor.dom.sprite.style.height = (editor.dom.sprite.height = (editor.dom.sprite.height + ysize)) + "px"; editor.dom.spriteCtx.putImageData(dt, 0, 0); + core.material.images[editor.dom.selectAppend.value].src = imgbase64; }); } From 8ba9abc331a96899f3c67adac4da90e8f72bcba1 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 26 Dec 2019 15:47:35 +0800 Subject: [PATCH 17/43] \b noPeak --- libs/control.js | 2 +- libs/ui.js | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libs/control.js b/libs/control.js index b978711d..283153ef 100644 --- a/libs/control.js +++ b/libs/control.js @@ -2452,7 +2452,7 @@ control.prototype.updateHeroIcon = function (name) { // 全身图 var w = core.material.icons.hero.width || 32; var h = core.material.icons.hero.height || 48; - var ratio = Math.max(w / h, 1), width = 32 * ratio, left = 16 - width/2; + var ratio = Math.min(w / h, 1), width = 32 * ratio, left = 16 - width/2; var canvas = document.createElement("canvas"); var context = canvas.getContext("2d"); diff --git a/libs/ui.js b/libs/ui.js index 8cf6a663..bc4565a6 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -587,7 +587,7 @@ ui.prototype._getTitleAndIcon = function (content) { ////// 正则处理 \b[up,xxx] 问题 ui.prototype._getPosition = function (content) { - var pos = null, px = null, py = null; + var pos = null, px = null, py = null, noPeak = false; if (core.status.event.id=='action') { px = core.status.event.data.x; py = core.status.event.data.y; @@ -614,6 +614,7 @@ ui.prototype._getPosition = function (content) { } else{ px = parseInt(str[0]); py = parseInt(str[1]); + noPeak = core.getBlockId(px, py) == null; } } if(pos=='hero' || pos=='null'){ @@ -621,7 +622,7 @@ ui.prototype._getPosition = function (content) { } return ""; }); - return {content: content, position: pos, px: px, py: py}; + return {content: content, position: pos, px: px, py: py, noPeak: noPeak}; } ////// 绘制选择光标 @@ -719,8 +720,8 @@ ui.prototype.drawWindowSkin = function(background, ctx, x, y, w, h, direction, p ////// 绘制一个背景图,可绘制 winskin 或纯色背景;支持小箭头绘制 ui.prototype.drawBackground = function (left, top, right, bottom, posInfo) { posInfo = posInfo || {}; - var px = posInfo.px == null ? null : posInfo.px * 32 - core.bigmap.offsetX; - var py = posInfo.py == null ? null : posInfo.py * 32 - core.bigmap.offsetY; + var px = posInfo.px == null || posInfo.noPeak ? null : posInfo.px * 32 - core.bigmap.offsetX; + var py = posInfo.py == null || posInfo.noPeak ? null : posInfo.py * 32 - core.bigmap.offsetY; var xoffset = posInfo.xoffset || 0, yoffset = posInfo.yoffset || 0; var background = core.status.textAttribute.background; @@ -1114,7 +1115,7 @@ ui.prototype.drawTextBox = function(content, showAll) { main.dom.next.style.borderRightColor = main.dom.next.style.borderBottomColor = core.arrayToRGB(textAttribute.text); main.dom.next.style.top = (vPos.bottom - 20) * core.domStyle.scale + "px"; var left = (hPos.left + hPos.right) / 2; - if (pInfo.position == 'up' && pInfo.px != null && Math.abs(pInfo.px * 32 + 16 - left) < 50) + if (pInfo.position == 'up' && !pInfo.noPeak && pInfo.px != null && Math.abs(pInfo.px * 32 + 16 - left) < 50) left = hPos.right - 64; main.dom.next.style.left = left * core.domStyle.scale + "px"; return config; From 88078448a74aec225f3d8a0b2e386e27625d3536 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 26 Dec 2019 16:18:42 +0800 Subject: [PATCH 18/43] drawHeroAnimate --- _docs/api.md | 6 ++++++ libs/control.js | 14 ++++++++++++-- libs/events.js | 9 ++++++--- libs/maps.js | 35 ++++++++++++++++++++++++++++------- project/functions.js | 5 ++++- 5 files changed, 56 insertions(+), 13 deletions(-) diff --git a/_docs/api.md b/_docs/api.md index 58ff0bfa..71b3a93c 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -1624,6 +1624,12 @@ core.drawAnimate(name, x, y, callback) 此函数会返回一个动画id,可以通过core.stopAnimate()立刻停止该动画的播放。 +core.drawHeroAnimate(name, callback) +绘制一个跟随勇士行动的动画。name为动画名,callback为绘制完毕的回调函数。 +此函数将播放动画音效,并异步开始绘制该动画。 +此函数会返回一个动画id,可以通过core.stopAnimate()立刻停止该动画的播放。 + + core.stopAnimate(id, doCallback) 立刻停止某个动画的播放。id为上面core.drawAnimate的返回值。 如果doCallback为真,则会执行该动画所对应的回调函数。 diff --git a/libs/control.js b/libs/control.js index 283153ef..4fbf1ba9 100644 --- a/libs/control.js +++ b/libs/control.js @@ -169,7 +169,17 @@ control.prototype._animationFrame_animate = function (timestamp) { return obj.index < obj.animate.frames.length; }); core.status.animateObjs.forEach(function (obj) { - core.maps._drawAnimateFrame(obj.animate, obj.centerX, obj.centerY, obj.index++); + if (obj.hero) { + // calculate position + var x = core.getHeroLoc('x'), y = core.getHeroLoc('y'), direction = core.getHeroLoc('direction'); + var offset = 4 * core.status.heroMoving; + if (offset < 0) offset = 0; + var way = core.utils.scan[direction]; + var centerX = 32 * x + way.x * offset + 16, centerY = 32 * y + way.y * offset + 16; + core.maps._drawAnimateFrame(obj.animate, centerX, centerY, obj.index++); + } else { + core.maps._drawAnimateFrame(obj.animate, obj.centerX, obj.centerY, obj.index++); + } }); core.animateFrame.animateTime = timestamp; } @@ -996,7 +1006,7 @@ control.prototype.checkBlock = function () { if (damage) { core.status.hero.hp -= damage; core.drawTip("受到"+(core.status.checkBlock.type[loc]||"伤害")+damage+"点"); - core.drawAnimate("zone", x, y); + core.drawHeroAnimate("zone"); this._checkBlock_disableQuickShop(); core.status.hero.statistics.extraDamage += damage; if (core.status.hero.hp <= 0) { diff --git a/libs/events.js b/libs/events.js index a52fce8d..1b84542b 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1304,9 +1304,12 @@ events.prototype._action_unfollow = function (data, x, y, prefix) { } events.prototype._action_animate = function (data, x, y, prefix) { - if (data.loc == 'hero') data.loc = [core.getHeroLoc('x'), core.getHeroLoc('y')]; - else data.loc = this.__action_getLoc(data.loc, x, y, prefix); - this.__action_doAsyncFunc(data.async, core.drawAnimate, data.name, data.loc[0], data.loc[1]); + if (data.loc == 'hero') { + this.__action_doAsyncFunc(data.async, core.drawHeroAnimate, data.name); + } else { + data.loc = this.__action_getLoc(data.loc, x, y, prefix); + this.__action_doAsyncFunc(data.async, core.drawAnimate, data.name, data.loc[0], data.loc[1]); + } } events.prototype._action_setViewport = function (data, x, y, prefix) { diff --git a/libs/maps.js b/libs/maps.js index b65cd2f5..591c6551 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -2030,13 +2030,7 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { name = core.getMappedName(name); // 正在播放录像:不显示动画 - if (core.isReplaying()) { - if (callback) callback(); - return -1; - } - - // 检测动画是否存在 - if (!core.material.animates[name] || x == null || y == null) { + if (core.isReplaying() || !core.material.animates[name] || x == null || y == null) { if (callback) callback(); return -1; } @@ -2059,6 +2053,33 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { return id; } +////// 绘制一个跟随勇士的动画 ////// +maps.prototype.drawHeroAnimate = function (name, callback) { + name = core.getMappedName(name); + + // 正在播放录像或动画不存在:不显示动画 + if (core.isReplaying() || !core.material.animates[name]) { + if (callback) callback(); + return -1; + } + + // 开始绘制 + var animate = core.material.animates[name]; + // 播放音效 + core.playSound(animate.se); + + var id = setTimeout(null); + core.status.animateObjs.push({ + "id": id, + "animate": animate, + "hero": true, + "index": 0, + "callback": callback + }); + + return id; +} + ////// 绘制动画的某一帧 ////// maps.prototype._drawAnimateFrame = function (animate, centerX, centerY, index) { var frame = animate.frames[index]; diff --git a/project/functions.js b/project/functions.js index 71f6223a..dbab9534 100644 --- a/project/functions.js +++ b/project/functions.js @@ -266,7 +266,10 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = if (!(core.material.animates[equipAnimate] || {}).se) core.playSound('attack.mp3'); // 强制战斗的战斗动画 - core.drawAnimate(equipAnimate, x != null ? x : core.getHeroLoc('x'), y != null ? y : core.getHeroLoc('y')); + if (x != null && y != null) + core.drawAnimate(equipAnimate, x, y); + else + core.drawHeroAnimate(equipAnimate); var damage = core.enemys.getDamage(enemyId, x, y); if (damage == null) damage = core.status.hero.hp + 1; From c42c419afce9f03f52e45f004d6f54acba0b8c7a Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 26 Dec 2019 16:18:45 +0800 Subject: [PATCH 19/43] drawHeroAnimate --- libs/control.js | 10 +++------- libs/core.js | 1 + libs/events.js | 2 ++ 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/libs/control.js b/libs/control.js index 4fbf1ba9..faf63818 100644 --- a/libs/control.js +++ b/libs/control.js @@ -170,13 +170,7 @@ control.prototype._animationFrame_animate = function (timestamp) { }); core.status.animateObjs.forEach(function (obj) { if (obj.hero) { - // calculate position - var x = core.getHeroLoc('x'), y = core.getHeroLoc('y'), direction = core.getHeroLoc('direction'); - var offset = 4 * core.status.heroMoving; - if (offset < 0) offset = 0; - var way = core.utils.scan[direction]; - var centerX = 32 * x + way.x * offset + 16, centerY = 32 * y + way.y * offset + 16; - core.maps._drawAnimateFrame(obj.animate, centerX, centerY, obj.index++); + core.maps._drawAnimateFrame(obj.animate, core.status.heroCenter.px, core.status.heroCenter.py, obj.index++); } else { core.maps._drawAnimateFrame(obj.animate, obj.centerX, obj.centerY, obj.index++); } @@ -816,6 +810,8 @@ control.prototype.drawHero = function (status, offset) { core.bigmap.offsetY = core.clamp((y - core.__HALF_SIZE__) * 32 + offsetY, 0, 32*core.bigmap.height-core.__PIXELS__); core.clearAutomaticRouteNode(x+dx, y+dy); core.clearMap('hero'); + core.status.heroCenter.px = 32 * x + offsetX + 16; + core.status.heroCenter.py = 32 * y + offsetY + 32 - core.material.icons.hero.height / 2; if (!core.hasFlag('hideHero')) { this._drawHero_getDrawObjs(direction, x, y, status, offset).forEach(function (block) { diff --git a/libs/core.js b/libs/core.js index aacb8b92..72f8a34a 100644 --- a/libs/core.js +++ b/libs/core.js @@ -116,6 +116,7 @@ function core() { // 勇士属性 'hero': {}, + 'heroCenter': {'px': null, 'py': null}, // 当前地图 'floorId': null, diff --git a/libs/events.js b/libs/events.js index 1b84542b..51f57286 100644 --- a/libs/events.js +++ b/libs/events.js @@ -2700,6 +2700,8 @@ events.prototype._jumpHero_jumping = function (jumpInfo) { core.control.updateViewport(); core.drawImage('hero', core.material.images.hero, jumpInfo.icon.stop, jumpInfo.icon.loc * height, width, height, nowx + (32 - width) / 2 - core.bigmap.offsetX, nowy + 32-height - core.bigmap.offsetY, width, height); + core.status.heroCenter.px = nowx + 16; + core.status.heroCenter.py = nowy + 32 - height / 2; } events.prototype._jumpHero_finished = function (animate, ex, ey, callback) { From 0f65f03083f2d9736f87d00d18b02bd2ca2d10a4 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 27 Dec 2019 13:11:30 +0800 Subject: [PATCH 20/43] Multiple autoSaves --- libs/control.js | 32 +++++++++++++++++++++++++++----- libs/core.js | 1 + libs/ui.js | 4 ++-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/libs/control.js b/libs/control.js index faf63818..0072ff2d 100644 --- a/libs/control.js +++ b/libs/control.js @@ -1601,7 +1601,13 @@ control.prototype.autosave = function (removeLast) { } if (core.status.event.id == 'action') // 事件中的自动存档 core.setFlag("__events__", core.clone(core.status.event.data)); - core.saves.autosave.data = core.saveData(); + if (core.saves.autosave.data == null) { + core.saves.autosave.data = []; + } + core.saves.autosave.data.push(core.saveData()); + if (core.saves.autosave.data.length > core.saves.autosave.max) { + core.saves.autosave.data.shift(); + } core.saves.autosave.updated = true; core.saves.ids[0] = true; core.removeFlag("__events__"); @@ -1657,11 +1663,21 @@ control.prototype._doSL_save = function (id) { control.prototype._doSL_load = function (id, callback) { if (id == 'autoSave' && core.saves.autosave.data != null) { - callback(id, core.clone(core.saves.autosave.data)) + var data = core.saves.autosave.data.pop(); + if (core.saves.autosave.data.length == 0) { + core.saves.autosave.data.push(core.clone(data)); + } + callback(id, data); } else { core.getLocalForage(id=='autoSave'?id:"save"+id, null, function(data) { - if (id == 'autoSave') core.saves.autosave.data = core.clone(data); + if (id == 'autoSave' && data != null) { + core.saves.autosave.data = data; + if (!(core.saves.autosave.data instanceof Array)) { + core.saves.autosave.data = [core.saves.autosave.data]; + } + return core.control._doSL_load(id, callback); + } callback(id, data); }, function(err) { main.log(err); @@ -1841,10 +1857,16 @@ control.prototype.getSave = function (index, callback) { if (index == 0) { // --- 自动存档先从缓存中获取 if (core.saves.autosave.data != null) - callback(core.clone(core.saves.autosave.data)); + callback(core.saves.autosave.data); else { core.getLocalForage("autoSave", null, function(data) { - callback(data); + if (data != null) { + core.saves.autosave.data = data; + if (!(core.saves.autosave.data instanceof Array)) { + core.saves.autosave.data = [core.saves.autosave.data]; + } + } + callback(core.saves.autosave.data); }, function(err) { main.log(err); callback(null); diff --git a/libs/core.js b/libs/core.js index 72f8a34a..a97fb8e5 100644 --- a/libs/core.js +++ b/libs/core.js @@ -106,6 +106,7 @@ function core() { "data": null, "time": 0, "updated": false, + "max": 10, // 自动存档最大回退数 }, "favorite": [], "favoriteName": {} diff --git a/libs/ui.js b/libs/ui.js index bc4565a6..3a51a6a4 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2502,9 +2502,9 @@ ui.prototype._drawSLPanel_loadSave = function(page, callback) { ids.push(id); } core.getSaves(ids, function (data) { - for (var i = 0; i < ids.length; ++i) + for (var i = 1; i < ids.length; ++i) core.status.event.ui[i] = data[i]; - core.saves.autosave.data = data[0]; + core.status.event.ui[0] = data[0] == null ? null : data[0][data[0].length-1]; callback(); }); } From 1216ae7d96ee9236c6c1105d83d30f202529f47a Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 27 Dec 2019 14:18:44 +0800 Subject: [PATCH 21/43] editor multi undo --- _server/editor.js | 12 ++++---- _server/editor_mappanel.js | 30 ++++++++++++------- _server/editor_ui.js | 61 +++++++++++++++++++------------------- 3 files changed, 54 insertions(+), 49 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index a56e63a8..e4ec6928 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -56,12 +56,9 @@ function editor() { startPos:null, endPos:null, // 撤销/恢复 - currDrawData : { - pos: [], - info: {} - }, - reDo : null, - preMapData : null, + preMapData : [], + preMapMax: 10, + postMapData: [], // shortcut:{}, copyedInfo : null, @@ -246,7 +243,8 @@ editor.prototype.changeFloor = function (floorId, callback) { }); editor.currentFloorData[name]=mapArray; } - editor.uivalues.preMapData = null; + editor.uivalues.preMapData = []; + editor.uivalues.postMapData = []; editor.uifunctions._extraEvent_bindSpecialDoor_doAction(true); core.changeFloor(floorId, null, {"x": 0, "y": 0, "direction": "up"}, null, function () { editor.game.fetchMapFromCore(); diff --git a/_server/editor_mappanel.js b/_server/editor_mappanel.js index 953cd7b1..59d538ee 100644 --- a/_server/editor_mappanel.js +++ b/_server/editor_mappanel.js @@ -206,7 +206,7 @@ editor_mappanel_wrapper = function (editor) { } editor.uivalues.holdingPath = 0; if (editor.uivalues.stepPostfix && editor.uivalues.stepPostfix.length) { - editor.uivalues.preMapData = JSON.parse(JSON.stringify({ map: editor.map, fgmap: editor.fgmap, bgmap: editor.bgmap })); + editor.savePreMap(); if (editor.brushMod !== 'line') { var x0 = editor.uivalues.stepPostfix[0].x; var y0 = editor.uivalues.stepPostfix[0].y; @@ -221,9 +221,6 @@ editor_mappanel_wrapper = function (editor) { } } } - editor.uivalues.currDrawData.pos = JSON.parse(JSON.stringify(editor.uivalues.stepPostfix)); - editor.uivalues.currDrawData.info = JSON.parse(JSON.stringify(editor.info)); - editor.uivalues.reDo = null; // console.log(editor.uivalues.stepPostfix); if (editor.brushMod === 'tileset' && core.tilesets.indexOf(editor.info.images) !== -1) { var imgWidth = ~~(core.material.images.tilesets[editor.info.images].width / 32); @@ -511,8 +508,7 @@ editor_mappanel_wrapper = function (editor) { editor.uifunctions.copyLoc_click = function (e) { editor.uifunctions.hideMidMenu(); e.stopPropagation(); - editor.uivalues.preMapData = null; - editor.uivalues.reDo = null; + editor.savePreMap(); editor_mode.onmode(''); var now = editor.pos, last = editor.uivalues.lastRightButtonPos[1]; if (now.x == last.x && now.y == last.y) return; @@ -535,8 +531,7 @@ editor_mappanel_wrapper = function (editor) { editor.uifunctions.moveLoc_click = function (e) { editor.uifunctions.hideMidMenu(); e.stopPropagation(); - editor.uivalues.preMapData = null; - editor.uivalues.reDo = null; + editor.savePreMap(); editor_mode.onmode(''); editor.exchangePos(editor.pos, editor.uivalues.lastRightButtonPos[1]); } @@ -547,7 +542,6 @@ editor_mappanel_wrapper = function (editor) { */ editor.uifunctions.clearEvent_click = function (e) { e.stopPropagation(); - editor.uivalues.reDo = null; editor.clearPos(false); } @@ -557,7 +551,6 @@ editor_mappanel_wrapper = function (editor) { */ editor.uifunctions.clearLoc_click = function (e) { e.stopPropagation(); - editor.uivalues.reDo = null; editor.clearPos(true); } @@ -768,6 +761,21 @@ editor_mappanel_wrapper = function (editor) { if (callback) callback(); }); } + + editor.constructor.prototype.savePreMap = function () { + var dt = { + map: editor.map, + fgmap: editor.fgmap, + bgmap: editor.bgmap, + }; + if (editor.uivalues.preMapData.length == 0 + || !core.same(editor.uivalues.preMapData[editor.uivalues.preMapData.length - 1], dt)) { + editor.uivalues.preMapData.push(core.clone(dt)); + if (editor.uivalues.preMapData.length > editor.uivalues.preMapMax) { + editor.uivalues.preMapData.shift(); + } + } + } editor.constructor.prototype.moveBgFg = function (startPos, endPos, name, callback) { if (!startPos || !endPos || ["bgmap","fgmap"].indexOf(name)<0) return; @@ -809,7 +817,7 @@ editor_mappanel_wrapper = function (editor) { var fields = Object.keys(editor.file.comment._data.floors._data.loc._data); pos = pos || editor.pos; editor.uifunctions.hideMidMenu(); - editor.uivalues.preMapData = null; + editor.savePreMap(); editor.info = 0; editor_mode.onmode(''); if (clearPos) diff --git a/_server/editor_ui.js b/_server/editor_ui.js index a82601e3..2417dda6 100644 --- a/_server/editor_ui.js +++ b/_server/editor_ui.js @@ -81,14 +81,14 @@ editor_ui_wrapper = function (editor) { editor.uifunctions.body_shortcut = function (e) { // UI预览 & 地图选点 - if (uievent && uievent.isOpen) { + if (editor.uievent && editor.uievent.isOpen) { e.preventDefault(); - if (e.keyCode == 27) uievent.close(); - else if (e.keyCode == 13) uievent.confirm(); - else if (e.keyCode == 87) uievent.move(0, -1) - else if (e.keyCode == 65) uievent.move(-1, 0) - else if (e.keyCode == 83) uievent.move(0, 1); - else if (e.keyCode == 68) uievent.move(1, 0); + if (e.keyCode == 27) editor.uievent.close(); + else if (e.keyCode == 13) editor.uievent.confirm(); + else if (e.keyCode == 87) editor.uievent.move(0, -1) + else if (e.keyCode == 65) editor.uievent.move(-1, 0) + else if (e.keyCode == 83) editor.uievent.move(0, 1); + else if (e.keyCode == 68) editor.uievent.move(1, 0); return; } @@ -111,29 +111,6 @@ editor_ui_wrapper = function (editor) { if (editor_multi.id != "" || editor_blockly.id != "") return; - //Ctrl+z 撤销上一步undo - if (e.keyCode == 90 && e.ctrlKey && editor.uivalues.preMapData && editor.uivalues.currDrawData.pos.length && selectBox.isSelected()) { - editor.map = JSON.parse(JSON.stringify(editor.uivalues.preMapData.map)); - editor.fgmap = JSON.parse(JSON.stringify(editor.uivalues.preMapData.fgmap)); - editor.bgmap = JSON.parse(JSON.stringify(editor.uivalues.preMapData.bgmap)); - editor.updateMap(); - editor.uivalues.reDo = JSON.parse(JSON.stringify(editor.uivalues.currDrawData)); - editor.uivalues.currDrawData = { pos: [], info: {} }; - editor.uivalues.preMapData = null; - return; - } - //Ctrl+y 重做一步redo - if (e.keyCode == 89 && e.ctrlKey && editor.uivalues.reDo && editor.uivalues.reDo.pos.length && selectBox.isSelected()) { - editor.uivalues.preMapData = JSON.parse(JSON.stringify({ map: editor.map, fgmap: editor.fgmap, bgmap: editor.bgmap })); - for (var j = 0; j < editor.uivalues.reDo.pos.length; j++) - editor.map[editor.uivalues.reDo.pos[j].y][editor.uivalues.reDo.pos[j].x] = JSON.parse(JSON.stringify(editor.uivalues.reDo.info)); - - editor.updateMap(); - editor.uivalues.currDrawData = JSON.parse(JSON.stringify(editor.uivalues.reDo)); - editor.uivalues.reDo = null; - return; - } - // PGUP和PGDOWN切换楼层 if (e.keyCode == 33 || e.keyCode == 34) { e.preventDefault(); @@ -151,7 +128,29 @@ editor_ui_wrapper = function (editor) { var focusElement = document.activeElement; if (!focusElement || focusElement.tagName.toLowerCase() == 'body' - || focusElement.id == 'selectFloor') { + || focusElement.id == 'selectFloor') { + + //Ctrl+z 撤销上一步undo + if (e.keyCode == 90 && e.ctrlKey && editor.uivalues.preMapData.length > 0) { + e.preventDefault(); + var data = editor.uivalues.preMapData.pop(); + editor.map = JSON.parse(JSON.stringify(data.map)); + editor.fgmap = JSON.parse(JSON.stringify(data.fgmap)); + editor.bgmap = JSON.parse(JSON.stringify(data.bgmap)); + editor.uivalues.postMapData.push(data); + return; + } + //Ctrl+y 重做一步redo + if (e.keyCode == 89 && e.ctrlKey && editor.uivalues.postMapData.length > 0) { + e.preventDefault(); + var data = editor.uivalues.postMapData.pop(); + editor.map = JSON.parse(JSON.stringify(data.map)); + editor.fgmap = JSON.parse(JSON.stringify(data.fgmap)); + editor.bgmap = JSON.parse(JSON.stringify(data.bgmap)); + editor.uivalues.preMapData.push(data); + return; + } + // Ctrl+C, Ctrl+X, Ctrl+V if (e.ctrlKey && e.keyCode == 67 && !selectBox.isSelected()) { e.preventDefault(); From 9d8146ab290e8b55e272a332c96dbd30a951c11d Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 27 Dec 2019 14:38:46 +0800 Subject: [PATCH 22/43] Editor last floorId --- _server/editor.js | 4 +++- _server/editor_ui.js | 32 ++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index e4ec6928..3563a1d7 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -158,7 +158,8 @@ editor.prototype.init = function (callback) { editor_mode = editor_mode(editor); editor.mode = editor_mode; core.resetGame(core.firstData.hero, null, core.firstData.floorId, core.clone(core.initStatus.maps)); - core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function () { + var lastFloorId = core.getLocalStorage('editorLastFloorId', core.status.floorId); + core.changeFloor(lastFloorId, null, core.firstData.hero.loc, null, function () { afterCoreReset(); }, true); core.events.setInitData(null); @@ -256,6 +257,7 @@ editor.prototype.changeFloor = function (floorId, callback) { var loc = editor.viewportLoc[floorId] || [], x = loc[0] || 0, y = loc[1] || 0; editor.setViewport(x, y); + core.setLocalStorage('editorLastFloorId', floorId); if (callback) callback(); }); } diff --git a/_server/editor_ui.js b/_server/editor_ui.js index 2417dda6..159f7395 100644 --- a/_server/editor_ui.js +++ b/_server/editor_ui.js @@ -131,23 +131,31 @@ editor_ui_wrapper = function (editor) { || focusElement.id == 'selectFloor') { //Ctrl+z 撤销上一步undo - if (e.keyCode == 90 && e.ctrlKey && editor.uivalues.preMapData.length > 0) { + if (e.keyCode == 90 && e.ctrlKey) { e.preventDefault(); - var data = editor.uivalues.preMapData.pop(); - editor.map = JSON.parse(JSON.stringify(data.map)); - editor.fgmap = JSON.parse(JSON.stringify(data.fgmap)); - editor.bgmap = JSON.parse(JSON.stringify(data.bgmap)); - editor.uivalues.postMapData.push(data); + if (editor.uivalues.preMapData.length > 0) { + var data = editor.uivalues.preMapData.pop(); + editor.map = JSON.parse(JSON.stringify(data.map)); + editor.fgmap = JSON.parse(JSON.stringify(data.fgmap)); + editor.bgmap = JSON.parse(JSON.stringify(data.bgmap)); + editor.updateMap(); + editor.uivalues.postMapData.push(data); + printf("已撤销此操作,你可能需要重新保存地图。"); + } return; } //Ctrl+y 重做一步redo - if (e.keyCode == 89 && e.ctrlKey && editor.uivalues.postMapData.length > 0) { + if (e.keyCode == 89 && e.ctrlKey) { e.preventDefault(); - var data = editor.uivalues.postMapData.pop(); - editor.map = JSON.parse(JSON.stringify(data.map)); - editor.fgmap = JSON.parse(JSON.stringify(data.fgmap)); - editor.bgmap = JSON.parse(JSON.stringify(data.bgmap)); - editor.uivalues.preMapData.push(data); + if (editor.uivalues.postMapData.length > 0) { + var data = editor.uivalues.postMapData.pop(); + editor.map = JSON.parse(JSON.stringify(data.map)); + editor.fgmap = JSON.parse(JSON.stringify(data.fgmap)); + editor.bgmap = JSON.parse(JSON.stringify(data.bgmap)); + editor.updateMap(); + editor.uivalues.preMapData.push(data); + printf("已重做此操作,你可能需要重新保存地图。"); + } return; } From 638aa0d8140c6e815025287a1977fdbd2f7b560e Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 27 Dec 2019 14:43:25 +0800 Subject: [PATCH 23/43] V266 --- _server/editor.js | 1 + main.js | 6 +++--- project/data.js | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index 3563a1d7..716b27a0 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -159,6 +159,7 @@ editor.prototype.init = function (callback) { editor.mode = editor_mode; core.resetGame(core.firstData.hero, null, core.firstData.floorId, core.clone(core.initStatus.maps)); var lastFloorId = core.getLocalStorage('editorLastFloorId', core.status.floorId); + if (core.floors.indexOf(lastFloorId) < 0) lastFloorId = core.status.floorId; core.changeFloor(lastFloorId, null, core.firstData.hero.loc, null, function () { afterCoreReset(); }, true); diff --git a/main.js b/main.js index 6d435c80..30516e37 100644 --- a/main.js +++ b/main.js @@ -2,7 +2,7 @@ function main() { //------------------------ 用户修改内容 ------------------------// - this.version = "2.6.5"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 + this.version = "2.6.6"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 this.useCompress = false; // 是否使用压缩文件 // 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。 @@ -189,8 +189,8 @@ function main() { this.floors = {} this.canvas = {}; - this.__VERSION__ = "2.6.5"; - this.__VERSION_CODE__ = 87; + this.__VERSION__ = "2.6.6"; + this.__VERSION_CODE__ = 97; } main.prototype.init = function (mode, callback) { diff --git a/project/data.js b/project/data.js index 9ed376f9..fc6805f8 100644 --- a/project/data.js +++ b/project/data.js @@ -78,7 +78,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "firstData": { "title": "魔塔样板", "name": "template", - "version": "Ver 2.6.5", + "version": "Ver 2.6.6", "floorId": "sample0", "hero": { "name": "阳光", From bd59bea0131262adc70b1b64859fb5a1c44075a0 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 27 Dec 2019 16:58:31 +0800 Subject: [PATCH 24/43] type:wait context --- _server/MotaAction.g4 | 60 ++++++++++++++++++++++++++++++++++++--- _server/editor_blockly.js | 5 +++- libs/actions.js | 3 ++ libs/events.js | 26 +++++++++++++++++ project/data.js | 2 +- 5 files changed, 90 insertions(+), 6 deletions(-) diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 8ed4eadd..5059405e 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -1988,18 +1988,56 @@ return code; wait_s - : '等待用户操作并获得按键或点击信息' + : '等待用户操作并获得按键或点击信息' BGNL? Newline waitContext* BEND Newline /* wait_s -tooltip : wait: 等待用户操作并获得按键或点击信息(具体用法看文档) +tooltip : wait: 等待用户操作并获得按键或点击信息 helpUrl : https://h5mota.com/games/template/_docs/#/event?id=wait%EF%BC%9A%E7%AD%89%E5%BE%85%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C colour : this.soundColor -var code = '{"type": "wait"},\n'; +waitContext_0 = waitContext_0 ? (', "data": [\n' + waitContext_0 + ']') : ''; +var code = '{"type": "wait"' + waitContext_0 + '},\n'; return code; */; +waitContext + : waitContext_1 + | waitContext_2 + | waitContext_empty; + + +waitContext_1 + : '按键的场合' '键值' Int BGNL? Newline action+ BEND Newline + +/* waitContext_1 +tooltip : wait: 等待用户操作并获得按键或点击信息 +helpUrl : https://h5mota.com/games/template/_docs/#/event?id=wait%EF%BC%9A%E7%AD%89%E5%BE%85%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C +colour : this.subColor +var code = '{"case": "keyboard", "keycode": ' + Int_0 + ', "action": [\n' + action_0 + ']},\n'; +return code; +*/; + + +waitContext_2 + : '点击的场合' '像素x范围' Int '~' Int '; y范围' Int '~' Int BGNL? Newline action+ BEND Newline + +/* waitContext_2 +tooltip : wait: 等待用户操作并获得按键或点击信息 +helpUrl : https://h5mota.com/games/template/_docs/#/event?id=wait%EF%BC%9A%E7%AD%89%E5%BE%85%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C +default : [0,32,0,32] +colour : this.subColor +var code = '{"case": "mouse", "px": [' + Int_0 + ',' + Int_1 + '], "py": [' + Int_2 + ',' + Int_3 + '], "action": [\n' + action_0 + ']},\n'; +return code; +*/; + +waitContext_empty : Newline + +/* waitContext_empty +return ''; +*/; + + waitAsync_s : '等待所有异步事件执行完毕' @@ -3547,8 +3585,22 @@ ActionParser.prototype.parseAction = function() { data.time||0,data.noSkip||false,this.next]); break; case "wait": // 等待用户操作 + var case_waitList = null; + if (data.data) { + for(var ii=data.data.length-1,caseNow;caseNow=data.data[ii];ii--) { + if (caseNow["case"] == "keyboard") { + case_waitList = MotaActionBlocks['waitContext_1'].xmlText([ + caseNow.keycode || 0, this.insertActionList(caseNow.action), case_waitList + ]); + } else if (caseNow["case"] == "mouse") { + case_waitList = MotaActionBlocks['waitContext_2'].xmlText([ + caseNow.px[0], caseNow.px[1], caseNow.py[0], caseNow.py[1], this.insertActionList(caseNow.action), case_waitList + ]); + } + } + } this.next = MotaActionBlocks['wait_s'].xmlText([ - this.next]); + case_waitList, this.next]); break; case "waitAsync": // 等待所有异步事件执行完毕 this.next = MotaActionBlocks['waitAsync_s'].xmlText([ diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 53c3d500..c1f0562a 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -163,7 +163,10 @@ editor_blockly = function () { ], '特效/声音':[ MotaActionBlocks['sleep_s'].xmlText(), - MotaActionBlocks['wait_s'].xmlText(), + MotaActionFunctions.actionParser.parseList({"type": "wait", "data": [ + {"case": "keyboard", "keycode": 13, "action": [{"type": "comment", "text": "当按下回车(keycode=13)时执行此事件"}]}, + {"case": "mouse", "px": [0,32], "py": [0,32], "action": [{"type": "comment", "text": "当点击地图左上角时执行此事件"}]}, + ]}), MotaActionBlocks['waitAsync_s'].xmlText(), MotaActionBlocks['vibrate_s'].xmlText(), MotaActionBlocks['animate_s'].xmlText(), diff --git a/libs/actions.js b/libs/actions.js index aefc1e4d..d0d21421 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -439,6 +439,7 @@ actions.prototype._sys_ondown_lockControl = function (x, y, px, py) { core.setFlag('px', px); core.setFlag('py', py); core.status.route.push("input:" + (1000000 + 1000 * px + py)); + core.events.__action_wait_afterGet(core.status.event.data.current); core.doAction(); } else { @@ -726,6 +727,7 @@ actions.prototype._sys_onmousewheel = function (direct) { var keycode = direct == 1 ? 33 : 34; core.setFlag('keycode', keycode); core.status.route.push("input:" + keycode); + core.events.__action_wait_afterGet(core.status.event.data.current); core.doAction(); return; } @@ -985,6 +987,7 @@ actions.prototype._keyUpAction = function (keycode) { core.setFlag('type', 0); core.setFlag('keycode', keycode); core.status.route.push("input:" + keycode); + core.events.__action_wait_afterGet(core.status.event.data.current); core.doAction(); return; } diff --git a/libs/events.js b/libs/events.js index 51f57286..8a50cc5f 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1910,6 +1910,7 @@ events.prototype._action_wait = function (data, x, y, prefix) { var value = parseInt(code.substring(6)); core.status.route.push("input:" + value); this.__action_wait_getValue(value); + this.__action_wait_afterGet(data); } else { main.log("录像文件出错!当前需要一个 input: 项,实际为 " + code); @@ -1944,6 +1945,31 @@ events.prototype.__action_wait_getValue = function (value) { } } +events.prototype.__action_wait_afterGet = function (data) { + if (!data.data) return; + var todo = []; + data.data.forEach(function (one) { + if (one["case"] == "keyboard" && core.getFlag("type") == 0) { + if (one["keycode"] == core.getFlag("keycode", 0)) { + core.push(todo, one.action); + } + } + if (one["case"] == "mouse" && one.px instanceof Array + && one.py instanceof Array && core.getFlag("type") == 1) { + var pxmin = core.calValue(one.px[0]); + var pxmax = core.calValue(one.px[1]); + var pymin = core.calValue(one.py[0]); + var pymax = core.calValue(one.py[1]); + var px = core.getFlag("px", 0), py = core.getFlag("py", 0); + if (px >= pxmin && px <= pxmax && py >= pymin && py <= pymax) { + core.push(todo, one.action); + } + } + }) + if (todo.length > 0) + core.insertAction(todo); +} + events.prototype._action_waitAsync = function (data, x, y, prefix) { var test = window.setInterval(function () { if (!core.hasAsync()) { diff --git a/project/data.js b/project/data.js index 9ed376f9..bfe338c6 100644 --- a/project/data.js +++ b/project/data.js @@ -387,7 +387,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "snowFourDirections": false, "bigKeyIsBox": false, "steelDoorWithoutKey": false, - "itemFirstText": true, + "itemFirstText": false, "equipment": false, "equipboxButton": false, "iconInEquipbox": false, From ef45e9f7d981e185f3f46059dbbc97c2c8603b72 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 27 Dec 2019 18:37:51 +0800 Subject: [PATCH 25/43] type:wait preview --- _docs/event.md | 25 +++++++++++++++++++++++++ _docs/img/events/52.png | Bin 0 -> 106169 bytes _server/MotaAction.g4 | 4 ++-- _server/editor.js | 2 +- _server/editor_blockly.js | 12 +++++++++--- libs/events.js | 11 +++++++++++ 6 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 _docs/img/events/52.png diff --git a/_docs/event.md b/_docs/event.md index e91d34f6..e7e67b94 100644 --- a/_docs/event.md +++ b/_docs/event.md @@ -1964,6 +1964,31 @@ yes和no均为必填项,即用户点击确认或取消后执行的事件。 ![](img/events/52.jpg) +从V2.6.6开始,也允许直接在`type:wait`中增加`data`项判定按键或点击坐标。 + +```js +[ + {"type": "wait", "data": [ + {"case": "keyboard", "keycode": 13, "action": [ + {"type": "comment", "text": "当按下回车(keycode=13)时执行此事件"}, + ]}, + {"case": "mouse", "px": [0,32], "py": [0,32], "action": [ + {"type": "comment", "text": "当点击地图左上角时执行此事件"}, + ]}, + ]}, +] +``` + +![](img/events/52.png) + +`data`是一个数组,每一项中,case只能为`keyboard`和`mouse`二选一,分别对应键盘和鼠标(即`type=0`和`type=1`)。 + +如果是键盘,则可以指定`keycode`为键盘的按键内容;否则指定`px`和`py`为点击的像素区间。 + +action为如果满足该条件时应该执行的事件列表。 + + + ### waitAsync:等待所有异步事件执行完毕 上面有很多很多的异步事件(也就是执行时不等待执行完毕)。 diff --git a/_docs/img/events/52.png b/_docs/img/events/52.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0c13c8e3cecf4633d6632029f4a7ac9b48b1a3 GIT binary patch literal 106169 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 z zzO|oFNwW9mw7vN7MVBONWiV!G@>S*__B@0A{WHR5ZFb#H&o88XzPA^iWZy#c%p1qS zGfV7qXiUj)J^UB}2EvF0ut-#!V0-#$MBy@0;t@#fg#5jYxXt7u38=g$%w$^$=M)q9 zd>}a<=4^rW*@#357Dfu>)Nrg~!YUTP*!3Pxh2if0(us6lNT&BH}P3MlKbV%);!B#ZE*T*VVi1>Qe z2Ql48A+H2)uSi1j^iY$C4H4DSS^jskOYQ z(o%E*if6tIGu;qR>nR(o*xO0c1cb%%Su_61y>6wxc20$U-TLjDQK&b%10OucfDjn_ z#Apjr-d0{Ec{PDG`s^Qz34Bq4^Z+b(4JK{|�(dlQ(Fxgm!A4C1Ag4G@50x*NaJl zU{@4&ocrT4rbCp^*4xTE-FxM@*RhrY;zYE6QVM>QQ9;@d@K^@he?Y38gPBIb_DPi^ zb-@bs%v=1n7{$mOW_dfHEP;$QYnYB0SRtFN>IEAv{L0H$D>H|dCClB83H)*|m4?d} znRp1vLGmpJUX+CMs%$CjkP3k)BKYi(KZjzj_?n=cap2?c@)pHF&&sqk-ctlo?wdbF zdlQB*sX*9PVG%bCYa8t5Yv=AAlnCSGW0HALeiCv#a~_qUiag|SIqCTP^{v|SlrVSs zL`ao1X0()YjSWjuyMw#t;XHw0=`bFW-wZ}5N1U^Qkp`LmE5 z7?%NeJ)314o-j$!eZ!sh&Y6PO=aIbqVvjDk*mIPNSD6eGlgse`QFYaEQFU8eN`_`Y zKzbOuyOBmxkVfearKLNhJ0zq#q@Ff(2f_f3i79%nDL09gF=xDEz zd94wQkMVT2@mi$?UKIi=)1s>nOY*#o>v*bFKYgUW;dqk99NTmt*#*`Qq|`6=*Iajm z(CbFe(3)|AaG_pIK;0*{1)V8(8_{PuEl39iE3j&_TGeIM4RzQK2%N~(rvL{a&GjTsG@SuJ765 z=tA9hKk(100Bh96%=ncZRRwU=Q^dR&uaHhfj`$!WiTC-N_!f5~=N?#UK?iM6`>#^t z9YAVJ#L|5MqJ{CgNL^-z7k{W3CW%tC)E9c}Y>ZZ8Jf9sOqmEK7Nqp_g>fysM{wf~4 zv=M|u`h0q!eT`-14iR6DMN;zc{>o~OL=l#%A##!otWw|(D$f}-{jP|Mld+E-y?g=p zwDRe_hsih-e5u#3(Zk5{S09$%$lE`HFY_I}$x; zOj~tt%n%Y6d`0$Mz26N3>G2uVx-2?phjRHCy95-zeIDKzx+P z-Zl{#ACa~9f_zI>2VDuGI(3;^zLjzNW#MWWxnHFI07}cqByEZbwIOSIJH)4%9+T%2O63s!b+Znu{aIP*Mltq#T?j?(mJa(>922}R>N zMr;8qEy=39XQ0QkvOix`4<3JI=xX}~WEtAXJVp)fw!51Vi$3LX_4y4RLd)i>Ijwps z@lpt*iiUWRsD8-h66)Sv3tSlaKo3;W2HR6C~Rzd0{D!f6i%I<9%Cl0L=u# zBgy`<4!1!M{-dGq7lbur6Nc+IJ^{@Rcqfw91^Bwpq#wTB$GJ~a);y27e zhMVai*_GF^>jwIY2ISr2@sNcDn2)cimcCO;G9%$t1lmDtF||%PYi#Ge({Cj@6=;vw zSanY^0LqY*3w4ksWVswKu3ZKuf<;11AMg|9u1#kToJOfqe`kB)NOHH&Z!>)fI8##? zqCXo4qcjkJ;!70du#ThPzmA&+b`RHqjMR0Mqf|}VOf8N%CtLSzS~^Uy@C~v=Qg*eR z*IHMZ)lkGvqn`8nQSnjP zx4E=Ff>6u+h2nWW@8PAOkUEUXvg<&$KlSxY51xP6R=mtKt5O1#0D?}ux9icp1Ulkn zHgiBoCA_?_G^rYsgMFxk&rU3}4#N(O{@`XWgzcgEV`+EmyA_|eJg+ND-|+z3_up5z7h@!qjR4U`ZkM1_k~5DYz&Wu#kXzt zoQWbLjn8S>yCm1ow=@>K`aFG29=O>choW9*CEu4)#X&2d(OtD*gNk6%fOd>_9C5(y zw6h&3QUqdqHrw6*jlz_Y>+2_D1iYblH5lmt63!Uy;}1q!hfHEl_rk@Cr;D22mKDey zM?NjAaTp6)XRhX>ca@=&@uZ1{|FtV)33gsi(k}cYE5j&*JPVbfEYNMVSFE4~tsI$d znDt>^$`~)Q=x|D{Hh81#6ZuA8s755ocbDCS%QgQQ==tbH$?hD?MmgaX?#T3|VcPam z;JY3Mot2J92lc|-P4E;T>!373Izc2_*Y7>1rERib2KtowQ^{m#k(&8|vH7}oxdj(xXUok;ZXd5+R z0Yk0nyuD(yqRc=rBRO5%_b^?*c%$p7*Z?}~`?-pQ-mNv|*%1mppEk_1&1b}lG6I^X zuZn#KTon3kQ=|y+L0`1Gc!YEUEDqqeqF6-Nofl&nPkY`i4r?+=k7P8*-=UtXMe>)8 zFIVxQf8BmxX0eZh!3W7OKqisIJ@~aU{X2a>UyP-!^FXBSkUF^3@px4}*n%_Q(ts{$ z@s-Z=Il^wT^cHkir(ajdvs4uj}Ds0c%)$NO$j60Up2TmNqSg&Kv* zw-}?ruMVRuSNvP~?9oXqBmP6_CujuhT5s_NLQe>v4L6^0+fFxX3Mzf@yV)a}xtqm4 zx+<4TI~FZeCifl8nbg_s3-p+#zIO72uaMhanI53^x26ffCy44N?74g~I374K^f;D| zgRaoOlpekaK0`-z_%8XgoHlY>jPJ3MTK26g8%T3g;}XJ%Pf`f{UOwU4<{gyRlSLIv zm<+adDAV`_^JF~S!dR0gYIg*Xzhn}Tt1?UU7!_iK?1&%xFUIVfW<7ZW7HUkn3D^y0 zPO97S&9*LUdVQ6%gqM+)Q4rUp>kjlhBomdX4W78h8k&_Xo^fJnZ%;s{>$_mC0zZjJ zAJgq!j>XL?FChW|=lE$TDJ8*7v)SmswE((6A`oxOEU(-+co*R|+~3Ls4~FN0oFgAR z{JIGltY!=wfPtE1Adbty8b?21NsLg2PqQmc^KGF|I(DSoRDiv=%QBPqNLbbQ1a@+8j;`n5W%miJjuz~UZTq`zYBrf~Z?!s6>osj{%@+)e~h800f( z^9Ky%F7qTl3?N^|eV{+|WNGZ+$6a#s**q})y>Rxq`CI_($vEQAKM^1_qKT186}=Um%(pukiWxUH8Q9> zz11PyxHaV0xYhA+&uy4rez*E-KR=0aOf@e!T)#fnCV$q=ZZx@kV{_(AQFSjO*7AS4 zUoD;^k&mv?q3RJy!UoXm12!cgL*OCdKplfN-}uVKCZ$IEMNCFz$Y)3l5=B%dG!?Z4e47hvQw87S|QJwkaQmH8vd{3VlICroXZQ z7ovzYSq@o(Zrz72O6fER^(C&9vkVEK3XBKZmqSULf7_2w#CU>wQ>s@8V#HJ z73)_(Tn*bwWRryr{#y_sz>5fYofrFUYs{v9jWmU)oGgac$dLQms=<@C9t28?t2As= zdLX+_l)g{2YW9)`XjC6AEV=74i-*7!m%kPo#}&%oRH=FPWt>-Poy`3*Mb0Mpuh9lE zf&EfJ_~$jTA=V@~K+*U9VDv;;)!A#QNXRG9B^MRbW8YFxyHUG@3?wP1{*hdoy;`Y! zuo}Mak1=ITr6+iyt~73wB`QIroarDE!c6=x9g%>`5MZWXy7pXo0=FQdRJhD&#g+5# zwRlm@#OJJ~ zjWgsiWzzx+C*}M{l%w15aqcgA4QmepR(l*AF%An&9?3(7rzqp9Gp`CTCAQ;!)BI8^ zN+{rdqhJW3KKYFsaNf$1{evFk|8*$-$9q94sd0Be8$bFV#_D&77&VWPC+ZZKz#I(V zOp&HoyD%e(+)q8_Qz-?9Bb5~h;l|4}@>``dRioiZURz5;tf~|$TQ*o*!vIuwpr!-K zKr4Wr3Ae7S7@IODsNuxhsY@$4MXd zvrRb@W_eU<=)1XHM8)CU z-LF%v@t_y-xn!SVjcN9vZmJVWa~74B$?{cAZ?@Ot={graHM-ABs+t)8a5MF4rrN0N z_5;ahb^S_Ng$U3j>eg|yUuL>YGn@SJv!u4p{IA*Seh0;hmMX&MXgRKH zJE#{I5(jmXD}2jYWI0H){1L4%s8E{hcOdhvEUP_~jkWF0U#tlDG6L^o!9S;$_lst4 z>G^v+Y!e|8h@Ltk+;M)`_lzCt1~;Ih7yH5-!Fobo3L@p-*PI)K+-f$;$64VdUvGNs zzm!FDMZw`ceGwbCPcpA>{8cIXuv+OclGxaZoN#u3OUrQ*j>CWw{=t*%?0@_d)uY*f z0lzg>v7>R8hM9D8Kl@?tSmr4Io7gJIf4BAUdiLvLzTa-1y(syXdkkK(joMKJuleWf zltF^T8-kdijm&ZLcqWQx((2xM=ELK$ScpO})0q_kN19Lw}gBBN_^cg!#2@Rk2)9~&XT2K^QcIgA%n$Ip{^Fw*lR0YC*v!jte z7VbsL>_uWlrJjJSbLcI5Cs-PXz%QYX|2^$&z@_rRokgeV7m{bJ4+)Ub_6_&JFF0FO zhJ0^$^XcF5nFR46wDpsbpYTFE31SMN#7{LS8jj+Zw0 z^C(IJ`J|4blz%7rXsGxX>Wn_WTA4GRB&ao_{MVreXOY#giOWTZX0?u za`@!p)3%=15fj$tiGzw3g4c=5J+sPE0cfNk8afJ)KaZbuqkno6fKG&}bch!k+L^gn zt1@-{7CTrF*%Tdn5f^Q+C89y$ced<-{sUQ1b(zLQ?V@HEpbO6kCr1*x~R)y zByHt*|N9oHBKsk2g<*H#Cq_zz6${MY{nk9+C)9%fVP&}2*$58@t1ww0Eqf&^U=#8R zY__)QhDOpbGrv&CLrht{Jye5Pn*8Y%+56d_K$%lE`bH%O@YcUJXU09-;f$TcJQFf~ zZ45p6m4mJhd;}2=Ch^$AIs)Ah4$JAJ=j6;4s@49S`NO(dmGd?k7bNiRKny|yNYD9R zQ57I~v;EaP?Oth^bVkr>k9q-32bn`r@`$4B_>(<+eP~a&?pA8i>-U`UqL}mTL7a`( zS^Fd(zVb(8zrO-Y4hMgy?^bQ-s+mlo-(cf6;RI`w7Tab7UCaX5z*Ol^wcJxN6+ATzXY$j4t@#OdbLWk(6=klfTye{ zUEkot;5^iN?8&j^_zv3!&7T3_&U22oxU968Ylowh1~4{i!%9J@Li$3+ImXzsiSq5jk{jw*_xFCVgY?W*wzm;kwqwd#2a9Yhyz5F0 z@3wU+AEpHOKB$&<4D0dWl%e4d+U#p<5Bc0+W6 z-?@?~ZPl8&xdtaS=S)s+8IF*+V1R%Pb1Djg{sPb6yr$4o(t z@#(r%Q(?(naFICwTij7wsC2*)VF~=x6X8bbK)|N%h$7 zA$xGf(SO!nsNnTwdTUn8Vw_`ZIF7e?VPKN4-4ti_7yB$MVr4Eo--&d6)m;msb1HB( zP3c4`4PLom5`v#P?M9btTUk8t8DJm1BgKZ5vO6Hw8n)}dXA!#2)SFdZzqo9x;ntKr zVTK8H56$WN(Oc=G*8d9TX83&x`6nt403n;O!r#B)4Tm_pfr{*NlVm^oDa*r)k-nSx z#&DzsmuB&hK3hF1A8nI{d^G*ZsMw~F5}{SXbdjtQy^n-ikwKbBliDwV0g=hDgroZ0 zBHBqOJKS^JPzzO?=5yNB=i)1;I)2aSSD2t7DYdjXwKboV{-pVCI)!V)T@KHdK5^!? zvg?EqVjB8S8n{L`s_C8GjLx;!1)t#i`5ra>&=eK!?_Y%p5lqGDjN8kz)SYL^P$I#B zC=zovZ8`e==MKis+D>BA)P)T8;apCn7OnKsS$fQjhuyVY;?K61s=Oo$(77=7E1-;? z#7Ko^MyZIn0_Zw(tHAzN{78D*K>9UyOjHo(>s5Xz8lw zK$gR|N9#_Pm9E5fn>-4|pFPAy^+%-`B_T$|l9z3g z`R{>bq;C=8wD?H|lm1H&CaWKl9unP+XaiKf=``Qu-v^)1RD|Gv=f@33G7)`RRH<-6 zP3nGYNtf}lPeg?ldMiDs|9zJPar_-~zyq~+C>6whs=A(ev=DjOq2Yb;qD+2FMpFI+K7g zz))boGzff#3D>b&%0R|&>KrKF3_iJt&P5}c@NPQPjJdS)B9GPgV#ylt8~!6r@jY;< z!)Ig2mN*B4Ztu^JWfcbGNQ~O2mjm{LcZ@J=mxn>yit`#B)%9eHuL^fsZ|gBMi9b(- zpv&+7)z=I79V*@m%}9L>t;R5WIL{8YAD~%@(XgHz=OEC1;X_8HsbCCtKplOrZrNm5 z#4#!l4Xm8l;eDH+T`Z5>|_nd!)X}W)N-c${{0~OCBfY&UJttQE4xaKGcUfYZ>r`1{B zG5vXlL010*F*IW}!Yg)yO2@mi-YBo#ar8qu+g%@9xJ*bsG&urKf2Fcd@@mU0Ah+PfIq82t5f|Q=I<|#=a)*9Qu-%}k1fNFcCt4f%xD z65g{pYFXarPt|fjt91jGao9*-`$?mNqTktfIzdq-3wu_i3h47aTb*1;Qb{Y5%twC3 z5XK^XK_F?MGVw+4v5al6%qO(|>ny%{Op0C5pqZn`tiR(mTw z&BNFk{m{savNr`)yLAQ&;R1DqTB@PBZ5sIIRsws++f>=iAPnSn|L3)AVSVqnTk5r~dg=^0tl(!7aUH(%O7AR`lV-IZP8oV3m!QpHvNk&z{xesvD9vx{2fl2P zaH$qG5e#@7KnvzynON*seH96abi0u(>pI}k_XOgP{oD+cNtP}$dhOXZe|}b;LKfr$ z7dUIH-RV*k{Fl_^Kf0ydh(|FFOi!E$J)$ULd#OtL2C_MZHA-1Hz-|dhP*nK2J)yMC zu~HEKN1Pda6O;4GT>U4_GB)VAluC2_;o)-aW5d!yS_B0^0xJF`3VdtNY;kx8`pW7< z;@fX4fsFi#%+8cHU-9i=rPk|_^WH%Nz7P1?(xAmK!6$kO>~}2S9Fz?h6KY5G52`VeKh|;&caS)7Xj=Fv zZNbm1k5KP6|7gz=x2Nfp_%pU>7U-;9V6gU2WL1q*OEO=$Pd+`a8!;I2JIIv#4O_$x zc2DaykKn_-dlQmGfH;sCbsTWvk&!u;}d#dzru(Jz?l} ztLZ^wgeQR&#D8`8cOH=<;p=%{Tf~zQs`HncD{^^T}kt$vg+#pj zB!XfF04+pw2Sa@E80W*UbXJ`QnGpF)F9@8n-ljP+v6geaa65)~3!Xl)S$9sqI5RRC z42f70h7moV&P5%NAigD#AVf;bM~a;edBvGcx9PL$P=8{6I%Zu0Dqe^c>Ht`LuP&1j z*{hCEz6ydn$j@cV+&FF=W=y+z|CMbY4H9pq&ER+yES8yQ_RNFRc!qWYqX8^1d6fD@ z=wp@k-Unxi%YF$`M6o7uQ`H_}A1G_Yo7zHrl*$El(MfS%!r*pp29IlqGiHpC}a1A&u*yP~-@e(lz%Z}tlAKrg#Whr&Dg ztHP2buU({Sn?Bq^dRhbfcBgJxG;BuSq*o)Je9ZU!gQu0T*sIRi;OOUzcb|=GRmg4D z&)C>@d$W@=h)nrH7{JS}o90w}oFc?y@K3$cvHF!=dDF58``C;Xh@|OJj!I?1fh_t9 zR~n_AwayPXkVxLw@NKqChx?@43{f6jBP5B3$qyOmPv&)^~K2(rEYN$4$bO1;8>S)|r9ewM9Ew0b|h^OHm=@ zVcG>%ULkBALJ1?+3_(i+4^QM@*ROO3&@WOyz=$WEIpI-Ef!-p26H7;=Ku#a~LM$nG zT#1j9@#c${b7<|XcBx#sMIv80wMmr2%hjDa67_0x0}wsb3bxCg5*FhreVJgqjJEvE zZolW}R(vC_nHGIUuS&B-Dhm_iqPR2`ueCrfxoivm=|l3!zzceB;`nwXX{4Ef7N`#H zKuHBp^a5yuL_$DJTgvfvf|{f1`h8N3ljXSE28#S6i^uYg>x z;vZyeouzPvbW#`Sosb5xDEJrQ>RiSm(Naq z&fJ2=_3$yEqT@byO5gF73u}I!R5~3&FJDn32jMNRw|!v8S6-{dTeQ-y?dl9r0!{cdla zXviis1LU6k5Pp1JO5W&9qdn`ZnrO5>F?s@t>lA-$O3aRukS zb#Gni5lF_c{4;nRcd4rop-V<6H?E}KzvS4L2m{<@1i%ttYY>dJWvhtxPxliZ7#e;X zdh}aa4;`E1Vz+1N!Rl!(X}=mp8(!N2k<6Hs8NNmMA@>BzmQdVw(QoI;Qd_(~Oai$Y0c(`pNd6BBfVy4L?y$sJt zEn~>Jpe2D(5Lwo1?nq?;#jw^Ep`{`Pc*78lsBz+E&L-x7)3N;yRYI;91bOS zbEG479at%<-i<}y4c9Vz-REk;kwu?v5v}Y|835wEr%{A@gT}{-o<+K9F7uk%2M$x{ zLOby;Y<49{Y2NpTbdAsmheI>0f(|ORfz`<-_m2uajwx2L_G#0Le`;9%F@LwM88705 zJACgXY%Tk>Qz_W4>O{`@jaw{~1#oO}l!T~;`F9wc{H~Q2a9vKun*Bb88xf1a&}wO| zu=1Dyji;lsvxAqN1T@oH-37mKiGYYeXhpzQincbCeTJy(01vxDUXD+~f`a8WkD8%2 zdlpfE?@v%|7gGH8DdLN;abS-`J+IhSG4J{TtX%l#E2(Tr-{1vd`{$IQEa+;aCZc4> zk$A>_O_n8|Em9%1#ODD)3TP^=qbV|)IWdZYmem|!4ig`p(-XZKlIo`ER zR|i{M*Ve#cgjXCy60%v-vU#S3V5*^;Jgv4j>$ChK$nx1LHr8)qo-I|Ab&;-f2ai7+r$01I^%YLAAOWYBgqU8a&AECD^~N|bM|R!+K;h@UV)4Y zGlGe~4&}#rGE!G1`_mu+D*d_ScFm0WZ_%R(6XxyThz?shFQr7sLy2a#II`{Wt&Mv*@xob>pb;!7>G2h+r@;2berP3t$%)bl{RlDX06E_qky)0>` zKTZv^p*sTBkmeaAsu?k+$VV4KdNnJC`oN)0dNa~g{)C?cHKb^sMTY~SrWT(iPQz;A zC&bc9EMJAWf4#7rmnW|z4`D#L_{_UY1>edAGWKqc@B-gAbF0=OWs#~5*nETS+CX(n zqF8gbLgyQHE3d5{+VAvMy9pMHEtWGzUP>;Zmhxn{vo(Z?e6p|}@xm;`ZO^=98`xd^ zsd5tDa2@RTQq0)(i}lO1cJYuzniH8EnHYms9PzrN0f|GUpi{WWNM1WrU6IwvN=kO$ zX1h<*9|}^NAr4SEe5Eid<@KEsH)sarwrT z9^&50n_%-Utj`<#BS&^SDp_sf({^(O(=9lKb12m8(3ZW>*?(7{MUj_j;laQ3zCOD^ z@!=O&(^$gAC7stpOML!f9+A#O&g(c-P971+-P=Go2E7{Ob^8(;bCeM6r%Fm(4FaDs z;wzJ3jLUv|eJ#_k9iM2I+HD+YOP~6_RK5ZIxrtq5-4mAu4;4bnIYvN0=#ncv7R{AX z5Eq>3GCf1UWlvoluo=v)BgW{Xl-jLwK#d4`BgYYppD1t{BZPL_lLN-2ai?JBy#QB> zlh9R(W~@6?`>2E~R9zAXvx@R;a!&zZwQjz^fnWagJNxPN*Di!LNKQU-RvI;7IfS;a zQD7dIjeEgfButNm4KwXSViZRS8!9VY&1xcmml58|MbPea&*F2mKbt^P#<^A0JJP_6 zZ?0*7VZGLcCi$lEM$V%*Ti1{03$q!U+F;K}IgTZ~*bu@3Y644}Oy%?IUhQmOSsySwjGOcip;V24kDB;IS6z;p7bB)9_{y>Vj?RB`<;%E;M*xc8!*h6($|c-Dq$t~V8j$r|i|qam@imOz zwk58EVZh&WElC-&iK4=SPZ&*d-f_LQBP0kI4L95L&9_4gOC1L9wo~vhOazb1M-pMe zKR8Fb#_JCDY+KA~6(xG!061HoU^)B1A5R$r#VKOK?jwDy1P0StGeJ^a=i*u3Tt1k+ z!fNlAh@Gebd@k6rO%C1ooN;_7%-MhtSrzT4k@<1OyCMK09G~LYvcG<7ZLo9?29cx7SUklemnUr{k=5B4}m0cVJ7)D0Wql1j?>Bv0ipy}@}@-K z2z@W8uE{{!+MskwjVF8=3S!WkM�L4l-b=$-Q`Fpqb{>V_g61){xncx@qNHA4W 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 literal 0 HcmV?d00001 diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 5059405e..e436f5d6 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -2020,14 +2020,14 @@ return code; waitContext_2 - : '点击的场合' '像素x范围' Int '~' Int '; y范围' Int '~' Int BGNL? Newline action+ BEND Newline + : '点击的场合' '像素x范围' PosString '~' PosString '; y范围' PosString '~' PosString BGNL? Newline action+ BEND Newline /* waitContext_2 tooltip : wait: 等待用户操作并获得按键或点击信息 helpUrl : https://h5mota.com/games/template/_docs/#/event?id=wait%EF%BC%9A%E7%AD%89%E5%BE%85%E7%94%A8%E6%88%B7%E6%93%8D%E4%BD%9C default : [0,32,0,32] colour : this.subColor -var code = '{"case": "mouse", "px": [' + Int_0 + ',' + Int_1 + '], "py": [' + Int_2 + ',' + Int_3 + '], "action": [\n' + action_0 + ']},\n'; +var code = '{"case": "mouse", "px": [' + PosString_0 + ',' + PosString_1 + '], "py": [' + PosString_2 + ',' + PosString_3 + '], "action": [\n' + action_0 + ']},\n'; return code; */; diff --git a/_server/editor.js b/_server/editor.js index 716b27a0..84b3f424 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -159,7 +159,7 @@ editor.prototype.init = function (callback) { editor.mode = editor_mode; core.resetGame(core.firstData.hero, null, core.firstData.floorId, core.clone(core.initStatus.maps)); var lastFloorId = core.getLocalStorage('editorLastFloorId', core.status.floorId); - if (core.floors.indexOf(lastFloorId) < 0) lastFloorId = core.status.floorId; + if (core.floorIds.indexOf(lastFloorId) < 0) lastFloorId = core.status.floorId; core.changeFloor(lastFloorId, null, core.firstData.hero.loc, null, function () { afterCoreReset(); }, true); diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index c1f0562a..91599d24 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -692,14 +692,20 @@ function omitedcheckUpdateFunction(event) { "previewUI_s", "clearMap_s", "clearMap_1_s", "setAttribute_s", "fillText_s", "fillBoldText_s", "fillRect_s", "strokeRect_s", "drawLine_s", "drawArrow_s", "fillPolygon_s", "strokePolygon_s", "fillCircle_s", "strokeCircle_s", - "drawImage_s", "drawImage_1_s", "drawIcon_s", "drawBackground_s", "drawSelector_s", "drawSelector_1_s" + "drawImage_s", "drawImage_1_s", "drawIcon_s", "drawBackground_s", "drawSelector_s", "drawSelector_1_s", + "waitContext_2" ]; if (b && types.indexOf(b.type)>=0) { try { var code = "[" + Blockly.JavaScript.blockToCode(b).replace(/\\(i|c|d|e)/g, '\\\\$1') + "]"; eval("var obj="+code); - // console.log(obj); - if (obj.length > 0 && b.type.startsWith(obj[0].type)) { + if (obj.length > 0 && b.type == 'waitContext_2') { + var dt = obj[0]; + editor.uievent.previewUI([{"type": "fillRect", "x": dt.px[0], "y": dt.py[0], + "width": "(" + dt.px[1] + ")-(" + dt.px[0] + ")", "height": "(" + dt.py[1] + ")-(" + dt.py[0] + ")", + "style": "#FF0000"}]) + } + else if (obj.length > 0 && b.type.startsWith(obj[0].type)) { if (b.type == 'previewUI_s') editor.uievent.previewUI(obj[0].action); else editor.uievent.previewUI([obj[0]]); diff --git a/libs/events.js b/libs/events.js index 8a50cc5f..628d5548 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1970,6 +1970,17 @@ events.prototype.__action_wait_afterGet = function (data) { core.insertAction(todo); } +events.prototype._precompile_wait = function (data) { + if (data.data) { + data.data.forEach(function (v) { + if (v.px) v.px = this.__precompile_array(v.px); + if (v.py) v.py = this.__precompile_array(v.py); + v.action = this.precompile(v.action); + }, this); + } + return data; +} + events.prototype._action_waitAsync = function (data, x, y, prefix) { var test = window.setInterval(function () { if (!core.hasAsync()) { From 4d0ad198a44ff2076a51f927141d5218ccc5f93c Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 27 Dec 2019 18:39:56 +0800 Subject: [PATCH 26/43] type:wait preview --- _server/editor_blockly.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 91599d24..f40b7fb9 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -703,7 +703,7 @@ function omitedcheckUpdateFunction(event) { var dt = obj[0]; editor.uievent.previewUI([{"type": "fillRect", "x": dt.px[0], "y": dt.py[0], "width": "(" + dt.px[1] + ")-(" + dt.px[0] + ")", "height": "(" + dt.py[1] + ")-(" + dt.py[0] + ")", - "style": "#FF0000"}]) + "style": "rgba(255,0,0,0.5)"}]) } else if (obj.length > 0 && b.type.startsWith(obj[0].type)) { if (b.type == 'previewUI_s') From 1b4f9475509db66f757f367da6b670c8758c28e5 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 29 Dec 2019 21:43:42 +0800 Subject: [PATCH 27/43] cursor follow mouse --- libs/actions.js | 39 +++++++++++++++++++++++++++++++++++++++ libs/maps.js | 2 +- main.js | 12 +++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index d0d21421..22dbadfb 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -42,6 +42,7 @@ actions.prototype._init = function () { // --- onmove注册 this.registerAction('onmove', '_sys_checkReplay', this._sys_checkReplay, 100); this.registerAction('onmove', '_sys_onmove_paint', this._sys_onmove_paint, 50); + this.registerAction('onmove', '_sys_onmove_choices', this._sys_onmove_choices, 30); this.registerAction('onmove', '_sys_onmove', this._sys_onmove, 0); // --- onup注册 this.registerAction('onup', '_sys_checkReplay', this._sys_checkReplay, 100); @@ -486,6 +487,29 @@ actions.prototype._sys_onmove_paint = function (x, y, px, py) { } } +actions.prototype._sys_onmove_choices = function (x, y) { + if (!core.status.lockControl) return false; + + switch (core.status.event.id) { + case 'action': + if (core.status.event.id != 'choices') break; + case 'selectShop': + case 'switchs': + case 'settings': + case 'syncSave': + case 'syncSelect': + case 'localSaveSelect': + case 'storageRemove': + case 'replay': + case 'gameInfo': + this._onMoveChoices(x, y); + return true; + default: + break; + } + return false; +} + actions.prototype._sys_onmove = function (x, y) { if ((core.status.stepPostfix || []).length > 0) { var pos = {'x': x, 'y': y}; @@ -852,6 +876,21 @@ actions.prototype._keyDownChoices = function (keycode) { } } +// 移动光标 +actions.prototype._onMoveChoices = function (x, y) { + if (x < this.CHOICES_LEFT || x > this.CHOICES_RIGHT) return; + var choices = core.status.event.ui.choices; + + var topIndex = this.HSIZE - parseInt((choices.length - 1) / 2) + (core.status.event.ui.offset || 0); + + if (y >= topIndex && y < topIndex + choices.length) { + var selection = y - topIndex; + if (selection == core.status.event.selection) return; + core.status.event.selection = selection; + core.ui.drawChoices(core.status.event.ui.text, core.status.event.ui.choices); + } +} + ////// 点击中心对称飞行器时 actions.prototype._clickCenterFly = function (x, y) { var posX = core.status.event.data.posX, posY = core.status.event.data.posY; diff --git a/libs/maps.js b/libs/maps.js index 591c6551..ea3a89a1 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -98,7 +98,7 @@ maps.prototype.initBlock = function (x, y, id, addInfo, eventFloor) { var block = {'x': x, 'y': y, 'id': id}; if (disable != null) block.disable = disable; - if (id == 17) block.event = {"cls": "terrains", "id": "airwall", "noPass": true}; + if (id == 17) block.event = {"cls": "terrains", "id": "airwall", "noPass": true, "cannotIn":["up", "down", "left", "right"]}; else if (id in this.blocksInfo) block.event = JSON.parse(JSON.stringify(this.blocksInfo[id])); else if (core.icons.getTilesetOffset(id)) block.event = {"cls": "tileset", "id": "X" + id, "noPass": true}; else block.event = {'cls': 'terrains', 'id': 'none', 'noPass': false}; diff --git a/main.js b/main.js index 30516e37..c9e9f506 100644 --- a/main.js +++ b/main.js @@ -426,7 +426,17 @@ main.dom.body.onkeyup = function(e) { (main.core.isPlaying() || main.core.status.lockControl)) main.core.onkeyUp(e); } catch (ee) { main.log(ee); } -} +}; + +[main.dom.startButtons, main.dom.levelChooseButtons].forEach(function (dom) { + dom.onmousemove = function (e) { + for (var i = 0; i < dom.children.length; ++i) { + if (dom.children[i] == e.target && i != (main.selectedButton || 0)) { + main.selectButton(i); + } + } + } +}); ////// 开始选择时 ////// main.dom.body.onselectstart = function () { From 2893e1c3fbffa0960fef2c5298ea13e77487cc78 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 29 Dec 2019 22:14:43 +0800 Subject: [PATCH 28/43] v2.6.6 --- _server/editor_table.js | 1 + project/data.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/_server/editor_table.js b/_server/editor_table.js index b2e8cf3f..c21220fd 100644 --- a/_server/editor_table.js +++ b/_server/editor_table.js @@ -293,6 +293,7 @@ editor_table_wrapper = function (editor) { var thiseval = null; if (input.checked != null) input.value = input.checked; try { + if (input.value == '') input.value = 'null'; thiseval = JSON.parse(input.value); } catch (ee) { printe(field + ' : ' + ee); diff --git a/project/data.js b/project/data.js index f7671cba..f5c220f7 100644 --- a/project/data.js +++ b/project/data.js @@ -63,8 +63,8 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "武器", "盾牌" ], - "startBgm": "bgm.mp3", - "statusLeftBackground": "url(project/images/ground.png) repeat", + "startBgm": null, + "statusLeftBackground": null, "statusTopBackground": "url(project/images/ground.png) repeat", "toolsBackground": "url(project/images/ground.png) repeat", "borderColor": "#CCCCCC", From d6b27a7ac45c57251ed34d22582badba5599bc65 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sun, 29 Dec 2019 23:06:31 +0800 Subject: [PATCH 29/43] Fix --- editor-mobile.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/editor-mobile.html b/editor-mobile.html index e618eb19..fe0525c0 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -135,6 +135,10 @@
+
+ + +
From eb8abae982bc84d62b8f24803af89ce29f01c9a7 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 30 Dec 2019 17:10:04 +0800 Subject: [PATCH 30/43] onmove_choices shop --- libs/actions.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/actions.js b/libs/actions.js index 22dbadfb..8af36328 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -492,7 +492,8 @@ actions.prototype._sys_onmove_choices = function (x, y) { switch (core.status.event.id) { case 'action': - if (core.status.event.id != 'choices') break; + if (core.status.event.data.type != 'choices') break; + case 'shop': case 'selectShop': case 'switchs': case 'settings': From 97ba00cb336537511b300fb374f7f9c1248b1e38 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 30 Dec 2019 18:38:50 +0800 Subject: [PATCH 31/43] tileset bind width&height --- _server/editor.js | 4 ++- _server/editor_datapanel.js | 44 +++++++++++++++++++++++++++------ _server/editor_legacy.js | 2 +- _server/editor_listen.js | 1 + _server/editor_mappanel.js | 15 +++++++++-- _server/editor_materialpanel.js | 17 +++++++++++++ editor.html | 1 + 7 files changed, 72 insertions(+), 12 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index 84b3f424..c7396183 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -85,8 +85,10 @@ function editor() { copyEnemyItem : { type: null, data: {} - } + }, + // tile + tileSize: [1,1], }; window.onerror = function (msg, url, lineNo, columnNo, error) { diff --git a/_server/editor_datapanel.js b/_server/editor_datapanel.js index a533d758..a962efe0 100644 --- a/_server/editor_datapanel.js +++ b/_server/editor_datapanel.js @@ -636,6 +636,8 @@ editor_datapanel_wrapper = function (editor) { editor.uifunctions.appendConfirm_func = function () { + var appendRegister = document.getElementById('appendRegister'); + var appendConfirm = document.getElementById('appendConfirm'); appendConfirm.onclick = function () { @@ -699,15 +701,28 @@ editor_datapanel_wrapper = function (editor) { } var dt = editor.dom.spriteCtx.getImageData(0, 0, editor.dom.sprite.width, editor.dom.sprite.height); var imgbase64 = editor.dom.sprite.toDataURL('image/png'); - fs.writeFile('./project/images/' + editor_mode.appendPic.imageName + '.png', imgbase64.split(',')[1], 'base64', function (err, data) { + var imgName = editor_mode.appendPic.imageName; + fs.writeFile('./project/images/' + imgName + '.png', imgbase64.split(',')[1], 'base64', function (err, data) { if (err) { printe(err); throw (err) } - printf('追加素材成功,你可以继续追加其他素材,最后再刷新以显示在素材区'); - editor.dom.sprite.style.height = (editor.dom.sprite.height = (editor.dom.sprite.height + ysize)) + "px"; + var currHeight = editor.dom.sprite.height; + editor.dom.sprite.style.height = (editor.dom.sprite.height = (currHeight + ysize)) + "px"; editor.dom.spriteCtx.putImageData(dt, 0, 0); - core.material.images[editor.dom.selectAppend.value].src = imgbase64; + core.material.images[imgName].src = imgbase64; + editor.widthsX[imgName][3] = currHeight; + if (appendRegister && appendRegister.checked) { + editor.file.autoRegister({images: imgName}, function (e) { + if (e) { + printe(e); + throw e; + } + printf('追加素材并自动注册成功!你可以继续追加其他素材,最后再刷新以使用。'); + }); + } else { + printf('追加素材成功!你可以继续追加其他素材,最后再刷新以使用。'); + } }); } @@ -731,15 +746,28 @@ editor_datapanel_wrapper = function (editor) { dt = editor.dom.spriteCtx.getImageData(0, 0, editor.dom.sprite.width, editor.dom.sprite.height); var imgbase64 = editor.dom.sprite.toDataURL('image/png'); - fs.writeFile('./project/images/' + editor_mode.appendPic.imageName + '.png', imgbase64.split(',')[1], 'base64', function (err, data) { + var imgName = editor_mode.appendPic.imageName; + fs.writeFile('./project/images/' + imgName + '.png', imgbase64.split(',')[1], 'base64', function (err, data) { if (err) { printe(err); throw (err) } - printf('快速追加素材成功,你可以继续追加其他素材,最后再刷新以显示在素材区'); - editor.dom.sprite.style.height = (editor.dom.sprite.height = (editor.dom.sprite.height + ysize)) + "px"; + var currHeight = editor.dom.sprite.height; + editor.dom.sprite.style.height = (editor.dom.sprite.height = (currHeight + ysize)) + "px"; editor.dom.spriteCtx.putImageData(dt, 0, 0); - core.material.images[editor.dom.selectAppend.value].src = imgbase64; + core.material.images[imgName].src = imgbase64; + editor.widthsX[imgName][3] = currHeight; + if (appendRegister && appendRegister.checked) { + editor.file.autoRegister({images: imgName}, function (e) { + if (e) { + printe(e); + throw e; + } + printf('快速追加素材并自动注册成功!你可以继续追加其他素材,最后再刷新以使用。'); + }) + } else { + printf('快速追加素材成功!你可以继续追加其他素材,最后再刷新以使用。'); + } }); } diff --git a/_server/editor_legacy.js b/_server/editor_legacy.js index 7242553c..35e5518d 100644 --- a/_server/editor_legacy.js +++ b/_server/editor_legacy.js @@ -216,7 +216,7 @@ tip.showHelp = function(value) { '双击事件编辑器的图块可以进行长文本编辑/脚本编辑/地图选点/UI绘制预览等操作', 'ESC或点击空白处可以自动保存当前修改', 'H键可以打开操作帮助哦', - 'tileset贴图模式下可以按选中tileset素材,并在地图上拖动来一次绘制一个区域', + 'tileset贴图模式可以在地图上拖动来一次绘制一个区域;右键额外素材也可以绑定宽高', '可以拖动地图上的图块和事件,或按Ctrl+C, Ctrl+X和Ctrl+V进行复制,剪切和粘贴,Delete删除', 'Alt+数字键保存图块,数字键读取保存的图块', ]; diff --git a/_server/editor_listen.js b/_server/editor_listen.js index 1e50f6af..62bb2e73 100644 --- a/_server/editor_listen.js +++ b/_server/editor_listen.js @@ -24,6 +24,7 @@ editor_listen_wrapper = function (editor) { editor.dom.iconExpandBtn.onclick = editor.uifunctions.fold_material_click editor.dom.iconLib.onmousedown = editor.uifunctions.material_ondown + editor.dom.iconLib.oncontextmenu = function (e) { e.preventDefault() } editor.dom.extraEvent.onmousedown = editor.uifunctions.extraEvent_click editor.dom.chooseThis.onmousedown = editor.uifunctions.chooseThis_click diff --git a/_server/editor_mappanel.js b/_server/editor_mappanel.js index 59d538ee..f36f4d33 100644 --- a/_server/editor_mappanel.js +++ b/_server/editor_mappanel.js @@ -221,8 +221,19 @@ editor_mappanel_wrapper = function (editor) { } } } - // console.log(editor.uivalues.stepPostfix); - if (editor.brushMod === 'tileset' && core.tilesets.indexOf(editor.info.images) !== -1) { + var useBrushMode = editor.brushMod == 'tileset'; + if (editor.uivalues.stepPostfix.length == 1 && (editor.uivalues.tileSize[0] > 1 || editor.uivalues.tileSize[1] > 1)) { + useBrushMode = true; + var x0 = editor.uivalues.stepPostfix[0].x; + var y0 = editor.uivalues.stepPostfix[0].y; + editor.uivalues.stepPostfix = []; + for (var jj = y0; jj < y0 + editor.uivalues.tileSize[1]; ++jj) { + for (var ii = x0; ii < x0 + editor.uivalues.tileSize[0]; ++ii) { + editor.uivalues.stepPostfix.push({ x: ii, y: jj }); + } + } + } + if (useBrushMode && core.tilesets.indexOf(editor.info.images) !== -1) { var imgWidth = ~~(core.material.images.tilesets[editor.info.images].width / 32); var x0 = editor.uivalues.stepPostfix[0].x; var y0 = editor.uivalues.stepPostfix[0].y; diff --git a/_server/editor_materialpanel.js b/_server/editor_materialpanel.js index 2c0daabe..f5dd9916 100644 --- a/_server/editor_materialpanel.js +++ b/_server/editor_materialpanel.js @@ -50,6 +50,7 @@ editor_materialpanel_wrapper = function (editor) { */ editor.uifunctions.material_ondown = function (e) { e.stopPropagation(); + e.preventDefault(); if (!editor.isMobile && e.clientY >= editor.dom.iconLib.offsetHeight - editor.uivalues.scrollBarHeight) return; var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft; var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; @@ -59,6 +60,7 @@ editor_materialpanel_wrapper = function (editor) { 'size': 32 }; editor.loc = loc; + editor.uivalues.tileSize = [1,1]; var pos = editor.uifunctions.locToPos(loc); for (var spriter in editor.widthsX) { if (pos.x >= editor.widthsX[spriter][1] && pos.x < editor.widthsX[spriter][2]) { @@ -126,6 +128,21 @@ editor_materialpanel_wrapper = function (editor) { break; } } + + if (editor.info.isTile && e.button == 2) { + var v = prompt("请输入该额外素材区域绑定宽高,以逗号分隔", "1,1"); + if (v != null && /^\d+,\d+$/.test(v)) { + v = v.split(","); + var x = parseInt(v[0]), y = parseInt(v[1]); + var widthX = editor.widthsX[editor.info.images]; + if (x <= 0 || y <= 0 || editor.info.x + x > widthX[2] - widthX[1] || 32*(editor.info.y + y) > widthX[3]) { + alert("不合法的输入范围,已经越界"); + } else { + editor.uivalues.tileSize = [x, y]; + } + } + } + } tip.infos(JSON.parse(JSON.stringify(editor.info))); editor_mode.onmode('nextChange'); diff --git a/editor.html b/editor.html index b1a645f7..ef0cf608 100644 --- a/editor.html +++ b/editor.html @@ -73,6 +73,7 @@ +   自动注册

色相: From 1d271648d23504f90e20868de56d24100b9840ce Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Mon, 30 Dec 2019 19:05:33 +0800 Subject: [PATCH 32/43] mid2 --- _server/css/editor.css | 10 +++++++++- _server/css/editor_mobile.css | 4 ++++ _server/editor_mappanel.js | 1 + editor-mobile.html | 4 ++++ editor.html | 3 +++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/_server/css/editor.css b/_server/css/editor.css index 04edff1a..2b14dd45 100644 --- a/_server/css/editor.css +++ b/_server/css/editor.css @@ -40,7 +40,7 @@ body { width: 104px; } -#left, #mid, #right { +#left, #mid, #mid2, #right { border-radius: 2px; box-sizing: border-box; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .14), 0 3px 1px -2px rgba(0, 0, 0, .2), 0 1px 5px 0 rgba(0, 0, 0, .12); @@ -130,6 +130,14 @@ body { height: 630px; } +#mid2 { + position: absolute; + left: 448px; + top: 650px; + width: 440px; + bottom: 10px; +} + #mapEdit { overflow: hidden; } diff --git a/_server/css/editor_mobile.css b/_server/css/editor_mobile.css index 40e28ff1..6dfaa651 100644 --- a/_server/css/editor_mobile.css +++ b/_server/css/editor_mobile.css @@ -110,6 +110,10 @@ body { position: absolute; } +#mid2 { + display: none; +} + #mapEdit { overflow: hidden; } diff --git a/_server/editor_mappanel.js b/_server/editor_mappanel.js index f36f4d33..fb32c7b3 100644 --- a/_server/editor_mappanel.js +++ b/_server/editor_mappanel.js @@ -229,6 +229,7 @@ editor_mappanel_wrapper = function (editor) { editor.uivalues.stepPostfix = []; for (var jj = y0; jj < y0 + editor.uivalues.tileSize[1]; ++jj) { for (var ii = x0; ii < x0 + editor.uivalues.tileSize[0]; ++ii) { + if (jj >= editor[editor.layerMod].length || ii >= editor[editor.layerMod][0].length) continue; editor.uivalues.stepPostfix.push({ x: ii, y: jj }); } } diff --git a/editor-mobile.html b/editor-mobile.html index fe0525c0..f172454c 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -77,6 +77,7 @@ + 自动注册

色相: @@ -311,6 +312,9 @@

+ +
+
+
+
-
- +
- +

最近使用的图块列表:

+
+ +