From 71f5d366dc7dcda02265a9e47da3e820ce851b12 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 30 Oct 2018 15:43:33 +0800 Subject: [PATCH 01/16] StartText events --- _server/data.comment.js | 2 +- docs/event.md | 4 +- libs/actions.js | 11 +---- libs/control.js | 47 ++------------------- libs/core.js | 4 +- libs/events.js | 92 +++++++++++++++++++++++++++++++---------- libs/utils.js | 1 + 7 files changed, 82 insertions(+), 79 deletions(-) diff --git a/_server/data.comment.js b/_server/data.comment.js index 43080322..4c7dcd92 100644 --- a/_server/data.comment.js +++ b/_server/data.comment.js @@ -257,7 +257,7 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_type": "event", "_event": "firstArrive", "_range": "thiseval==null || thiseval instanceof Array", - "_data": "游戏开始前剧情。\n可以双击进入事件编辑器。\n如果无剧情直接留一个空数组即可。" + "_data": "游戏开始前剧情,可以执行任意自定义事件。\n双击进入事件编辑器。\n如果无剧情直接留一个空数组即可。" }, "shops": { "_leaf": true, diff --git a/docs/event.md b/docs/event.md index 6c475c36..d0418e49 100644 --- a/docs/event.md +++ b/docs/event.md @@ -1587,6 +1587,7 @@ core.insertAction([ "icon": "blueShop", // 商店图标,blueShop为蓝色商店,pinkShop为粉色商店 "textInList": "1F金币商店", // 在快捷商店栏中显示的名称 "use": "money", // 商店所要使用的。只能是"money"或"experience"。 + "commonTimes": true, // 是否使用全局次数 "need": "20+10*times*(times+1)", // 商店需要的金币/经验数值;可以是一个表达式,以times作为参数计算。 // 这里用到的times为该商店的已经的访问次数。首次访问该商店时times的值为0。 // 上面的例子是50层商店的计算公式。你也可以写任意其他的计算公式,只要以times作为参数即可。 @@ -1634,6 +1635,7 @@ core.insertAction([ - icon 为商店的图标,在icons.js的npcs中定义。如woman可代表一个商人。 - textInList 为其在快捷商店栏中显示的名称,如"3楼金币商店"等 - use 为消耗的类型,是金币(money)还是经验(experience)。 +- commonTimes 是否使用全局次数;如果为true则可以多个快捷商店共享相同的次数 - need 是一个表达式,计算商店所需要用到的数值。 - 可以将times作为参数,times为该商店已经访问过的次数,第一次访问时times是0。 - 如果对于每个选项都需要不同的数值,这里设为"-1";可参见下面经验商店的例子。 @@ -1873,8 +1875,6 @@ core.insertAction([ 它将显示全塔属性中的startText内容(可以修改成自己的),提供战斗动画开启选择,设置初始福利,并正式开始游戏。 -全塔属性的startText只能使用纯文本类型,其他的事件均无效。 - 我们可以修改脚本编辑`setInitData`函数来对于不同难度分别设置初始属性。 其参数hard分为对应全塔属性中levelChooseButtons中的第二项,分别对应不同的难度,并会在游戏中传输,在状态栏显示。 diff --git a/libs/actions.js b/libs/actions.js index 9c70ab75..a49a5f99 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -2216,15 +2216,8 @@ actions.prototype.clickReplay = function (x, y) { case 0: { core.ui.closePanel(); - var hard=core.status.hard, route=core.clone(core.status.route); - var seed = core.getFlag('seed'); - core.resetStatus(core.firstData.hero, hard, core.firstData.floorId, null, core.initStatus.maps); - core.events.setInitData(hard); - core.setFlag('seed', seed); - core.setFlag('rand', seed); - core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { - core.startReplay(route); - }, true); + var hard=core.status.hard, seed = core.getFlag('seed'); + core.startGame(hard, seed, core.clone(core.status.route)); break; } case 1: diff --git a/libs/control.js b/libs/control.js index d69826b6..db94bd37 100644 --- a/libs/control.js +++ b/libs/control.js @@ -318,32 +318,6 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps, value core.status.played = true; } -////// 开始游戏 ////// -control.prototype.startGame = function (hard, callback) { - console.log('开始游戏'); - - this.resetStatus(core.firstData.hero, hard, core.firstData.floorId, null, core.initStatus.maps); - - core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { - if (core.isset(callback)) callback(); - }, true); - - setTimeout(function () { - // Upload - var formData = new FormData(); - formData.append('type', 'people'); - formData.append('name', core.firstData.name); - formData.append('version', core.firstData.version); - formData.append('platform', core.platform.isPC?"PC":core.platform.isAndroid?"Android":core.platform.isIOS?"iOS":""); - formData.append('hard', core.encodeBase64(hard)); - formData.append('hardCode', core.getFlag('hard', 0)); - formData.append('base64', 1); - - core.utils.http("POST", "/games/upload.php", formData); - }) - -} - ////// 重新开始游戏;此函数将回到标题页面 ////// control.prototype.restart = function() { this.showStartAnimate(); @@ -1041,7 +1015,7 @@ control.prototype.updateViewport = function() { ////// 绘制勇士 ////// control.prototype.drawHero = function (direction, x, y, status, offset) { - if (!core.isPlaying()) return; + if (!core.isPlaying() || core.status.isStarting) return; var scan = { 'up': {'x': 0, 'y': -1}, @@ -1679,14 +1653,7 @@ control.prototype.chooseReplayFile = function () { return; } - core.dom.startPanel.style.display = 'none'; - core.resetStatus(core.firstData.hero, obj.hard, core.firstData.floorId, null, core.initStatus.maps); - core.setFlag('seed', obj.seed); - core.setFlag('rand', obj.seed); - core.events.setInitData(obj.hard); - core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { - core.startReplay(core.decodeRoute(obj.route)); - }, true); + core.startGame(obj.hard, obj.seed, core.decode(obj.route)); }, function () { }) @@ -2263,15 +2230,7 @@ control.prototype.doSL = function (id, type) { if (data.version != core.firstData.version) { // core.drawTip("存档版本不匹配"); if (confirm("存档版本不匹配!\n你想回放此存档的录像吗?\n可以随时停止录像播放以继续游戏。")) { - core.dom.startPanel.style.display = 'none'; - var seed = data.hero.flags.seed; - core.resetStatus(core.firstData.hero, data.hard, core.firstData.floorId, null, core.initStatus.maps); - core.events.setInitData(data.hard); - core.setFlag('seed', seed); - core.setFlag('rand', seed); - core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() { - core.startReplay(core.decodeRoute(data.route)); - }, true); + core.startGame(data.hard, data.hero.flags.seed, core.decodeRoute(data.route)); } return; } diff --git a/libs/core.js b/libs/core.js index 38f0f4d8..184957f0 100644 --- a/libs/core.js +++ b/libs/core.js @@ -356,8 +356,8 @@ core.prototype.resetStatus = function(hero, hard, floorId, route, maps, values) } ////// 开始游戏 ////// -core.prototype.startGame = function (hard, callback) { - core.control.startGame(hard, callback); +core.prototype.startGame = function (hard, seed, route, callback) { + core.events.startGame(hard, seed, route, callback); } ////// 重新开始游戏;此函数将回到标题页面 ////// diff --git a/libs/events.js b/libs/events.js index 73397f40..bc56158e 100644 --- a/libs/events.js +++ b/libs/events.js @@ -76,38 +76,83 @@ events.prototype.initGame = function () { } ////// 游戏开始事件 ////// -events.prototype.startGame = function (hard) { +events.prototype.startGame = function (hard, seed, route, callback) { if (core.status.isStarting) return; core.status.isStarting = true; - core.hideStartAnimate(function() { - core.drawText(core.clone(core.firstData.startText), function() { - if (core.flags.showBattleAnimateConfirm) { // 是否提供“开启战斗动画”的选择项 + var start = function () { + console.log('开始游戏'); + core.resetStatus(core.firstData.hero, hard, core.firstData.floorId, null, core.initStatus.maps); + + core.status.isStarting = true; + + if (core.isset(seed)) { + core.setFlag('seed', seed); + core.setFlag('rand', seed); + } + else core.utils.__init_seed(); + + core.events.setInitData(hard); + core.clearMap('all'); + core.clearStatusBar(); + + var post_start = function () { + + core.status.isStarting = false; + + core.changeFloor(core.status.floorId, null, core.status.hero.loc, null, function() { + if (core.isset(callback)) callback(); + }, true); + + setTimeout(function () { + // Upload + var formData = new FormData(); + formData.append('type', 'people'); + formData.append('name', core.firstData.name); + formData.append('version', core.firstData.version); + formData.append('platform', core.platform.isPC?"PC":core.platform.isAndroid?"Android":core.platform.isIOS?"iOS":""); + formData.append('hard', core.encodeBase64(hard)); + formData.append('hardCode', core.getFlag('hard', 0)); + formData.append('base64', 1); + + core.utils.http("POST", "/games/upload.php", formData); + }) + } + + core.insertAction(core.clone(core.firstData.startText), null, null, function() { + if (!core.status.replay.replaying && core.flags.showBattleAnimateConfirm) { // 是否提供“开启战斗动画”的选择项 core.status.event.selection = core.flags.battleAnimate ? 0 : 1; core.ui.drawConfirmBox("你想开启战斗动画吗?\n之后可以在菜单栏中开启或关闭。\n(强烈建议新手开启此项)", function () { - core.data.flags.battleAnimate = true; core.flags.battleAnimate = true; core.setLocalStorage('battleAnimate', true); - core.startGame(hard); - core.utils.__init_seed(); - core.events.setInitData(hard); + post_start(); }, function () { - core.data.flags.battleAnimate = false; core.flags.battleAnimate = false; core.setLocalStorage('battleAnimate', false); - core.startGame(hard); - core.utils.__init_seed(); - core.events.setInitData(hard); + post_start(); }); } else { - core.startGame(hard); - core.utils.__init_seed(); - core.events.setInitData(hard); + post_start(); } }); - }) + + if (core.isset(route)) { + core.startReplay(route); + } + + } + + if (core.isset(route)) { + core.dom.startPanel.style.display = 'none'; + start(); + } + else { + core.hideStartAnimate(function() { + start(); + }) + } } ////// 不同难度分别设置初始属性 ////// @@ -589,11 +634,8 @@ events.prototype.doAction = function() { this.doAction(); break; case "showImage": // 显示图片 - if (core.isset(data.loc) && core.isset(core.material.images.images[data.name])) { - core.canvas.image.drawImage(core.material.images.images[data.name], - core.calValue(data.loc[0]), core.calValue(data.loc[1])); - } - else core.clearMap('image'); + if (!core.isset(data.loc)) data.loc=[]; + core.events.showImage(data.name, data.loc[0], data.loc[1]); this.doAction(); break; case "animateImage": // 淡入淡出图片 @@ -1361,6 +1403,14 @@ events.prototype.changeFloor = function (floorId, stair, heroLoc, time, callback }, 25); } +////// 绘制图片 ////// +events.prototype.showImage = function (name, x, y) { + if (core.isset(name) && core.isset(x) && core.isset(y) && core.isset(core.material.images.images[name])) { + core.canvas.image.drawImage(core.material.images.images[name], x, y); + } + else core.clearMap('image'); +} + ////// 图片淡入/淡出 ////// events.prototype.animateImage = function (type, image, loc, time, keep, callback) { time = time||0; diff --git a/libs/utils.js b/libs/utils.js index b347f524..24c1eaf9 100644 --- a/libs/utils.js +++ b/libs/utils.js @@ -20,6 +20,7 @@ utils.prototype.replaceText = function (text) { ////// 计算表达式的值 ////// utils.prototype.calValue = function (value) { + if (!core.isset(value)) return value; if (typeof value == 'number') { return value; } From 9bc235255c24fa37a640658ecddb591e3ee1c2b8 Mon Sep 17 00:00:00 2001 From: oc Date: Tue, 30 Oct 2018 22:45:37 +0800 Subject: [PATCH 02/16] clearPaint --- libs/actions.js | 7 ++++++- libs/ui.js | 2 +- main.js | 8 +++++++- project/images/delete (1).png | Bin 0 -> 940 bytes project/images/delete.png | Bin 0 -> 962 bytes project/images/icons.png | Bin 22029 -> 22870 bytes 6 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 project/images/delete (1).png create mode 100644 project/images/delete.png diff --git a/libs/actions.js b/libs/actions.js index 5b4fff35..8f935115 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -2597,6 +2597,12 @@ actions.prototype.setPaintMode = function (mode) { core.drawTip("进入"+(core.status.event.data.erase?"擦除":"绘图")+"模式"); } +actions.prototype.clearPaint = function () { + core.clearMap('route'); + core.paint[core.status.floorId] = null; + core.drawTip("已清空绘图内容"); +} + actions.prototype.savePaint = function () { var data = {}; for (var floorId in core.paint) { @@ -2639,7 +2645,6 @@ actions.prototype.exitPaint = function () { core.clearMap('route'); core.ui.closePanel(); core.statusBar.image.shop.style.opacity = 1; - core.statusBar.image.toolbox.style.opacity = 1; core.updateStatusBar(); core.drawTip("退出绘图模式"); } diff --git a/libs/ui.js b/libs/ui.js index 9636e447..d66d1500 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2460,10 +2460,10 @@ ui.prototype.drawPaint = function () { core.setStrokeStyle('route', '#FF0000'); core.statusBar.image.shop.style.opacity = 0; - core.statusBar.image.toolbox.style.opacity = 0; core.statusBar.image.book.src = core.statusBar.icons.paint.src; core.statusBar.image.fly.src = core.statusBar.icons.erase.src; + core.statusBar.image.toolbox.src = core.statusBar.icons.delete.src; core.statusBar.image.settings.src = core.statusBar.icons.exit.src; core.statusBar.image.book.style.opacity = 1; core.statusBar.image.fly.style.opacity = 1; diff --git a/main.js b/main.js index cee1293a..01bf184b 100644 --- a/main.js +++ b/main.js @@ -130,7 +130,8 @@ function main() { 'skill': 25, 'paint': 26, 'erase': 27, - 'exit': 28, + 'delete': 28, + 'exit': 29, }, 'floor': document.getElementById('floor'), 'name': document.getElementById('name'), @@ -451,6 +452,11 @@ main.statusBar.image.toolbox.onclick = function () { return; } + if (main.core.isPlaying() && (core.status.event||{}).id=='paint') { + core.actions.clearPaint(); + return; + } + if (main.core.isPlaying()) { main.core.openToolbox(core.status.event.id != 'equipbox'); } diff --git a/project/images/delete (1).png b/project/images/delete (1).png new file mode 100644 index 0000000000000000000000000000000000000000..aee5e5052c935fd80162e2eb16503a2d70c1493b GIT binary patch literal 940 zcmV;d15^BoP)l|txZ#%ldQnnA>Oly4h<<=k z8R2^o^dAJh^mpV-ZxvDq;zK?aL{JH3rBoP|MwYs|nBuRUxu=I=+#UDa-H}zgFMDV1 zchC3Dcg{UCOU#Tgqw9Fjbpq}HI8qWw7>DM&FUJO+go#UG1e|K?PHK)$1BizS3Sd6E zyszom_xo$*fOeQ@u8yB1(jGbCAvC5W921Ta&;y{}sm`_oc)cS608Rc(G55U~8+b0E zy4tQ>22&3Jux*iq**fUL#6-+miuRI1$^>%0PB!O0e7*_*c1KHp+!sdeP7fm7Py`wUu<#%F7ns#YHQ13JNx7Lu z3!Eg-?OmrOzGZ=vDL2zN*pVIy9K(z6fAkX5quu1!#OH_Fn}_{t6v+fk1D*?0Ua0 zGjei+z}1#&m^ZLOpRn00vv)RtD67vKfeB^=P3Sb3d= z`YLunyQLj4(gTj~0AvNWRv~I2YDmF0YQW?`q$*zCf!L=*8RXr}3kXpIx^xY!^tUuD zmle=|4K9F8v4Dyl5Nk_5G0etp=v!0B;m`dwTXsP1FCxFt3l790h$+Iscmx1YAF;5< zQmC~p?6oZq6ZbItW5U-yv*>{Mzkme08lpDN*45-U65(_*5x}%2VrWgoq>#o2XKGr; zPqPZfHfq42wxS_4A)^3d{b$GdmEk2P-Ly6$LjcBhikyJaDn~z+*8TzU={d_eYI-36 O0000x`VphdPP!1%<6X9SC za)X3;^Z($$Sv|^uzk!>HUVwuKPf9{mBD%ot0_%kyB!&cL*4?gp9;#+~V76zN*=+XW zOFEhE_f@^GzE|~Ljm(UlG`FMC|0e)UjRRKe_YVT$@-u zfzlPoz$yZ|b>|qFn`4*z$>!&u=+C<+0POI)KWb%VH|ybJe0XR_4*eDvK@I|JQ2J!` zl`zmE2%u8H+(kTBSn~@JqiY0R17OWB;JJdii`5)%mLM=Ufda}3d;qhGKv3L_re<8B zD*T3P5?`wg>y@X0wF=Y|XscjaK;ItlYNsI0M5w}>niybx1VWd<^aLq*cK>g@46mxF zc(w6@QjPRpsZgqs-rE2Ihu5C??UmXT)Dp0hCrg5ROwb$Z;>>jjg3zZxSA{?`<+}sG zFH3s}a(MUDj_<3jBg5OVr-hf}=XT!iv-p!kBX=^|1hc>`ZRbWL;|IvykhVaSV{qOl5aLOr!5c& zse*Njknk-HHO% ziZZ5R;qQc2VRnZ0n7o|C;L``)t>v)H^1-wKDGZQP+dlYi&bz-r=UZNslF79W4%6LTS&o1 zS>UDt9oBcnuj4UD7uallr~(6b!U4dyty{qR;|1^8vYpA_83q`AEq~HJ&dkhP6NL|* k2csY(71(au@&AVZ0e5|vES%c_s{jB107*qoM6N<$g1=(1x&QzG literal 0 HcmV?d00001 diff --git a/project/images/icons.png b/project/images/icons.png index 538a2c8f7210626cd09d93cb3b4beb326a629395..75301f33464638828c1bfcdd538f2b523f784721 100644 GIT binary patch literal 22870 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 literal 22029 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 Date: Tue, 30 Oct 2018 22:46:48 +0800 Subject: [PATCH 03/16] clearPaint --- project/images/delete (1).png | Bin 940 -> 0 bytes project/images/delete.png | Bin 962 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 project/images/delete (1).png delete mode 100644 project/images/delete.png diff --git a/project/images/delete (1).png b/project/images/delete (1).png deleted file mode 100644 index aee5e5052c935fd80162e2eb16503a2d70c1493b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmV;d15^BoP)l|txZ#%ldQnnA>Oly4h<<=k z8R2^o^dAJh^mpV-ZxvDq;zK?aL{JH3rBoP|MwYs|nBuRUxu=I=+#UDa-H}zgFMDV1 zchC3Dcg{UCOU#Tgqw9Fjbpq}HI8qWw7>DM&FUJO+go#UG1e|K?PHK)$1BizS3Sd6E zyszom_xo$*fOeQ@u8yB1(jGbCAvC5W921Ta&;y{}sm`_oc)cS608Rc(G55U~8+b0E zy4tQ>22&3Jux*iq**fUL#6-+miuRI1$^>%0PB!O0e7*_*c1KHp+!sdeP7fm7Py`wUu<#%F7ns#YHQ13JNx7Lu z3!Eg-?OmrOzGZ=vDL2zN*pVIy9K(z6fAkX5quu1!#OH_Fn}_{t6v+fk1D*?0Ua0 zGjei+z}1#&m^ZLOpRn00vv)RtD67vKfeB^=P3Sb3d= z`YLunyQLj4(gTj~0AvNWRv~I2YDmF0YQW?`q$*zCf!L=*8RXr}3kXpIx^xY!^tUuD zmle=|4K9F8v4Dyl5Nk_5G0etp=v!0B;m`dwTXsP1FCxFt3l790h$+Iscmx1YAF;5< zQmC~p?6oZq6ZbItW5U-yv*>{Mzkme08lpDN*45-U65(_*5x}%2VrWgoq>#o2XKGr; zPqPZfHfq42wxS_4A)^3d{b$GdmEk2P-Ly6$LjcBhikyJaDn~z+*8TzU={d_eYI-36 O0000x`VphdPP!1%<6X9SC za)X3;^Z($$Sv|^uzk!>HUVwuKPf9{mBD%ot0_%kyB!&cL*4?gp9;#+~V76zN*=+XW zOFEhE_f@^GzE|~Ljm(UlG`FMC|0e)UjRRKe_YVT$@-u zfzlPoz$yZ|b>|qFn`4*z$>!&u=+C<+0POI)KWb%VH|ybJe0XR_4*eDvK@I|JQ2J!` zl`zmE2%u8H+(kTBSn~@JqiY0R17OWB;JJdii`5)%mLM=Ufda}3d;qhGKv3L_re<8B zD*T3P5?`wg>y@X0wF=Y|XscjaK;ItlYNsI0M5w}>niybx1VWd<^aLq*cK>g@46mxF zc(w6@QjPRpsZgqs-rE2Ihu5C??UmXT)Dp0hCrg5ROwb$Z;>>jjg3zZxSA{?`<+}sG zFH3s}a(MUDj_<3jBg5OVr-hf}=XT!iv-p!kBX=^|1hc>`ZRbWL;|IvykhVaSV{qOl5aLOr!5c& zse*Njknk-HHO% ziZZ5R;qQc2VRnZ0n7o|C;L``)t>v)H^1-wKDGZQP+dlYi&bz-r=UZNslF79W4%6LTS&o1 zS>UDt9oBcnuj4UD7uallr~(6b!U4dyty{qR;|1^8vYpA_83q`AEq~HJ&dkhP6NL|* k2csY(71(au@&AVZ0e5|vES%c_s{jB107*qoM6N<$g1=(1x&QzG From 782ad9e60a863ae8b1e868d5f1ff60ecc1bf1e2a Mon Sep 17 00:00:00 2001 From: oc Date: Tue, 30 Oct 2018 23:11:05 +0800 Subject: [PATCH 04/16] show status on SL Panel --- libs/actions.js | 8 ++++++++ libs/ui.js | 32 ++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index 776a9151..0ec76d04 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -2141,11 +2141,15 @@ actions.prototype.clickStorageRemove = function (x, y) { localforage.clear(function () { core.ui.closePanel(); core.drawText("\t[操作成功]你的所有存档已被清空。"); + core.status.saveIndex = 1; + core.setLocalStorage('saveIndex2', 1); }); } else { localStorage.clear(); core.drawText("\t[操作成功]你的所有存档已被清空。"); + core.status.saveIndex = 1; + core.setLocalStorage('saveIndex2', 1); } break; case 1: @@ -2158,6 +2162,8 @@ actions.prototype.clickStorageRemove = function (x, y) { core.removeLocalForage("autoSave", function() { core.ui.closePanel(); core.drawText("\t[操作成功]当前塔的存档已被清空。"); + core.status.saveIndex = 1; + core.setLocalStorage('saveIndex2', 1); }); } else { @@ -2167,6 +2173,8 @@ actions.prototype.clickStorageRemove = function (x, y) { } core.removeLocalStorage("autoSave"); core.drawText("\t[操作成功]当前塔的存档已被清空。"); + core.status.saveIndex = 1; + core.setLocalStorage('saveIndex2', 1); } break; case 2: diff --git a/libs/ui.js b/libs/ui.js index d66d1500..bdace20d 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2048,27 +2048,35 @@ ui.prototype.drawSLPanel = function(index, refresh) { core.status.event.ui[i] = data; var id=5*page+i; if (i<3) { - core.fillText('ui', i==0?"自动存档":name+id, (2*i+1)*u, 35, '#FFFFFF', "bold 17px Verdana"); - core.strokeRect('ui', (2*i+1)*u-size/2, 50, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); + core.fillText('ui', i==0?"自动存档":name+id, (2*i+1)*u, 30, '#FFFFFF', "bold 17px Verdana"); + core.strokeRect('ui', (2*i+1)*u-size/2, 45, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); if (core.isset(data) && core.isset(data.floorId)) { - core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 50, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); - core.fillText('ui', core.formatDate(new Date(data.time)), (2*i+1)*u, 65+size, data.hero.flags.consoleOpened?'#FF6A6A':'#FFFFFF', '10px Verdana'); + core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i+1)*u-size/2, 45, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); + var v = core.formatBigNumber(data.hero.hp)+"/"+core.formatBigNumber(data.hero.atk)+"/"+core.formatBigNumber(data.hero.def); + var v2 = "/"+core.formatBigNumber(data.hero.mdef); + if (v.length+v2.length<=21) v+=v2; + core.fillText('ui', v, (2*i+1)*u, 60+size, '#FFD700', '10px Verdana'); + core.fillText('ui', core.formatDate(new Date(data.time)), (2*i+1)*u, 73+size, data.hero.flags.consoleOpened?'#FF6A6A':'#FFFFFF'); } else { - core.fillRect('ui', (2*i+1)*u-size/2, 50, size, size, '#333333', 2); - core.fillText('ui', '空', (2*i+1)*u, 117, '#FFFFFF', 'bold 30px Verdana'); + core.fillRect('ui', (2*i+1)*u-size/2, 45, size, size, '#333333', 2); + core.fillText('ui', '空', (2*i+1)*u, 112, '#FFFFFF', 'bold 30px Verdana'); } } else { - core.fillText('ui', name+id, (2*i-5)*u, 230, '#FFFFFF', "bold 17px Verdana"); - core.strokeRect('ui', (2*i-5)*u-size/2, 245, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); + core.fillText('ui', name+id, (2*i-5)*u, 218, '#FFFFFF', "bold 17px Verdana"); + core.strokeRect('ui', (2*i-5)*u-size/2, 233, size, size, i==offset?strokeColor:'#FFFFFF', i==offset?6:2); if (core.isset(data) && core.isset(data.floorId)) { - core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 245, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); - core.fillText('ui', core.formatDate(new Date(data.time)), (2*i-5)*u, 260+size, data.hero.flags.consoleOpened?'#FF6A6A':'#FFFFFF', '10px Verdana'); + core.ui.drawThumbnail(data.floorId, 'ui', core.maps.load(data.maps, data.floorId).blocks, (2*i-5)*u-size/2, 233, size, data.hero.loc.x, data.hero.loc.y, data.hero.loc, data.hero.flags.heroIcon||"hero.png"); + var v = core.formatBigNumber(data.hero.hp)+"/"+core.formatBigNumber(data.hero.atk)+"/"+core.formatBigNumber(data.hero.def); + var v2 = "/"+core.formatBigNumber(data.hero.mdef); + if (v.length+v2.length<=21) v+=v2; + core.fillText('ui', v, (2*i-5)*u, 248+size, '#FFD700', '10px Verdana'); + core.fillText('ui', core.formatDate(new Date(data.time)), (2*i-5)*u, 261+size, data.hero.flags.consoleOpened?'#FF6A6A':'#FFFFFF', '10px Verdana'); } else { - core.fillRect('ui', (2*i-5)*u-size/2, 245, size, size, '#333333', 2); - core.fillText('ui', '空', (2*i-5)*u, 245+70, '#FFFFFF', 'bold 30px Verdana'); + core.fillRect('ui', (2*i-5)*u-size/2, 233, size, size, '#333333', 2); + core.fillText('ui', '空', (2*i-5)*u, 297, '#FFFFFF', 'bold 30px Verdana'); } } }; From 41dffcc4059cb8e09d0e52abc1407d229c5af53b Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 31 Oct 2018 00:49:31 +0800 Subject: [PATCH 05/16] clickMoveDirectly --- libs/actions.js | 2 +- libs/control.js | 2 +- libs/maps.js | 6 ------ libs/ui.js | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index 0ec76d04..16b3baae 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1760,7 +1760,7 @@ actions.prototype.clickSwitchs = function (x,y) { core.ui.drawSwitchs(); break; case 7: - core.setFlag('bigmapMoveDirectly', !core.getFlag('bigmapMoveDirectly', false)); + core.setFlag('clickMove', !core.getFlag('clickMove', true)); core.ui.drawSwitchs(); break; case 8: diff --git a/libs/control.js b/libs/control.js index db94bd37..65fe545a 100644 --- a/libs/control.js +++ b/libs/control.js @@ -447,7 +447,7 @@ control.prototype.setAutomaticRoute = function (destX, destY, stepPostfix) { // 单击瞬间移动 if (core.status.heroStop) { - if (core.control.tryMoveDirectly(destX, destY)) + if (stepPostfix.length<=1 && core.getFlag('clickMove', true) && core.control.tryMoveDirectly(destX, destY)) return; } diff --git a/libs/maps.js b/libs/maps.js index 9a319ca6..f0e40315 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -310,12 +310,6 @@ maps.prototype.canMoveDirectly = function (destX,destY) { var fromX = core.getHeroLoc('x'), fromY = core.getHeroLoc('y'); if (fromX==destX&&fromY==destY) return 0; - // 大地图且会改变左上角坐标,不能 - var sx = core.clamp(fromX-6,0,core.bigmap.width-13), sy = core.clamp(fromY-6,0,core.bigmap.height-13), - ex = core.clamp(destX-6,0,core.bigmap.width-13), ey = core.clamp(destY-6,0,core.bigmap.height-13); - - if (!core.hasFlag('bigmapMoveDirectly') && (sx!=ex || sy!=ey)) return -1; - // 无视起点事件 var nowBlockId = core.getBlockId(fromX, fromY); if ((nowBlockId!=null&&nowBlockId!='upFloor'&&nowBlockId!='downFloor'&&nowBlockId!='portal' diff --git a/libs/ui.js b/libs/ui.js index bdace20d..745ae1ad 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -823,7 +823,7 @@ ui.prototype.drawSwitchs = function() { "临界显伤: "+(core.flags.displayCritical ? "[ON]" : "[OFF]"), "领域显伤: "+(core.flags.displayExtraDamage ? "[ON]" : "[OFF]"), "新版存档: "+(core.platform.useLocalForage ? "[ON]":"[OFF]"), - "大地图瞬移:"+(core.hasFlag('bigmapMoveDirectly') ? "[ON]":"[OFF]"), + "单击瞬移: "+(core.getFlag('clickMove', true) ? "[ON]":"[OFF]"), "查看工程", "下载离线版本", "返回主菜单" From 86735bc5bf934cf0e76ec0289ae14a15cc39a2ba Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 31 Oct 2018 01:02:10 +0800 Subject: [PATCH 06/16] drawStatistics equips --- libs/ui.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/ui.js b/libs/ui.js index 745ae1ad..01bf28ae 100644 --- a/libs/ui.js +++ b/libs/ui.js @@ -2331,7 +2331,7 @@ ui.prototype.drawStatistics = function () { } else { // 装备 - if (id.indexOf('sword')==0 || id.indexOf('shield')==0) { + if (cls[id]=='equips') { var values = core.material.items[id].equip||{}; atk = values.atk||0; def = values.def||0; @@ -2339,7 +2339,7 @@ ui.prototype.drawStatistics = function () { } } - if (id.indexOf('sword')==0 || id.indexOf('shield')==0) { + if (id.indexOf('sword')==0 || id.indexOf('shield')==0 || cls[id]=='equips') { var t = ""; if (atk>0) t+=atk+"攻"; if (def>0) t+=def+"防"; From 1e7da99ff11bb90aae4eba5fd2e1a568331b030b Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 31 Oct 2018 13:08:18 +0800 Subject: [PATCH 07/16] F12 --- libs/actions.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libs/actions.js b/libs/actions.js index 16b3baae..add9551f 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -2291,6 +2291,15 @@ actions.prototype.clickKeyBoard = function (x, y) { core.ui.closePanel(); core.keyUp(112+x-1); // F1-F12: 112-122 } + if (y==3 && x==12) { + var val = prompt(); + if (val!=null) { + try { + eval(val); + } + catch (e) {} + } + } if (y==4 && x>=1 && x<=10) { core.ui.closePanel(); core.keyUp(x==10?48:48+x); // 1-9: 49-57; 0: 48 From 755919307d14eb26215e898aecdf33f1d4823a32 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 31 Oct 2018 17:34:41 +0800 Subject: [PATCH 08/16] Event: Comment --- _server/blockly/MotaAction.g4 | 18 ++++++++++++++++++ _server/editor_blockly.js | 1 + docs/event.md | 12 ++++++++++++ libs/events.js | 3 +++ 4 files changed, 34 insertions(+) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 892bd536..f877be0f 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -182,6 +182,7 @@ return code; action : text_0_s | text_1_s + | comment_s | autoText_s | setText_s | tip_s @@ -282,6 +283,19 @@ var code = '"'+title+EvalString_1+EvalString_2+'",\n'; return code; */; +comment_s + : '添加注释' ':' EvalString Newline + + +/* comment_s +tooltip : text:显示一段文字(剧情) +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=comment%ef%bc%9a%e6%b7%bb%e5%8a%a0%e6%b3%a8%e9%87%8a +default : ["可以在这里写添加任何注释内容"] +colour : this.commentColor +var code = '{"type": "comment", "text": "'+EvalString_0+'"},\n'; +return code; +*/; + autoText_s : '自动剧情文本: 标题' EvalString? '图像' IdString? '对话框效果' EvalString? '时间' Int BGNL? EvalString Newline @@ -1575,6 +1589,7 @@ this.evisitor.printColor=70; this.evisitor.dataColor=130; this.evisitor.eventColor=220; this.evisitor.soundColor=20; +this.evisitor.commentColor=285; */ /* Function_1 @@ -1704,6 +1719,9 @@ ActionParser.prototype.parseAction = function() { this.next = MotaActionBlocks['autoText_s'].xmlText([ '','','',data.time,this.EvalString(data.text),this.next]); break; + case "comment": // 注释 + this.next = MotaActionBlocks['comment_s'].xmlText([data.text,this.next]); + break; case "setText": // 设置剧情文本的属性 var setTextfunc = function(a){return a?JSON.stringify(a).slice(1,-1):null;} data.title=setTextfunc(data.title); diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 4a12dd87..8ac1ee48 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -56,6 +56,7 @@ editor_blockly = function () { '显示文字':[ MotaActionBlocks['text_0_s'].xmlText(), MotaActionBlocks['text_1_s'].xmlText(), + MotaActionBlocks['comment_s'].xmlText(), MotaActionFunctions.actionParser.parseList({"type": "choices", "text": "是否跳过剧情", "choices": [ {"text": "是", "action": []}, {"text": "否", "action": [ diff --git a/docs/event.md b/docs/event.md index d0418e49..61521133 100644 --- a/docs/event.md +++ b/docs/event.md @@ -327,6 +327,18 @@ time为可选项,表示文字添加的速度。若此项设置为0将直接全 值得注意的是,提示的text内容也是可以使用`${ }`来计算表达式的值的。 +### comment:添加注释 + +使用`{"type": "comment"}`可以添加一段注释 + +``` js +"x,y": [ // 实际执行的事件列表 + {"type": "comment", "text": "这是一段会被跳过的注释内容"} +] +``` + +这个事件将在运行时被游戏跳过。 + ### setValue:设置勇士的某个属性、道具个数,或某个变量/Flag的值 `{"type": "setValue"}` 能修改勇士的某个属性、道具个数、或某个自定义变量或`Flag`的值。 diff --git a/libs/events.js b/libs/events.js index bc56158e..14ac2254 100644 --- a/libs/events.js +++ b/libs/events.js @@ -392,6 +392,9 @@ events.prototype.doAction = function() { }, data.time || 3000); } break; + case "comment": + this.doAction(); + break; case "setText": // 设置文本状态 ["position", "offset", "bold", "titlefont", "textfont", "time"].forEach(function (t) { if (core.isset(data[t])) core.status.textAttribute[t]=data[t]; From d98a21f7f9b716a57b967c6b7bfeed92657c29fb Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 31 Oct 2018 17:36:32 +0800 Subject: [PATCH 09/16] Event: Comment --- _server/blockly/MotaAction.g4 | 2 +- _server/editor_blockly.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index f877be0f..3eb1d13f 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -288,7 +288,7 @@ comment_s /* comment_s -tooltip : text:显示一段文字(剧情) +tooltip : comment:添加一段会被游戏跳过的注释内容 helpUrl : https://ckcz123.github.io/mota-js/#/event?id=comment%ef%bc%9a%e6%b7%bb%e5%8a%a0%e6%b3%a8%e9%87%8a default : ["可以在这里写添加任何注释内容"] colour : this.commentColor diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 8ac1ee48..1c4b538b 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -485,6 +485,7 @@ document.getElementById('blocklyDiv').onmousewheel = function(e){ 'text_0_s': 'EvalString_0', 'text_1_s': 'EvalString_2', 'autoText_s': 'EvalString_2', + 'comment_s': 'EvalString_0', 'choices_s': 'EvalString_0', 'function_s': 'RawEvalString_0', 'shopsub': 'EvalString_3', From 54b8e7e60d1a1bf9a345148f8dfc5425c590c540 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Wed, 31 Oct 2018 18:18:31 +0800 Subject: [PATCH 10/16] Quick Shops --- _server/blockly/MotaAction.g4 | 7 ++++--- _server/data.comment.js | 6 ++++++ docs/event.md | 2 ++ libs/actions.js | 18 +++++++++++++++--- libs/events.js | 14 ++++++++++---- libs/ui.js | 7 ++----- project/data.js | 3 ++- 7 files changed, 41 insertions(+), 16 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 3eb1d13f..add43d86 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -63,19 +63,20 @@ return code; */; shopsub - : '商店 id' IdString '标题' EvalString '图标' IdString BGNL? Newline '快捷商店栏中名称' EvalString '共用times' Bool BGNL? Newline '使用' ShopUse_List '消耗' EvalString BGNL? Newline '显示文字' EvalString BGNL? Newline shopChoices+ BEND + : '商店 id' IdString '标题' EvalString '图标' IdString BGNL? Newline '快捷商店栏中名称' EvalString '共用times' Bool BGNL? Newline '未开启状态则不显示在列表中' Bool BGNL? NewLine '使用' ShopUse_List '消耗' EvalString BGNL? Newline '显示文字' EvalString BGNL? Newline shopChoices+ BEND /* shopsub tooltip : 全局商店,消耗填-1表示每个选项的消耗不同,正数表示消耗数值 helpUrl : https://ckcz123.github.io/mota-js/#/event?id=%e5%85%a8%e5%b1%80%e5%95%86%e5%ba%97 -default : ["shop1","贪婪之神","blueShop","1F金币商店",false,null,"20+10*times*(times+1)","勇敢的武士啊, 给我${need}金币就可以:"] +default : ["shop1","贪婪之神","blueShop","1F金币商店",false,false,null,"20+10*times*(times+1)","勇敢的武士啊, 给我${need}金币就可以:"] var code = { 'id': IdString_0, 'name': EvalString_0, 'icon': IdString_1, 'textInList': EvalString_1, 'commonTimes': Bool_0, + 'mustEnable': Bool_1, 'use': ShopUse_List_0, 'need': EvalString_2, 'text': EvalString_3, @@ -1654,7 +1655,7 @@ ActionParser.prototype.parse = function (obj,type) { choice.text,choice.need||'',text_effect,text_choices]); } return MotaActionBlocks['shopsub'].xmlText([ - obj.id,obj.name,obj.icon,obj.textInList,obj.commonTimes,obj.use,obj.need,parser.EvalString(obj.text),text_choices,next + obj.id,obj.name,obj.icon,obj.textInList,obj.commonTimes,obj.mustEnable,obj.use,obj.need,parser.EvalString(obj.text),text_choices,next ]); } var next=null; diff --git a/_server/data.comment.js b/_server/data.comment.js index 4c7dcd92..af1c0b4b 100644 --- a/_server/data.comment.js +++ b/_server/data.comment.js @@ -606,6 +606,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = "_bool": "bool", "_data": "是否允许瞬间移动" }, + "enableDisabledShop": { + "_leaf": true, + "_type": "checkbox", + "_bool": "bool", + "_data": "是否允许查看未开启状态的快捷商店内容;如果此项为真,则对于未开启状态的商店允许查看其内容(但不能购买)" + }, } } } diff --git a/docs/event.md b/docs/event.md index 61521133..f326ae6f 100644 --- a/docs/event.md +++ b/docs/event.md @@ -1600,6 +1600,7 @@ core.insertAction([ "textInList": "1F金币商店", // 在快捷商店栏中显示的名称 "use": "money", // 商店所要使用的。只能是"money"或"experience"。 "commonTimes": true, // 是否使用全局次数 + "mustEnable": true, // 如果未开启则不显示在状态栏中 "need": "20+10*times*(times+1)", // 商店需要的金币/经验数值;可以是一个表达式,以times作为参数计算。 // 这里用到的times为该商店的已经的访问次数。首次访问该商店时times的值为0。 // 上面的例子是50层商店的计算公式。你也可以写任意其他的计算公式,只要以times作为参数即可。 @@ -1648,6 +1649,7 @@ core.insertAction([ - textInList 为其在快捷商店栏中显示的名称,如"3楼金币商店"等 - use 为消耗的类型,是金币(money)还是经验(experience)。 - commonTimes 是否使用全局次数;如果为true则可以多个快捷商店共享相同的次数 +- mustEnable 是否必须是只在开启状态才在列表显示;如果此项为true则未开启的快捷商店不予显示 - need 是一个表达式,计算商店所需要用到的数值。 - 可以将times作为参数,times为该商店已经访问过的次数,第一次访问时times是0。 - 如果对于每个选项都需要不同的数值,这里设为"-1";可参见下面经验商店的例子。 diff --git a/libs/actions.js b/libs/actions.js index add9551f..7c5d595a 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1028,6 +1028,18 @@ actions.prototype.clickShop = function(x,y) { var topIndex = 6 - parseInt(choices.length / 2); if (y>=topIndex && y= 5 && x <= 7) { var topIndex = 6 - parseInt(keys.length / 2); if (y>=topIndex && y Date: Wed, 31 Oct 2018 19:41:43 +0800 Subject: [PATCH 11/16] startAnimate --- libs/actions.js | 4 ++-- libs/control.js | 37 +++++++++++++++++++++++-------------- libs/core.js | 4 ++-- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/libs/actions.js b/libs/actions.js index 7c5d595a..1724c529 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1566,7 +1566,7 @@ actions.prototype.clickSL = function(x,y) { if (x>=10 && x<=12 && y==12) { core.ui.closePanel(); if (!core.isPlaying()) { - core.showStartAnimate(); + core.showStartAnimate(true); } return; } @@ -1678,7 +1678,7 @@ actions.prototype.keyUpSL = function (keycode) { if (keycode==27 || keycode==88 || (core.status.event.id == 'save' && keycode==83) || (core.status.event.id == 'load' && keycode==68)) { core.ui.closePanel(); if (!core.isPlaying()) { - core.showStartAnimate(); + core.showStartAnimate(true); } return; } diff --git a/libs/control.js b/libs/control.js index 65fe545a..172a8827 100644 --- a/libs/control.js +++ b/libs/control.js @@ -201,7 +201,7 @@ control.prototype.setRequestAnimationFrame = function () { } ////// 显示游戏开始界面 ////// -control.prototype.showStartAnimate = function (callback) { +control.prototype.showStartAnimate = function (noAnimate, callback) { core.dom.startPanel.style.opacity=1; core.dom.startPanel.style.display="block"; core.dom.startTop.style.opacity=1; @@ -213,18 +213,27 @@ control.prototype.showStartAnimate = function (callback) { core.clearStatus(); core.clearMap('all'); - var opacityVal = 1; - var startAnimate = window.setInterval(function () { - opacityVal -= 0.03; - if (opacityVal < 0) { - clearInterval(startAnimate); - core.dom.startTop.style.display = 'none'; - // core.playGame(); - core.dom.startButtonGroup.style.display = 'block'; - if (core.isset(callback)) callback(); - } - core.dom.startTop.style.opacity = opacityVal; - }, 20); + if(noAnimate) { + core.dom.startTop.style.display = 'none'; + // core.playGame(); + core.dom.startButtonGroup.style.display = 'block'; + if (core.isset(callback)) callback(); + } + else { + var opacityVal = 1; + var startAnimate = window.setInterval(function () { + opacityVal -= 0.03; + if (opacityVal < 0) { + clearInterval(startAnimate); + core.dom.startTop.style.display = 'none'; + // core.playGame(); + core.dom.startButtonGroup.style.display = 'block'; + if (core.isset(callback)) callback(); + } + core.dom.startTop.style.opacity = opacityVal; + }, 20); + } + } ////// 隐藏游戏开始界面 ////// @@ -320,7 +329,7 @@ control.prototype.resetStatus = function(hero, hard, floorId, route, maps, value ////// 重新开始游戏;此函数将回到标题页面 ////// control.prototype.restart = function() { - this.showStartAnimate(); + this.showStartAnimate(true); if (core.bgms.length>0) core.playBgm(core.bgms[0]); } diff --git a/libs/core.js b/libs/core.js index 184957f0..6420a35a 100644 --- a/libs/core.js +++ b/libs/core.js @@ -331,8 +331,8 @@ core.prototype.setRequestAnimationFrame = function () { } ////// 显示游戏开始界面 ////// -core.prototype.showStartAnimate = function (callback) { - core.control.showStartAnimate(callback); +core.prototype.showStartAnimate = function (noAnimate, callback) { + core.control.showStartAnimate(noAnimate, callback); } ////// 隐藏游戏开始界面 ////// From 82dcff123a00a7ac5b3e5bde58d25f3b606ad8b9 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 31 Oct 2018 22:59:46 +0800 Subject: [PATCH 12/16] Autotile animate --- _server/editor.js | 2 +- _server/editor_mode.js | 2 +- libs/control.js | 7 +++++++ libs/core.js | 5 +++-- libs/maps.js | 15 +++++++++++++-- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/_server/editor.js b/_server/editor.js index e7cd0523..63ca9f47 100644 --- a/_server/editor.js +++ b/_server/editor.js @@ -390,7 +390,7 @@ editor.prototype.drawInitData = function (icons) { if (img == 'autotile') { var autotiles = images[img]; for (var im in autotiles) { - dc.drawImage(autotiles[im], nowx, nowy); + dc.drawImage(autotiles[im], 0, 0, 96, 128, nowx, nowy, 96, 128); nowy += autotiles[im].height; } nowx += 3 * 32; diff --git a/_server/editor_mode.js b/_server/editor_mode.js index 0c231b0a..99a85cac 100644 --- a/_server/editor_mode.js +++ b/_server/editor_mode.js @@ -804,7 +804,7 @@ editor_mode = function (editor) { appendConfirm.onclick = function () { var confirmAutotile = function () { - if (sprite.width != 96 || sprite.height != 128) { + if (sprite.width % 96 !=0 || sprite.height != 128) { printe("不合法的Autotile图片!"); return; } diff --git a/libs/control.js b/libs/control.js index 172a8827..f7a8f576 100644 --- a/libs/control.js +++ b/libs/control.js @@ -79,6 +79,13 @@ control.prototype.setRequestAnimationFrame = function () { core.drawBlock(obj, obj.status); } + if ((core.status.autotileAnimateObjs.blocks||[]).length>0) { + core.status.autotileAnimateObjs.status++; + core.status.autotileAnimateObjs.blocks.forEach(function (block) { + core.drawAutotile(core.canvas.event, core.status.autotileAnimateObjs.map, block, 32, 0, 0, core.status.autotileAnimateObjs.status); + }) + } + core.animateFrame.globalTime = timestamp; } } diff --git a/libs/core.js b/libs/core.js index 6420a35a..77ad01e9 100644 --- a/libs/core.js +++ b/libs/core.js @@ -164,6 +164,7 @@ function core() { // 动画 'globalAnimateObjs': [], 'boxAnimateObjs': [], + 'autotileAnimateObjs': {}, 'animateObjs': [], }; this.status = {}; @@ -661,8 +662,8 @@ core.prototype.drawMap = function (mapName, callback) { } ////// 绘制Autotile ////// -core.prototype.drawAutotile = function(ctx, mapArr, block, size, left, top){ - core.maps.drawAutotile(ctx, mapArr, block, size, left, top); +core.prototype.drawAutotile = function(ctx, mapArr, block, size, left, top, status){ + core.maps.drawAutotile(ctx, mapArr, block, size, left, top, status); } ////// 某个点是否不可通行 ////// diff --git a/libs/maps.js b/libs/maps.js index f0e40315..1e41fd5a 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -452,6 +452,7 @@ maps.prototype.drawMap = function (mapName, callback) { mapName = mapName || core.status.floorId; core.clearMap('all'); core.removeGlobalAnimate(null, null, true); + var drawBg = function(){ core.maps.drawBgFgMap(mapName, core.canvas.bg, "bg"); @@ -514,6 +515,8 @@ maps.prototype.drawMap = function (mapName, callback) { core.status.floorId = mapName; core.status.thisMap = core.status.maps[mapName]; var drawEvent = function(){ + core.status.autotileAnimateObjs = {"status": 0, "blocks": [], "map": null}; + var mapData = core.status.maps[core.status.floorId]; var mapBlocks = mapData.blocks; @@ -524,6 +527,7 @@ maps.prototype.drawMap = function (mapName, callback) { if (core.isset(block.event) && !block.disable) { if (block.event.cls == 'autotile') { core.drawAutotile(core.canvas.event, mapArray, block, 32, 0, 0); + core.status.autotileAnimateObjs.blocks.push(core.clone(block)); } else { core.drawBlock(block); @@ -531,6 +535,7 @@ maps.prototype.drawMap = function (mapName, callback) { } } } + core.status.autotileAnimateObjs.map = core.clone(mapArray); } if (main.mode=='editor'){ @@ -555,7 +560,7 @@ maps.prototype.drawMap = function (mapName, callback) { } ////// 绘制Autotile ////// -maps.prototype.drawAutotile = function(ctx, mapArr, block, size, left, top){ +maps.prototype.drawAutotile = function(ctx, mapArr, block, size, left, top, status){ var indexArrs = [ //16种组合的图块索引数组; // 将autotile分割成48块16*16的小块; 数组索引即对应各个小块 // +----+----+----+----+----+----+ [10, 9, 4, 3 ], //0 bin:0000 | 1 | 2 | 3 | 4 | 5 | 6 | @@ -578,7 +583,9 @@ maps.prototype.drawAutotile = function(ctx, mapArr, block, size, left, top){ var drawBlockByIndex = function(ctx, dx, dy, autotileImg, index, size){ //index为autotile的图块索引1-48 var sx = 16*((index-1)%6), sy = 16*(~~((index-1)/6)); - ctx.drawImage(autotileImg, sx, sy, 16, 16, dx, dy, size/2, size/2); + status = status || 0; + status %= parseInt(autotileImg.width/96); + ctx.drawImage(autotileImg, sx + 96*status, sy, 16, 16, dx, dy, size/2, size/2); } var getAutotileAroundId = function(currId, x, y) { if(x<0 || y<0 || x>=mapArr[0].length || y>=mapArr.length) return 1; @@ -1189,6 +1196,7 @@ maps.prototype.removeGlobalAnimate = function (x, y, all) { if (all) { core.status.globalAnimateObjs = []; + core.status.autotileAnimateObjs = {}; return; } @@ -1213,6 +1221,9 @@ maps.prototype.syncGlobalAnimate = function () { core.status.globalAnimateObjs.forEach(function (t) { t.status=0; }) + if (core.isset(core.status.autotileAnimateObjs.status)) { + core.status.autotileAnimateObjs.status = 0; + } } ////// 绘制UI层的box动画 ////// From b9af2c8e39faf8d319d4ae5db80969596e597d80 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 31 Oct 2018 23:26:00 +0800 Subject: [PATCH 13/16] Remove Autotile Animate --- libs/maps.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libs/maps.js b/libs/maps.js index 1e41fd5a..859faee7 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -1200,12 +1200,14 @@ maps.prototype.removeGlobalAnimate = function (x, y, all) { return; } - for (var t = 0; t < core.status.globalAnimateObjs.length; t++) { - if (core.status.globalAnimateObjs[t].x == x && core.status.globalAnimateObjs[t].y == y) { - core.status.globalAnimateObjs.splice(t, 1); - return; - } + core.status.globalAnimateObjs = core.status.globalAnimateObjs.filter(function (block) {return block.x!=x || block.y!=y;}); + + // 检查Autotile + if (core.isset(core.status.autotileAnimateObjs.blocks)) { + core.status.autotileAnimateObjs.blocks = core.status.autotileAnimateObjs.blocks.filter(function (block) {return block.x!=x || block.y!=y;}); + core.status.autotileAnimateObjs.map[y][x] = 0; } + } ////// 设置全局动画的显示效果 ////// From 31a7e7684117b8543344f6fa144c08e5856bb19a Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Wed, 31 Oct 2018 23:27:08 +0800 Subject: [PATCH 14/16] fix autotile hsl size --- _server/editor_mode.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_server/editor_mode.js b/_server/editor_mode.js index 99a85cac..b53b9025 100644 --- a/_server/editor_mode.js +++ b/_server/editor_mode.js @@ -808,7 +808,9 @@ editor_mode = function (editor) { printe("不合法的Autotile图片!"); return; } - var imgbase64 = source.toDataURL().split(',')[1]; + var imgData = source_ctx.getImageData(0,0,sprite.width,sprite.height); + sprite_ctx.putImageData(imgData, 0, 0); + var imgbase64 = sprite.toDataURL().split(',')[1]; // Step 1: List文件名 fs.readdir('./project/images', function (err, data) { From 179c390f81933c4e4eec1c36c704365000ed03e0 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 31 Oct 2018 23:33:15 +0800 Subject: [PATCH 15/16] V2.5 --- README.md | 25 +++++++++++++++++++++++++ docs/V2.0.md | 2 +- docs/api.md | 2 +- docs/element.md | 2 +- docs/event.md | 2 +- docs/index.md | 2 +- docs/personalization.md | 2 +- docs/start.md | 2 +- main.js | 2 +- project/data.js | 2 +- 更新说明.txt | 29 ++++++++++++++++++++++++++++- 11 files changed, 62 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 13b94127..406abacc 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,31 @@ HTML5 canvas制作的魔塔样板,支持全平台游戏! ## 更新说明 +### 2018.10.31 V2.5 + +* [x] 添加绘图模式支持;可以用户手动绘图和保存 +* [x] 内置主动技能:二倍斩的支持,可以仿照制作其他主动技能 +* [x] 将按键处理移动到脚本编辑中 +* [x] Alt+0\~9保存和读取当前套装 +* [x] 图块属性的cannotOut和cannotIn控制可通行方向(来造成悬崖效果) +* [x] 支持动态Autotile自动元件(仅在事件层有效) +* [x] 允许快捷商店使用共用的times +* [x] 未启用的快捷商店可以隐藏或预览 +* [x] 开始剧情startText可以执行任意事件 +* [x] 对话窗口可以任意调节位置(上中下、距离顶部/底部的像素值) +* [x] 楼层转换界面可以设置背景图片文字颜色等 +* [x] 数据统计进行分段描写,剑盾显示数值 +* [x] 现在可以在事件编辑器中注释内容了 +* [x] 存读档界面显示该存档的属性 +* [x] F7键可以开启debug模式 +* [x] R键可以从本地选取录像文件从头播放 +* [x] 吸血属性的显伤增加^;仇恨怪显示仇恨伤害 +* [x] 4键默认使用破冰稿或冰冻徽章或地震卷轴或上下楼器(依次判断是否存在) +* [x] 血瓶的道具化选项;黄宝石增加加点选项 +* [x] 破炸飞增加默认音效 +* [x] 修复单击瞬移的拖动打怪问题 +* [x] 其他细节优化 + ### 2018.10.27 V2.4.4 * [x] tilesets可以设置图块属性(如可通行状态) diff --git a/docs/V2.0.md b/docs/V2.0.md index 617af9f2..6c1039cf 100644 --- a/docs/V2.0.md +++ b/docs/V2.0.md @@ -1,6 +1,6 @@ # V2.0版本介绍 -?> 目前版本**v2.4.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5**,上次更新时间:* {docsify-updated} * 目前样板已经更新到V2.0版本以上,本章将对V2.0的一些内容进行介绍。 diff --git a/docs/api.md b/docs/api.md index 72335c95..03a5d666 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,6 +1,6 @@ # 附录: API列表 -?> 目前版本**v2.4.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5**,上次更新时间:* {docsify-updated} * **这里只列出所有可能会被造塔者用到的常用API,更多的有关内容请在代码内进行查询。** diff --git a/docs/element.md b/docs/element.md index 75633a11..087937c0 100644 --- a/docs/element.md +++ b/docs/element.md @@ -1,6 +1,6 @@ # 元件说明 -?> 目前版本**v2.4.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5**,上次更新时间:* {docsify-updated} * 在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。 diff --git a/docs/event.md b/docs/event.md index f326ae6f..915ca3a8 100644 --- a/docs/event.md +++ b/docs/event.md @@ -1,6 +1,6 @@ # 事件 -?> 目前版本**v2.4.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5**,上次更新时间:* {docsify-updated} * 本章内将对样板所支持的事件进行介绍。 diff --git a/docs/index.md b/docs/index.md index 3d12213c..842078dd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # HTML5 魔塔样板说明文档 -?> 目前版本**v2.4.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5**,上次更新时间:* {docsify-updated} * 众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。 diff --git a/docs/personalization.md b/docs/personalization.md index 2a6a15b0..5d4211f3 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -1,6 +1,6 @@ # 个性化 -?> 目前版本**v2.4.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5**,上次更新时间:* {docsify-updated} * 有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。 diff --git a/docs/start.md b/docs/start.md index ca8d110a..ac2bc064 100644 --- a/docs/start.md +++ b/docs/start.md @@ -1,6 +1,6 @@ # 快速上手 -?> 目前版本**v2.4.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v2.5**,上次更新时间:* {docsify-updated} * 在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔! diff --git a/main.js b/main.js index 01bf184b..2def3d70 100644 --- a/main.js +++ b/main.js @@ -2,7 +2,7 @@ function main() { //------------------------ 用户修改内容 ------------------------// - this.version = "2.4.4"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 + this.version = "2.5"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 this.useCompress = false; // 是否使用压缩文件 // 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。 diff --git a/project/data.js b/project/data.js index 7e98faee..22b396ea 100644 --- a/project/data.js +++ b/project/data.js @@ -68,7 +68,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "firstData": { "title": "魔塔样板", "name": "template", - "version": "Ver 2.4.4", + "version": "Ver 2.5", "floorId": "sample0", "hero": { "name": "阳光", diff --git a/更新说明.txt b/更新说明.txt index 1e1ad136..806a3184 100644 --- a/更新说明.txt +++ b/更新说明.txt @@ -1,4 +1,31 @@ -HTML5魔塔样板V2.4.4 +HTML5魔塔样板V2.5 + +添加绘图模式支持;可以用户手动绘图和保存 +内置主动技能:二倍斩的支持,可以仿照制作其他主动技能 +将按键处理移动到脚本编辑中 +Alt+0\~9保存和读取当前套装 +图块属性的cannotOut和cannotIn控制可通行方向(来造成悬崖效果) +支持动态Autotile自动元件(仅在事件层有效) +允许快捷商店使用共用的times +未启用的快捷商店可以隐藏或预览 +开始剧情startText可以执行任意事件 +对话窗口可以任意调节位置(上中下、距离顶部/底部的像素值) +楼层转换界面可以设置背景图片文字颜色等 +数据统计进行分段描写,剑盾显示数值 +现在可以在事件编辑器中注释内容了 +存读档界面显示该存档的属性 +F7键可以开启debug模式 +R键可以从本地选取录像文件从头播放 +吸血属性的显伤增加^;仇恨怪显示仇恨伤害 +4键默认使用破冰稿或冰冻徽章或地震卷轴或上下楼器等等 +血瓶的道具化选项;黄宝石增加加点选项 +破炸飞增加默认音效 +修复单击瞬移的拖动打怪问题 +其他细节优化 + +----------------------------------------------------------------------- + +HTML5魔塔样板V2.4.4 tilesets可以设置图块属性(如可通行状态) 追加素材时可以更改图片色调 From 008c007104dcb15caa7b5401b3eafbd68b2f6ad5 Mon Sep 17 00:00:00 2001 From: oc Date: Wed, 31 Oct 2018 23:40:18 +0800 Subject: [PATCH 16/16] V2.5 --- _server/editor_mode.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/_server/editor_mode.js b/_server/editor_mode.js index b53b9025..6693d42e 100644 --- a/_server/editor_mode.js +++ b/_server/editor_mode.js @@ -804,8 +804,14 @@ editor_mode = function (editor) { appendConfirm.onclick = function () { var confirmAutotile = function () { - if (sprite.width % 96 !=0 || sprite.height != 128) { - printe("不合法的Autotile图片!"); + if (sprite.width != 96 || sprite.height != 128) { + if (sprite.height==128 && sprite.width%96==0) { + printe("这里只能导入单帧的自动元件,多帧的动画请先导入单帧自动元件再同名替换素材即可。"); + } + else { + printe("不合法的Autotile图片!"); + } + return; } var imgData = source_ctx.getImageData(0,0,sprite.width,sprite.height);