diff --git a/_server/blockly/MotaAction.g4 b/_server/blockly/MotaAction.g4 index 5c6e5f82..2483aaef 100644 --- a/_server/blockly/MotaAction.g4 +++ b/_server/blockly/MotaAction.g4 @@ -236,7 +236,7 @@ text_0_s /* text_0_s tooltip : text:显示一段文字(剧情) -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=text%ef%bc%9a%e6%98%be%e7%a4%ba%e4%b8%80%e6%ae%b5%e6%96%87%e5%ad%97%ef%bc%88%e5%89%a7%e6%83%85%ef%bc%89 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=text%EF%BC%9A%E6%98%BE%E7%A4%BA%E4%B8%80%E6%AE%B5%E6%96%87%E5%AD%97%EF%BC%88%E5%89%A7%E6%83%85%EF%BC%89 default : ["欢迎使用事件编辑器(双击方块进入多行编辑)"] var code = '"'+EvalString_0+'",\n'; return code; @@ -248,7 +248,7 @@ text_1_s /* text_1_s tooltip : text:显示一段文字(剧情),选项较多请右键点击帮助 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=text%ef%bc%9a%e6%98%be%e7%a4%ba%e4%b8%80%e6%ae%b5%e6%96%87%e5%ad%97%ef%bc%88%e5%89%a7%e6%83%85%ef%bc%89 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=text%EF%BC%9A%E6%98%BE%E7%A4%BA%E4%B8%80%E6%AE%B5%E6%96%87%E5%AD%97%EF%BC%88%E5%89%A7%E6%83%85%EF%BC%89 default : ["小妖精","fairy","","欢迎使用事件编辑器(双击方块进入多行编辑)"] var title=''; if (EvalString_0==''){ @@ -272,7 +272,7 @@ autoText_s /* autoText_s tooltip : autoText:自动剧情文本,用户无法跳过自动剧情文本,大段剧情文本请添加“是否跳过剧情”的提示 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=autotext%ef%bc%9a%e8%87%aa%e5%8a%a8%e5%89%a7%e6%83%85%e6%96%87%e6%9c%ac +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=autotext%EF%BC%9A%E8%87%AA%E5%8A%A8%E5%89%A7%E6%83%85%E6%96%87%E6%9C%AC default : ["小妖精","fairy","",3000,"双击方块进入多行编辑\\n自动剧情文本\\n自动剧情文本\\n自动剧情文本"] var title=''; if (EvalString_0==''){ @@ -296,7 +296,7 @@ setText_s /* setText_s tooltip : setText:设置剧情文本的属性,颜色为RGB三元组或RGBA四元组,打字间隔为剧情文字添加的时间间隔,为整数或不填 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=settext%ef%bc%9a%e8%ae%be%e7%bd%ae%e5%89%a7%e6%83%85%e6%96%87%e6%9c%ac%e7%9a%84%e5%b1%9e%e6%80%a7 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=settext%EF%BC%9A%E8%AE%BE%E7%BD%AE%E5%89%A7%E6%83%85%E6%96%87%E6%9C%AC%E7%9A%84%E5%B1%9E%E6%80%A7 default : [null,"","","",null,''] SetTextPosition_List_0 =SetTextPosition_List_0==='null'?'': ', "position": "'+SetTextPosition_List_0+'"'; var colorRe = /^(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d),(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d),(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(,0(\.\d+)?|,1)?$/; @@ -327,7 +327,7 @@ tip_s /* tip_s tooltip : tip:显示一段提示文字 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=tip%ef%bc%9a%e6%98%be%e7%a4%ba%e4%b8%80%e6%ae%b5%e6%8f%90%e7%a4%ba%e6%96%87%e5%ad%97 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=tip%EF%BC%9A%E6%98%BE%E7%A4%BA%E4%B8%80%E6%AE%B5%E6%8F%90%E7%A4%BA%E6%96%87%E5%AD%97 default : ["这段话将在左上角以气泡形式显示"] var code = '{"type": "tip", "text": "'+EvalString_0+'"},\n'; return code; @@ -339,37 +339,41 @@ setValue_s /* setValue_s tooltip : setValue:设置勇士的某个属性、道具个数, 或某个变量/Flag的值 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=text%ef%bc%9a%e6%98%be%e7%a4%ba%e4%b8%80%e6%ae%b5%e6%96%87%e5%ad%97%ef%bc%88%e5%89%a7%e6%83%85%ef%bc%89 +helpUrl : https://ckcz123.github.io/mota-js/#/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 var code = '{"type": "setValue", "name": "'+idString_e_0+'", "value": "'+expression_0+'"},\n'; return code; */; show_s - : '显示事件' 'x' EvalString ',' 'y' EvalString '楼层' IdString? '动画时间' Int? Newline + : '显示事件' 'x' EvalString? ',' 'y' EvalString? '楼层' IdString? '动画时间' Int? Newline /* show_s tooltip : show: 将禁用事件启用,楼层和动画时间可不填,xy可用逗号分隔表示多个点 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=show-%e5%b0%86%e4%b8%80%e4%b8%aa%e7%a6%81%e7%94%a8%e4%ba%8b%e4%bb%b6%e5%90%af%e7%94%a8 -default : ["0","0","",500] +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=show%EF%BC%9A%E5%B0%86%E4%B8%80%E4%B8%AA%E7%A6%81%E7%94%A8%E4%BA%8B%E4%BB%B6%E5%90%AF%E7%94%A8 +default : ["","","",500] colour : this.eventColor -IdString_0 = IdString_0 && (', "floorId": "'+IdString_0+'"'); -var pattern1 = /^flag:[0-9a-zA-Z_][0-9a-zA-Z_\-:]*$/; -if(pattern1.test(EvalString_0) || pattern1.test(EvalString_1)){ - EvalString_0=MotaActionFunctions.PosString_pre(EvalString_0); - EvalString_1=MotaActionFunctions.PosString_pre(EvalString_1); - EvalString_0=[EvalString_0,EvalString_1] -} else { - var pattern2 = /^([+-]?\d+)(,[+-]?\d+)*$/; - if(!pattern2.test(EvalString_0) || !pattern2.test(EvalString_1))throw new Error('坐标格式错误,请右键点击帮助查看格式'); - EvalString_0=EvalString_0.split(','); - EvalString_1=EvalString_1.split(','); - if(EvalString_0.length!==EvalString_1.length)throw new Error('坐标格式错误,请右键点击帮助查看格式'); - for(var ii=0;ii10) throw new Error('天气的强度等级, 在1-10之间'); @@ -777,7 +769,7 @@ move_s /* move_s tooltip : move: 让某个NPC/怪物移动,位置可不填代表当前事件 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=move-%e8%ae%a9%e6%9f%90%e4%b8%aanpc%e6%80%aa%e7%89%a9%e7%a7%bb%e5%8a%a8 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=move%EF%BC%9A%E8%AE%A9%E6%9F%90%E4%B8%AAnpc%E6%80%AA%E7%89%A9%E7%A7%BB%E5%8A%A8 default : ["","",500,null,"上右3下2左上左2"] colour : this.eventColor var floorstr = ''; @@ -795,7 +787,7 @@ moveHero_s /* moveHero_s tooltip : moveHero:移动勇士,用这种方式移动勇士的过程中将无视一切地形, 无视一切事件, 中毒状态也不会扣血 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=movehero%ef%bc%9a%e7%a7%bb%e5%8a%a8%e5%8b%87%e5%a3%ab +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=movehero%EF%BC%9A%E7%A7%BB%E5%8A%A8%E5%8B%87%E5%A3%AB default : [500,"上右3下2左上左2"] colour : this.dataColor Int_0 = Int_0 ?(', "time": '+Int_0):''; @@ -809,7 +801,7 @@ playBgm_s /* playBgm_s tooltip : playBgm: 播放背景音乐 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=playbgm-%e6%92%ad%e6%94%be%e8%83%8c%e6%99%af%e9%9f%b3%e4%b9%90 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=playbgm%EF%BC%9A%E6%92%AD%E6%94%BE%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90 default : ["bgm.mp3"] colour : this.soundColor var code = '{"type": "playBgm", "name": "'+EvalString_0+'"},\n'; @@ -822,7 +814,7 @@ pauseBgm_s /* pauseBgm_s tooltip : pauseBgm: 暂停背景音乐 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=pausebgm-%e6%9a%82%e5%81%9c%e8%83%8c%e6%99%af%e9%9f%b3%e4%b9%90 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=pausebgm%EF%BC%9A%E6%9A%82%E5%81%9C%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90 colour : this.soundColor var code = '{"type": "pauseBgm"},\n'; return code; @@ -834,7 +826,7 @@ resumeBgm_s /* resumeBgm_s tooltip : resumeBgm: 恢复背景音乐 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=resumebgm-%e6%81%a2%e5%a4%8d%e8%83%8c%e6%99%af%e9%9f%b3%e4%b9%90 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=resumebgm%EF%BC%9A%E6%81%A2%E5%A4%8D%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90 colour : this.soundColor var code = '{"type": "resumeBgm"},\n'; return code; @@ -846,7 +838,7 @@ playSound_s /* playSound_s tooltip : playSound: 播放音效 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=playsound-%e6%92%ad%e6%94%be%e9%9f%b3%e6%95%88 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=playsound%EF%BC%9A%E6%92%AD%E6%94%BE%E9%9F%B3%E6%95%88 default : ["item.ogg"] colour : this.soundColor var code = '{"type": "playSound", "name": "'+EvalString_0+'"},\n'; @@ -859,7 +851,7 @@ setVolume_s /* setVolume_s tooltip : setVolume: 设置音量 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=setVolume-%e8%ae%be%e7%bd%ae%e9%9f%b3%e9%87%8f +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=setvolume%EF%BC%9A%E8%AE%BE%E7%BD%AE%E9%9F%B3%E9%87%8F default : [90] colour : this.soundColor var code = '{"type": "setVolume", "value": '+Int_0+'},\n'; @@ -872,7 +864,7 @@ win_s /* win_s tooltip : win: 获得胜利, 该事件会显示获胜页面, 并重新游戏 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=win-%e8%8e%b7%e5%be%97%e8%83%9c%e5%88%a9 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=win%EF%BC%9A%E8%8E%B7%E5%BE%97%E8%83%9C%E5%88%A9 default : [""] var code = '{"type": "win", "reason": "'+EvalString_0+'"},\n'; return code; @@ -884,7 +876,7 @@ lose_s /* lose_s tooltip : lose: 游戏失败, 该事件会显示失败页面, 并重新开始游戏 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=lose-%e6%b8%b8%e6%88%8f%e5%a4%b1%e8%b4%a5 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=lose%EF%BC%9A%E6%B8%B8%E6%88%8F%E5%A4%B1%E8%B4%A5 default : [""] var code = '{"type": "lose", "reason": "'+EvalString_0+'"},\n'; return code; @@ -896,7 +888,7 @@ input_s /* input_s tooltip : input:接受用户输入, 事件只能接受非负整数输入, 所有非法的输入将全部变成0 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=input%ef%bc%9a%e6%8e%a5%e5%8f%97%e7%94%a8%e6%88%b7%e8%be%93%e5%85%a5 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=input%EF%BC%9A%E6%8E%A5%E5%8F%97%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5 default : ["请输入一个数"] colour : this.dataColor var code = '{"type": "input", "text": "'+EvalString_0+'"},\n'; @@ -909,7 +901,7 @@ if_s /* if_s tooltip : if: 条件判断 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=if-%e6%9d%a1%e4%bb%b6%e5%88%a4%e6%96%ad +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=if%EF%BC%9A%E6%9D%A1%E4%BB%B6%E5%88%A4%E6%96%AD colour : this.eventColor var code = ['{"type": "if", "condition": "',expression_0,'",\n', '"true": [\n',action_0,'],\n', @@ -918,6 +910,43 @@ var code = ['{"type": "if", "condition": "',expression_0,'",\n', return code; */; +choices_s + : '选项' ':' EvalString? BGNL? '标题' EvalString? '图像' IdString? BGNL? Newline choicesContext+ BEND Newline + + +/* choices_s +tooltip : choices: 给用户提供选项 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=choices%EF%BC%9A%E7%BB%99%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E9%80%89%E9%A1%B9 +default : ["","流浪者","woman"] +var title=''; +if (EvalString_1==''){ + if (IdString_0=='')title=''; + else title='\\t['+IdString_0+']'; +} else { + if (IdString_0=='')title='\\t['+EvalString_1+']'; + else title='\\t['+EvalString_1+','+IdString_0+']'; +} +EvalString_0 = title+EvalString_0; +EvalString_0 = EvalString_0 ?(', "text": "'+EvalString_0+'"'):''; +var code = ['{"type": "choices"',EvalString_0,', "choices": [\n', + choicesContext_0, +']},\n'].join(''); +return code; +*/; + +choicesContext + : '子选项' EvalString BGNL? Newline action+ + + +/* choicesContext +tooltip : 选项的选择 +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=choices%EF%BC%9A%E7%BB%99%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E9%80%89%E9%A1%B9 +default : ["提示文字:红钥匙"] +colour : this.subColor +var code = '{"text": "'+EvalString_0+'", "action": [\n'+action_0+']},\n'; +return code; +*/; + while_s : '循环处理' ':' '当' expression '时' BGNL? Newline action+ BEND Newline @@ -953,40 +982,16 @@ var code = '{"type": "continue"},\n'; return code; */; -choices_s - : '选项' ':' EvalString? BGNL? '标题' EvalString? '图像' IdString? BGNL? Newline choicesContext+ BEND Newline - -/* choices_s -tooltip : choices: 给用户提供选项 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=choices-%e7%bb%99%e7%94%a8%e6%88%b7%e6%8f%90%e4%be%9b%e9%80%89%e9%a1%b9 -default : ["","流浪者","woman"] -var title=''; -if (EvalString_1==''){ - if (IdString_0=='')title=''; - else title='\\t['+IdString_0+']'; -} else { - if (IdString_0=='')title='\\t['+EvalString_1+']'; - else title='\\t['+EvalString_1+','+IdString_0+']'; -} -EvalString_0 = title+EvalString_0; -EvalString_0 = EvalString_0 ?(', "text": "'+EvalString_0+'"'):''; -var code = ['{"type": "choices"',EvalString_0,', "choices": [\n', - choicesContext_0, -']},\n'].join(''); -return code; -*/; +wait_s + : '等待用户操作并获得按键或点击信息' -choicesContext - : '子选项' EvalString BGNL? Newline action+ - -/* choicesContext -tooltip : 选项的选择 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=choices-%e7%bb%99%e7%94%a8%e6%88%b7%e6%8f%90%e4%be%9b%e9%80%89%e9%a1%b9 -default : ["提示文字:红钥匙"] -colour : this.subColor -var code = '{"text": "'+EvalString_0+'", "action": [\n'+action_0+']},\n'; +/* wait_s +tooltip : wait: 等待用户操作并获得按键或点击信息(具体用法看文档) +helpUrl : https://ckcz123.github.io/mota-js/#/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'; return code; */; @@ -996,7 +1001,7 @@ function_s /* function_s tooltip : function: 自定义JS脚本 -helpUrl : https://ckcz123.github.io/mota-js/#/event?id=function-%e8%87%aa%e5%ae%9a%e4%b9%89js%e8%84%9a%e6%9c%ac +helpUrl : https://ckcz123.github.io/mota-js/#/event?id=function%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89js%E8%84%9A%E6%9C%AC default : ["alert(core.getStatus(\"atk\"));"] colour : this.dataColor var code = '{"type": "function", "function": "function(){\\n'+JSON.stringify(RawEvalString_0).slice(1,-1).split('\\\\n').join('\\n')+'\\n}"},\n'; diff --git a/docs/api.md b/docs/api.md index b074575b..37580c0d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -181,10 +181,18 @@ core.getBlock(x, y, floorId, needEnable) 获得某个点的当前图块信息。 x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。 needEnable表示该点是否启用时才返回,其值不设置则默认为true。 -该函数返回值如下: {"index": xxx, "block": xxx} +如果该点不存在图块,则返回null。 +否则,返回值如下: {"index": xxx, "block": xxx} 其中index为该点在该楼层blocks数组中的索引,block为该图块实际内容。 +core.getBlockId(x, y, floorId, needEnable) +获得某个点的图块ID +x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。 +needEnable表示是否需要该点处于启用状态才返回,其值不设置则默认为true。 +如果该点不存在图块,则返回null,否则返回该点的图块ID。 + + core.showBlock(x, y, floorId) 将某个点从禁用变成启用状态 diff --git a/docs/element.md b/docs/element.md index 44e3bd97..3e915cdb 100644 --- a/docs/element.md +++ b/docs/element.md @@ -36,7 +36,8 @@ ## 怪物 -本塔支持的怪物列表参见`enemys.js`。其与images目录下的`enemys.png`素材按顺序一一对应。如不知道怪物素材长啥样的请打开`enemys.png`对比查看。 +本塔支持的怪物列表参见`project/enemys.js`。其与images目录下的`enemys.png`素材按顺序一一对应。 + 如有自己的怪物素材需求请参见[自定义素材](personalization#自定义素材)的内容。 怪物可以有特殊属性,每个怪物可以有多个自定义属性。 @@ -89,27 +90,23 @@ enemys.prototype.getSpecialText = function (enemyId) { 下面的`getSpecialHint`函数则给定了每个特殊属性的详细描述。这个描述将在怪物手册中看到。 -**打败怪物后可以进行加点操作。有关加点塔的制作可参见[加点事件](event#加点事件)。** +打败怪物后可以进行加点操作。有关加点塔的制作可参见[加点事件](event#加点事件)。 如果`data.js`中的enableExperience为false,即不启用经验的话,怪物手册里将不显示怪物的经验值,打败怪物也不获得任何经验。 拿到幸运金币后,打怪获得的金币将翻倍。 +如果怪物有`"notBomb": true`,则该系列诖怪物均不可被炸。 + N连击怪物的special是6,且我们可以为它定义n代表实际连击数。参见样板中剑王的写法。 -![N连击](./img/nattack.png) - -吸血怪需要在怪物后添加value,代表吸血的比例。 +吸血怪需要给怪物设置value,代表吸血的比例。 可以给吸血怪添加`'add': true`来将吸血的数值加到自身上。 -![怪物吸血](./img/blood.png) - 中毒怪让勇士中毒后,每步扣减的生命值由`data.js`中的values定义。 -衰弱怪让勇士衰弱后,攻防会暂时下降一定的数值(直到衰弱状态解除恢复);这个下降的数值同在`data.js`中的values定义。 - -![debuff](./img/debuff.png) +衰弱怪让勇士衰弱后,攻防会下降一定比例或固定数值(直到衰弱状态解除恢复);其在`data.js`中的values定义。 诅咒怪将让勇士陷入诅咒状态,诅咒状态下杀怪不获得金币和经验值。 @@ -117,21 +114,17 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数 领域是十字伤害还是九宫格伤害由`zoneSquare`设定,如设置为true则为九宫格伤害,不指定或为false则为十字伤害。 -`range`选项可选,代表该领域怪的范围,不写则默认为1。 +领域怪还可以设置`range`选项代表该领域怪的范围,不写则默认为1。 -![怪物领域](./img/zone.png) - -阻击怪同样需要在怪物后添加value,代表领域伤害的数值。如果勇士生命值扣减到0,则直接死亡触发lose事件。 +阻击怪同样需要设置value,代表领域伤害的数值。如果勇士生命值扣减到0,则直接死亡触发lose事件。 !> 阻击怪后退的地点不能有任何事件存在,即使是已经被禁用的自定义事件! 请注意如果吸血、领域、阻击中任何两个同时存在,则value会冲突。**因此请勿将吸血、领域或阻击放置在同一个怪物身上。** -退化怪需要在后面增加'atkValue'和'defValue'表示退化的数值。 +退化怪需要设置'atkValue'和'defValue'表示退化的数值;也可以不设置默认为0。 -![怪物退化](./img/tuihua.png) - -固伤怪则需要在后面增加`damage`选项,代表战前扣血数值。 +固伤怪则需要设置`damage`选项,代表战前扣血数值。 如有额外需求,可参见[自定义怪物属性](personalization#自定义自定义怪物属性),里面讲了如何设置一个新的怪物属性。 @@ -197,12 +190,12 @@ floorId指定的是目标楼层的唯一标识符(ID)。 本塔支持BGM和SE的播放。 -要播放音乐和音效,你需要将对应的文件放在sounds目录下,然后在main.js中进行定义 +要播放音乐和音效,你需要将对应的文件放在sounds目录下,然后在全塔属性中进行定义 ``` js "bgms": [ // 在此存放所有的bgm,和文件名一致。第一项为默认播放项 // 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好 - 'bgm.mp3', 'qianjin.mid', 'star.mid', + 'bgm.mp3' ]; "sounds": [ // 在此存放所有的SE,和文件名一致 // 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好 diff --git a/docs/event.md b/docs/event.md index 51f84109..d8d50530 100644 --- a/docs/event.md +++ b/docs/event.md @@ -26,7 +26,7 @@ 它能通过拖动、复制粘贴等方式帮助你快速生成事件列表,而不用手动打大量字符。 -但是,仍然强烈建议要对每个事件的写法进行了解。 +但是,仍然强烈建议要对每个事件的写法进行了解,因为在脚本编辑,`insertAction`等地方需要插入自定义事件时,还是很有必要的。 ## 自定义事件 @@ -264,6 +264,7 @@ - `flag:xxx` 中的xxx为一个自定义的变量/Flag;如果没有对其进行赋值则默认值为false。 另外,有个小`trick`。是否想立刻知道显示效果? + 你可以用Chrome浏览器打开游戏,按Ctrl+Shift+I打开开发者工具,找到Console(控制台),并中输入`core.drawText("...")` 即可立刻看到文字显示的效果。适当调整文字,使得显示效果满意后,再复制粘贴到你的剧情文本中。 ![调试](./img/eventdebug.png) @@ -322,7 +323,7 @@ time为可选项,表示文字添加的速度。若此项设置为0将直接全 ] ``` -值得注意的是,提示的text内容是可以使用`${ }`来计算表达式的值的。 +值得注意的是,提示的text内容也是可以使用`${ }`来计算表达式的值的。 ### setValue:设置勇士的某个属性、道具个数,或某个变量/Flag的值 @@ -356,7 +357,7 @@ value是一个表达式,将通过这个表达式计算出的结果赋值给nam 另外注意一点的是,如果hp被设置成了0或以下,将触发lose事件,直接死亡。 -### show: 将一个禁用事件启用 +### show:将一个禁用事件启用 我们上面提到了,所有事件都必须靠其他事件驱动来完成,不存在当某个flag为true时自动执行的说法。那么,我们自然要有启用事件的写法。 @@ -381,7 +382,7 @@ time为动画效果时间,如果指定了某个大于0的数,则会以动画 !> **要注意的是,调用show事件后只是让该事件从禁用状态变成启用,从不可见不可交互变成可见可交互,但本身不会去执行该点的事件。** -### hide: 将一个启用事件禁用 +### hide:将一个启用事件禁用 `{"type":"hide"}`和show刚好相反,它会让一个已经启用的事件被禁用。 @@ -407,7 +408,7 @@ NPC对话事件结束后如果需要NPC消失也需要调用 `{"type": "hide"}` ] ``` -### trigger: 立即触发另一个地点的事件 +### trigger:立即触发另一个地点的事件 `{"type":"trigger"}` 会立刻触发当层另一个地点的自定义事件。 @@ -428,7 +429,7 @@ NPC对话事件结束后如果需要NPC消失也需要调用 `{"type": "hide"}` 例如上面这个例子,下面的文字将不会再被显示,而是直接跳转到`"3,6"`对应的事件列表从头执行。 -### revisit: 立即重启当前事件 +### revisit:立即重启当前事件 revisit和trigger完全相同,只不过是立刻触发的还是本地点的事件 @@ -443,7 +444,7 @@ revisit其实是trigger的简写,只不过是loc固定为当前点。 revisit常常使用在一些商人之类的地方,当用户购买物品后不是离开,而是立刻重新访问重新进入购买页面。 -### exit: 立刻结束当前事件 +### exit:立刻结束当前事件 上面说到像商人一类,购买物品后可以立刻revisit重新访问,但是这样就相当于陷入了死循环导致无法离开。 @@ -504,11 +505,11 @@ name是可选的,代表目标行走图的文件名。 如果你需要同时修改勇士的名称,可以使用`setValue`事件来修改`status:name`,但请注意value必须加单引号,不然会报错。 -### update: 立刻更新状态栏和地图显伤 +### update:立刻更新状态栏和地图显伤 如果你需要刷新状态栏和地图显伤,只需要简单地调用 `{"type": "update"}` 即可。 -### sleep: 等待多少毫秒 +### sleep:等待多少毫秒 等价于RMXP中的"等待x帧",不过是以毫秒来计算。 @@ -521,7 +522,7 @@ name是可选的,代表目标行走图的文件名。 ] ``` -### battle: 强制战斗 +### battle:强制战斗 调用battle可强制与某怪物进行战斗(而无需去触碰到它)。 @@ -552,7 +553,7 @@ name是可选的,代表目标行走图的文件名。 强制战斗没有指定loc的选项,因此战斗后需要调用hide使怪物消失(如果有必要)。 -### openDoor: 开门 +### openDoor:开门 调用`{"type":"openDoor"}`可以打开一扇门。 @@ -569,7 +570,7 @@ loc指定门的坐标,floorId指定门所在的楼层ID。如果是当前层 如果loc所在的点既不是门也不是墙壁,则忽略本事件。 -### changeFloor: 楼层切换 +### changeFloor:楼层切换 在事件中也可以对楼层进行切换。一个比较典型的例子就是TSW中,勇士在三楼的陷阱被扔到了二楼,就是一个楼层切换事件。 @@ -594,7 +595,7 @@ time为可选的,指定的话将作为楼层切换动画的时间。 !> **changeFloor到达一个新的楼层,将不会执行firstArrive事件!如有需求请在到达点设置自定义事件,然后使用type: trigger立刻调用之。** -### changePos: 当前位置切换/勇士转向 +### changePos:当前位置切换/勇士转向 有时候我们不想要楼层切换的动画效果,而是直接让勇士从A点到B点。 @@ -608,11 +609,11 @@ time为可选的,指定的话将作为楼层切换动画的时间。 ] ``` -### openShop: 打开一个全局商店 +### openShop:打开一个全局商店 使用openShop可以打开一个全局商店。有关全局商店的说明可参见[全局商店](#全局商店)。 -### disableShop: 禁用一个全局商店 +### disableShop:禁用一个全局商店 使用disableShop可以永久禁用全局商店直到再次被openShop打开为止。有关全局商店的说明可参见[全局商店](#全局商店)。 @@ -722,7 +723,7 @@ time为总移动的时间。 !> 移动图片只是会在顶层绘制“移动”效果,动画结束即消失,并不会实际对图片的显示造成影响。请与showImage事件合用。 -### setFg: 更改画面色调 +### setFg:更改画面色调 我们可以使用 `{"type": "setFg"}` 来更改画面色调。 @@ -762,7 +763,7 @@ level为天气的强度等级,在1-10之间。1级为最弱,10级为最强 !> 使用setWeather更改的天气在切换地图后会被目标地图的默认天气覆盖。 -### move: 让某个NPC/怪物移动 +### move:让某个NPC/怪物移动 如果我们需要移动某个NPC或怪物,可以使用`{"type": "move"}`。 @@ -832,7 +833,7 @@ move完毕后移动的NPC/怪物一定会消失,只不过可以通过immediate 不过值得注意的是,用这种方式移动勇士的过程中将无视一切地形,无视一切事件,中毒状态也不会扣血。 -### playBgm: 播放背景音乐 +### playBgm:播放背景音乐 使用playBgm可以播放一个背景音乐。 @@ -844,15 +845,15 @@ move完毕后移动的NPC/怪物一定会消失,只不过可以通过immediate 有关BGM播放的详细说明参见[背景音乐](element#背景音乐) -### pauseBgm: 暂停背景音乐 +### pauseBgm:暂停背景音乐 使用`{"type": "pauseBgm"}`可以暂停背景音乐的播放。 -### resumeBgm: 恢复背景音乐 +### resumeBgm:恢复背景音乐 使用`{"type": "resumeBgm"}`可以恢复背景音乐的播放。 -### playSound: 播放音效 +### playSound:播放音效 使用playSound可以立刻播放一个音效。 @@ -868,7 +869,7 @@ move完毕后移动的NPC/怪物一定会消失,只不过可以通过immediate value为音量大小,在0到100之间,默认为100。设置后,BGM和SE都将使用该音量进行播放。 -### win: 获得胜利 +### win:获得胜利 `{"type": "win", "reason": "xxx"}` 将会直接调用events.js中的win函数,并将reason作为结局传入。 @@ -876,7 +877,7 @@ value为音量大小,在0到100之间,默认为100。设置后,BGM和SE都 !> 如果`reason`不为空,则会以reason作为获胜的结局! -### lose: 游戏失败 +### lose:游戏失败 `{"type": "lose", "reason": "xxx"}` 将会直接调用`events.js`中的lose函数,并将reason作为参数传入。 @@ -901,7 +902,7 @@ text为提示文字,可以在这里给输入提示文字。这里同样可以 输入得到的结果将被赋值给flag:input,可以供后续if来进行判断。 -### if: 条件判断 +### if:条件判断 使用`{"type": "if"}`可以对条件进行判断,根据判断结果将会选择不同的分支执行。 @@ -952,7 +953,7 @@ text为提示文字,可以在这里给输入提示文字。这里同样可以 - if可以不断进行嵌套,一层套一层;如成立的场合再进行另一个if判断等。 - if语句内的内容执行完毕后将接着其后面的语句继续执行。 -### choices: 给用户提供选项 +### choices:给用户提供选项 choices是一个很麻烦的事件,它将弹出一个列表供用户进行选择。 @@ -1153,7 +1154,6 @@ choices为一个数组,其中每一项都是一个选项列表。 ``` - ### function: 自定义JS脚本 上述给出了这么多事件,但有时候往往不能满足需求,这时候就需要执行自定义脚本了。 @@ -1169,23 +1169,7 @@ choices为一个数组,其中每一项都是一个选项列表。 `{"type":"function"}`需要有一个`"function"`参数,它是一个JS函数,里面可以写任何自定义的JS脚本;系统将会执行它。 -系统所有支持的API都在[附录](api)中给出。 - -这里只简单列出给一些最常见的API: - -``` js -core.getStatus(name) //获得勇士的某个属性(hp/atk/def/…) -core.setStatus(name, value) //设置勇士某个属性值为value -core.itemCount(name) //获得某个道具的个数 -core.getItem(name, count) //获得某个道具count个 -core.setItem(name, value) //设置某个道具为value个 -core.getFlag(name, defaultValue) //获得某个自定义变量flag;如果未定义则返回defaultValue -core.setFlag(name, value) //将某个自定义变量/flag设置为value -core.hasFlag(name) //判断某个自定义flag是否成立。只有被被赋值过,且不为0或false时才会返回true。 -core.updateStatusBar() //立刻更新状态栏和地图显伤。(上面各种get和set均不会对状态栏和地图显伤更新,需要手动调用这个函数。) -core.insertAction(list) //往当前事件列表中插入一系列事件。使用这个函数插入的事件将在这段自定义JS脚本执行完毕后立刻执行。 -// …… -``` +系统所有支持的API都在[附录](api)中给出,请进行参照。 ## 同一个点的多事件处理 @@ -1197,7 +1181,7 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用 下面以几个具体例子来进行详细说明。 -### 打怪掉宝(怪物->道具) +### 打怪掉宝 我们注意到怪物和道具都是系统默认事件,因此无需写events,而是直接在afterBattle中setBlock即可。 @@ -1209,22 +1193,24 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用 } ``` -### 打怪变成可对话的NPC(怪物->NPC) +### 打怪变成楼梯 -由于NPC是自定义事件,因此我们需要写events。注意到events中不覆盖trigger,则还是怪物时,存在系统trigger因此会战斗;变成NPC后没有系统trigger因此会触发自定义事件。 +因为涉及到多事件处理,因此我们不能写changeFloor那一项,而是使用events(自定义事件里写楼层转换)。 + +注意到events中不覆盖trigger,则还是怪物时,存在系统trigger因此会战斗并触发afterBattle;变成NPC后没有系统trigger因此会触发自定义事件(楼层转换)。 请注意打死怪物时默认会禁用该点,因此替换后需要手动进行show来启用。 ``` js "events": { "x,y": [ - "可对话的NPC" + {"type": "changeFloor", "loc": [0,0], "floorId": "MT1"} ] }, "afterBattle": { "x,y": [ - {"type": "setBlock", "number": 121}, // 变成老人 - {"type": "show", "loc": [x,y]} // 启用该点 + {"type": "setBlock", "number": 87}, // 变成上楼梯 + {"type": "show"} // 启用该点 ] } ``` @@ -1264,6 +1250,7 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用 - 触发器(trigger)亦采用覆盖原则,即**首先取该图块的默认触发器(例如怪物是battle,道具是getItem,门是openDoor),如果剧本的events中定义了该点的trigger则覆盖**。 - 可以通过if语句和flag来控制自定义事件具体走向哪个分支。 - 如果弄不清楚系统trigger和自定义事件等的区别,也可以全部覆盖为自定义事件,然后通过type:battle,type:openDoor等来具体进行控制。 + - 多事件处理时请不要使用`changeFloor`那一项,而是使用`events`或者`afterXXX`来处理。 ## 加点事件 @@ -1273,13 +1260,7 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用 如果要对某个怪物进行加点操作,则首先需要修改该怪物的`point`数值,代表怪物本身的加点数值。 -``` js -... 'def': 0, 'money': 1, 'experience': 1, 'point': 1, 'special': 0}, // 在怪物后面添加point代表怪物的加点数 -``` - -然后在`functions.js`文件中找到`addPoint`函数。它将返回一个choices事件。修改此函数为我们需要的加点项即可。 - -!> V2.0版本可以直接在“脚本编辑 - 加点事件”中双击进行修改! +然后在脚本编辑中找到加点事件,双击进行修改。它将返回一个choices事件。修改此函数为我们需要的加点项即可。 ``` js ////// 加点事件 ////// @@ -1315,6 +1296,8 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用 全局商店定义在`data.js`中,找到shops一项。 +从V2.2以后,全局商店也可以使用图块进行编辑,但仍需知道每一项的使用。 + ``` js "shops": [ // 定义全局商店(即快捷商店) { diff --git a/docs/img/plugin.png b/docs/img/plugin.png new file mode 100644 index 00000000..4e87fa84 Binary files /dev/null and b/docs/img/plugin.png differ diff --git a/docs/personalization.md b/docs/personalization.md index c287e4e7..36191624 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -75,7 +75,7 @@ images为一个数组,代表当前层所有作为背景素材的图片信息 如果第四项为true,则会在前景层(event2)上绘制,能覆盖勇士,常常用来作为柱子的上半部分等情况。 -**如果你需要让某些点不可通行(比如你建了个房子,墙壁和家具等位置不让通行),则需在`events`中指定`{"noPass": false}`,参见[自定义事件](event#自定义事件)的写法。 +**如果你需要让某些点不可通行(比如你建了个房子,墙壁和家具等位置不让通行),则需在`events`中指定`{"noPass": false}`,参见[自定义事件](event#自定义事件)的写法。** ``` js "events": { @@ -114,8 +114,35 @@ images为一个数组,代表当前层所有作为背景素材的图片信息 **`ID-数字` 对应关系定义在maps.js文件中。该文件将唯一确定一个ID对应的数字是多少。** -如果需要添加一个素材到游戏,则必须为其分配一个唯一标识符,并同时修改`icons.js`和`maps.js`两个文件。 +在V2.0中,我们可以在地图编辑器中很方便查看每个图块的三个属性信息。 +#### 注册素材 + +在V2.0的地图编辑器中,要注册新素材,我们只需要在图块属性一栏输入新素材的ID和数字。 + +![素材注册](./img/register.png) + +ID必须由数字字母下划线组成,数字在1000以内,且均不能和已有的进行重复。 + +之后刷新编辑器即可。 + +对于怪物和道具,我们也可以进行自动注册,只需要点击“自动注册”按钮,将对该栏下所有未注册的素材进行自动注册(自动分配ID和数字)。 + +素材注册完毕后,即可在游戏中正常使用,也可以被地图生成器所识别(需要重开地图生成器)。 + +#### Autotile的注册 + +但是,通过上面这种方式,我们是没办法新增并注册Autotile的。 + +除了替换样板现有的几个外,如果我们还需要新添加Autotile,则: + +1. 将新的Autotile图片复制到images目录下。文件名必须是字母数字和下划线组成。 +2. 进入icons.js,在autotile分类下进行添加该文件的名称,索引简单的写0。 +3. 指定一个数字,在maps.js中类似进行添加。 + +!> Autotile的ID和文件名应确保完全相同! + + + ### 地图生成器使用自定义素材 地图生成器是直接从js文件中读取数字-图标对应关系的。 @@ -196,7 +225,7 @@ images为一个数组,代表当前层所有作为背景素材的图片信息 如果你想要同种宝石在不同层效果不同的话,可以进行如下操作: 1. 在楼层的item_ratio中定义宝石的比率(比如1-10的写1,11-20层写2等) -2. 修改获得道具的itemEffect函数(在items.js中的itemEffect中编辑,V2.0中也可以使用编辑器) +2. 修改获得道具的itemEffect函数(编辑器中双击进行编辑) ``` js // ratio为楼层的item_ratio值,可以进行翻倍宝石属性 @@ -278,7 +307,7 @@ control.prototype.checkBlock = function () { } // ... 下略 ``` -4. 如果有更高的需求,例如想让吸血效果变成一半(如异空间),则还是在上面这些地方进行对应的修改即可。 +4. 如果有更高的需求,例如想让吸血效果变成一半,则还是在上面这些地方进行对应的修改即可。 ## 自定义装备 @@ -359,7 +388,7 @@ this.useEquipment = function (itemId) { // 使用装备 你需自己指定一个special数字,修改getSpecialText函数(属性名)和getSpecialHint函数(属性提示文字)。 -如果要修改伤害计算公式,请修改下面的calDamage函数。请注意,如果无法战斗,该函数必须返回`null`。 +如果要修改伤害计算公式,请修改下面的getDamageInfo函数。请注意,如果无法战斗,该函数必须返回`null`。 对于毒衰弱怪物的战斗后结算在`functions.js`中的afterBattle函数中。 @@ -367,6 +396,209 @@ this.useEquipment = function (itemId) { // 使用装备 `getCritical`, `getCriticalDamage`和`getDefDamage`三个函数依次计算的是该怪物的临界值、临界减伤和1防减伤。也可以适当进行修改。 +## 公共事件 + +在RM中,存在公共事件的说法;也就是通过某个指令来调用一系列事件的触发。 + +在H5中,我们可以使用“插件”的形式来达成这个效果。具体参见“脚本编辑 - 插件编写”。 + +![插件编写](./img/plugin.png) + +当我们在这上面定义了自己需要的函数(插件后),就可以通过任何方式进行调用。 + +在这个插件编写的过程中,我们可以使用任何[常见API](api)里面的代码调用;也可以通过`core.insertAction`来插入自定义事件执行。 + +下面是一个很简单的例子,我编写一个公共事件(插件),其效果是让勇士生命值变成原来的x倍,并令面前的图块消失。 + +``` js +this.myfunc = function(x) { + core.status.hero.hp *= x; // 勇士生命翻若干倍 + core.insertAction([ // 自定义事件:令面前的图块消失。 + {"type": "setValue", "name": "flag:x", "value": "core.nextX()"}, + {"type": "setValue", "name": "flag:y", "value": "core.nextY()"}, + {"type": "hide", "loc": ["flag:x", "flag:y"]} + ]); +} +``` + +然后比如我们在某个道具的使用效果 `useItemEffect` 中写 `core.plugin.myfunc(2)` 即可调用此公共事件(插件)。也可以在战后事件或自定义脚本等位置来写。 + +通过这种,将脚本和自定义事件混用的方式,可以达到和RM中公共事件类似的效果,即一个调用触发一系列事件。 + +## 自定义状态栏(新增显示项) + +在V2.2以后,我们可以自定义状态栏背景图(全塔属性 - statusLeftBackground)等等。 + +但是,如果我们还想新增其他项目的显示,比如技能塔所需要的魔力值(气息),该怎么办? + +需要进行如下几个操作: + +1. 定义图标ID;比如魔力我就定义mana,气息可以简单的定义qixi;你也可以定义其他的ID,但是不能和已有的重复。这里以mana为例。 +2. 在index.html的statusBar中(44行起),进行该状态栏项的定义。仿照其他几项,插在其应当显示的位置,注意替换掉相应的ID。 +``` html +
+ +

+
+``` +3. 在editor.html中的statusBar(305行起),仿照第二点同样添加;这一项如果不进行则会地图编辑器报错。 +4. 使用便捷PS工具,打开icons.png,新增一行并将魔力的图标P上去;记下其索引比如23(减速播放图标的下方)。 +5. 在main.js的this.statusBar中增加图片、图标和内容的定义。 +``` js +this.statusBar = { + 'images': { + // ...其他略 + 'mana': document.getElementById("img-mana"), // 图片的定义 + }, + 'icons': { + // ...其他略 + 'mana': 23, // 图标的定义,这里对应的是icons.png中的索引 + }, + // ...其他略 + 'mana': document.getElementById('mana'), // 显示内容(数据)的定义 +} +``` +6. 显示内容的设置。在control.js的updateStatusBar函数,可以对该状态栏显示内容进行设置,下面是几个例子。 +``` js +core.statusBar.mana.innerHTML = core.getFlag('mana', 0); // 设置其显示内容为flag:mana值。 +core.statusBar.mana.innerHTML = core.getFlag('mana', 0) + '/' + core.getFlag('manaMax', 0); // 显示内容将类似 "32/60" 这样。 +core.statusBar.mana.style.fontStyle = 'normal'; // 这一行会取消斜体。如果是汉字(比如技能名)的话,斜体起来会非常难看,可以通过这一句取消。 +``` +7. 在control.js的clearStatusBar函数,`statusList`里面也要增加mana项,这样清空状态栏时也会对其清空。 + +## 技能塔的支持 + +其实,在HTML5上制作技能塔是完全可行的。 + +要支持技能塔,可能需要如下几个方面: + +- 魔力(和上限)的定义添加 +- 状态栏的显示 +- 技能的触发(按键与录像问题) +- 技能的效果 + +下面依次进行描述。 + +### 魔力的定义添加 + +当我们定义了魔力的ID,比如`mana`后,要使用它,一般有两种方式:属性获取`status:mana`或者flag标记`flag:mana`。 + +如果要属性获取,则需要打开`data.js`文件,并在`hero`中添加定义。 + +通过这种方式定义的,可以通过`core.setStatus('mana', 0)`以及`core.getStatus('mana')`来设置或获取。 + +``` js +'hero': { + // ... 上略 + 'mana': 0, // 增添mana定义,可以放在experience之后。同理可定义manaMax表示当前最大魔力值。 +} +``` + +如果要flag标记,则无需额外在任何地方进行定义。只需要在设置或取用的时候使用 `core.setFlag('mana', 0)` 或 `core.getFlag('mana', 0)` 即可。 + +下面我都使用属性获取的方式来进行说明。 + +### 状态栏的显示 + +首先我们需要额外新增一个状态栏;参见上面的自定义状态栏的做法来新增一栏。 + +我们可以在魔力那一行显示当前值和最大值: + +``` js +core.setStatus('mana', Math.min(core.getStatus('mana'), core.getStatus('manaMax')); // 如果魔力存在上限,则不能超过其上限值 +core.statusBar.mana.innerHTML = core.getStatus('mana') + '/' + core.getStatus('manaMax', 0); // 显示比如 6/30 这样 +``` + +如果我们还需要显示当前使用的技能名,也是可以的;定义一个ID为skill,然后按照上面的做法新增一行。 + +请注意,如果是中文字符,需要取消斜体(不然会非常难看的)! + +``` js +core.statusBar.skill.style.fontStyle = 'normal'; // 取消斜体显示 +core.statusBar.skill.innerHTML = core.getFlag('skillName', '无'); // 使用flag:skillName表示当前激活的技能名。 +``` + +### 技能的触发 + +我们可以按键触发技能。 + +要修改按键,我们可以在`actions.js`的`keyUp`进行处理: + +我们设置一个快捷键进行绑定,比如`W`,其keycode是87。(有关每个键的keycode搜一下就能得到) + +!> H5不支持组合快捷键,所以不存在`W+1`这种组合快捷键的说法! + +然后在`actions.js`的`keyUp`函数的`switch`中进行处理。 + +``` js +case 87: // W + if (core.status.heroStop) { // 当前停止状态;这个if需要加,不能在行走过程中触发不然容易出错。 + if (core.getFlag('skill', 0)==0) { // 判断当前是否已经开了技能 + if (能开技能) { // 这里要写当前能否开技能的条件判断 + core.setFlag('skill', 1); // 开技能1 + core.setFlag('skillName', '二倍斩'); // 设置技能名 + } + else { + core.drawTip("当前不能开技能!"); + } + } + else { // 关闭技能 + core.setFlag('skill', 0); // 关闭技能状态 + core.setFlag('skillName', '无'); + } + core.updateStatusBar(); // 立刻更新状态栏和地图显伤 + core.status.route.push("key:"+keyCode); // 录像的支持!这句话必须要加,不然录像回放会出错! + } + break; +``` + +简单的说,用flag:skill判断当前开启的技能,flag:skillName表示该技能名。(可在状态栏显示) + +在勇士处于停止的条件下,按下W键时,判断当前是否开启了技能,如果开启则关闭,没开则再判断是否允许开启(魔力值够不够等)。 + +`core.status.route.push("key:"+keyCode);` 这句话是对录像的支持,一定要加(这样录像播放时也会模拟该按键)。 + +!> 1,2,3这三个键被默认绑定到了破炸飞;如果想用的话也是一样,只不过是把已有的实现进行替换。 + +!> 手机端可以通过长按任何位置调出虚拟键盘,再进行按键,和键盘按键是等价的效果! + +### 技能的效果 + +最后一点就是技能的效果;其实到了这里就和RM差不多了。 + +技能的效果要分的话有地图类技能,战斗效果类技能,后续影响类技能什么的,这里只介绍最简单的战斗效果类技能。 +其他的几类技能根据需求可能更为麻烦,有兴趣可自行进行研究。 + +战斗效果内技能要改两个地方:战斗伤害计算,战后扣除魔力值。 + +战斗伤害计算在`enenmys.js`的`getDamageInfo`函数,有需求直接修改这个函数即可。 + +战后扣除魔力值则在脚本编辑的`afterBattle`中进行编辑即可。 + +举个例子,我设置一个勇士的技能:二倍斩,开启技能消耗5点魔力,下一场战斗攻击力翻倍。 + +那么,直接在`getDamageInfo`中进行判断: + +``` js +if (core.getFlag('skill', 0)==1) { // 开启了技能1 + hero_atk *= 2; // 计算时攻击力翻倍 +} +``` + +然后在脚本编辑的战后事件中进行魔力值的扣除: + +``` js +if (core.getFlag('skill', 0)==1) { // 开启了技能1 + core.status.hero.mana -= 5; // 扣除5点魔力值 + core.setFlag('skill', 0); // 自动关闭技能 + core.setFlag('skillName', '无'); +} +``` + +  + +通过上述这几种方式,我们就能成功的让H5支持技能啦! + ## 根据难度分歧来自定义地图 遗憾的是,所有地图数据必须在剧本的map中指定,换句话说,我们无法在游戏进行中动态修改地图,比如为简单难度增加一个血瓶。 diff --git a/libs/core.js b/libs/core.js index 34e06f1a..78d0a7fa 100644 --- a/libs/core.js +++ b/libs/core.js @@ -651,6 +651,11 @@ core.prototype.getBlock = function (x, y, floorId, needEnable) { return core.maps.getBlock(x,y,floorId,needEnable); } +////// 获得某个点的blockId ////// +core.prototype.getBlockId = function (x, y, floorId, needEnable) { + return core.maps.getBlockId(x, y, floorId, needEnable); +} + ////// 显示移动某块的动画,达到{“type”:”move”}的效果 ////// core.prototype.moveBlock = function(x,y,steps,time,immediateHide,callback) { core.maps.moveBlock(x,y,steps,time,immediateHide,callback) diff --git a/libs/events.js b/libs/events.js index 35d8d70c..8cf62d64 100644 --- a/libs/events.js +++ b/libs/events.js @@ -349,6 +349,8 @@ events.prototype.doAction = function() { core.events.doAction(); break; case "show": // 显示 + if (!core.isset(data.loc)) + data.loc = [x,y]; if ((typeof data.loc[0] == 'number' || typeof data.loc[0] == 'string') && (typeof data.loc[1] == 'number' || typeof data.loc[1] == 'string')) data.loc = [[core.calValue(data.loc[0]), core.calValue(data.loc[1])]]; diff --git a/libs/maps.js b/libs/maps.js index fa80da9f..39a0e306 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -537,6 +537,14 @@ maps.prototype.getBlock = function (x, y, floorId, needEnable) { return null; } +////// 获得某个点的blockId ////// +maps.prototype.getBlockId = function (x, y, floorId, needEnable) { + var block = core.getBlock(x, y, floorId, needEnable); + if (block == null) return null; + if (core.isset(block.block.event)) return block.block.event.id; + return null; +} + ////// 显示移动某块的动画,达到{“type”:”move”}的效果 ////// maps.prototype.moveBlock = function(x,y,steps,time,immediateHide,callback) { time = time || 500;