From 5b1bf618c245df0f215236dfaffabe8e4d074a0a Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 30 Oct 2018 14:19:24 +0800 Subject: [PATCH 1/4] Skill --- _server/functions.comment.js | 12 +++ docs/personalization.md | 55 ++++++------ libs/actions.js | 147 +------------------------------ project/data.js | 10 +-- project/functions.js | 165 +++++++++++++++++++++++++++++++++++ project/icons.js | 3 +- project/items.js | 11 ++- project/maps.js | 1 + 8 files changed, 223 insertions(+), 181 deletions(-) diff --git a/_server/functions.comment.js b/_server/functions.comment.js index 92080dd7..9bd96f61 100644 --- a/_server/functions.comment.js +++ b/_server/functions.comment.js @@ -129,6 +129,18 @@ functions_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = } } }, + "actions": { + "_leaf": false, + "_type": "object", + "_data": { + "onKeyUp": { + "_leaf": true, + "_type": "textarea", + "_lint": true, + "_data": "按键处理;可以在这里自定义快捷键,详见文档-个性化-自定义快捷键" + } + } + }, "control": { "_leaf": false, "_type": "object", diff --git a/docs/personalization.md b/docs/personalization.md index e3d9dc8e..bc2d9791 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -496,34 +496,28 @@ this.useEquipment = function (itemId) { // 使用装备 如果需要绑定某个快捷键为处理一段事件,也是可行的。 -要修改按键,我们可以在`actions.js`的`keyUp`进行处理: +要修改按键,我们可以在脚本编辑的`onKeyUp`进行处理: -比如,我们设置一个快捷键进行绑定,比如`W`,其keycode是87。(有关每个键的keycode搜一下就能得到) +比如,我们设置一个快捷键进行绑定,比如`Y`,其keycode是89。(有关每个键的keycode搜一下就能得到) -然后在`actions.js`的`keyUp`函数的`switch`中进行处理。 +然后在脚本编辑的`onKeyUp`函数的`switch`中进行处理。 ``` js -case 87: // W - if (core.status.heroStop) { - // ... 在这里写你要执行脚本 - // 请使用同步脚本,请勿执行任何异步代码,否则可能导致游戏过程或录像出现问题。 - core.insertAction([...]) // 例如,插入一段自定义事件并执行。 - - // core.status.route.push("key:"+keyCode); // 录像的支持,这句话加不加最好仔细进行测试 +case 89: // 使用该按键的keyCode,比如Y键就是89 + // 还可以再判定altKey是否被按下,即 if (altKey) { ... + + // ... 在这里写你要执行脚本 + // **强烈建议所有新增的自定义快捷键均能给个对应的道具可点击,以方便手机端的行为** + if (core.hasItem('...')) { + core.useItem('...'); } + break; ``` +强烈建议所有新增的自定义快捷键均给个对应的永久道具可点击,以方便手机端的行为。 -在勇士处于停止的条件下,按下W键时,将执行你写的脚本代码。请只使用同步脚本而不要使用异步代码,不然可能导致游戏出现问题。 - -`core.status.route.push("key:"+keyCode);` 这句话是对录像的支持。 - -**录像的支持可能比较诡异,在不同条件下都是不同的;因此加不加最好分开独立进行测试。** - -!> H5不支持组合快捷键,所以不存在`W+1`这种组合快捷键的说法! - -!> 手机端可以通过长按任何位置调出虚拟键盘,再进行按键,和键盘按键是等价的效果! +可以使用altKey来判断Alt键是否被同时按下。 ## 公共事件 @@ -609,7 +603,7 @@ core.statusBar.mana.style.fontStyle = 'normal'; // 这一行会取消斜体。 - 技能的触发(按键与录像问题) - 技能的效果 -从V2.5开始,魔力和技能的定义被内置到了样板中,因此十分方便。 +从V2.5开始,内置了"二倍斩"技能,可以仿照其制作自己的技能。 ### 魔力的定义添加;技能的定义 @@ -684,11 +678,10 @@ else { // 关闭技能 下面是一个很简单的例子,当勇士按下W后,触发我们上面定义的二倍斩技能。 ``` js -case 87: // W - if (core.status.heroStop) { // 当前停止状态;这个if需要加,不能在行走过程中触发不然容易出错。 - if (core.hasItem('skill1')) { // 判定该技能道具是否存在 - core.useItem('skill1'); // 使用道具(该技能) - } +case 87: // W:开启技能“二倍斩” + // 检测技能栏是否开启,是否拥有“二倍斩”这个技能道具 + if (core.flags.enableSkill && core.hasItem('skill1')) { + core.useItem('skill1'); } break; ``` @@ -724,9 +717,15 @@ if (core.getFlag('skill', 0)==1) { // 开启了技能1 然后在脚本编辑的`afterBattle`中进行魔力值的扣除: ``` js -if (core.getFlag('skill', 0)==1) { // 开启了技能1 - core.status.hero.mana -= 5; // 扣除5点魔力值 - core.setFlag('skill', 0); // 自动关闭技能 +// 战后的技能处理,比如扣除魔力值 +if (core.flags.enableSkill) { + // 检测当前开启的技能类型 + var skill = core.getFlag('skill', 0); + if (skill==1) { // 技能1:二倍斩 + core.status.hero.mana-=5; // 扣除5点魔力值 + } + // 关闭技能 + core.setFlag('skill', 0); core.setFlag('skillName', '无'); } ``` diff --git a/libs/actions.js b/libs/actions.js index 5b4fff35..a2af8038 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -8,7 +8,7 @@ function actions() { } actions.prototype.init = function () { - + this.actionsdata = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.actions; } ////// 按下某个键时 ////// @@ -291,150 +291,7 @@ actions.prototype.keyUp = function(keyCode, altKey) { if(!core.status.played) return; - // 0~9的AltKey - if (altKey && keyCode>=48 && keyCode<=57 && core.status.heroStop) { - core.items.quickLoadEquip(keyCode-48); - return; - } - - switch (keyCode) { - case 27: // ESC - if (core.status.heroStop) - core.openSettings(true); - break; - case 71: // G - if (core.status.heroStop) - core.useFly(true); - break; - case 81: // Q - if (core.status.heroStop) - core.openEquipbox(true); - break; - case 88: // X - if (core.status.heroStop) - core.openBook(true); - break; - case 65: // A - if (core.status.heroStop) - core.doSL("autoSave", "load"); - break; - case 66: // B - if (core.status.heroStop) - core.ui.drawStatistics(); - break; - case 83: // S - if (core.status.heroStop) - core.save(true); - break; - case 68: // D - if (core.status.heroStop) - core.load(true); - break; - case 69: // E - if (core.status.heroStop) - core.ui.drawCursor(); - break; - case 84: // T - if (core.status.heroStop) - core.openToolbox(true); - break; - case 90: // Z - if (core.status.heroStop) - core.turnHero(); - break; - case 75: case 86: // K/V - if (core.status.heroStop) - core.openQuickShop(true); - break; - case 32: // SPACE - if (core.status.heroStop) - core.getNextItem(); - break; - case 72: // H - if (core.status.heroStop) - core.ui.drawHelp(); - break; - case 82: // R - if (core.status.heroStop) { - if (core.hasFlag('debug')) { - core.drawText("\t[系统提示]调试模式下无法回放录像"); - } - else { - core.ui.drawReplay(); - } - } - break; - case 33: case 34: // PAGEUP/PAGEDOWN - if (core.status.heroStop) - core.ui.drawMaps(); - break; - case 77: // M - if (core.status.heroStop) { - core.ui.drawPaint(); - } - break; - case 37: // UP - break; - case 38: // DOWN - break; - case 39: // RIGHT - break; - case 40: // DOWN - break; - case 49: // 快捷键1: 破 - if (core.status.heroStop && core.hasItem('pickaxe')) { - if (core.canUseItem('pickaxe')) { - core.useItem('pickaxe'); - } - else { - core.drawTip('当前不能使用破墙镐'); - } - } - break; - case 50: // 快捷键2: 炸 - if (core.status.heroStop) { - if (core.hasItem('bomb')) { - if (core.canUseItem('bomb')) { - core.useItem('bomb'); - } - else { - core.drawTip('当前不能使用炸弹'); - } - } - else if (core.hasItem('hammer')) { - if (core.canUseItem('hammer')) { - core.useItem('hammer'); - } - else { - core.drawTip('当前不能使用圣锤'); - } - - } - } - break; - case 51: // 快捷键3: 飞 - if (core.status.heroStop && core.hasItem('centerFly')) { - core.events.useItem('centerFly'); - } - break; - case 52: // 快捷键4:破冰/冰冻/地震/上下楼器/... - if (core.status.heroStop) { - var list = ["icePickaxe", "snow", "earthquake", "upFly", "downFly", "jumpShoes", "lifeWand", "poisonWine", "weakWine", "curseWine", "superWine"]; - for (var i=0;i=48 && keyCode<=57) { + core.items.quickLoadEquip(keyCode-48); + return; + } + + // 根据keyCode值来执行对应操作 + switch (keyCode) { + case 27: // ESC:打开菜单栏 + core.openSettings(true); + break; + case 88: // X:使用怪物手册 + core.openBook(true); + break; + case 71: // G:使用楼传器 + core.useFly(true); + break; + case 65: // A:读取自动存档(回退) + core.doSL("autoSave", "load"); + break; + case 83: // S:存档 + core.save(true); + break; + case 68: // D:独挡 + core.load(true); + break; + case 69: // E:打开光标 + core.ui.drawCursor(); + break; + case 84: // T:打开道具栏 + core.openToolbox(true); + break; + case 81: // Q:打开装备栏 + core.openEquipbox(true); + break; + case 90: // Z:转向 + core.turnHero(); + break; + case 75: case 86: // K/V:打开快捷商店列表 + core.openQuickShop(true); + break; + case 32: // SPACE:轻按 + core.getNextItem(); + break; + case 82: // R:回放录像 + if (core.hasFlag('debug')) { + core.drawText("\t[系统提示]调试模式下无法回放录像"); + } + else { + core.ui.drawReplay(); + } + break; + case 33: case 34: // PgUp/PgDn:浏览地图 + core.ui.drawMaps(); + break; + case 77: // M:绘图模式 + core.ui.drawPaint(); + break; + case 66: // B:打开数据统计 + core.ui.drawStatistics(); + break; + case 72: // H:打开帮助页面 + core.ui.drawHelp(); + break; + case 49: // 快捷键1: 破 + if (core.hasItem('pickaxe')) { + if (core.canUseItem('pickaxe')) { + core.useItem('pickaxe'); + } + else { + core.drawTip('当前不能使用破墙镐'); + } + } + break; + case 50: // 快捷键2: 炸 + if (core.hasItem('bomb')) { + if (core.canUseItem('bomb')) { + core.useItem('bomb'); + } + else { + core.drawTip('当前不能使用炸弹'); + } + } + else if (core.hasItem('hammer')) { + if (core.canUseItem('hammer')) { + core.useItem('hammer'); + } + else { + core.drawTip('当前不能使用圣锤'); + } + + } + break; + case 51: // 快捷键3: 飞 + if (core.hasItem('centerFly')) { + core.events.useItem('centerFly'); + } + break; + case 52: // 快捷键4:破冰/冰冻/地震/上下楼器/... 其他道具依次判断 + { + var list = ["icePickaxe", "snow", "earthquake", "upFly", "downFly", "jumpShoes", "lifeWand", "poisonWine", "weakWine", "curseWine", "superWine"]; + for (var i=0;i=5) { // 这里要写当前能否开技能的条件判断,比如魔力值至少要多少\n\t\tcore.setFlag('skill', 1); // 开技能1\n\t\tcore.setFlag('skillName', '二倍斩'); // 设置技能名\n\t}\n\telse {\n\t\tcore.drawTip(\"魔力不足,无法开启技能\");\n\t}\n}\nelse { // 关闭技能\n\tcore.setFlag('skill', 0); // 关闭技能状态\n\tcore.setFlag('skillName', '无');\n}" }, "canUseItemEffect": { "book": "true", @@ -401,6 +407,7 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = "redJewel": "true", "blueJewel": "true", "greenJewel": "true", - "yellowJewel": "true" + "yellowJewel": "true", + "skill1": "true" } } \ No newline at end of file diff --git a/project/maps.js b/project/maps.js index 6fee9b19..66ef81d1 100644 --- a/project/maps.js +++ b/project/maps.js @@ -79,6 +79,7 @@ maps_90f36752_8815_4be8_b32b_d7fad1d0542e = '65':{'cls': 'items', 'id': 'hammer'}, // 圣锤 '68':{'cls': 'items', 'id': 'lifeWand'}, // 生命魔杖 '69':{'cls': 'items', 'id': 'jumpShoes'}, // 生命魔杖 + '70':{'cls': 'items', 'id': 'skill1'}, // 技能:二倍斩 ////////////////////////// 门、楼梯、传送点部分 ////////////////////////// From b0b6c0be99a8ee07fbe366ad5c32589aea89215d Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 30 Oct 2018 14:23:57 +0800 Subject: [PATCH 2/4] Skill --- docs/personalization.md | 2 ++ project/data.js | 6 +++--- project/functions.js | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/personalization.md b/docs/personalization.md index bc2d9791..2a6a15b0 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -730,6 +730,8 @@ if (core.flags.enableSkill) { } ``` +!> 开启技能后,建议将全塔属性的useLoop置为true,即改用循环计算临界值,这样临界计算才不会出问题! +   通过上述这几种方式,我们就能成功的让H5支持技能啦! diff --git a/project/data.js b/project/data.js index 9489a95e..15eba994 100644 --- a/project/data.js +++ b/project/data.js @@ -75,7 +75,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "lv": 1, "hpmax": 9999, "hp": 1000, - "mana": 10, + "mana": 0, "atk": 100, "def": 100, "mdef": 0, @@ -198,7 +198,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "enableName": false, "enableLv": false, "enableHPMax": false, - "enableMana": true, + "enableMana": false, "enableMDef": true, "enableMoney": true, "enableExperience": false, @@ -206,7 +206,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = "enableKeys": true, "enablePZF": false, "enableDebuff": false, - "enableSkill": true, + "enableSkill": false, "flyNearStair": true, "pickaxeFourDirections": false, "bombFourDirections": false, diff --git a/project/functions.js b/project/functions.js index fc590af6..59ad43f7 100644 --- a/project/functions.js +++ b/project/functions.js @@ -708,8 +708,8 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = core.debug(); break; case 87: // W:开启技能“二倍斩” - // 检测技能栏是否开启,是否拥有“二倍斩”这个技能道具 - if (core.flags.enableSkill && core.hasItem('skill1')) { + // 检测是否拥有“二倍斩”这个技能道具 + if (core.hasItem('skill1')) { core.useItem('skill1'); } break; From ca1c5a00ece2573afc287eede9adee9408316cd6 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 30 Oct 2018 14:39:15 +0800 Subject: [PATCH 3/4] QuickShop common times --- _server/blockly/MotaAction.g4 | 7 ++++--- libs/actions.js | 2 ++ libs/events.js | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 18cd0c30..892bd536 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -63,18 +63,19 @@ return code; */; shopsub - : '商店 id' IdString '标题' EvalString '图标' IdString BGNL? Newline '快捷商店栏中名称' EvalString BGNL? Newline '使用' ShopUse_List '消耗' EvalString BGNL? Newline '显示文字' EvalString BGNL? Newline shopChoices+ BEND + : '商店 id' IdString '标题' EvalString '图标' IdString BGNL? Newline '快捷商店栏中名称' EvalString '共用times' 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金币商店",null,"20+10*times*(times+1)","勇敢的武士啊, 给我${need}金币就可以:"] +default : ["shop1","贪婪之神","blueShop","1F金币商店",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, 'use': ShopUse_List_0, 'need': EvalString_2, 'text': EvalString_3, @@ -1638,7 +1639,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.use,obj.need,parser.EvalString(obj.text),text_choices,next + obj.id,obj.name,obj.icon,obj.textInList,obj.commonTimes,obj.use,obj.need,parser.EvalString(obj.text),text_choices,next ]); } var next=null; diff --git a/libs/actions.js b/libs/actions.js index a2af8038..9c70ab75 100644 --- a/libs/actions.js +++ b/libs/actions.js @@ -1056,6 +1056,8 @@ actions.prototype.clickShop = function(x,y) { }); core.updateStatusBar(); shop.times++; + if (shop.commonTimes) + core.setFlag('commonTimes', shop.times); core.events.openShop(core.status.event.data.id); } // 离开 diff --git a/libs/events.js b/libs/events.js index 56907f27..73397f40 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1532,6 +1532,8 @@ events.prototype.vibrate = function(time, callback) { events.prototype.openShop = function(shopId, needVisited) { var shop = core.status.shops[shopId]; shop.times = shop.times || 0; + if (shop.commonTimes) + shop.times = core.getFlag('commonTimes', 0); shop.visited = shop.visited || false; if (needVisited && !shop.visited) { if (shop.times==0) core.drawTip("该商店尚未开启"); From 71f5d366dc7dcda02265a9e47da3e820ce851b12 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 30 Oct 2018 15:43:33 +0800 Subject: [PATCH 4/4] 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; }