commit
8a31598b76
@ -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;
|
||||
|
||||
@ -153,6 +153,11 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
"_type": "textarea",
|
||||
"_data": "初始生命值"
|
||||
},
|
||||
"mana": {
|
||||
"_leaf": true,
|
||||
"_type": "textarea",
|
||||
"_data": "初始魔力值,只在enableMana开启时才有效"
|
||||
},
|
||||
"atk": {
|
||||
"_leaf": true,
|
||||
"_type": "textarea",
|
||||
@ -389,6 +394,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
"_bool": "bool",
|
||||
"_data": "是否是否启用生命上限"
|
||||
},
|
||||
"enableMana": {
|
||||
"_leaf": true,
|
||||
"_type": "checkbox",
|
||||
"_bool": "bool",
|
||||
"_data": "是否开启魔力值"
|
||||
},
|
||||
"enableMDef": {
|
||||
"_leaf": true,
|
||||
"_type": "checkbox",
|
||||
@ -431,6 +442,12 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
"_bool": "bool",
|
||||
"_data": "是否涉及毒衰咒;如果此项为false则不会在状态栏中显示毒衰咒的debuff"
|
||||
},
|
||||
"enableSkill": {
|
||||
"_leaf": true,
|
||||
"_type": "checkbox",
|
||||
"_bool": "bool",
|
||||
"_data": "是否启用技能栏"
|
||||
},
|
||||
"flyNearStair": {
|
||||
"_leaf": true,
|
||||
"_type": "checkbox",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -369,6 +369,20 @@ HTML5魔塔一大亮点就是存在录像系统,可以很方便进行录像回
|
||||
|
||||
如果录像出现问题,请加群539113091找小艾反馈Bug。
|
||||
|
||||
## 绘图模式
|
||||
|
||||
从V2.5开始,样板提供了绘图模式,可以让玩家在画布上任意进行绘制,标记等。
|
||||
|
||||
使用M键,或在菜单栏中可以进入绘图模式。
|
||||
|
||||
**绘图的内容会自动保存,且以页面为生命周期,和存读档无关,返回标题并重新开始游戏后绘制的内容仍有效,但刷新页面就会消失。**
|
||||
|
||||
你可以将绘制内容保存到文件,也可以从文件读取保存的绘制内容。
|
||||
|
||||
绘图模式下,状态栏的图标也会相应改变,铅笔为绘制模式,橡皮为擦除模式,存读档为保存和读取绘图文件,退出为返回默认值。
|
||||
|
||||
在浏览地图页面中也可以按楼传按钮或M键来开启/关闭该层的绘图显示。
|
||||
|
||||
## 操作说明
|
||||
|
||||
本塔主要支持鼠标(触摸屏)操作和键盘操作。
|
||||
@ -397,10 +411,15 @@ HTML5魔塔一大亮点就是存在录像系统,可以很方便进行录像回
|
||||
- **[B]** 打开数据统计
|
||||
- **[H]** 打开帮助页面
|
||||
- **[R]** 回放录像
|
||||
- **[E]** 显示光标
|
||||
- **[SPACE]** 轻按(仅在轻按开关打开时有效)
|
||||
- **[M]** 绘图模式
|
||||
- **[PgUp/PgDn]** 浏览地图
|
||||
- **[1]** 快捷使用破墙镐
|
||||
- **[2]** 快捷使用炸弹/圣锤
|
||||
- **[3]** 快捷使用中心对称飞行器
|
||||
- **[4]** 快捷使用其他道具
|
||||
- **[Alt+0~9]** 快捷换装
|
||||
|
||||
以上快捷键也能在游戏菜单中的操作说明中看到。
|
||||
|
||||
|
||||
@ -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([...]) // 例如,插入一段自定义事件并执行。
|
||||
case 89: // 使用该按键的keyCode,比如Y键就是89
|
||||
// 还可以再判定altKey是否被按下,即 if (altKey) { ...
|
||||
|
||||
// core.status.route.push("key:"+keyCode); // 录像的支持,这句话加不加最好仔细进行测试
|
||||
// ... 在这里写你要执行脚本
|
||||
// **强烈建议所有新增的自定义快捷键均能给个对应的道具可点击,以方便手机端的行为**
|
||||
if (core.hasItem('...')) {
|
||||
core.useItem('...');
|
||||
}
|
||||
|
||||
break;
|
||||
```
|
||||
|
||||
强烈建议所有新增的自定义快捷键均给个对应的永久道具可点击,以方便手机端的行为。
|
||||
|
||||
在勇士处于停止的条件下,按下W键时,将执行你写的脚本代码。请只使用同步脚本而不要使用异步代码,不然可能导致游戏出现问题。
|
||||
|
||||
`core.status.route.push("key:"+keyCode);` 这句话是对录像的支持。
|
||||
|
||||
**录像的支持可能比较诡异,在不同条件下都是不同的;因此加不加最好分开独立进行测试。**
|
||||
|
||||
!> H5不支持组合快捷键,所以不存在`W+1`这种组合快捷键的说法!
|
||||
|
||||
!> 手机端可以通过长按任何位置调出虚拟键盘,再进行按键,和键盘按键是等价的效果!
|
||||
可以使用altKey来判断Alt键是否被同时按下。
|
||||
|
||||
## 公共事件
|
||||
|
||||
@ -554,6 +548,8 @@ this.myfunc = function(x) {
|
||||
|
||||
通过这种,将脚本和自定义事件混用的方式,可以达到和RM中公共事件类似的效果,即一个调用触发一系列事件。
|
||||
|
||||
<!--
|
||||
|
||||
## 自定义状态栏(新增显示项)
|
||||
|
||||
在V2.2以后,我们可以自定义状态栏背景图(全塔属性 - statusLeftBackground)等等。
|
||||
@ -594,56 +590,51 @@ core.statusBar.mana.innerHTML = core.getFlag('mana', 0) + '/' + core.getFlag('ma
|
||||
core.statusBar.mana.style.fontStyle = 'normal'; // 这一行会取消斜体。如果是汉字(比如技能名)的话,斜体起来会非常难看,可以通过这一句取消。
|
||||
```
|
||||
|
||||
-->
|
||||
|
||||
## 技能塔的支持
|
||||
|
||||
其实,在HTML5上制作技能塔是完全可行的。
|
||||
|
||||
要支持技能塔,可能需要如下几个方面:
|
||||
|
||||
- 魔力(和上限)的定义添加
|
||||
- 魔力(和上限)的添加;技能的定义
|
||||
- 状态栏的显示
|
||||
- 技能的触发(按键与录像问题)
|
||||
- 技能的效果
|
||||
|
||||
下面依次进行描述。
|
||||
从V2.5开始,内置了"二倍斩"技能,可以仿照其制作自己的技能。
|
||||
|
||||
### 魔力的定义添加
|
||||
### 魔力的定义添加;技能的定义
|
||||
|
||||
当我们定义了魔力的ID,比如`mana`后,要使用它,一般有两种方式:属性获取`status:mana`或者flag标记`flag:mana`。
|
||||
从V2.5开始,提供了status:mana选项,可以直接代表当前魔力值。
|
||||
|
||||
如果要属性获取,则需要打开`data.js`文件,并在`hero`中添加定义。
|
||||
如果要启用,需要开启全塔属性的enableMana选项。
|
||||
|
||||
通过这种方式定义的,可以通过`core.setStatus('mana', 0)`以及`core.getStatus('mana')`来设置或获取。
|
||||
如果需要魔力上限,则可以使用flag:manaMax来表示当前的魔力最大值。
|
||||
|
||||
``` js
|
||||
'hero': {
|
||||
// ... 上略
|
||||
'mana': 0, // 增添mana定义,可以放在experience之后。同理可定义manaMax表示当前最大魔力值。
|
||||
}
|
||||
```
|
||||
同时,我们可以使用flag:skill表示当前开启的技能编号,flag:skillName表示当前开启的技能名称。
|
||||
|
||||
如果要flag标记,则无需额外在任何地方进行定义。只需要在设置或取用的时候使用 `core.setFlag('mana', 0)` 或 `core.getFlag('mana', 0)` 即可。
|
||||
|
||||
下面我都使用属性获取的方式来进行说明。
|
||||
如果flag:skill不为0,则代表当前处于某个技能开启状态,且状态栏显示flag:skillName值。伤害计算函数中只需要对flag:skill进行处理即可。
|
||||
|
||||
### 状态栏的显示
|
||||
|
||||
首先我们需要额外新增一个状态栏;请参见[自定义状态栏(新增显示项)](#自定义状态栏(新增显示项))。
|
||||
从V2.5开始,魔力值和技能名的状态栏项目已经被添加,可以直接使用。
|
||||
|
||||
我们可以在魔力那一行显示当前值和最大值:
|
||||
在脚本编辑-updateStatusBar中,可以对状态栏显示内容进行修改。
|
||||
|
||||
``` 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表示当前激活的技能名。
|
||||
// 设置魔力值
|
||||
if (core.flags.enableMana) {
|
||||
// 也可以使用flag:manaMax来表示最大魔力值
|
||||
// core.status.hero.mana = Math.max(core.status.hero.mana, core.getFlag('manaMax', 10));
|
||||
// core.statusBar.mana.innerHTML = core.status.hero.mana + "/" + core.getFlag('manaMax', 10);
|
||||
}
|
||||
// 设置技能栏
|
||||
if (core.flags.enableSkill) {
|
||||
// 可以用flag:skill表示当前开启的技能类型,flag:skillName显示技能名
|
||||
core.statusBar.skill.innerHTML = core.getFlag('skillName', '无');
|
||||
}
|
||||
```
|
||||
|
||||
### 技能的触发
|
||||
@ -687,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;
|
||||
```
|
||||
@ -716,7 +706,7 @@ case 87: // W
|
||||
|
||||
举个例子,我设置一个勇士的技能:二倍斩,开启技能消耗5点魔力,下一场战斗攻击力翻倍。
|
||||
|
||||
那么,直接在`getDamageInfo`中进行判断:
|
||||
那么,直接在脚本编辑的`getDamageInfo`中进行判断:
|
||||
|
||||
``` js
|
||||
if (core.getFlag('skill', 0)==1) { // 开启了技能1
|
||||
@ -724,16 +714,24 @@ if (core.getFlag('skill', 0)==1) { // 开启了技能1
|
||||
}
|
||||
```
|
||||
|
||||
然后在脚本编辑的战后事件中进行魔力值的扣除:
|
||||
然后在脚本编辑的`afterBattle`中进行魔力值的扣除:
|
||||
|
||||
``` js
|
||||
if (core.getFlag('skill', 0)==1) { // 开启了技能1
|
||||
// 战后的技能处理,比如扣除魔力值
|
||||
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('skill', 0);
|
||||
core.setFlag('skillName', '无');
|
||||
}
|
||||
```
|
||||
|
||||
!> 开启技能后,建议将全塔属性的useLoop置为true,即改用循环计算临界值,这样临界计算才不会出问题!
|
||||
|
||||
|
||||
|
||||
通过上述这几种方式,我们就能成功的让H5支持技能啦!
|
||||
|
||||
@ -355,6 +355,10 @@
|
||||
<img id="img-hp">
|
||||
<p class='statusLabel statusText' id='hp'></p>
|
||||
</div>
|
||||
<div class="status" id='manaCol'>
|
||||
<img id="img-mana">
|
||||
<p class='statusLabel statusText' id='mana'></p>
|
||||
</div>
|
||||
<div class="status">
|
||||
<img id="img-atk">
|
||||
<p class='statusLabel statusText' id='atk'></p>
|
||||
@ -379,6 +383,10 @@
|
||||
<img id="img-up">
|
||||
<p class='statusLabel statusText' id='up'></p>
|
||||
</div>
|
||||
<div class="status" id="skillCol">
|
||||
<img id="img-skill">
|
||||
<p class='statusLabel statusText' id='skill' style='font-style: normal'></p>
|
||||
</div>
|
||||
<div class="status" id='keyCol'>
|
||||
<span class='statusLabel' id='yellowKey' style="color:#FFCCAA"></span>
|
||||
<span class='statusLabel' id='blueKey' style="color:#AAAADD"></span>
|
||||
|
||||
@ -341,6 +341,10 @@
|
||||
<img id="img-hp">
|
||||
<p class='statusLabel statusText' id='hp'></p>
|
||||
</div>
|
||||
<div class="status" id='manaCol'>
|
||||
<img id="img-mana">
|
||||
<p class='statusLabel statusText' id='mana'></p>
|
||||
</div>
|
||||
<div class="status">
|
||||
<img id="img-atk">
|
||||
<p class='statusLabel statusText' id='atk'></p>
|
||||
@ -365,6 +369,10 @@
|
||||
<img id="img-up">
|
||||
<p class='statusLabel statusText' id='up'></p>
|
||||
</div>
|
||||
<div class="status" id="skillCol">
|
||||
<img id="img-skill">
|
||||
<p class='statusLabel statusText' id='skill' style='font-style: normal'></p>
|
||||
</div>
|
||||
<div class="status" id='keyCol'>
|
||||
<span class='statusLabel' id='yellowKey' style="color:#FFCCAA"></span>
|
||||
<span class='statusLabel' id='blueKey' style="color:#AAAADD"></span>
|
||||
|
||||
@ -62,6 +62,10 @@
|
||||
<img id="img-hp">
|
||||
<p class='statusLabel statusText' id='hp'></p>
|
||||
</div>
|
||||
<div class="status" id='manaCol'>
|
||||
<img id="img-mana">
|
||||
<p class='statusLabel statusText' id='mana'></p>
|
||||
</div>
|
||||
<div class="status">
|
||||
<img id="img-atk">
|
||||
<p class='statusLabel statusText' id='atk'></p>
|
||||
@ -86,6 +90,10 @@
|
||||
<img id="img-up">
|
||||
<p class='statusLabel statusText' id='up'></p>
|
||||
</div>
|
||||
<div class="status" id="skillCol">
|
||||
<img id="img-skill">
|
||||
<p class='statusLabel statusText' id='skill' style='font-style: normal'></p>
|
||||
</div>
|
||||
<div class="status" id='keyCol'>
|
||||
<span class='statusLabel' id='yellowKey' style="color:#FFCCAA"></span>
|
||||
<span class='statusLabel' id='blueKey' style="color:#AAAADD"></span>
|
||||
|
||||
367
libs/actions.js
367
libs/actions.js
@ -8,7 +8,7 @@ function actions() {
|
||||
}
|
||||
|
||||
actions.prototype.init = function () {
|
||||
|
||||
this.actionsdata = functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a.actions;
|
||||
}
|
||||
|
||||
////// 按下某个键时 //////
|
||||
@ -282,152 +282,16 @@ actions.prototype.keyUp = function(keyCode, altKey) {
|
||||
this.keyUpCenterFly(keyCode);
|
||||
return;
|
||||
}
|
||||
if (core.status.event.id=='paint') {
|
||||
this.keyUpPaint(keyCode);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
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 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<list.length;i++) {
|
||||
var itemId = list[i];
|
||||
if (core.canUseItem(itemId)) {
|
||||
core.useItem(itemId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 118: // F7开启debug模式
|
||||
if (core.status.heroStop)
|
||||
core.debug();
|
||||
break;
|
||||
|
||||
}
|
||||
this.actionsdata.onKeyUp(keyCode, altKey);
|
||||
|
||||
if (core.isset(core.status.automaticRoute)&&core.status.automaticRoute.autoHeroMove) {
|
||||
core.stopAutomaticRoute();
|
||||
@ -438,9 +302,18 @@ actions.prototype.keyUp = function(keyCode, altKey) {
|
||||
}
|
||||
|
||||
////// 点击(触摸)事件按下时 //////
|
||||
actions.prototype.ondown = function (x ,y) {
|
||||
actions.prototype.ondown = function (loc) {
|
||||
if (core.isset(core.status.replay)&&core.status.replay.replaying
|
||||
&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0&&core.status.event.id!='viewMaps') return;
|
||||
|
||||
// 画板
|
||||
if (core.status.played && (core.status.event||{}).id=='paint') {
|
||||
this.ondownPaint(loc.x, loc.y);
|
||||
return;
|
||||
}
|
||||
|
||||
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
|
||||
|
||||
if (!core.status.played || core.status.lockControl) {
|
||||
this.onclick(x, y, []);
|
||||
if (core.timeout.onDownTimeout==null) {
|
||||
@ -467,11 +340,18 @@ actions.prototype.ondown = function (x ,y) {
|
||||
}
|
||||
|
||||
////// 当在触摸屏上滑动时 //////
|
||||
actions.prototype.onmove = function (x ,y) {
|
||||
actions.prototype.onmove = function (loc) {
|
||||
if (core.isset(core.status.replay)&&core.status.replay.replaying
|
||||
&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0&&core.status.event.id!='viewMaps') return;
|
||||
// if (core.status.holdingPath==0){return;}
|
||||
//core.status.mouseOutCheck =1;
|
||||
|
||||
// 画板
|
||||
if (core.status.played && (core.status.event||{}).id=='paint') {
|
||||
this.onmovePaint(loc.x, loc.y)
|
||||
return;
|
||||
}
|
||||
|
||||
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
|
||||
|
||||
var pos={'x':x,'y':y};
|
||||
var pos0=core.status.stepPostfix[core.status.stepPostfix.length-1];
|
||||
var directionDistance=[pos.y-pos0.y,pos0.x-pos.x,pos0.y-pos.y,pos.x-pos0.x];
|
||||
@ -492,10 +372,18 @@ actions.prototype.onmove = function (x ,y) {
|
||||
}
|
||||
|
||||
////// 当点击(触摸)事件放开时 //////
|
||||
actions.prototype.onup = function () {
|
||||
actions.prototype.onup = function (loc) {
|
||||
if (core.isset(core.status.replay)&&core.status.replay.replaying
|
||||
&&core.status.event.id!='save'&&(core.status.event.id||"").indexOf('book')!=0&&core.status.event.id!='viewMaps') return;
|
||||
|
||||
// 画板
|
||||
if (core.status.played && (core.status.event||{}).id=='paint') {
|
||||
this.onupPaint(loc.x, loc.y)
|
||||
return;
|
||||
}
|
||||
|
||||
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
|
||||
|
||||
clearTimeout(core.timeout.onDownTimeout);
|
||||
core.timeout.onDownTimeout = null;
|
||||
clearInterval(core.interval.onDownInterval);
|
||||
@ -1109,10 +997,17 @@ actions.prototype.keyUpViewMaps = function (keycode) {
|
||||
core.clearMap('data');
|
||||
core.setOpacity('data', 1);
|
||||
core.ui.closePanel();
|
||||
return;
|
||||
}
|
||||
if (keycode==86) {
|
||||
core.status.event.data.damage = !core.status.event.data.damage;
|
||||
core.ui.drawMaps(core.status.event.data.index, core.status.event.data.x, core.status.event.data.y);
|
||||
core.ui.drawMaps(core.status.event.data);
|
||||
return;
|
||||
}
|
||||
if (keycode==77) {
|
||||
core.status.event.data.paint = !core.status.event.data.paint;
|
||||
core.ui.drawMaps(core.status.event.data);
|
||||
return;
|
||||
}
|
||||
if (keycode==88 || (core.status.replay.replaying && keycode==67)) {
|
||||
if (core.isset(core.status.replay)&&core.status.replay.replaying) {
|
||||
@ -1120,6 +1015,7 @@ actions.prototype.keyUpViewMaps = function (keycode) {
|
||||
} else {
|
||||
core.openBook(false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -1160,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);
|
||||
}
|
||||
// 离开
|
||||
@ -1927,10 +1825,13 @@ actions.prototype.clickSettings = function (x,y) {
|
||||
core.ui.drawMaps();
|
||||
break;
|
||||
case 3:
|
||||
core.ui.drawPaint();
|
||||
break;
|
||||
case 4:
|
||||
core.status.event.selection=0;
|
||||
core.ui.drawSyncSave();
|
||||
break;
|
||||
case 4:
|
||||
case 5:
|
||||
core.status.event.selection=1;
|
||||
core.ui.drawConfirmBox("你确定要返回标题页面吗?", function () {
|
||||
core.ui.closePanel();
|
||||
@ -1940,65 +1841,16 @@ actions.prototype.clickSettings = function (x,y) {
|
||||
core.ui.drawSettings();
|
||||
});
|
||||
break;
|
||||
case 5:
|
||||
core.ui.drawStatistics();
|
||||
/*
|
||||
core.ui.drawWaiting("正在拉取统计信息,请稍后...");
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('type', 'statistics');
|
||||
formData.append('name', core.firstData.name);
|
||||
formData.append('version', core.firstData.version);
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("POST", "/games/upload.php");
|
||||
|
||||
xhr.onload = function(e) {
|
||||
if (xhr.status==200) {
|
||||
var response = JSON.parse(xhr.response);
|
||||
if (response.code<0) {
|
||||
core.drawText("出错啦!\n无法拉取统计信息。\n错误原因:"+response.msg);
|
||||
}
|
||||
else {
|
||||
var text="\t[本塔统计信息]";
|
||||
var toAdd=false;
|
||||
response.data.forEach(function (t) {
|
||||
if (toAdd) text+="\n\n";
|
||||
toAdd=true;
|
||||
if (t.hard!='') text+=t.hard+"难度: "
|
||||
text+="已有"+t.people+"人次游戏,"+t.score+"人次通关。";
|
||||
t.info.forEach(function(ending) {
|
||||
if (ending.ending!='') {
|
||||
text+="\n"+ending.ending+": 已有"+ending.score+"人次通关。";
|
||||
}
|
||||
if (core.isset(ending.max) && ending.max>0) {
|
||||
text+="\n当前MAX为"+ending.max+",最早由 "+(ending.username||"匿名")+" 于"+core.formatDate(new Date(1000*ending.timestamp))+"打出。";
|
||||
}
|
||||
})
|
||||
})
|
||||
core.drawText(text);
|
||||
}
|
||||
}
|
||||
else {
|
||||
core.drawText("出错啦!\n无法拉取统计信息。\n错误原因:HTTP "+xhr.status);
|
||||
}
|
||||
};
|
||||
xhr.ontimeout = function() {
|
||||
core.drawText("出错啦!\n无法拉取统计信息。\n错误原因:Timeout");
|
||||
}
|
||||
xhr.onerror = function() {
|
||||
core.drawText("出错啦!\n无法拉取统计信息。\n错误原因:XHR Error");
|
||||
}
|
||||
xhr.send(formData);
|
||||
*/
|
||||
break;
|
||||
case 6:
|
||||
core.ui.drawHelp();
|
||||
core.ui.drawStatistics();
|
||||
break;
|
||||
case 7:
|
||||
core.ui.drawAbout();
|
||||
core.ui.drawHelp();
|
||||
break;
|
||||
case 8:
|
||||
core.ui.drawAbout();
|
||||
break;
|
||||
case 9:
|
||||
core.ui.closePanel();
|
||||
break;
|
||||
}
|
||||
@ -2548,3 +2400,114 @@ actions.prototype.clickAbout = function () {
|
||||
else
|
||||
core.restart();
|
||||
}
|
||||
|
||||
|
||||
////// 绘图相关 //////
|
||||
|
||||
actions.prototype.ondownPaint = function (x, y) {
|
||||
x+=core.bigmap.offsetX;
|
||||
y+=core.bigmap.offsetY;
|
||||
if (!core.status.event.data.erase) {
|
||||
core.canvas.route.beginPath();
|
||||
core.canvas.route.moveTo(x, y);
|
||||
}
|
||||
core.status.event.data.x = x;
|
||||
core.status.event.data.y = y;
|
||||
}
|
||||
|
||||
actions.prototype.onmovePaint = function (x, y) {
|
||||
if (core.status.event.data.x==null) return;
|
||||
x+=core.bigmap.offsetX;
|
||||
y+=core.bigmap.offsetY;
|
||||
if (core.status.event.data.erase) {
|
||||
core.clearMap('route', x-10, y-10, 20, 20);
|
||||
return;
|
||||
}
|
||||
var midx = (core.status.event.data.x+x)/2, midy = (core.status.event.data.y+y)/2;
|
||||
core.canvas.route.quadraticCurveTo(midx, midy, x, y);
|
||||
core.canvas.route.stroke();
|
||||
core.status.event.data.x = x;
|
||||
core.status.event.data.y = y;
|
||||
}
|
||||
|
||||
actions.prototype.onupPaint = function (x,y) {
|
||||
x+=core.bigmap.offsetX;
|
||||
y+=core.bigmap.offsetY;
|
||||
if (core.status.event.data.erase) {
|
||||
core.clearMap('route', x-5, y-5, 10, 10);
|
||||
}
|
||||
else if (core.status.event.data.x!=null) {
|
||||
var midx = (core.status.event.data.x+x)/2, midy = (core.status.event.data.y+y)/2;
|
||||
core.canvas.route.quadraticCurveTo(midx, midy, x, y);
|
||||
core.canvas.route.stroke();
|
||||
}
|
||||
|
||||
core.status.event.data.x = null;
|
||||
core.status.event.data.y = null;
|
||||
// 保存
|
||||
core.paint[core.status.floorId] = LZString.compress(core.utils.encodeCanvas(core.canvas.route).join(","));
|
||||
}
|
||||
|
||||
actions.prototype.setPaintMode = function (mode) {
|
||||
if (mode == 'paint') core.status.event.data.erase = false;
|
||||
else if (mode == 'erase') core.status.event.data.erase = true;
|
||||
else return;
|
||||
|
||||
core.drawTip("进入"+(core.status.event.data.erase?"擦除":"绘图")+"模式");
|
||||
}
|
||||
|
||||
actions.prototype.savePaint = function () {
|
||||
var data = {};
|
||||
for (var floorId in core.paint) {
|
||||
if (core.isset(core.paint[floorId]))
|
||||
data[floorId] = LZString.decompress(core.paint[floorId]);
|
||||
}
|
||||
core.download(core.firstData.name+".h5paint", JSON.stringify({
|
||||
'name': core.firstData.name,
|
||||
'paint': data
|
||||
}));
|
||||
}
|
||||
|
||||
actions.prototype.loadPaint = function () {
|
||||
core.readFile(function (obj) {
|
||||
if (obj.name!=core.firstData.name) {
|
||||
alert("绘图文件和游戏不一致!");
|
||||
return;
|
||||
}
|
||||
if (!core.isset(obj.paint)) {
|
||||
alert("无效的绘图文件!");
|
||||
return;
|
||||
}
|
||||
core.paint = {};
|
||||
for (var floorId in obj.paint) {
|
||||
if (core.isset(obj.paint[floorId]))
|
||||
core.paint[floorId] = LZString.compress(obj.paint[floorId]);
|
||||
}
|
||||
|
||||
core.clearMap('route');
|
||||
var value = core.paint[core.status.floorId];
|
||||
if (core.isset(value)) value = LZString.decompress(value).split(",");
|
||||
core.utils.decodeCanvas(value, 32*core.bigmap.width, 32*core.bigmap.height);
|
||||
core.canvas.route.drawImage(core.bigmap.tempCanvas.canvas, 0, 0);
|
||||
|
||||
core.drawTip("读取绘图文件成功");
|
||||
})
|
||||
}
|
||||
|
||||
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("退出绘图模式");
|
||||
}
|
||||
|
||||
actions.prototype.keyUpPaint = function (keycode) {
|
||||
if (keycode==27 || keycode==88 || keycode==77 || keycode==13 || keycode==32 || keycode==67) {
|
||||
this.exitPaint();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
////// 绘图相关 END //////
|
||||
|
||||
@ -2807,6 +2807,8 @@ control.prototype.resize = function(clientWidth, clientHeight) {
|
||||
if (!core.flags.enableKeys) count--;
|
||||
if (!core.flags.enablePZF) count--;
|
||||
if (!core.flags.enableName) count--;
|
||||
if (!core.flags.enableMana) count--;
|
||||
if (!core.flags.enableSkill) count--;
|
||||
|
||||
var statusLineHeight = BASE_LINEHEIGHT * 9 / count;
|
||||
var statusLineFontSize = DEFAULT_FONT_SIZE;
|
||||
@ -3086,6 +3088,12 @@ control.prototype.resize = function(clientWidth, clientHeight) {
|
||||
display: core.flags.enableHPMax ? 'block': 'none'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'manaCol',
|
||||
rules: {
|
||||
display: core.flags.enableMana ? 'block': 'none'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'mdefCol',
|
||||
rules: {
|
||||
@ -3110,6 +3118,12 @@ control.prototype.resize = function(clientWidth, clientHeight) {
|
||||
display: core.flags.enableLevelUp ? 'block': 'none'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'skillCol',
|
||||
rules: {
|
||||
display: core.flags.enableSkill ? 'block': 'none'
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'keyCol',
|
||||
rules: {
|
||||
|
||||
13
libs/core.js
13
libs/core.js
@ -81,6 +81,7 @@ function core() {
|
||||
height: 13,
|
||||
tempCanvas: null, // A temp canvas for drawing
|
||||
}
|
||||
this.paint = {}
|
||||
this.initStatus = {
|
||||
'played': false,
|
||||
'gameOver': false,
|
||||
@ -395,18 +396,18 @@ core.prototype.keyUp = function(keyCode, altKey) {
|
||||
}
|
||||
|
||||
////// 点击(触摸)事件按下时 //////
|
||||
core.prototype.ondown = function (x ,y) {
|
||||
return core.actions.ondown(x,y);
|
||||
core.prototype.ondown = function (loc) {
|
||||
return core.actions.ondown(loc);
|
||||
}
|
||||
|
||||
////// 当在触摸屏上滑动时 //////
|
||||
core.prototype.onmove = function (x ,y) {
|
||||
return core.actions.onmove(x,y);
|
||||
core.prototype.onmove = function (loc) {
|
||||
return core.actions.onmove(loc);
|
||||
}
|
||||
|
||||
////// 当点击(触摸)事件放开时 //////
|
||||
core.prototype.onup = function () {
|
||||
return core.actions.onup();
|
||||
core.prototype.onup = function (loc) {
|
||||
return core.actions.onup(loc);
|
||||
}
|
||||
|
||||
////// 获得点击事件相对左上角的坐标(0到12之间) //////
|
||||
|
||||
@ -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("该商店尚未开启");
|
||||
|
||||
88
libs/ui.js
88
libs/ui.js
@ -836,7 +836,7 @@ ui.prototype.drawSettings = function () {
|
||||
core.status.event.id = 'settings';
|
||||
|
||||
this.drawChoices(null, [
|
||||
"系统设置", "快捷商店", "浏览地图", "同步存档", "返回标题", "数据统计", "操作帮助", "关于本塔", "返回游戏"
|
||||
"系统设置", "快捷商店", "浏览地图", "打开画板", "同步存档", "返回标题", "数据统计", "操作帮助", "关于本塔", "返回游戏"
|
||||
]);
|
||||
}
|
||||
|
||||
@ -1645,6 +1645,10 @@ ui.prototype.drawMaps = function (index, x, y) {
|
||||
core.clearMap('animate');
|
||||
core.setOpacity('animate', 1);
|
||||
|
||||
var damage = (core.status.event.data||{}).damage, paint = (core.status.event.data||{}).paint;
|
||||
if (core.isset(index.damage)) damage=index.damage;
|
||||
if (core.isset(index.paint)) paint=index.paint;
|
||||
|
||||
if (core.isset(index.index)) {
|
||||
x=index.x;
|
||||
y=index.y;
|
||||
@ -1661,19 +1665,27 @@ ui.prototype.drawMaps = function (index, x, y) {
|
||||
if (y<6) y=6;
|
||||
if (y>mh-7) y=mh-7;
|
||||
|
||||
core.status.event.data = {"index": index, "x": x, "y": y, "damage": (core.status.event.data||{"damage":false}).damage};
|
||||
core.status.event.data = {"index": index, "x": x, "y": y, "damage": damage, "paint": paint};
|
||||
|
||||
clearTimeout(core.interval.tipAnimate);
|
||||
core.clearMap('ui');
|
||||
core.setAlpha('ui', 1);
|
||||
this.drawThumbnail(floorId, 'ui', core.status.maps[floorId].blocks, 0, 0, 416, x, y);
|
||||
|
||||
// 绘图
|
||||
if (core.status.event.data.paint) {
|
||||
var offsetX = core.clamp(x-6, 0, mw-13), offsetY = core.clamp(y-6, 0, mh-13);
|
||||
var value = core.paint[floorId];
|
||||
if (core.isset(value)) value = LZString.decompress(value).split(",");
|
||||
core.utils.decodeCanvas(value, 32*mw, 32*mh);
|
||||
core.canvas.ui.drawImage(core.bigmap.tempCanvas.canvas, offsetX*32, offsetY*32, 416, 416, 0, 0, 416, 416);
|
||||
}
|
||||
|
||||
core.clearMap('data');
|
||||
core.setOpacity('data', 0.2);
|
||||
core.canvas.data.textAlign = 'left';
|
||||
core.setFont('data', '16px Arial');
|
||||
|
||||
|
||||
var text = core.status.maps[floorId].title;
|
||||
if (mw>13 || mh>13) text+=" ["+(x-6)+","+(y-6)+"]";
|
||||
var textX = 16, textY = 18, width = textX + core.canvas.data.measureText(text).width + 16, height = 42;
|
||||
@ -2417,28 +2429,64 @@ ui.prototype.drawAbout = function () {
|
||||
return this.uidata.drawAbout();
|
||||
}
|
||||
|
||||
////// 绘制“画图”界面 //////
|
||||
ui.prototype.drawPaint = function () {
|
||||
|
||||
core.drawText(
|
||||
"\t[进入绘图模式]你可以在此页面上任意进行绘图和标记操作。\nM键可以进入或退出此模式。\n\n"+
|
||||
"绘图的内容会自动保存,且以页面为生命周期,和存读档无关,重新开始游戏或读档后绘制的内容仍有效,但刷新页面就会消失。\n"+
|
||||
"你可以将绘制内容保存到文件,也可以从文件读取保存的绘制内容。\n"+
|
||||
"浏览地图页面可以按楼传按钮或M键来开启/关闭该层的绘图显示。\n\n更多功能请详见文档-元件-绘图模式。",
|
||||
function () {
|
||||
core.drawTip("打开绘图模式,现在可以任意在界面上绘图标记");
|
||||
|
||||
core.lockControl();
|
||||
core.status.event.id = 'paint';
|
||||
core.status.event.data = {"x": null, "y": null, "erase": false};
|
||||
|
||||
core.clearMap('ui');
|
||||
core.clearMap('route');
|
||||
|
||||
core.setAlpha('route', 1);
|
||||
core.setOpacity('route', 1);
|
||||
|
||||
// 将已有的内容绘制到route上
|
||||
var value = core.paint[core.status.floorId];
|
||||
if (core.isset(value)) value = LZString.decompress(value).split(",");
|
||||
core.utils.decodeCanvas(value, 32*core.bigmap.width, 32*core.bigmap.height);
|
||||
core.canvas.route.drawImage(core.bigmap.tempCanvas.canvas, 0, 0);
|
||||
|
||||
core.setLineWidth('route', 3);
|
||||
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.settings.src = core.statusBar.icons.exit.src;
|
||||
core.statusBar.image.book.style.opacity = 1;
|
||||
core.statusBar.image.fly.style.opacity = 1;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
////// 绘制帮助页面 //////
|
||||
ui.prototype.drawHelp = function () {
|
||||
core.drawText([
|
||||
"\t[键盘快捷键列表]"+
|
||||
"[CTRL] 跳过对话\n" +
|
||||
"[Z] 转向\n" +
|
||||
"[X] 打开/关闭怪物手册\n" +
|
||||
"[G] 打开/关闭楼层传送器\n" +
|
||||
"[A] 读取自动存档(回退)\n" +
|
||||
"[CTRL] 跳过对话 [Z] 转向\n" +
|
||||
"[X] 怪物手册 [G] 楼层传送\n" +
|
||||
"[A] 读取自动存档 [S/D] 存读档页面\n" +
|
||||
"[S/D] 打开/关闭存/读档页面\n" +
|
||||
"[K/V] 打开/关闭快捷商店选择列表\n" +
|
||||
"[T] 打开/关闭工具栏\n" +
|
||||
"[ESC] 打开/关闭系统菜单\n" +
|
||||
"[B] 打开数据统计\n" +
|
||||
// "[E] 显示光标\n" +
|
||||
"[H] 打开帮助页面\n"+
|
||||
"[R] 回放\n"+
|
||||
"[SPACE] 轻按(仅在轻按开关打开时有效)\n" +
|
||||
"[K/V] 快捷商店 [ESC] 系统菜单\n" +
|
||||
"[T] 道具页面 [Q] 装备页面\n" +
|
||||
"[B] 数据统计 [H] 帮助页面\n" +
|
||||
"[R] 回放录像 [E] 显示光标\n" +
|
||||
"[SPACE] 轻按 [M] 绘图模式\n" +
|
||||
"[PgUp/PgDn] 浏览地图\n"+
|
||||
"[1] 快捷使用破墙镐\n" +
|
||||
"[2] 快捷使用炸弹/圣锤\n" +
|
||||
"[3] 快捷使用中心对称飞行器",
|
||||
"[1~4] 快捷使用破炸飞和其他道具\n"+
|
||||
"[Alt+0~9] 快捷换装",
|
||||
"\t[鼠标操作]"+
|
||||
"点状态栏中图标: 进行对应的操作\n"+
|
||||
"点任意块: 寻路并移动\n"+
|
||||
@ -2446,7 +2494,7 @@ ui.prototype.drawHelp = function () {
|
||||
"双击空地: 瞬间移动\n"+
|
||||
"单击勇士: 转向\n"+
|
||||
"双击勇士: 轻按(仅在轻按开关打开时有效)\n"+
|
||||
"长按任意位置:跳过剧情对话或打开虚拟键盘\n"
|
||||
"长按任意位置:跳过剧情对话或打开虚拟键盘"
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -253,14 +253,14 @@ utils.prototype.cropImage = function (image, size) {
|
||||
////// 格式化时间为字符串 //////
|
||||
utils.prototype.formatDate = function(date) {
|
||||
if (!core.isset(date)) return "";
|
||||
return date.getFullYear()+"-"+core.setTwoDigits(date.getMonth()+1)+"-"+core.setTwoDigits(date.getDate())+" "
|
||||
return ""+date.getFullYear()+"-"+core.setTwoDigits(date.getMonth()+1)+"-"+core.setTwoDigits(date.getDate())+" "
|
||||
+core.setTwoDigits(date.getHours())+":"+core.setTwoDigits(date.getMinutes())+":"+core.setTwoDigits(date.getSeconds());
|
||||
}
|
||||
|
||||
////// 格式化时间为最简字符串 //////
|
||||
utils.prototype.formatDate2 = function (date) {
|
||||
if (!core.isset(date)) return "";
|
||||
return date.getFullYear()+core.setTwoDigits(date.getMonth()+1)+core.setTwoDigits(date.getDate())
|
||||
return ""+date.getFullYear()+core.setTwoDigits(date.getMonth()+1)+core.setTwoDigits(date.getDate())
|
||||
+core.setTwoDigits(date.getHours())+core.setTwoDigits(date.getMinutes())+core.setTwoDigits(date.getSeconds());
|
||||
}
|
||||
|
||||
@ -460,6 +460,26 @@ utils.prototype.decodeBase64 = function (str) {
|
||||
}).join(''));
|
||||
}
|
||||
|
||||
////// 任意进制转换 //////
|
||||
utils.prototype.convertBase = function (str, fromBase, toBase) {
|
||||
var map = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_-+={}[]\\|:;<>,.?/";
|
||||
if (fromBase==toBase) return str;
|
||||
var len = str.length, ans="";
|
||||
var t = [];
|
||||
for (var i=0;i<len;i++) t[i]=map.indexOf(str.charAt(i));
|
||||
t[len]=0;
|
||||
while (len>0) {
|
||||
for (var i=len; i>=1; i--) {
|
||||
t[i-1]+=t[i]%toBase*fromBase;
|
||||
t[i]=parseInt(t[i]/toBase);
|
||||
}
|
||||
ans+=map.charAt(t[0]%toBase);
|
||||
t[0]=parseInt(t[0]/toBase);
|
||||
while (len>0 && t[len-1]==0) len--;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
utils.prototype.__init_seed = function () {
|
||||
var rand = new Date().getTime()%34834795 + 3534;
|
||||
rand = this.__next_rand(rand);
|
||||
@ -726,6 +746,58 @@ utils.prototype.hide = function (obj, speed, callback) {
|
||||
}, speed);
|
||||
}
|
||||
|
||||
utils.prototype.encodeCanvas = function (ctx) {
|
||||
var list = [];
|
||||
var width = ctx.canvas.width, height = ctx.canvas.height;
|
||||
ctx.mozImageSmoothingEnabled = false;
|
||||
ctx.webkitImageSmoothingEnabled = false;
|
||||
ctx.msImageSmoothingEnabled = false;
|
||||
ctx.imageSmoothingEnabled = false;
|
||||
|
||||
var imgData = ctx.getImageData(0, 0, width, height);
|
||||
for (var i=0;i<imgData.data.length;i+=4) {
|
||||
list.push(Math.sign(imgData.data[i+3]));
|
||||
}
|
||||
// compress 01 to array
|
||||
var prev = 0, cnt = 0, arr = [];
|
||||
for (var i=0;i<list.length;i++) {
|
||||
if (list[i]!=prev) {
|
||||
arr.push(cnt);
|
||||
prev=list[i];
|
||||
cnt=0;
|
||||
}
|
||||
cnt++;
|
||||
}
|
||||
arr.push(cnt);
|
||||
return arr;
|
||||
}
|
||||
|
||||
////// 解析arr数组,并绘制到tempCanvas上 //////
|
||||
utils.prototype.decodeCanvas = function (arr, width, height) {
|
||||
if (!core.isset(arr)) return null;
|
||||
// to byte array
|
||||
var curr = 0, list = [];
|
||||
arr.forEach(function (x) {
|
||||
for (var i=0;i<x;i++) list.push(curr);
|
||||
curr = 1-curr;
|
||||
})
|
||||
// 使用tempCanvas
|
||||
var tempCanvas = core.bigmap.tempCanvas;
|
||||
tempCanvas.canvas.width=width;
|
||||
tempCanvas.canvas.height=height;
|
||||
tempCanvas.clearRect(0, 0, width, height);
|
||||
|
||||
var imgData = tempCanvas.getImageData(0, 0, width, height);
|
||||
for (var i=0;i<imgData.data.length;i+=4) {
|
||||
var index = i/4;
|
||||
if (list[index]) {
|
||||
imgData.data[i]=255;
|
||||
imgData.data[i+3]=255;
|
||||
}
|
||||
}
|
||||
tempCanvas.putImageData(imgData, 0, 0);
|
||||
}
|
||||
|
||||
utils.prototype.consoleOpened = function () {
|
||||
var threshold = 160;
|
||||
var widthThreshold = window.outerWidth - window.innerWidth > threshold;
|
||||
|
||||
72
main.js
72
main.js
@ -55,6 +55,7 @@ function main() {
|
||||
'nameCol': document.getElementById('nameCol'),
|
||||
'lvCol': document.getElementById('lvCol'),
|
||||
'hpmaxCol': document.getElementById('hpmaxCol'),
|
||||
'manaCol': document.getElementById('manaCol'),
|
||||
'mdefCol': document.getElementById('mdefCol'),
|
||||
'moneyCol': document.getElementById('moneyCol'),
|
||||
'expCol': document.getElementById('expCol'),
|
||||
@ -62,6 +63,7 @@ function main() {
|
||||
'keyCol': document.getElementById('keyCol'),
|
||||
'pzfCol': document.getElementById('pzfCol'),
|
||||
'debuffCol': document.getElementById('debuffCol'),
|
||||
'skillCol': document.getElementById('skillCol'),
|
||||
'hard': document.getElementById('hard'),
|
||||
};
|
||||
this.mode = 'play';
|
||||
@ -82,12 +84,14 @@ function main() {
|
||||
'lv': document.getElementById('img-lv'),
|
||||
'hpmax': document.getElementById('img-hpmax'),
|
||||
'hp': document.getElementById("img-hp"),
|
||||
'mana': document.getElementById("img-mana"),
|
||||
'atk': document.getElementById("img-atk"),
|
||||
'def': document.getElementById("img-def"),
|
||||
'mdef': document.getElementById("img-mdef"),
|
||||
'money': document.getElementById("img-money"),
|
||||
'experience': document.getElementById("img-experience"),
|
||||
'up': document.getElementById("img-up"),
|
||||
'skill': document.getElementById('img-skill'),
|
||||
'book': document.getElementById("img-book"),
|
||||
'fly': document.getElementById("img-fly"),
|
||||
'toolbox': document.getElementById("img-toolbox"),
|
||||
@ -122,18 +126,25 @@ function main() {
|
||||
'speedUp': 21,
|
||||
'rewind': 22,
|
||||
'equipbox': 23,
|
||||
'mana': 24,
|
||||
'skill': 25,
|
||||
'paint': 26,
|
||||
'erase': 27,
|
||||
'exit': 28,
|
||||
},
|
||||
'floor': document.getElementById('floor'),
|
||||
'name': document.getElementById('name'),
|
||||
'lv': document.getElementById('lv'),
|
||||
'hpmax': document.getElementById('hpmax'),
|
||||
'hp': document.getElementById('hp'),
|
||||
'mana': document.getElementById('mana'),
|
||||
'atk': document.getElementById('atk'),
|
||||
'def': document.getElementById("def"),
|
||||
'mdef': document.getElementById('mdef'),
|
||||
'money': document.getElementById("money"),
|
||||
'experience': document.getElementById("experience"),
|
||||
'up': document.getElementById('up'),
|
||||
'skill': document.getElementById('skill'),
|
||||
'yellowKey': document.getElementById("yellowKey"),
|
||||
'blueKey': document.getElementById("blueKey"),
|
||||
'redKey': document.getElementById("redKey"),
|
||||
@ -317,8 +328,7 @@ main.dom.data.onmousedown = function (e) {
|
||||
}
|
||||
var loc = main.core.getClickLoc(e.clientX, e.clientY);
|
||||
if (loc == null) return;
|
||||
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
|
||||
main.core.ondown(x, y);
|
||||
main.core.ondown(loc);
|
||||
} catch (ee) {}
|
||||
}
|
||||
|
||||
@ -328,15 +338,17 @@ main.dom.data.onmousemove = function (e) {
|
||||
e.stopPropagation();
|
||||
var loc = main.core.getClickLoc(e.clientX, e.clientY);
|
||||
if (loc == null) return;
|
||||
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
|
||||
main.core.onmove(x, y);
|
||||
main.core.onmove(loc);
|
||||
}catch (ee) {}
|
||||
}
|
||||
|
||||
////// 鼠标放开时 //////
|
||||
main.dom.data.onmouseup = function () {
|
||||
main.dom.data.onmouseup = function (e) {
|
||||
try {
|
||||
main.core.onup();
|
||||
e.stopPropagation();
|
||||
var loc = main.core.getClickLoc(e.clientX, e.clientY);
|
||||
if (loc == null) return;
|
||||
main.core.onup(loc);
|
||||
}catch (e) {}
|
||||
}
|
||||
|
||||
@ -356,9 +368,7 @@ main.dom.data.ontouchstart = function (e) {
|
||||
e.preventDefault();
|
||||
var loc = main.core.getClickLoc(e.targetTouches[0].clientX, e.targetTouches[0].clientY);
|
||||
if (loc == null) return;
|
||||
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
|
||||
//main.core.onclick(x, y, []);
|
||||
main.core.ondown(x, y);
|
||||
main.core.ondown(loc);
|
||||
}catch (ee) {}
|
||||
}
|
||||
|
||||
@ -368,15 +378,17 @@ main.dom.data.ontouchmove = function (e) {
|
||||
e.preventDefault();
|
||||
var loc = main.core.getClickLoc(e.targetTouches[0].clientX, e.targetTouches[0].clientY);
|
||||
if (loc == null) return;
|
||||
var x = parseInt(loc.x / loc.size), y = parseInt(loc.y / loc.size);
|
||||
main.core.onmove(x, y);
|
||||
main.core.onmove(loc);
|
||||
}catch (ee) {}
|
||||
}
|
||||
|
||||
////// 手指离开触摸屏时 //////
|
||||
main.dom.data.ontouchend = function () {
|
||||
try {
|
||||
main.core.onup();
|
||||
e.preventDefault();
|
||||
var loc = main.core.getClickLoc(e.targetTouches[0].clientX, e.targetTouches[0].clientY);
|
||||
if (loc == null) return;
|
||||
main.core.onup(loc);
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
@ -388,6 +400,11 @@ main.statusBar.image.book.onclick = function () {
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying() && (core.status.event||{}).id=='paint') {
|
||||
core.actions.setPaintMode('paint');
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying())
|
||||
main.core.openBook(true);
|
||||
}
|
||||
@ -395,11 +412,27 @@ main.statusBar.image.book.onclick = function () {
|
||||
////// 点击状态栏中的楼层传送器/装备栏时 //////
|
||||
main.statusBar.image.fly.onclick = function () {
|
||||
|
||||
// 播放录像时
|
||||
if (core.isset(core.status.replay) && core.status.replay.replaying) {
|
||||
core.stopReplay();
|
||||
return;
|
||||
}
|
||||
|
||||
// 绘图模式
|
||||
if (main.core.isPlaying() && (core.status.event||{}).id=='paint') {
|
||||
core.actions.setPaintMode('erase');
|
||||
return;
|
||||
}
|
||||
|
||||
// 浏览地图时
|
||||
if (main.core.isPlaying() && (core.status.event||{}).id=='viewMaps') {
|
||||
if (core.isset(core.status.event.data)) {
|
||||
core.status.event.data.paint = !core.status.event.data.paint;
|
||||
core.ui.drawMaps(core.status.event.data);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying()) {
|
||||
if (!main.core.flags.equipboxButton) {
|
||||
main.core.useFly(true);
|
||||
@ -456,6 +489,11 @@ main.statusBar.image.save.onclick = function () {
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying() && (core.status.event||{}).id=='paint') {
|
||||
core.actions.savePaint();
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying())
|
||||
main.core.save(true);
|
||||
}
|
||||
@ -468,6 +506,11 @@ main.statusBar.image.load.onclick = function () {
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying() && (core.status.event||{}).id=='paint') {
|
||||
core.actions.loadPaint();
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying())
|
||||
main.core.load(true);
|
||||
}
|
||||
@ -480,6 +523,11 @@ main.statusBar.image.settings.onclick = function () {
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying() && (core.status.event||{}).id=='paint') {
|
||||
core.actions.exitPaint();
|
||||
return;
|
||||
}
|
||||
|
||||
if (main.core.isPlaying())
|
||||
main.core.openSettings(true);
|
||||
}
|
||||
|
||||
@ -75,10 +75,11 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
||||
"lv": 1,
|
||||
"hpmax": 9999,
|
||||
"hp": 1000,
|
||||
"mana": 0,
|
||||
"atk": 100,
|
||||
"def": 100,
|
||||
"mdef": 100,
|
||||
"money": 100,
|
||||
"mdef": 0,
|
||||
"money": 0,
|
||||
"experience": 0,
|
||||
"equipment": [],
|
||||
"items": {
|
||||
@ -197,6 +198,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
||||
"enableName": false,
|
||||
"enableLv": false,
|
||||
"enableHPMax": false,
|
||||
"enableMana": false,
|
||||
"enableMDef": true,
|
||||
"enableMoney": true,
|
||||
"enableExperience": false,
|
||||
@ -204,6 +206,7 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
||||
"enableKeys": true,
|
||||
"enablePZF": false,
|
||||
"enableDebuff": false,
|
||||
"enableSkill": false,
|
||||
"flyNearStair": true,
|
||||
"pickaxeFourDirections": false,
|
||||
"bombFourDirections": false,
|
||||
|
||||
@ -202,6 +202,19 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
}
|
||||
// 增加仇恨值
|
||||
core.setFlag('hatred', core.getFlag('hatred',0)+core.values.hatred);
|
||||
|
||||
// 战后的技能处理,比如扣除魔力值
|
||||
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', '无');
|
||||
}
|
||||
|
||||
core.updateStatusBar();
|
||||
|
||||
|
||||
@ -477,6 +490,11 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
var enemyInfo = core.enemys.getEnemyInfo(enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId);
|
||||
var mon_hp = enemyInfo.hp, mon_atk = enemyInfo.atk, mon_def = enemyInfo.def, mon_special = enemyInfo.special;
|
||||
|
||||
// 技能的处理
|
||||
if (core.getFlag('skill', 0)==1) { // 开启了技能1:二倍斩
|
||||
hero_atk *= 2; // 计算时攻击力翻倍
|
||||
}
|
||||
|
||||
// 如果是无敌属性,且勇士未持有十字架
|
||||
if (this.hasSpecial(mon_special, 20) && !core.hasItem("cross"))
|
||||
return null; // 不可战斗
|
||||
@ -563,6 +581,153 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
}
|
||||
*/
|
||||
// 别忘了在事件中调用“更新怪物数据”事件!
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"onKeyUp": function (keyCode, altKey) {
|
||||
// 键盘按键处理,可以在这里自定义快捷键列表
|
||||
// keyCode:当前按键的keyCode(每个键的keyCode自行百度)
|
||||
// altKey:Alt键是否被按下,为true代表同时按下了Alt键
|
||||
// 可以在这里任意增加或编辑每个按键的行为
|
||||
|
||||
// 如果处于正在行走状态,则不处理
|
||||
if (!core.status.heroStop)
|
||||
return;
|
||||
|
||||
// Alt+0~9,快捷换上套装
|
||||
if (altKey && keyCode>=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<list.length;i++) {
|
||||
var itemId = list[i];
|
||||
if (core.canUseItem(itemId)) {
|
||||
core.useItem(itemId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 118: // F7:开启debug模式
|
||||
core.debug();
|
||||
break;
|
||||
case 87: // W:开启技能“二倍斩”
|
||||
// 检测是否拥有“二倍斩”这个技能道具
|
||||
if (core.hasItem('skill1')) {
|
||||
core.useItem('skill1');
|
||||
}
|
||||
break;
|
||||
// 在这里可以任意新增或编辑已有的快捷键内容
|
||||
/*
|
||||
case 0: // 使用该按键的keyCode
|
||||
// 还可以再判定altKey是否被按下,即 if (altKey) { ...
|
||||
|
||||
// ... 在这里写你要执行脚本
|
||||
// **强烈建议所有新增的自定义快捷键均能给个对应的道具可点击,以方便手机端的行为**
|
||||
if (core.hasItem('...')) {
|
||||
core.useItem('...');
|
||||
}
|
||||
|
||||
break;
|
||||
*/
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
"control": {
|
||||
@ -617,7 +782,7 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
else core.statusBar.lv.style.fontStyle = 'normal';
|
||||
|
||||
// 设置生命上限、生命值、攻防魔防金币和经验值
|
||||
var statusList = ['hpmax', 'hp', 'atk', 'def', 'mdef', 'money', 'experience'];
|
||||
var statusList = ['hpmax', 'hp', 'mana', 'atk', 'def', 'mdef', 'money', 'experience'];
|
||||
statusList.forEach(function (item) {
|
||||
// 向下取整
|
||||
if (core.isset(core.status.hero[item]))
|
||||
@ -633,6 +798,18 @@ functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
core.statusBar.mdef.innerHTML = core.formatBigNumber(Math.floor(core.getFlag('equip_mdef_buff',1)*core.getStatus('mdef')));
|
||||
}
|
||||
|
||||
// 设置魔力值
|
||||
if (core.flags.enableMana) {
|
||||
// 也可以使用flag:manaMax来表示最大魔力值;详见文档-个性化-技能塔的支持
|
||||
// core.status.hero.mana = Math.max(core.status.hero.mana, core.getFlag('manaMax', 10));
|
||||
// core.statusBar.mana.innerHTML = core.status.hero.mana + "/" + core.getFlag('manaMax', 10);
|
||||
}
|
||||
// 设置技能栏
|
||||
if (core.flags.enableSkill) {
|
||||
// 可以用flag:skill表示当前开启的技能类型,flag:skillName显示技能名;详见文档-个性化-技能塔的支持
|
||||
core.statusBar.skill.innerHTML = core.getFlag('skillName', '无');
|
||||
}
|
||||
|
||||
// 可以在这里添加自己额外的状态栏信息,比如想攻击显示 +0.5 可以这么写:
|
||||
// if (core.hasFlag('halfAtk')) core.statusBar.atk.innerHTML += "+0.5";
|
||||
|
||||
|
||||
@ -236,7 +236,8 @@ icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 =
|
||||
'moneyPocket': 46,
|
||||
'shoes': 47,
|
||||
'hammer': 48,
|
||||
'jumpShoes': 49
|
||||
'jumpShoes': 49,
|
||||
'skill1': 30,
|
||||
},
|
||||
'autotile': { // 所有的Autotile列表;后面的index简单取0即可
|
||||
'autotile': 0,
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 22 KiB |
@ -295,6 +295,11 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a =
|
||||
"cls": "tools",
|
||||
"name": "跳跃靴",
|
||||
"text": "能跳跃到前方两格处"
|
||||
},
|
||||
"skill1": {
|
||||
"cls": "constants",
|
||||
"name": "技能:二倍斩",
|
||||
"text": "可以打开或关闭主动技能二倍斩"
|
||||
}
|
||||
},
|
||||
"itemEffect": {
|
||||
@ -373,7 +378,8 @@ items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a =
|
||||
"redJewel": "core.status.hero.atk += core.values.redJewel",
|
||||
"blueJewel": "core.status.hero.def += core.values.blueJewel",
|
||||
"greenJewel": "core.status.hero.mdef += core.values.greenJewel",
|
||||
"yellowJewel": "core.insertAction([\n\t{\"type\": \"choices\", \"choices\": [\n\t\t{\"text\": \"攻击+1\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:atk\", \"value\": \"status:atk+1\"}\n\t\t]},\n\t\t{\"text\": \"防御+2\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:def\", \"value\": \"status:def+2\"}\n\t\t]},\n\t\t{\"text\": \"生命+200\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:hp\", \"value\": \"status:hp+200\"}\n\t\t]},\n\t]}\n]);"
|
||||
"yellowJewel": "core.insertAction([\n\t{\"type\": \"choices\", \"choices\": [\n\t\t{\"text\": \"攻击+1\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:atk\", \"value\": \"status:atk+1\"}\n\t\t]},\n\t\t{\"text\": \"防御+2\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:def\", \"value\": \"status:def+2\"}\n\t\t]},\n\t\t{\"text\": \"生命+200\", \"action\": [\n\t\t\t{\"type\": \"setValue\", \"name\": \"status:hp\", \"value\": \"status:hp+200\"}\n\t\t]},\n\t]}\n]);",
|
||||
"skill1": "// 二倍斩的flag:skill为1\nif (core.getFlag('skill', 0)==0) { // 判断当前是否已经开了技能\n\tif (core.getStatus('mana')>=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"
|
||||
}
|
||||
}
|
||||
@ -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'}, // 技能:二倍斩
|
||||
|
||||
|
||||
////////////////////////// 门、楼梯、传送点部分 //////////////////////////
|
||||
|
||||
Loading…
Reference in New Issue
Block a user