门信息&朝向的图块

This commit is contained in:
ckcz123 2020-05-21 12:32:33 +08:00
parent 57fff1b3e2
commit 237b6a4926
8 changed files with 133 additions and 28 deletions

View File

@ -457,6 +457,75 @@ return code;
*/;
// doorInfo 事件编辑器入口之一
doorInfo_m
: '门信息' '开关门时间' Int '开门音效' EvalString? '关门音效' EvalString? BGNL? Newline '需要钥匙' doorKeyList+ BEND
/* doorInfo_m
tooltip : 开门信息
default : [160, 'door.mp3', 'door.mp3']
helpUrl : https://h5mota.com/games/template/_docs/#/event
EvalString_0 = EvalString_0 && (', "openSound": "' + EvalString_0 + '"');
EvalString_1 = EvalString_1 && (', "closeSound": "' + EvalString_1 + '"');
var code = '{"time": '+Int_0+EvalString_0+EvalString_1+', "keys": {\n'+doorKeyList_0+'\n}}';
return code;
*/;
doorKeyList
: doorKeyKnown
| doorKeyUnknown
| doorKeyEmpty;
doorKeyKnown
: Key_List ':' Int BEND
/* doorKeyKnown
tooltip : 需要钥匙
default : ['yellowKey', 1]
helpUrl : https://h5mota.com/games/template/_docs/#/event
return '"'+Key_List_0+'": '+Int_0+', ';
*/;
doorKeyUnknown
: IdString ':' Int BEND
/* doorKeyUnknown
tooltip : 需要钥匙
default : ['orangeKey', 1]
helpUrl : https://h5mota.com/games/template/_docs/#/event
return '"'+IdString_0+'": '+Int_0+', ';
*/;
doorKeyEmpty
: Newline
/* doorKeyEmpty
var code = ' \n';
return code;
*/;
faceIds_m
: '行走图朝向:' BGNL? Newline '向上ID' IdString? '向下ID' IdString? '向左ID' IdString? '向右ID' IdString? BEND
/* faceIds_m
tooltip : 行走图朝向
default : ["","","",""]
helpUrl : https://h5mota.com/games/template/_docs/#/event
return '{' + [
IdString_0 && ('"up": "' + IdString_0 +'"'),
IdString_1 && ('"down": "' + IdString_1 +'"'),
IdString_2 && ('"left": "' + IdString_2 +'"'),
IdString_3 && ('"right": "' + IdString_3 +'"'),
].join(', ') + '}\n';
*/;
//为了避免关键字冲突,全部加了_s
//动作
@ -3042,6 +3111,10 @@ Equip_List
: '生命'|'生命上限'|'攻击'|'防御'|'护盾'|'魔力'|'魔力上限'
/*Equip_List ['hp','hpmax','atk','def','mdef','mana','manamax']*/;
Key_List
: '黄钥匙'|'蓝钥匙'|'红钥匙'|'绿钥匙'|'铁门钥匙'
/*Key_List ['yellowKey','blueKey','redKey','greenKey','steelKey']*/;
//转blockly后不保留需要加"
EvalString
: Equote_double (ESC_double | ~["\\])* Equote_double

View File

@ -74,6 +74,22 @@ ActionParser.prototype.parse = function (obj,type) {
}
return MotaActionBlocks['equip_m'].xmlText([obj.type, obj.animate, buildEquip(obj.value), buildEquip(obj.percentage)]);
case 'doorInfo':
if(!obj) obj={};
var buildKeys = function (obj) {
obj = obj || {};
var text_choices = null;
var knownListKeys = MotaActionBlocks.doorKeyKnown.json.args0[0].options.map(function (one) {return one[1];})
Object.keys(obj).sort().forEach(function (key) {
var one = knownListKeys.indexOf(key) >= 0 ? 'doorKeyKnown' : 'doorKeyUnknown';
text_choices = MotaActionBlocks[one].xmlText([
key, obj.key, text_choices
]);
})
return text_choices;
}
return MotaActionBlocks['doorInfo_m'].xmlText([obj.time || 160, obj.openSound, obj.closeSound, buildKeys(obj.keys)]);
case 'floorImage':
if(!obj) obj=[];
var text_choices = null;
@ -84,6 +100,9 @@ ActionParser.prototype.parse = function (obj,type) {
}
return MotaActionBlocks['floorImage_m'].xmlText([text_choices]);
case 'faceIds':
if(!obj) obj={};
return MotaActionBlocks['faceIds_m'].xmlText([obj.up||"", obj.down||"", obj.left||"", obj.right||""]);
case 'shop':
var buildsub = function(obj,parser,next){

View File

@ -81,6 +81,10 @@ editor_blockly = function () {
MotaActionFunctions.actionParser.parse([{
"name": "bg.jpg", "x": 0, "y": 0, "canvas": "bg"
}], 'floorImage'),
MotaActionFunctions.actionParser.parse({
"time": 160, "openSound": "door.mp3", "closeSound": "door.mp3", "keys": {"yellowKey": 1, "orangeKey": 1}
}, 'doorInfo'),
MotaActionBlocks['faceIds_m'].xmlText(),
],
'显示文字':[
MotaActionBlocks['text_0_s'].xmlText(),
@ -1052,7 +1056,8 @@ function omitedcheckUpdateFunction(event) {
|| (type == 'choices_s' && name == 'IdString_0') || (type == 'choicesContext' && name == 'IdString_0')
|| (type == 'closeDoor_s' && name == 'IdString_0') || (type == 'setBlock_s' && name == 'EvalString_0')
|| (type == 'setBgFgBlock_s' && name == 'EvalString_0') || (type == 'drawIcon_s' && name == 'IdString_0')
|| (type == 'shopsub' && name == 'IdString_1') || (type == 'shopChoices' && name == 'IdString_0')) {
|| (type == 'shopsub' && name == 'IdString_1') || (type == 'shopChoices' && name == 'IdString_0')
|| type == 'faceIds_m') {
return filter(allIds, content);
}
@ -1062,13 +1067,14 @@ function omitedcheckUpdateFunction(event) {
}
// 对道具ID进行补全
if ((type == 'useItem_s' || type == 'loadEquip_s') && name == 'IdString_0') {
if ((type == 'useItem_s' || type == 'loadEquip_s' || type == 'doorKeyUnknown') && name == 'IdString_0') {
return filter(allItems, content);
}
// 对图片名进行补全
if ((type == 'showImage_s' || type == 'showImage_1_s' || type == 'showGif_s' || type == 'setHeroIcon_s'
|| type == 'follow_s' || type == 'unfollow_s' || type == 'drawImage_s' || type == 'drawImage_1_s') && name == 'EvalString_0') {
|| type == 'follow_s' || type == 'unfollow_s' || type == 'drawImage_s' || type == 'drawImage_1_s'
|| type == 'floorOneImage') && name == 'EvalString_0') {
return filter(allImages, content);
}

View File

@ -336,13 +336,15 @@ var comment_c456ea59_6018_45ef_8bcc_211a24c627dc = {
},
"doorInfo": {
"_leaf": true,
"_type": "textarea",
"_type": "event",
"_event": "doorInfo",
"_docs": "门信息",
"_data": "该图块的门信息,是一个四元数组。\n第一项为所需要的钥匙信息第二项为开关门的毫秒数第三项为开此门时的音效第四项为关此门时的音效。仅对animates生效。"
},
"faceIds": {
"_leaf": true,
"_type": "textarea",
"_type": "event",
"_event": "faceIds",
"_docs": "行走图朝向",
"_data": "行走图朝向仅对NPC有效。可以在这里定义同一个NPC的多个朝向行走图。\n比如 {\"up\":\"N333\",\"down\":\"N334\",\"left\":\"N335\",\"right\":\"N336\"} 就将该素材的上下左右朝向分别绑定到N333,N334,N335和N336四个图块。\n在勇士撞上NPC时或NPC在移动时会自动选择最合适的朝向图块如果存在定义来进行绘制。"
}

View File

@ -220,6 +220,8 @@
<option value="levelChoose">levelChoose</option>
<option value="equip">equip</option>
<option value="floorImage">floorImage</option>
<option value="doorInfo">doorInfo</option>
<option value="faceIds">faceIds</option>
</select>
<button onclick="editor_blockly.confirm()">确认</button>
<button id='blocklyParse' onclick="editor_blockly.parse()">解析</button>

View File

@ -216,6 +216,8 @@
<option value="levelChoose">levelChoose</option>
<option value="equip">equip</option>
<option value="floorImage">floorImage</option>
<option value="doorInfo">doorInfo</option>
<option value="faceIds">faceIds</option>
</select>
<button onclick="editor_blockly.confirm()">确认</button>
<button id='blocklyParse' onclick="editor_blockly.parse()">解析</button>

View File

@ -469,13 +469,14 @@ events.prototype._openDoor_check = function (id, x, y, needKey) {
return clearAndReturn();
doorInfo = doorInfo.doorInfo;
// Check all keys
var keyInfo = doorInfo[0];
var keyInfo = doorInfo.keys || {};
if (needKey) {
if (keyInfo == null) {
core.drawTip("无法开启此门");
return clearAndReturn();
}
for (var keyName in keyInfo) {
// --- 如果是一个不存在的道具,则直接认为无法开启
if (!core.material.items[keyName]) {
core.drawTip("无法开启此门");
return clearAndReturn();
}
var keyValue = keyInfo[keyName];
if (core.itemCount(keyName) < keyValue) {
core.drawTip("你没有" + ((core.material.items[keyName] || {}).name || "钥匙"), null, true);
@ -487,7 +488,7 @@ events.prototype._openDoor_check = function (id, x, y, needKey) {
core.removeItem(keyName, keyInfo[keyName]);
}
}
core.playSound(doorInfo[2] || 'door.mp3');
core.playSound(doorInfo.openSound);
return true;
}
@ -495,7 +496,7 @@ events.prototype._openDoor_animate = function (id, x, y, callback) {
var blockInfo = core.getBlockInfo(id);
var image = blockInfo.image, posY = blockInfo.posY, height = blockInfo.height;
var speed = (core.getBlockById(id).event.doorInfo[1] || 160) / 4;
var speed = (core.getBlockById(id).event.doorInfo.time || 160) / 4;
var locked = core.status.lockControl;
core.lockControl();
@ -2629,11 +2630,11 @@ events.prototype.closeDoor = function (x, y, id, callback) {
}
// 关门动画
core.playSound(doorInfo[3] || 'door.mp3');
core.playSound(doorInfo.closeDoor);
var blockInfo = core.getBlockInfo(id);
var image = blockInfo.image, posY = blockInfo.posY, height = blockInfo.height;
var speed = (doorInfo[1] || 160) / 4, state = 0;
var speed = (doorInfo.time || 160) / 4, state = 0;
var animate = window.setInterval(function () {
state++;
if (state == 4) {

View File

@ -1,8 +1,8 @@
var maps_90f36752_8815_4be8_b32b_d7fad1d0542e =
{
"1": {"cls":"animates","id":"yellowWall","canBreak":true,"animate":1,"doorInfo":[null,160,"door.mp3","door.mp3"]},
"2": {"cls":"animates","id":"whiteWall","canBreak":true,"animate":1,"doorInfo":[null,160,"door.mp3","door.mp3"]},
"3": {"cls":"animates","id":"blueWall","canBreak":true,"animate":1,"doorInfo":[null,160,"door.mp3","door.mp3"]},
"1": {"cls":"animates","id":"yellowWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}}},
"2": {"cls":"animates","id":"whiteWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}}},
"3": {"cls":"animates","id":"blueWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}}},
"4": {"cls":"animates","id":"star","name":"星空"},
"5": {"cls":"animates","id":"lava","name":"岩浆"},
"6": {"cls":"terrains","id":"ice"},
@ -68,12 +68,12 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e =
"71": {"cls":"items","id":"shield0"},
"72": {"cls":"items","id":"skill1"},
"73": {"cls":"items","id":"wand"},
"81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":[{"yellowKey":1},160,"door.mp3","door.mp3"],"name":"黄门"},
"82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":[{"blueKey":1},160,"door.mp3","door.mp3"],"name":"蓝门"},
"83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":[{"redKey":1},160,"door.mp3","door.mp3"],"name":"红门"},
"84": {"cls":"animates","id":"greenDoor","trigger":"openDoor","animate":1,"doorInfo":[{"greenKey":1},160,"door.mp3","door.mp3"],"name":"绿门"},
"85": {"cls":"animates","id":"specialDoor","trigger":"openDoor","animate":1,"doorInfo":[null,160,"door.mp3","door.mp3"],"name":"机关门"},
"86": {"cls":"animates","id":"steelDoor","trigger":"openDoor","animate":1,"doorInfo":[{"steelKey":1},160,"door.mp3","door.mp3"],"name":"铁门"},
"81": {"cls":"animates","id":"yellowDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"yellowKey":1}},"name":"黄门"},
"82": {"cls":"animates","id":"blueDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"blueKey":1}},"name":"蓝门"},
"83": {"cls":"animates","id":"redDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"redKey":1}},"name":"红门"},
"84": {"cls":"animates","id":"greenDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"greenKey":1}},"name":"绿门"},
"85": {"cls":"animates","id":"specialDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"specialKey":1}},"name":"机关门"},
"86": {"cls":"animates","id":"steelDoor","trigger":"openDoor","animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{"steelKey":1}},"name":"铁门"},
"87": {"cls":"terrains","id":"upFloor","canPass":true},
"88": {"cls":"terrains","id":"downFloor","canPass":true},
"89": {"cls":"animates","id":"portal","canPass":true},
@ -86,11 +86,11 @@ var maps_90f36752_8815_4be8_b32b_d7fad1d0542e =
"102": {"cls":"animates","id":"crystalBottom"},
"103": {"cls":"animates","id":"fire"},
"104": {"cls":"animates","id":"switch"},
"105": {"cls":"animates","id":"steelDoor2","doorInfo":[{},"door.mp3","door.mp3"],"animate":1,"trigger":"openDoor"},
"106": {"cls":"animates","id":"steelDoor3","doorInfo":[{},"door.mp3","door.mp3"],"animate":1,"trigger":"openDoor"},
"107": {"cls":"animates","id":"iceDoor","doorInfo":[{},"door.mp3","door.mp3"],"animate":1,"trigger":"openDoor"},
"108": {"cls":"animates","id":"iceDoor2","doorInfo":[{},"door.mp3","door.mp3"],"animate":1,"trigger":"openDoor"},
"109": {"cls":"animates","id":"magentaWall","canBreak":true,"animate":1,"doorInfo":[null,"door.mp3","door.mp3"]},
"105": {"cls":"animates","id":"steelDoor2","doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}},"animate":1,"trigger":"openDoor"},
"106": {"cls":"animates","id":"steelDoor3","doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}},"animate":1,"trigger":"openDoor"},
"107": {"cls":"animates","id":"iceDoor","doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}},"animate":1,"trigger":"openDoor"},
"108": {"cls":"animates","id":"iceDoor2","doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}},"animate":1,"trigger":"openDoor"},
"109": {"cls":"animates","id":"magentaWall","canBreak":true,"animate":1,"doorInfo":{"time":160,"openSound":"door.mp3","closeSound":"door.mp3","keys":{}}},
"121": {"cls":"npcs","id":"man"},
"122": {"cls":"npcs","id":"trader"},
"123": {"cls":"npcs","id":"thief"},