1751 lines
71 KiB
JavaScript
1751 lines
71 KiB
JavaScript
MotaActionParser=function(){
|
||
function ActionParser(){
|
||
}
|
||
|
||
ActionParser.prototype.parse = function (obj,type) {
|
||
switch (type) {
|
||
case 'event':
|
||
if(!obj)obj={};
|
||
if(typeof(obj)===typeof('')) obj={'data':[obj]};
|
||
if(obj instanceof Array) obj={'data':obj};
|
||
if (!obj.filter) obj.filter={};
|
||
return MotaActionBlocks['event_m'].xmlText([
|
||
obj.trigger==='action',obj.enable,obj.noPass,obj.displayDamage,obj.opacity,
|
||
obj.filter.blur,obj.filter.hue,obj.filter.grayscale,obj.filter.invert,obj.filter.shadow,this.parseList(obj.data)
|
||
]);
|
||
|
||
case 'autoEvent':
|
||
if(!obj)obj={};
|
||
return MotaActionBlocks['autoEvent_m'].xmlText([
|
||
obj.condition,obj.priority,obj.currentFloor,obj.delayExecute,obj.multiExecute,this.parseList(obj.data)
|
||
]);
|
||
|
||
case 'changeFloor':
|
||
if(!obj)obj={};
|
||
if (!obj.loc) {
|
||
obj.loc = obj.loc || ['',''];
|
||
obj.stair = obj.stair || ':now';
|
||
}
|
||
if (obj.floorId==':before'||obj.floorId==':next'||obj.floorId==':now') {
|
||
obj.floorType=obj.floorId;
|
||
delete obj.floorId;
|
||
}
|
||
return MotaActionBlocks['changeFloor_m'].xmlText([
|
||
obj.floorType||'floorId',obj.floorId,obj.stair||'loc',obj.loc[0],obj.loc[1],obj.direction,
|
||
obj.time,obj.ignoreChangeFloor
|
||
]);
|
||
|
||
case 'afterGetItem':
|
||
if (!obj) obj = [];
|
||
if (obj instanceof Array) obj = {'data': obj};
|
||
return MotaActionBlocks['afterGetItem_m'].xmlText([
|
||
obj.disableOnGentleClick||false, this.parseList(obj.data)
|
||
]);
|
||
|
||
case 'level':
|
||
if(!obj)obj={};
|
||
var text_choices = null;
|
||
for(var ii=obj.length-1,choice;choice=obj[ii];ii--) {
|
||
text_choices=MotaActionBlocks['levelCase'].xmlText([
|
||
this.expandEvalBlock([choice.need]),choice.title,choice.clear||false,this.parseList(choice.action),text_choices]);
|
||
}
|
||
return MotaActionBlocks['level_m'].xmlText([text_choices]);
|
||
|
||
case 'levelChoose':
|
||
if(!obj) obj=[];
|
||
var text_choices = null;
|
||
for(var ii=obj.length-1,choice;choice=obj[ii];ii--) {
|
||
text_choices=MotaActionBlocks['levelChooseChoice'].xmlText([
|
||
choice.title, choice.name, choice.hard||0, choice.color, 'rgba('+choice.color+')', this.parseList(choice.action), text_choices]);
|
||
}
|
||
return MotaActionBlocks['levelChoose_m'].xmlText([text_choices]);
|
||
|
||
case 'floorPartition':
|
||
if(!obj) obj=[];
|
||
var text_choices = null;
|
||
for(var ii=obj.length-1,choice;choice=obj[ii];ii--) {
|
||
text_choices=MotaActionBlocks['floorPartitionItem'].xmlText([choice[0], choice[1]||"", text_choices]);
|
||
}
|
||
return MotaActionBlocks['floorPartition_m'].xmlText([text_choices]);
|
||
|
||
case 'equip':
|
||
if(!obj) obj={};
|
||
var buildEquip = function (obj) {
|
||
obj = obj || {};
|
||
var text_choices = null;
|
||
var knownEquipListKeys = MotaActionBlocks['Equip_List'].options.map(function (one) {return one[1];})
|
||
Object.keys(obj).sort().forEach(function (key) {
|
||
var one = knownEquipListKeys.indexOf(key) >= 0 ? 'equipKnown' : 'equipUnknown';
|
||
text_choices = MotaActionBlocks[one].xmlText([
|
||
key, obj[key], text_choices
|
||
]);
|
||
})
|
||
return text_choices;
|
||
}
|
||
return MotaActionBlocks['equip_m'].xmlText([obj.type, obj.animate, buildEquip(obj.value), buildEquip(obj.percentage),
|
||
this.parseList(obj.equipEvent), this.parseList(obj.unequipEvent)]);
|
||
|
||
case 'doorInfo':
|
||
if(!obj) obj={};
|
||
var buildKeys = function (obj) {
|
||
obj = obj || {};
|
||
var text_choices = null;
|
||
var knownListKeys = MotaActionBlocks['Key_List'].options.map(function (one) {return one[1];})
|
||
Object.keys(obj).sort().forEach(function (key) {
|
||
var noNeed = key.endsWith(':o');
|
||
if (noNeed) key = key.substring(0, key.length - 2);
|
||
var one = knownListKeys.indexOf(key) >= 0 ? 'doorKeyKnown' : 'doorKeyUnknown';
|
||
text_choices = MotaActionBlocks[one].xmlText([
|
||
one == 'doorKeyUnknown' ? MotaActionFunctions.replaceToName_token(key) : key, obj[key], noNeed, text_choices
|
||
]);
|
||
})
|
||
return text_choices;
|
||
}
|
||
return MotaActionBlocks['doorInfo_m'].xmlText([obj.time || 160, obj.openSound, obj.closeSound, buildKeys(obj.keys), this.parseList(obj.afterOpenDoor)]);
|
||
|
||
case 'floorImage':
|
||
if(!obj) obj=[];
|
||
var text_choices = null;
|
||
for(var ii=obj.length-1,choice;choice=obj[ii];ii--) {
|
||
text_choices=MotaActionBlocks['floorOneImage'].xmlText([
|
||
choice.name, choice.reverse, choice.canvas||'bg', choice.x||0, choice.y||0, choice.disable||false,
|
||
choice.sx, choice.sy, choice.w, choice.h, choice.frame, text_choices]);
|
||
}
|
||
return MotaActionBlocks['floorImage_m'].xmlText([text_choices]);
|
||
|
||
case 'faceIds':
|
||
if(!obj) obj={};
|
||
return MotaActionBlocks['faceIds_m'].xmlText([obj.down||"", obj.left||"", obj.right||"", obj.up||""]);
|
||
|
||
case 'splitImages':
|
||
if(!obj) obj=[];
|
||
var text_choices = null;
|
||
for(var ii=obj.length-1,choice;choice=obj[ii];ii--) {
|
||
text_choices=MotaActionBlocks['splitImagesOne'].xmlText([
|
||
choice.name, choice.width, choice.height, choice.prefix, text_choices]);
|
||
}
|
||
return MotaActionBlocks['splitImages_m'].xmlText([text_choices]);
|
||
|
||
case 'mainStyle':
|
||
if(!obj) obj={};
|
||
return MotaActionBlocks['mainStyle_m'].xmlText([
|
||
obj.startBackground, obj.startVerticalBackground || obj.startBackground, obj.startLogoStyle, obj.startButtonsStyle,
|
||
obj.statusLeftBackground, obj.statusTopBackground, obj.toolsBackground, obj.floorChangingStyle,
|
||
obj.statusBarColor, 'rgba('+obj.statusBarColor+')', obj.borderColor, 'rgba('+obj.borderColor+')',
|
||
obj.selectColor, 'rgba(' + obj.selectColor + ')', obj.font
|
||
]);
|
||
|
||
case 'nameMap':
|
||
if (!obj) obj={};
|
||
var items = Object.keys(obj);
|
||
var result = null;
|
||
for (var ii=items.length-1,one;one=items[ii];ii--) {
|
||
var value = obj[one];
|
||
var knownItems = MotaActionBlocks['NameMap_List'].options.map(function (one) {return one[1];})
|
||
if (knownItems.indexOf(one) >= 0) {
|
||
result = MotaActionBlocks['nameMapSoundKnown'].xmlText([one, value, result]);
|
||
continue;
|
||
}
|
||
if (main.bgms.indexOf(value) >= 0) {
|
||
result = MotaActionBlocks['nameMapBgm'].xmlText([one, value, result]);
|
||
continue;
|
||
}
|
||
if (main.sounds.indexOf(value) >= 0) {
|
||
result = MotaActionBlocks['nameMapSoundUnknown'].xmlText([one, value, result]);
|
||
continue;
|
||
}
|
||
if (main.images.indexOf(value) >= 0) {
|
||
result = MotaActionBlocks['nameMapImage'].xmlText([one, value, result]);
|
||
continue;
|
||
}
|
||
if (main.animates.indexOf(value) >= 0) {
|
||
result = MotaActionBlocks['nameMapAnimate'].xmlText([one, value, result]);
|
||
continue;
|
||
}
|
||
result = MotaActionBlocks['nameMapUnknown'].xmlText([one, value, result]);
|
||
}
|
||
return MotaActionBlocks['nameMap_m'].xmlText([result]);
|
||
|
||
case 'shop':
|
||
var buildsub = function(obj,parser,next){
|
||
var text_choices = null;
|
||
for(var ii=obj.choices.length-1,choice;choice=obj.choices[ii];ii--) {
|
||
text_choices=MotaActionBlocks['shopChoices'].xmlText([
|
||
choice.text,choice.need||'',choice.icon,choice.color,'rgba('+choice.color+')',choice.condition,parser.parseList(choice.action),text_choices]);
|
||
}
|
||
var info = parser.getTitleAndPosition(obj.text || '');
|
||
return MotaActionBlocks['shopsub'].xmlText([
|
||
obj.id,info[0],info[1],info[3],obj.textInList,obj.mustEnable,obj.disablePreview,text_choices,next
|
||
]);
|
||
}
|
||
var buildcommentevent = function(obj,parser,next){
|
||
if (obj.args instanceof Array) {
|
||
obj.args = JSON.stringify(obj.args);
|
||
}
|
||
else obj.args = null;
|
||
return MotaActionBlocks['shopcommonevent'].xmlText([
|
||
obj.id,parser.EvalString(obj.textInList),obj.mustEnable,parser.EvalString(obj.commonEvent),obj.args,next
|
||
]);
|
||
}
|
||
var builditem = function (obj,parser,next){
|
||
var text_choices = null;
|
||
for(var ii=obj.choices.length-1,choice;choice=obj.choices[ii];ii--) {
|
||
text_choices = MotaActionBlocks['shopItemChoices'].xmlText([
|
||
choice.id, choice.number == null ? "" : (""+choice.number), choice.money == null ? "" : (""+choice.money),
|
||
choice.sell == null ? "" : (""+choice.sell), choice.condition || "", text_choices
|
||
]);
|
||
}
|
||
return MotaActionBlocks['shopitem'].xmlText([
|
||
obj.id,obj.textInList,obj.use||'money',obj.mustEnable,text_choices,next
|
||
]);
|
||
}
|
||
var next=null;
|
||
if(!obj)obj=[];
|
||
while(obj.length){
|
||
var shopobj=obj.pop()
|
||
if(shopobj.item)
|
||
next=builditem(shopobj,this,next);
|
||
else if(shopobj.choices)
|
||
next=buildsub(shopobj,this,next);
|
||
else if(shopobj.commonEvent)
|
||
next=buildcommentevent(shopobj,this,next);
|
||
else
|
||
throw new Error("[警告]出错啦!\n"+shopobj.id+" 无效的商店");
|
||
}
|
||
return MotaActionBlocks['shop_m'].xmlText([next]);
|
||
|
||
default:
|
||
return MotaActionBlocks[type+'_m'].xmlText([this.parseList(obj)]);
|
||
}
|
||
}
|
||
|
||
////// 开始解析一系列自定义事件 //////
|
||
ActionParser.prototype.parseList = function (list) {
|
||
if (!this.isset(list)) return MotaActionBlocks['pass_s'].xmlText([],true);
|
||
if (!(list instanceof Array)) {
|
||
list = [list];
|
||
}
|
||
if (list.length===0) return MotaActionBlocks['pass_s'].xmlText([],true);
|
||
this.event = {'id': 'action', 'data': {
|
||
'list': list
|
||
}}
|
||
this.next = null;
|
||
this.result = null;
|
||
this.parseAction();
|
||
return this.result;
|
||
}
|
||
|
||
////// 解析当前自定义事件列表中的最后一个事件 //////
|
||
ActionParser.prototype.parseAction = function() {
|
||
|
||
// 事件处理完毕
|
||
if (this.event.data.list.length==0) {
|
||
this.result = this.next;
|
||
this.next = null;
|
||
return;
|
||
}
|
||
|
||
var data = this.event.data.list.pop();
|
||
this.event.data.current = data;
|
||
|
||
// 不同种类的事件
|
||
|
||
// 如果是文字:显示
|
||
if (typeof data == "string") {
|
||
data={"type": "text", "text": data}
|
||
}
|
||
this.event.data.type=data.type;
|
||
switch (data.type) {
|
||
case "_next":
|
||
this.result = this.next;
|
||
this.next = data.next;
|
||
return;
|
||
case "text": // 文字/对话
|
||
var info = this.getTitleAndPosition(data.text);
|
||
var textDrawing = [];
|
||
info[3] = (info[3] || "").replace(/(\f|\\f)\[(.*?)]/g, function (text, sympol, str) {
|
||
var ss = str.split(",");
|
||
if (ss.length == 3 || ss.length == 5 || ss.length >=9) {
|
||
var swap = function (i, j) { var x = ss[i]; ss[i] = ss[j]; ss[j] = x;}
|
||
if (ss.length >= 9) {
|
||
swap(1,5); swap(2,6); swap(3,7); swap(4,8);
|
||
}
|
||
textDrawing.push(ss);
|
||
}
|
||
return '';
|
||
});
|
||
if (textDrawing.length > 0) {
|
||
var buildTextDrawing = function (obj) {
|
||
if(!obj) obj=[];
|
||
var text_choices = null;
|
||
for(var ii=obj.length-1,choice;choice=obj[ii];ii--) {
|
||
var reverse = 'null';
|
||
if (choice[0].endsWith(':o') || choice[0].endsWith(':x') || choice[0].endsWith(':y')) {
|
||
reverse = choice[0].substring(choice[0].length - 2);
|
||
choice[0] = choice[0].substring(0, choice[0].length - 2);
|
||
}
|
||
text_choices=MotaActionBlocks['textDrawing'].xmlText([
|
||
choice[0], reverse, choice[1], choice[2], choice[3], choice[4], choice[5], choice[6],
|
||
choice[7], choice[8], choice[9], choice[10], text_choices]);
|
||
}
|
||
return text_choices;
|
||
}
|
||
data.pos = data.pos || [];
|
||
this.next = MotaActionFunctions.xmlText('text_2_s', [
|
||
info[0], info[1], info[2], data.pos[0], data.pos[1], data.pos[2], data.code||0, data.async||false, info[3], buildTextDrawing(textDrawing), this.next
|
||
], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
} else if (info[0] || info[1] || info[2] || data.pos || data.code) {
|
||
data.pos = data.pos || [];
|
||
this.next = MotaActionFunctions.xmlText('text_1_s',[
|
||
info[0], info[1], info[2], data.pos[0], data.pos[1], data.pos[2], data.code||0, data.async||false, info[3], this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
}
|
||
else {
|
||
this.next = MotaActionFunctions.xmlText('text_0_s', [info[3],this.next],
|
||
/* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
}
|
||
break;
|
||
case "moveTextBox": // 移动对话框
|
||
data.loc = data.loc || ['',''];
|
||
this.next = MotaActionBlocks['moveTextBox_s'].xmlText([
|
||
data.code, data.loc[0], data.loc[1], data.relative||false, data.moveMode, data.time, data.async, this.next]);
|
||
break;
|
||
case "clearTextBox": // 清除对话框
|
||
this.next = MotaActionBlocks['clearTextBox_s'].xmlText([(data.code||"").toString(),this.next]);
|
||
break;
|
||
case "autoText": // 自动剧情文本
|
||
var info = this.getTitleAndPosition(data.text);
|
||
this.next = MotaActionBlocks['autoText_s'].xmlText([
|
||
info[0],info[1],info[2],data.time,info[3],this.next]);
|
||
break;
|
||
case "scrollText":
|
||
this.next = MotaActionBlocks['scrollText_s'].xmlText([
|
||
data.time, data.lineHeight||1.4, data.async||false, this.EvalString_Multi(data.text), this.next]);
|
||
break;
|
||
case "comment": // 注释
|
||
this.next = MotaActionBlocks['comment_s'].xmlText([this.EvalString_Multi(data.text),this.next]);
|
||
break;
|
||
case "setText": // 设置剧情文本的属性
|
||
data.title=this.Colour(data.title);
|
||
data.text=this.Colour(data.text);
|
||
if (!/^\w+\.png$/.test(data.background))
|
||
data.background=this.Colour(data.background);
|
||
this.next = MotaActionBlocks['setText_s'].xmlText([
|
||
data.position,data.offset,data.align,data.bold,data.title,'rgba('+data.title+')',
|
||
data.text,'rgba('+data.text+')',data.background,'rgba('+data.background+')',
|
||
data.titlefont,data.textfont,data.lineHeight,data.time,data.letterSpacing,data.animateTime,this.next]);
|
||
break;
|
||
case "tip":
|
||
this.next = MotaActionBlocks['tip_s'].xmlText([
|
||
data.text,data.icon||"",this.next]);
|
||
break;
|
||
case "show": // 显示
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['show_s'].xmlText([
|
||
x_str.join(','),y_str.join(','),data.floorId||'',data.time,data.async||false,this.next]);
|
||
break;
|
||
case "hide": // 消失
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['hide_s'].xmlText([
|
||
x_str.join(','),y_str.join(','),data.floorId||'',data.remove||false,data.time,data.async||false,this.next]);
|
||
break;
|
||
case "setBlock": // 设置图块
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['setBlock_s'].xmlText([
|
||
data.number||0,x_str.join(','),y_str.join(','),data.floorId||'',data.time,data.async||false,this.next]);
|
||
break;
|
||
case "setBlockOpacity": // 设置图块不透明度
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['setBlockOpacity_s'].xmlText([
|
||
x_str.join(','),y_str.join(','),data.floorId||'',data.opacity,data.time,data.async||false,this.next]);
|
||
break;
|
||
case "setBlockFilter": // 设置图块不透明度
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['setBlockFilter_s'].xmlText([
|
||
x_str.join(','),y_str.join(','),data.floorId||'',data.blur,data.hue,data.grayscale,data.invert||false,data.shadow,this.next]);
|
||
break;
|
||
case "turnBlock": // 事件转向
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['turnBlock_s'].xmlText([
|
||
data.direction,x_str.join(','),y_str.join(','),data.floorId||'',this.next]);
|
||
break;
|
||
case "showFloorImg": // 显示贴图
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['showFloorImg_s'].xmlText([
|
||
x_str.join(','),y_str.join(','),data.floorId||'',this.next]);
|
||
break;
|
||
case "hideFloorImg": // 隐藏贴图
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['hideFloorImg_s'].xmlText([
|
||
x_str.join(','),y_str.join(','),data.floorId||'',this.next]);
|
||
break;
|
||
case "showBgFgMap": // 显示图层块
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['showBgFgMap_s'].xmlText([
|
||
data.name||'bg', x_str.join(','),y_str.join(','),data.floorId||'',this.next]);
|
||
break;
|
||
case "hideBgFgMap": // 隐藏图层块
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['hideBgFgMap_s'].xmlText([
|
||
data.name||'bg', x_str.join(','),y_str.join(','),data.floorId||'',this.next]);
|
||
break;
|
||
case "setBgFgBlock": // 设置图块
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['setBgFgBlock_s'].xmlText([
|
||
data.name||'bg', data.number||0, x_str.join(','),y_str.join(','),data.floorId||'',this.next]);
|
||
break;
|
||
case "setHeroIcon": // 改变勇士
|
||
this.next = MotaActionBlocks['setHeroIcon_s'].xmlText([
|
||
data.name||"", data.noDraw || false, this.next]);
|
||
break;
|
||
case "move": // 移动事件
|
||
data.loc=data.loc||['',''];
|
||
var buildMoveDirection= function (obj) {
|
||
obj = MotaActionFunctions.processMoveDirections(obj||[]);
|
||
var res = null;
|
||
for(var ii=obj.length-1,one;one=obj[ii];ii--) {
|
||
var v = one.split(':');
|
||
res=MotaActionBlocks['moveDirection'].xmlText([v[0], parseInt(v[1]), res]);
|
||
}
|
||
return res;
|
||
}
|
||
this.next = MotaActionBlocks['move_s'].xmlText([
|
||
data.loc[0],data.loc[1],data.time,data.keep||false,data.async||false,buildMoveDirection(data.steps),this.next]);
|
||
break;
|
||
case "moveAction": // 前进一格或撞击
|
||
this.next = MotaActionBlocks['moveAction_s'].xmlText([this.next]);
|
||
break;
|
||
case "moveHero": // 无视地形移动勇士
|
||
var buildMoveDirection= function (obj) {
|
||
obj = MotaActionFunctions.processMoveDirections(obj||[]);
|
||
var res = null;
|
||
for(var ii=obj.length-1,one;one=obj[ii];ii--) {
|
||
var v = one.split(':');
|
||
res=MotaActionBlocks['moveDirection'].xmlText([v[0], parseInt(v[1]), res]);
|
||
}
|
||
return res;
|
||
}
|
||
this.next = MotaActionBlocks['moveHero_s'].xmlText([
|
||
data.time,data.async||false,buildMoveDirection(data.steps),this.next]);
|
||
break;
|
||
case "jump": // 跳跃事件
|
||
data.from=data.from||['',''];
|
||
if (data.dxy) {
|
||
this.next = MotaActionBlocks['jump_1_s'].xmlText([
|
||
data.from[0],data.from[1],data.dxy[0],data.dxy[1],data.time,data.keep||false,data.async||false,this.next]);
|
||
} else {
|
||
data.to=data.to||['',''];
|
||
this.next = MotaActionBlocks['jump_s'].xmlText([
|
||
data.from[0],data.from[1],data.to[0],data.to[1],data.time,data.keep||false,data.async||false,this.next]);
|
||
}
|
||
break;
|
||
case "jumpHero": // 跳跃勇士
|
||
if (data.dxy) {
|
||
this.next = MotaActionBlocks['jumpHero_1_s'].xmlText([
|
||
data.dxy[0],data.dxy[1],data.time,data.async||false,this.next]);
|
||
} else {
|
||
data.loc=data.loc||['','']
|
||
this.next = MotaActionBlocks['jumpHero_s'].xmlText([
|
||
data.loc[0],data.loc[1],data.time,data.async||false,this.next]);
|
||
}
|
||
break;
|
||
case "changeFloor": // 楼层转换
|
||
if (!data.loc) {
|
||
data.loc = data.loc || ['',''];
|
||
data.stair = data.stair || ':now';
|
||
}
|
||
if (data.floorId==':before'||data.floorId==':next'||data.floorId==':now') {
|
||
data.floorType=data.floorId;
|
||
delete data.floorId;
|
||
}
|
||
this.next = MotaActionBlocks['changeFloor_s'].xmlText([
|
||
data.floorType||'floorId',data.floorId,data.stair||'loc',data.loc[0],data.loc[1],data.direction,
|
||
data.time, this.next]);
|
||
break;
|
||
case "changePos": // 直接更换勇士位置, 不切换楼层
|
||
data.loc=data.loc||['','']
|
||
this.next = MotaActionBlocks['changePos_s'].xmlText([
|
||
data.loc[0],data.loc[1],data.direction,this.next]);
|
||
break;
|
||
case "follow": // 跟随勇士
|
||
this.next = MotaActionBlocks['follow_s'].xmlText([data.name||"", this.next]);
|
||
break;
|
||
case "unfollow": // 取消跟随
|
||
this.next = MotaActionBlocks['unfollow_s'].xmlText([data.name||"", this.next]);
|
||
break;
|
||
case "animate": // 显示动画
|
||
if (data.loc == 'hero') {
|
||
this.next = MotaActionBlocks['animate_1_s'].xmlText([
|
||
data.name,data.async||false,this.next]);
|
||
} else {
|
||
data.loc=data.loc||['',''];
|
||
this.next = MotaActionBlocks['animate_s'].xmlText([
|
||
data.name,data.loc[0],data.loc[1],data.alignWindow||false,data.async||false,this.next]);
|
||
}
|
||
break;
|
||
case "stopAnimate": // 停止所有动画
|
||
this.next = MotaActionBlocks['stopAnimate_s'].xmlText([data.doCallback||false,this.next]);
|
||
break;
|
||
case "setViewport": // 设置视角
|
||
if (data.dxy) {
|
||
this.next = MotaActionBlocks['setViewport_1_s'].xmlText([
|
||
data.dxy[0],data.dxy[1],data.moveMode||'', data.time||0,data.async||false,this.next]);
|
||
} else {
|
||
data.loc = data.loc||['',''];
|
||
this.next = MotaActionBlocks['setViewport_s'].xmlText([
|
||
data.loc[0],data.loc[1],data.moveMode||'', data.time||0,data.async||false,this.next]);
|
||
}
|
||
break;
|
||
case "lockViewport":
|
||
this.next = MotaActionBlocks['lockViewport_s'].xmlText([data.lock,
|
||
this.next]);
|
||
break;
|
||
case "vibrate": // 画面震动
|
||
this.next = MotaActionBlocks['vibrate_s'].xmlText([data.direction||'horizontal',
|
||
data.time||0, data.speed, data.power, data.async||false, this.next]);
|
||
break;
|
||
case "showImage": // 显示图片
|
||
data.loc=data.loc||['','']
|
||
if (data.sloc) {
|
||
this.next = MotaActionBlocks['showImage_1_s'].xmlText([
|
||
data.code,data.image||data.name,data.reverse,data.sloc[0],data.sloc[1],data.sloc[2],data.sloc[3],data.opacity,
|
||
data.loc[0],data.loc[1],data.loc[2],data.loc[3],data.time||0,data.async||false,this.next
|
||
]);
|
||
}
|
||
else {
|
||
this.next = MotaActionBlocks['showImage_s'].xmlText([
|
||
data.code,data.image||data.name,data.reverse,data.loc[0],data.loc[1],data.opacity,data.time||0,data.async||false,this.next]);
|
||
}
|
||
break;
|
||
case "showImage2": // 显示图片
|
||
data.loc=data.loc||['','']
|
||
if (data.sloc) {
|
||
this.next = MotaActionBlocks['showImage2_1_s'].xmlText([
|
||
data.code,data.image||data.name,data.reverse,data.sloc[0],data.sloc[1],data.sloc[2],data.sloc[3],data.opacity,
|
||
data.loc[0],data.loc[1],data.loc[2],data.loc[3],data.time||0,data.async||false,this.next
|
||
]);
|
||
}
|
||
else {
|
||
this.next = MotaActionBlocks['showImage2_s'].xmlText([
|
||
data.code,data.image||data.name,data.reverse,data.loc[0],data.loc[1],data.opacity,data.time||0,data.async||false,this.next]);
|
||
}
|
||
break;
|
||
case "hideImage": // 清除图片
|
||
this.next = MotaActionBlocks['hideImage_s'].xmlText([
|
||
data.code,data.time||0,data.async||false,this.next]);
|
||
break;
|
||
case "showTextImage": // 显示图片化文本
|
||
data.loc=data.loc||['','']
|
||
this.next = MotaActionBlocks['showTextImage_s'].xmlText([
|
||
this.EvalString_Multi(data.text),data.code,data.loc[0],data.loc[1],data.lineHeight||1.4,data.reverse,data.opacity,data.time||0,data.async||false,this.next]);
|
||
break;
|
||
case "moveImage": // 移动图片
|
||
data.to=data.to||['','']
|
||
this.next = MotaActionBlocks['moveImage_s'].xmlText([
|
||
data.code, data.to[0], data.to[1], data.opacity, data.moveMode||'', data.time||0, data.async||false, this.next]);
|
||
break;
|
||
case "rotateImage": // 旋转图片
|
||
data.center=data.center||['','']
|
||
this.next = MotaActionBlocks['rotateImage_s'].xmlText([
|
||
data.code, data.center[0], data.center[1], data.moveMode||'', data.angle||0, data.time||0, data.async||false, this.next]);
|
||
break;
|
||
case "scaleImage": // 放缩图片
|
||
data.center=data.center||['','']
|
||
this.next = MotaActionBlocks['scaleImage_s'].xmlText([
|
||
data.code, data.center[0], data.center[1], data.moveMode||'', data.scale, data.time||0, data.async||false, this.next]);
|
||
break;
|
||
case "showGif": // 显示动图
|
||
data.loc=data.loc||['','']
|
||
this.next = MotaActionBlocks['showGif_s'].xmlText([
|
||
data.name,data.loc[0],data.loc[1],this.next]);
|
||
break;
|
||
case "setCurtain": // 颜色渐变
|
||
if(this.isset(data.color)){
|
||
data.color = this.Colour(data.color);
|
||
this.next = MotaActionBlocks['setCurtain_0_s'].xmlText([
|
||
data.color,'rgba('+data.color+')',data.time,data.moveMode,data.keep||false,data.async||false,this.next]);
|
||
} else {
|
||
this.next = MotaActionBlocks['setCurtain_1_s'].xmlText([
|
||
data.time,data.moveMode,data.async||false,this.next]);
|
||
}
|
||
break;
|
||
case "screenFlash": // 画面闪烁
|
||
data.color = this.Colour(data.color);
|
||
this.next = MotaActionBlocks['screenFlash_s'].xmlText([
|
||
data.color,'rgba('+data.color+')',data.time||500,data.times,data.moveMode,data.async||false,this.next]);
|
||
break;
|
||
case "setWeather": // 更改天气
|
||
this.next = MotaActionBlocks['setWeather_s'].xmlText([
|
||
data.name,data.level||1,data.keep||false,this.next]);
|
||
break;
|
||
case "openDoor": // 开一个门, 包括暗墙
|
||
data.loc=data.loc||['','']
|
||
this.next = MotaActionBlocks['openDoor_s'].xmlText([
|
||
data.loc[0],data.loc[1],data.floorId||'',data.needKey||false,data.async||false,this.next]);
|
||
break;
|
||
case "closeDoor": // 关一个门,需要该点无事件
|
||
data.loc=data.loc||['','']
|
||
this.next = MotaActionBlocks['closeDoor_s'].xmlText([
|
||
data.loc[0],data.loc[1],data.id,data.async||false,this.next]);
|
||
break;
|
||
case "useItem": // 使用道具
|
||
this.next = MotaActionBlocks['useItem_s'].xmlText([
|
||
MotaActionFunctions.replaceToName_token(data.id),this.next]);
|
||
break;
|
||
case "loadEquip": // 装上装备
|
||
this.next = MotaActionBlocks['loadEquip_s'].xmlText([
|
||
MotaActionFunctions.replaceToName_token(data.id),this.next]);
|
||
break;
|
||
case "unloadEquip": // 卸下装备
|
||
this.next = MotaActionBlocks['unloadEquip_s'].xmlText([
|
||
data.pos,this.next]);
|
||
break;
|
||
case "openShop": // 打开一个全局商店
|
||
this.next = MotaActionBlocks['openShop_s'].xmlText([
|
||
data.id,data.open||false,this.next]);
|
||
break;
|
||
case "disableShop": // 禁用一个全局商店
|
||
this.next = MotaActionBlocks['disableShop_s'].xmlText([
|
||
data.id,this.next]);
|
||
break;
|
||
case "battle": // 强制战斗
|
||
if (data.id) {
|
||
this.next = MotaActionBlocks['battle_s'].xmlText([
|
||
MotaActionFunctions.replaceToName_token(data.id),this.next]);
|
||
}
|
||
else {
|
||
data.loc = data.loc || [];
|
||
this.next = MotaActionBlocks['battle_1_s'].xmlText([
|
||
data.loc[0],data.loc[1],this.next]);
|
||
}
|
||
break;
|
||
case "trigger": // 触发另一个事件
|
||
data.loc = data.loc || [];
|
||
this.next = MotaActionBlocks['trigger_s'].xmlText([
|
||
data.loc[0],data.loc[1],this.next]);
|
||
break;
|
||
case "insert": // 强制插入另一个点的事件在当前事件列表执行,当前坐标和楼层不会改变
|
||
if (data.args instanceof Array) {
|
||
data.args = JSON.stringify(data.args);
|
||
}
|
||
else data.args = null;
|
||
if (this.isset(data.name)) {
|
||
this.next = MotaActionBlocks['insert_1_s'].xmlText([
|
||
data.name, data.args||"", this.next]);
|
||
}
|
||
else {
|
||
data.loc = data.loc || [];
|
||
this.next = MotaActionBlocks['insert_2_s'].xmlText([
|
||
data.loc[0],data.loc[1],data.which,data.floorId||'',data.args||"",this.next]);
|
||
}
|
||
break;
|
||
case "playSound":
|
||
var knownItems = MotaActionBlocks['NameMap_List'].options.map(function (one) {return one[1];});
|
||
if (knownItems.indexOf(data.name) >= 0) {
|
||
this.next = MotaActionBlocks['playSound_1_s'].xmlText([
|
||
data.name,data.stop,data.pitch||"",data.sync,this.next]);
|
||
} else {
|
||
this.next = MotaActionBlocks['playSound_s'].xmlText([
|
||
data.name,data.stop,data.pitch||"",data.sync,this.next]);
|
||
}
|
||
break;
|
||
case "playBgm":
|
||
this.next = MotaActionBlocks['playBgm_s'].xmlText([
|
||
data.name,data.startTime||0,data.keep||false,this.next]);
|
||
break
|
||
case "pauseBgm":
|
||
this.next = MotaActionBlocks['pauseBgm_s'].xmlText([
|
||
this.next]);
|
||
break
|
||
case "resumeBgm":
|
||
this.next = MotaActionBlocks['resumeBgm_s'].xmlText([
|
||
data.resume||false,this.next]);
|
||
break
|
||
case "loadBgm":
|
||
this.next = MotaActionBlocks['loadBgm_s'].xmlText([
|
||
data.name,this.next]);
|
||
break
|
||
case "freeBgm":
|
||
this.next = MotaActionBlocks['freeBgm_s'].xmlText([
|
||
data.name,this.next]);
|
||
break
|
||
case "stopSound":
|
||
this.next = MotaActionBlocks['stopSound_s'].xmlText([
|
||
this.next]);
|
||
break
|
||
case "setVolume":
|
||
this.next = MotaActionBlocks['setVolume_s'].xmlText([
|
||
data.value, data.time, data.async||false, this.next]);
|
||
break
|
||
case "setBgmSpeed":
|
||
this.next = MotaActionBlocks['setBgmSpeed_s'].xmlText([
|
||
data.value, data.pitch||false, this.next]);
|
||
break;
|
||
case "setValue":
|
||
this.next = MotaActionBlocks['setValue_s'].xmlText([
|
||
this.expandIdBlock([data.name]), data["operator"]||'=',
|
||
this.expandEvalBlock([data.value]),
|
||
data.norefresh || false,
|
||
this.next]);
|
||
break;
|
||
case "setEnemy":
|
||
this.next = MotaActionBlocks['setEnemy_s'].xmlText([
|
||
MotaActionFunctions.replaceToName_token(data.id), data.name, data["operator"]||'=', this.expandEvalBlock([data.value]),
|
||
data.norefresh||false, this.next]);
|
||
break;
|
||
case "setEnemyOnPoint":
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['setEnemyOnPoint_s'].xmlText([
|
||
x_str.join(','),y_str.join(','),data.floorId||'',data.name, data["operator"]||'=', this.expandEvalBlock([data.value]),
|
||
data.norefresh||false, this.next]);
|
||
break;
|
||
case "resetEnemyOnPoint":
|
||
data.loc=data.loc||[];
|
||
if (!(data.loc[0] instanceof Array))
|
||
data.loc = [data.loc];
|
||
var x_str=[],y_str=[];
|
||
data.loc.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['resetEnemyOnPoint_s'].xmlText([
|
||
x_str.join(','),y_str.join(','), data.floorId||'',data.norefresh||false,this.next]);
|
||
break;
|
||
case "moveEnemyOnPoint":
|
||
data.from=data.from||['','']
|
||
if (data.dxy) {
|
||
this.next = MotaActionBlocks['moveEnemyOnPoint_1_s'].xmlText([
|
||
data.from[0], data.from[1], data.dxy[0], data.dxy[1], data.floorId||'',data.norefresh||false,this.next]);
|
||
} else {
|
||
data.to=data.to||['','']
|
||
this.next = MotaActionBlocks['moveEnemyOnPoint_s'].xmlText([
|
||
data.from[0], data.from[1], data.to[0], data.to[1], data.floorId||'',data.norefresh||false,this.next]);
|
||
}
|
||
break;
|
||
case "setEquip":
|
||
this.next = MotaActionBlocks['setEquip_s'].xmlText([
|
||
MotaActionFunctions.replaceToName_token(data.id), data.valueType||'value', data.name, data["operator"]||'=', this.expandEvalBlock([data.value]), this.next]);
|
||
break;
|
||
case "setFloor":
|
||
this.next = MotaActionBlocks['setFloor_s'].xmlText([
|
||
data.name, data.floorId||null, JSON.stringify(data.value), this.next]);
|
||
break;
|
||
case "setGlobalAttribute":
|
||
this.next = MotaActionBlocks['setGlobalAttribute_s'].xmlText([
|
||
data.name, data.value, this.next]);
|
||
break;
|
||
case "setGlobalValue":
|
||
this.next = MotaActionBlocks['setGlobalValue_s'].xmlText([
|
||
data.name, data.value, this.next]);
|
||
break;
|
||
case "setGlobalFlag":
|
||
this.next = MotaActionBlocks['setGlobalFlag_s'].xmlText([
|
||
data.name, data.value, this.next]);
|
||
break;
|
||
case "setNameMap":
|
||
this.next = MotaActionBlocks['setNameMap_s'].xmlText([
|
||
data.name, data.value, this.next]);
|
||
break;
|
||
case "input":
|
||
this.next = MotaActionBlocks['input_s'].xmlText([
|
||
data.text,this.next]);
|
||
break;
|
||
case "input2":
|
||
this.next = MotaActionBlocks['input2_s'].xmlText([
|
||
data.text,this.next]);
|
||
break;
|
||
case "if": // 条件判断
|
||
if (data["false"]) {
|
||
this.next = MotaActionFunctions.xmlText('if_s', [
|
||
this.expandEvalBlock([data.condition]),
|
||
this.insertActionList(data["true"]),
|
||
this.insertActionList(data["false"]),
|
||
this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
}
|
||
else {
|
||
this.next = MotaActionFunctions.xmlText('if_1_s', [
|
||
this.expandEvalBlock([data.condition]),
|
||
this.insertActionList(data["true"]),
|
||
this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
}
|
||
break;
|
||
case "confirm": // 显示确认框
|
||
this.next = MotaActionFunctions.xmlText('confirm_s', [
|
||
this.EvalString_Multi(data.text), data.timeout||0, data["default"],
|
||
this.insertActionList(data["yes"]),
|
||
this.insertActionList(data["no"]),
|
||
this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "switch": // 多重条件分歧
|
||
var case_caseList = null;
|
||
for(var ii=data.caseList.length-1,caseNow;caseNow=data.caseList[ii];ii--) {
|
||
case_caseList=MotaActionFunctions.xmlText('switchCase', [
|
||
this.isset(caseNow.case)?this.expandEvalBlock([caseNow.case]):"值",caseNow.nobreak,this.insertActionList(caseNow.action),case_caseList],
|
||
/* isShadow */false, /*comment*/ null, /*collapsed*/ caseNow._collapsed, /*disabled*/ caseNow._disabled);
|
||
}
|
||
this.next = MotaActionFunctions.xmlText('switch_s', [
|
||
this.expandEvalBlock([data.condition]),
|
||
case_caseList,this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "choices": // 提供选项
|
||
var text_choices = null;
|
||
for(var ii=data.choices.length-1,choice;choice=data.choices[ii];ii--) {
|
||
choice.color = this.Colour(choice.color);
|
||
text_choices=MotaActionFunctions.xmlText('choicesContext', [
|
||
choice.text,choice.icon,choice.color,'rgba('+choice.color+')',choice.need||'',choice.condition||'',this.insertActionList(choice.action),text_choices],
|
||
/* isShadow */false, /*comment*/ null, /*collapsed*/ choice._collapsed, /*disabled*/ choice._disabled);
|
||
}
|
||
if (!this.isset(data.text)) data.text = '';
|
||
var info = this.getTitleAndPosition(data.text);
|
||
this.next = MotaActionFunctions.xmlText('choices_s', [
|
||
info[3],info[0],info[1],data.timeout||0,data.width,text_choices,this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "for": // 循环遍历
|
||
this.next = MotaActionFunctions.xmlText('for_s',[
|
||
this.expandEvalBlock([data.name]),
|
||
data.from || 0, data.to || 0, data.step || 0,
|
||
this.insertActionList(data.data),
|
||
this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "forEach": // 循环遍历列表
|
||
this.next = MotaActionFunctions.xmlText('forEach_s',[
|
||
this.expandEvalBlock([data.name]),
|
||
JSON.stringify(data.list),
|
||
this.insertActionList(data.data),
|
||
this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "while": // 前置条件循环处理
|
||
this.next = MotaActionFunctions.xmlText('while_s',[
|
||
this.expandEvalBlock([data.condition]),
|
||
this.insertActionList(data.data),
|
||
this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "dowhile": // 后置条件循环处理
|
||
this.next = MotaActionFunctions.xmlText('dowhile_s',[
|
||
this.insertActionList(data.data),
|
||
this.expandEvalBlock([data.condition]),
|
||
this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "break": // 跳出循环
|
||
this.next = MotaActionBlocks['break_s'].xmlText([
|
||
data.n || 1, this.next]);
|
||
break;
|
||
case "continue": // 继续执行当前循环
|
||
this.next = MotaActionBlocks['continue_s'].xmlText([
|
||
data.n || 1, this.next]);
|
||
break;
|
||
case "win":
|
||
this.next = MotaActionBlocks['win_s'].xmlText([
|
||
data.reason,data.norank?true:false,data.noexit?true:false,this.next]);
|
||
break;
|
||
case "lose":
|
||
this.next = MotaActionBlocks['lose_s'].xmlText([
|
||
data.reason,this.next]);
|
||
break;
|
||
case "restart":
|
||
this.next = MotaActionBlocks['restart_s'].xmlText([
|
||
this.next]);
|
||
break;
|
||
case "function":
|
||
var func = data["function"];
|
||
func=func.split('{').slice(1).join('{').split('}').slice(0,-1).join('}').trim().split('\n').join('\\n');
|
||
this.next = MotaActionBlocks['function_s'].xmlText([
|
||
data.async||false,func,this.next]);
|
||
break;
|
||
case "update":
|
||
this.next = MotaActionBlocks['update_s'].xmlText([
|
||
this.doNotCheckAutoEvents||false, this.next]);
|
||
break;
|
||
case "showStatusBar":
|
||
this.next = MotaActionBlocks['showStatusBar_s'].xmlText([
|
||
this.next]);
|
||
break;
|
||
case "hideStatusBar":
|
||
this.next = MotaActionBlocks['hideStatusBar_s'].xmlText([
|
||
data.toolbox||false,this.next]);
|
||
break;
|
||
case "setHeroOpacity":
|
||
this.next = MotaActionBlocks['setHeroOpacity_s'].xmlText([
|
||
data.opacity, data.moveMode, data.time, data.async||false, this.next]);
|
||
break;
|
||
case "sleep": // 等待多少毫秒
|
||
this.next = MotaActionBlocks['sleep_s'].xmlText([
|
||
data.time||0,data.noSkip||false,this.next]);
|
||
break;
|
||
case "wait": // 等待用户操作
|
||
var case_waitList = null;
|
||
if (data.data) {
|
||
for(var ii=data.data.length-1,caseNow;caseNow=data.data[ii];ii--) {
|
||
if (caseNow["case"] == "keyboard") {
|
||
case_waitList = MotaActionFunctions.xmlText('waitContext_1',[
|
||
caseNow.keycode || "0", caseNow["break"] || false, this.insertActionList(caseNow.action), case_waitList
|
||
], /* isShadow */false, /*comment*/ null, /*collapsed*/ caseNow._collapsed, /*disabled*/ caseNow._disabled);
|
||
} else if (caseNow["case"] == "mouse") {
|
||
case_waitList = MotaActionFunctions.xmlText('waitContext_2',[
|
||
caseNow.px[0], caseNow.px[1], caseNow.py[0], caseNow.py[1], caseNow["break"] || false, this.insertActionList(caseNow.action), case_waitList
|
||
], /* isShadow */false, /*comment*/ null, /*collapsed*/ caseNow._collapsed, /*disabled*/ caseNow._disabled);
|
||
} else if (caseNow["case"] == "condition") {
|
||
case_waitList = MotaActionFunctions.xmlText('waitContext_3',[
|
||
this.expandEvalBlock([caseNow.condition]), caseNow["break"] || false, this.insertActionList(caseNow.action), case_waitList
|
||
], /* isShadow */false, /*comment*/ null, /*collapsed*/ caseNow._collapsed, /*disabled*/ caseNow._disabled);
|
||
} else if (caseNow["case"] == "timeout") {
|
||
case_waitList = MotaActionFunctions.xmlText('waitContext_4',[
|
||
caseNow["break"] || false, this.insertActionList(caseNow.action), case_waitList
|
||
], /* isShadow */false, /*comment*/ null, /*collapsed*/ caseNow._collapsed, /*disabled*/ caseNow._disabled);
|
||
}
|
||
}
|
||
}
|
||
this.next = MotaActionFunctions.xmlText('wait_s',[
|
||
data.forceChild||false,data.timeout||0,case_waitList, this.next], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "waitAsync": // 等待所有异步事件执行完毕
|
||
this.next = MotaActionBlocks['waitAsync_s'].xmlText([
|
||
data.excludeAnimates||false, data.includeSounds||false, this.next]);
|
||
break;
|
||
case "stopAsync": // 立刻停止所有异步事件
|
||
this.next = MotaActionBlocks['stopAsync_s'].xmlText([
|
||
this.next]);
|
||
break;
|
||
case "callBook": // 呼出怪物手册
|
||
this.next = MotaActionBlocks['callBook_s'].xmlText([
|
||
this.next]);
|
||
break;
|
||
case "callSave": // 呼出存档界面
|
||
this.next = MotaActionBlocks['callSave_s'].xmlText([
|
||
this.next]);
|
||
break;
|
||
case "autoSave": // 自动存档
|
||
this.next = MotaActionBlocks['autoSave_s'].xmlText([
|
||
data.removeLast||false, this.next]);
|
||
break;
|
||
case "forbidSave": // 禁止存档
|
||
this.next = MotaActionBlocks['forbidSave_s'].xmlText([
|
||
data.forbid||false, this.next]);
|
||
break;
|
||
case "callLoad": // 呼出读档界面
|
||
this.next = MotaActionBlocks['callLoad_s'].xmlText([
|
||
this.next]);
|
||
break;
|
||
case "exit": // 立刻结束事件
|
||
this.next = MotaActionBlocks['exit_s'].xmlText([
|
||
this.next]);
|
||
break;
|
||
case "previewUI": // UI绘制预览
|
||
this.next = MotaActionFunctions.xmlText('previewUI_s',[
|
||
this.insertActionList(data.action), this.next
|
||
], /* isShadow */false, /*comment*/ null, /*collapsed*/ data._collapsed, /*disabled*/ data._disabled);
|
||
break;
|
||
case "clearMap": // 清除画布
|
||
this.next = MotaActionBlocks['clearMap_s'].xmlText([
|
||
data.x, data.y, data.width, data.height, this.next
|
||
]);
|
||
break;
|
||
case "setAttribute": // 设置画布属性
|
||
data.fillStyle=this.Colour(data.fillStyle);
|
||
data.strokeStyle=this.Colour(data.strokeStyle);
|
||
this.next = MotaActionBlocks['setAttribute_s'].xmlText([
|
||
data.font,data.fillStyle,'rgba('+data.fillStyle+')',data.strokeStyle,'rgba('+data.strokeStyle+')',
|
||
data.lineWidth,data.alpha,data.align,data.baseline,data.z,this.next]);
|
||
break;
|
||
case "setFilter":
|
||
this.next = MotaActionBlocks['setFilter_s'].xmlText([
|
||
data.blur, data.hue, data.grayscale, data.invert||false, data.shadow, this.next]);
|
||
break;
|
||
case "fillText": // 绘制一行文本
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['fillText_s'].xmlText([
|
||
data.x, data.y, data.style, 'rgba('+data.style+')', data.font, data.maxWidth, this.EvalString(data.text), this.next
|
||
]);
|
||
break;
|
||
case "fillBoldText": // 绘制一行描边文本
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['fillBoldText_s'].xmlText([
|
||
data.x, data.y, data.style, 'rgba('+data.style+')', data.strokeStyle, 'rgba('+(data.strokeStyle||"0,0,0,1")+')',
|
||
data.font, this.EvalString(data.text), this.next
|
||
]);
|
||
break;
|
||
case "drawTextContent": // 绘制多行文本
|
||
data.color = this.Colour(data.color);
|
||
this.next = MotaActionBlocks['drawTextContent_s'].xmlText([
|
||
this.EvalString_Multi(data.text), data.left, data.top, data.maxWidth, data.color, 'rgba('+data.color+')',
|
||
data.align, data.fontSize, data.lineHeight, data.bold, this.next
|
||
]);
|
||
break;
|
||
case "fillRect": // 绘制矩形
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['fillRect_s'].xmlText([
|
||
data.x, data.y, data.width, data.height, data.radius, data.angle, data.style, 'rgba('+data.style+')', this.next
|
||
]);
|
||
break;
|
||
case "strokeRect": // 绘制矩形边框
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['strokeRect_s'].xmlText([
|
||
data.x, data.y, data.width, data.height, data.radius, data.angle, data.style, 'rgba('+data.style+')', data.lineWidth, this.next
|
||
]);
|
||
break;
|
||
case "drawLine": // 绘制线段
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['drawLine_s'].xmlText([
|
||
data.x1, data.y1, data.x2, data.y2, data.style, 'rgba('+data.style+')', data.lineWidth, this.next
|
||
]);
|
||
break;
|
||
case "drawArrow": // 绘制线段
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['drawArrow_s'].xmlText([
|
||
data.x1, data.y1, data.x2, data.y2, data.style, 'rgba('+data.style+')', data.lineWidth, this.next
|
||
]);
|
||
break;
|
||
case "fillPolygon": // 绘制多边形
|
||
data.style = this.Colour(data.style);
|
||
var x_str=[],y_str=[];
|
||
data.nodes.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['fillPolygon_s'].xmlText([
|
||
x_str.join(','), y_str.join(','), data.style, 'rgba('+data.style+')', this.next
|
||
]);
|
||
break;
|
||
case "strokePolygon": // 绘制多边形
|
||
data.style = this.Colour(data.style);
|
||
var x_str=[],y_str=[];
|
||
data.nodes.forEach(function (t) {
|
||
x_str.push(t[0]);
|
||
y_str.push(t[1]);
|
||
})
|
||
this.next = MotaActionBlocks['strokePolygon_s'].xmlText([
|
||
x_str.join(','), y_str.join(','), data.style, 'rgba('+data.style+')', data.lineWidth, this.next
|
||
]);
|
||
break;
|
||
case "fillEllipse": // 绘制椭圆
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['fillEllipse_s'].xmlText([
|
||
data.x, data.y, data.a, data.b, data.angle, data.style, 'rgba('+data.style+')', this.next
|
||
]);
|
||
break;
|
||
case "strokeEllipse": // 绘制椭圆边框
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['strokeEllipse_s'].xmlText([
|
||
data.x, data.y, data.a, data.b, data.angle, data.style, 'rgba('+data.style+')', data.lineWidth, this.next
|
||
]);
|
||
break;
|
||
case "fillArc": // 绘制弧
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['fillArc_s'].xmlText([
|
||
data.x, data.y, data.r, data.start, data.end, data.style, 'rgba('+data.style+')', this.next
|
||
]);
|
||
break;
|
||
case "strokeArc": // 绘制弧
|
||
data.style = this.Colour(data.style);
|
||
this.next = MotaActionBlocks['strokeArc_s'].xmlText([
|
||
data.x, data.y, data.r, data.start, data.end, data.style, 'rgba('+data.style+')', data.lineWidth, this.next
|
||
]);
|
||
break;
|
||
case "drawImage": // 绘制图片
|
||
if (data.x1 != null && data.y1 != null && data.w1 != null && data.h1 != null) {
|
||
this.next = MotaActionBlocks['drawImage_1_s'].xmlText([
|
||
data.image, data.reverse, data.x, data.y, data.w, data.h, data.x1, data.y1, data.w1, data.h1, data.angle, this.next
|
||
]);
|
||
}
|
||
else {
|
||
this.next = MotaActionBlocks['drawImage_s'].xmlText([
|
||
data.image, data.reverse, data.x, data.y, data.w, data.h, data.angle, this.next
|
||
]);
|
||
}
|
||
break;
|
||
case "drawIcon": // 绘制图标
|
||
this.next = MotaActionBlocks['drawIcon_s'].xmlText([
|
||
data.id, data.frame||0, data.x, data.y, data.width, data.height, this.next
|
||
]);
|
||
break;
|
||
case "drawBackground": // 绘制背景
|
||
if (!/^\w+\.png$/.test(data.background))
|
||
data.background=this.Colour(data.background);
|
||
this.next = MotaActionBlocks['drawBackground_s'].xmlText([
|
||
data.background, 'rgba('+data.background+')', data.x, data.y, data.width, data.height, this.next
|
||
]);
|
||
break;
|
||
case "drawSelector": // 绘制光标
|
||
if (data.image) {
|
||
this.next = MotaActionBlocks['drawSelector_s'].xmlText([
|
||
data.image, data.code, data.x, data.y, data.width, data.height, this.next
|
||
]);
|
||
}
|
||
else {
|
||
this.next = MotaActionBlocks['drawSelector_1_s'].xmlText([data.code, this.next]);
|
||
}
|
||
case "animateImage": // 兼容 animateImage
|
||
break;
|
||
default:
|
||
this.next = MotaActionBlocks['unknown_s'].xmlText([
|
||
JSON.stringify(data),this.next]);
|
||
}
|
||
this.parseAction();
|
||
return;
|
||
}
|
||
|
||
////// 往当前事件列表之后添加一个事件组 //////
|
||
ActionParser.prototype.insertActionList = function (actionList) {
|
||
if (actionList.length===0) return null;
|
||
this.event.data.list.push({"type": "_next", "next": this.next});
|
||
this.event.data.list=this.event.data.list.concat(actionList);
|
||
this.next = null;
|
||
this.parseAction();
|
||
return this.result;
|
||
}
|
||
|
||
////// 判断某对象是否不为undefined也不会null //////
|
||
ActionParser.prototype.isset = function (val) {
|
||
if (val === undefined || val === null) {
|
||
return false;
|
||
}
|
||
return true
|
||
}
|
||
|
||
ActionParser.prototype.StepString = function(steplist) {
|
||
var stepchar = {
|
||
'up': '上',
|
||
'down': '下',
|
||
'left': '左',
|
||
'right': '右',
|
||
'forward': '前',
|
||
'backward': '后'
|
||
}
|
||
var StepString = '';
|
||
var last = null, number = 0;
|
||
steplist.forEach(function (v) {
|
||
if (v != last) {
|
||
if (last != null) {
|
||
StepString += stepchar[last];
|
||
if (number > 1) StepString += number;
|
||
}
|
||
last = v;
|
||
number = 1;
|
||
} else {
|
||
number++;
|
||
}
|
||
});
|
||
if (last != null) {
|
||
StepString += stepchar[last];
|
||
if (number > 1) StepString += number;
|
||
}
|
||
return StepString;
|
||
}
|
||
|
||
ActionParser.prototype.EvalString = function(EvalString) {
|
||
return EvalString.split('\b').join('\\b').split('\t').join('\\t').split('\n').join('\\n');
|
||
}
|
||
|
||
ActionParser.prototype.EvalString_Multi = function(EvalString) {
|
||
return EvalString.split('\b').join('\\b').split('\t').join('\\t');
|
||
}
|
||
|
||
ActionParser.prototype.getTitleAndPosition = function (string) {
|
||
string = this.EvalString_Multi(string);
|
||
var title = '', icon = '', position = '';
|
||
string = string.replace(/\\t\[(([^\],]+),)?([^\],]+)\]/g, function (s0, s1, s2, s3) {
|
||
if (s3) title = s3;
|
||
if (s2) { icon = s3; title = s2; }
|
||
if (icon && !/^(.*)\.(jpg|jpeg|png)$/.test(icon)
|
||
&& !/^[0-9a-zA-Z_][0-9a-zA-Z_:]*$/.test(icon)) { title += "," + icon; icon = ''; }
|
||
return "";
|
||
}).replace(/\\b\[(.*?)\]/g, function (s0, s1) {
|
||
position = s1; return "";
|
||
});
|
||
return [title, icon, position, string];
|
||
}
|
||
|
||
ActionParser.prototype.Colour = function(color) {
|
||
return color?JSON.stringify(color).slice(1,-1):null;
|
||
}
|
||
|
||
ActionParser.prototype.matchId = function(args) {
|
||
var rt=function(xml,args){
|
||
// 此处刻意不写成 xml:MotaActionBlocks[str].xmlText 来方便搜索
|
||
return {ret:true,xml:xml,args:args}
|
||
}
|
||
var match = /nothing/.exec('nothing')
|
||
// 固定列表
|
||
var FixedId_List=MotaActionBlocks['FixedId_List'].options; // [["生命", "status:hp"], ...]
|
||
match=new RegExp('^('+FixedId_List.map(function(v){return v[1]}).join('|')+')$').exec(args[0])
|
||
if(match){
|
||
return rt(MotaActionBlocks['idFixedList_e'].xmlText, args);
|
||
}
|
||
// 独立开关
|
||
match=/^switch:([A-Z])$/.exec(args[0])
|
||
if(match){
|
||
args[0]=match[1]
|
||
return rt(MotaActionBlocks['idFlag_e'].xmlText, args);
|
||
}
|
||
// 临时变量
|
||
match=/^temp:([A-Z])$/.exec(args[0])
|
||
if(match){
|
||
args[0]=match[1]
|
||
return rt(MotaActionBlocks['idTemp_e'].xmlText, args);
|
||
}
|
||
// id列表
|
||
var Id_List = MotaActionBlocks['Id_List'].options; // [["变量", "flag"], ...]
|
||
match=new RegExp('^('+Id_List.map(function(v){return v[1]}).join('|')+'):([a-zA-Z0-9_\\u4E00-\\u9FCC\\u3040-\\u30FF\\u2160-\\u216B\\u0391-\\u03C9]+)$').exec(args[0])
|
||
if(match){
|
||
if (match[1] == 'status' || match[1] == 'item' || match[1] == 'buff') {
|
||
match[2] = MotaActionFunctions.replaceToName_token(match[2]);
|
||
}
|
||
args=[match[1],match[2]]
|
||
return rt(MotaActionBlocks['idIdList_e'].xmlText, args);
|
||
}
|
||
return {ret:false}
|
||
}
|
||
|
||
ActionParser.prototype.matchEvalAtom = function(args) {
|
||
var rt=function(xml,args){
|
||
// 此处刻意不写成 xml:MotaActionBlocks[str].xmlText 来方便搜索
|
||
return {ret:true,xml:xml,args:args}
|
||
}
|
||
var match = /nothing/.exec('nothing')
|
||
// 勾选框
|
||
match = /^(true|false)$/.exec(args[0])
|
||
if(match){
|
||
args[0]='true'==args[0];
|
||
return rt(MotaActionBlocks['bool_e'].xmlText, args);
|
||
}
|
||
// 怪物属性
|
||
var EnemyId_List=MotaActionBlocks['EnemyId_List'].options; // [["生命", "hp"], ...]
|
||
match=new RegExp("^enemy:([a-zA-Z0-9_]+):(" + EnemyId_List.map(function(v){return v[1]}).join('|') + ")$").exec(args[0])
|
||
if(match){
|
||
args=[MotaActionFunctions.replaceToName_token(match[1]),match[2]]
|
||
return rt(MotaActionBlocks['enemyattr_e'].xmlText, args);
|
||
}
|
||
// 图块ID
|
||
match=/^blockId:(-?\d+),(-?\d+)$/.exec(args[0])
|
||
if(match){
|
||
args=[match[1],match[2]]
|
||
return rt(MotaActionBlocks['blockId_e'].xmlText, args);
|
||
}
|
||
// 图块数字
|
||
match=/^blockNumber:(-?\d+),(-?\d+)$/.exec(args[0])
|
||
if(match){
|
||
args=[match[1],match[2]]
|
||
return rt(MotaActionBlocks['blockNumber_e'].xmlText, args);
|
||
}
|
||
// 图块类别
|
||
match=/^blockCls:(-?\d+),(-?\d+)$/.exec(args[0])
|
||
if(match){
|
||
args=[match[1],match[2]]
|
||
return rt(MotaActionBlocks['blockCls_e'].xmlText, args);
|
||
}
|
||
// 装备孔
|
||
match=/^equip:(-?\d+)$/.exec(args[0])
|
||
if(match){
|
||
args[0]=match[1]
|
||
return rt(MotaActionBlocks['equip_e'].xmlText, args);
|
||
}
|
||
match=/^core\.isReplaying\(\)$/.exec(args[0]);
|
||
if (match) {
|
||
return rt(MotaActionBlocks['isReplaying_e'].xmlText, args);
|
||
}
|
||
match=/^core\.(nextX|nextY)\((-?\d*)\)$/.exec(args[0]);
|
||
if (match) {
|
||
if (match[2] == "") match[2] = "1";
|
||
args=[match[2], match[1]];
|
||
return rt(MotaActionBlocks['nextXY_e'].xmlText, args);
|
||
}
|
||
match=/^core\.hasVisitedFloor\(['"](.*?)['"']\)$/.exec(args[0]);
|
||
if (match) {
|
||
args[0]=match[1];
|
||
return rt(MotaActionBlocks['hasVisitedFloor_e'].xmlText, args);
|
||
}
|
||
match=/^core\.isShopVisited\(['"](.*?)['"']\)$/.exec(args[0]);
|
||
if (match) {
|
||
args[0]=match[1];
|
||
return rt(MotaActionBlocks['isShopVisited_e'].xmlText, args);
|
||
}
|
||
match=/^core\.hasEquip\(['"](.*?)['"']\)$/.exec(args[0]);
|
||
if (match) {
|
||
args[0]=match[1];
|
||
return rt(MotaActionBlocks['hasEquip_e'].xmlText, args);
|
||
}
|
||
match=/^core\.canBattle\(['"](.*?)['"']\)$/.exec(args[0]);
|
||
if (match) {
|
||
args[0]=match[1];
|
||
return rt(MotaActionBlocks['canBattle_e'].xmlText, args);
|
||
}
|
||
match=/^core\.rand\((\d+)\)$/.exec(args[0]);
|
||
if (match) {
|
||
args[0]=match[1];
|
||
return rt(MotaActionBlocks['rand_e'].xmlText, args);
|
||
}
|
||
return {ret:false}
|
||
}
|
||
|
||
ActionParser.prototype.matchEvalCompare=function(args, isShadow){
|
||
if (MotaActionFunctions.disableExpandCompare) return {ret:false};
|
||
var raw=args[0].replace(/>/g,'>').replace(/</g,'<').replace(/"/g,'"').replace(/ /g,' ').replace(/&/g,'&')
|
||
if (raw[0]+raw.slice(-1)=='()') raw=raw.slice(1,-1);
|
||
var str=raw
|
||
var xml=MotaActionBlocks['expression_arithmetic_0'].xmlText
|
||
if (!/<=|<|>=|>|==|!=|===|!==|&&|\|\|/.exec(str)) return {ret:false};
|
||
str=str.replace(/[^<>=!()&|]/g,' ')
|
||
// 处理括号匹配
|
||
var old;
|
||
do {
|
||
old=str;
|
||
str=str.replace(/\([^()]*\)/g,function(v){return Array.from({length:v.length+1}).join(' ')})
|
||
} while (old!=str);
|
||
// 按优先级依次寻找以下符号
|
||
var oplist=['<','<=','>','>=','==','!=','===','!==','&&','||'].reverse()
|
||
for (var index = 0,op; op=oplist[index]; index++) {
|
||
var match=new RegExp(' '+(op=='||'?'\\|\\|':op)+' ').exec(str)
|
||
if (!match) continue;
|
||
args=[this.expandEvalBlock([raw.slice(0,match.index+1)],isShadow),op.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'),this.expandEvalBlock([raw.slice(match.index+1+op.length)],isShadow)]
|
||
return {ret:true,xml:xml,args:args}
|
||
}
|
||
return {ret:false}
|
||
}
|
||
|
||
ActionParser.prototype.expandIdBlock = function(args, isShadow, comment) {
|
||
args[0]=MotaActionFunctions.replaceFromName(args[0])
|
||
var xml=MotaActionBlocks['idString_e'].xmlText
|
||
var ret=this.matchId(args)
|
||
if (ret.ret){
|
||
xml=ret.xml;
|
||
args=ret.args;
|
||
} else {
|
||
for (var index = 0; index < args.length; index++) {
|
||
args[index]=MotaActionFunctions.replaceToName(args[index])
|
||
}
|
||
}
|
||
return xml(args, isShadow, comment);
|
||
}
|
||
|
||
ActionParser.prototype.expandEvalBlock = function(args, isShadow, comment) {
|
||
args[0]=MotaActionFunctions.replaceFromName(args[0])
|
||
var xml=MotaActionBlocks['evalString_e'].xmlText
|
||
if (args[0].indexOf('\n') >= 0 || args[0].indexOf('\\n') >= 0) return xml(args, isShadow, comment);
|
||
var ret=this.matchId(args)
|
||
if (ret.ret){
|
||
xml=ret.xml;
|
||
args=ret.args;
|
||
} else if( (ret=this.matchEvalAtom(args)).ret ){
|
||
xml=ret.xml;
|
||
args=ret.args;
|
||
} else if(/^(!.*|\(!.*\))$/.exec(args[0])){
|
||
// 非
|
||
xml=MotaActionBlocks['negate_e'].xmlText
|
||
var content=args[0][0]=='!'?args[0].slice(1):args[0].slice(2,-1)
|
||
args[0]=this.expandEvalBlock([content],isShadow)
|
||
} else if( (ret=this.matchEvalCompare(args, isShadow)).ret ){
|
||
// 大小比较
|
||
xml=ret.xml;
|
||
args=ret.args;
|
||
} else {
|
||
for (var index = 0; index < args.length; index++) {
|
||
args[index]=MotaActionFunctions.replaceToName(args[index])
|
||
}
|
||
}
|
||
return xml(args, isShadow, comment);
|
||
}
|
||
|
||
MotaActionFunctions.actionParser = new ActionParser();
|
||
|
||
MotaActionFunctions.workspace = function(){return workspace}
|
||
|
||
MotaActionFunctions.parse = function(obj,type) {
|
||
try {
|
||
obj = obj.map(function (e) {
|
||
if (e.type == "function") return e;
|
||
else return JSON.parse(MotaActionFunctions.replaceToName(JSON.stringify(e)));
|
||
});
|
||
} catch (e) { }
|
||
MotaActionFunctions.workspace().clear();
|
||
xml_text = MotaActionFunctions.actionParser.parse(obj, type || 'event');
|
||
xml = Blockly.Xml.textToDom('<xml>' + xml_text + '</xml>');
|
||
Blockly.Xml.domToWorkspace(xml, MotaActionFunctions.workspace());
|
||
}
|
||
|
||
MotaActionFunctions.EvalString_pre = function(EvalString){
|
||
if (EvalString.indexOf('__door__')!==-1) throw new Error('请修改开门变量__door__,如door1,door2,door3等依次向后。请勿存在两个门使用相同的开门变量。');
|
||
EvalString = MotaActionFunctions.replaceFromName(EvalString);
|
||
return EvalString.replace(/([^\\])"/g,'$1\\"').replace(/^"/g,'\\"').replace(/""/g,'"\\"');
|
||
}
|
||
|
||
MotaActionFunctions.EvalString_Multi_pre = function(EvalString){
|
||
if (EvalString.indexOf('__door__')!==-1) throw new Error('请修改开门变量__door__,如door1,door2,door3等依次向后。请勿存在两个门使用相同的开门变量。');
|
||
EvalString = MotaActionFunctions.replaceFromName(EvalString);
|
||
return EvalString.replace(/([^\\])"/g,'$1\\"').replace(/^"/g,'\\"').replace(/""/g,'"\\"').replace(/\n/g, '\\n');
|
||
}
|
||
|
||
MotaActionFunctions.JsonEvalString_pre = function (JsonEvalString) {
|
||
if (JsonEvalString == '') return '';
|
||
JsonEvalString = MotaActionFunctions.replaceFromName(JsonEvalString);
|
||
try {
|
||
return JSON.stringify(JSON.parse(JsonEvalString));
|
||
} catch (e) {
|
||
throw new Error('此处需要填写一个合法的JSON内容');
|
||
}
|
||
}
|
||
|
||
MotaActionFunctions.IntString_pre = function (IntString) {
|
||
if (!/^[+-]?\d*$/.test(IntString)) throw new Error('此项必须是整数或不填');
|
||
return IntString;
|
||
}
|
||
|
||
MotaActionFunctions.IdString_pre = function(IdString){
|
||
if (IdString.indexOf('__door__')!==-1) throw new Error('请修改开门变量__door__,如door1,door2,door3等依次向后。请勿存在两个门使用相同的开门变量。');
|
||
IdString = MotaActionFunctions.replaceFromName(IdString);
|
||
IdString = MotaActionFunctions.replaceFromName_token(IdString);
|
||
if (IdString && !(MotaActionFunctions.pattern.id.test(IdString)) && !(MotaActionFunctions.pattern.idWithoutFlag.test(IdString)))
|
||
throw new Error('id: '+IdString+'中包含了0-9 a-z A-Z _ - :之外的字符');
|
||
return IdString;
|
||
}
|
||
|
||
MotaActionFunctions.PosString_pre = function(PosString){
|
||
if (!PosString || /^-?\d+$/.test(PosString)) return PosString;
|
||
//if (!(MotaActionFunctions.pattern.id.test(PosString)))throw new Error(PosString+'中包含了0-9 a-z A-Z _ 和中文之外的字符,或者是没有以flag: 开头');
|
||
var comma = PosString.indexOf(',');
|
||
if (comma >= 0 && PosString.substring(0, comma).indexOf('(') < 0) throw '此处不可写多点坐标';
|
||
return '"'+MotaActionFunctions.replaceFromName(PosString)+'"';
|
||
}
|
||
|
||
MotaActionFunctions.processMoveDirections = function (steps) {
|
||
var curr = null, num = null;
|
||
var result = [];
|
||
steps.forEach(function (one) {
|
||
var v = one.split(':');
|
||
if (v.length == 1) v.push("1");
|
||
if (v[0] != curr) {
|
||
if (curr != null) result.push(curr+":"+num);
|
||
curr = v[0];
|
||
num = parseInt(v[1]);
|
||
} else {
|
||
num += parseInt(v[1]);
|
||
}
|
||
});
|
||
if (curr != null) result.push(curr+":"+num);
|
||
return result;
|
||
}
|
||
|
||
MotaActionFunctions.processMultiLoc = function (EvalString_0, EvalString_1) {
|
||
var floorstr = '';
|
||
if (EvalString_0 && EvalString_1) {
|
||
var x = EvalString_0, y = EvalString_1;
|
||
var pattern = /^([+-]?\d+)(, ?[+-]?\d+)*$/;
|
||
if (pattern.test(x) && pattern.test(y) && x.split(',').length == y.split(',').length) {
|
||
x=x.split(',');
|
||
y=y.split(',');
|
||
for(var ii=0;ii<x.length;ii++) x[ii]='['+x[ii].trim()+','+y[ii].trim()+']';
|
||
floorstr = ', "loc": ['+x.join(',')+']';
|
||
}
|
||
if (floorstr == '') {
|
||
floorstr = ', "loc": ["'+x+'","'+y+'"]';
|
||
}
|
||
}
|
||
return floorstr;
|
||
}
|
||
|
||
MotaActionFunctions.StepString_pre = function(StepString){
|
||
//StepString='上右3下2左上左2'
|
||
var route = StepString.replace(/上/g,'U').replace(/下/g,'D').replace(/左/g,'L').replace(/右/g,'R').replace(/前/g,'F').replace(/后/g,'B');
|
||
|
||
//copyed from core.js
|
||
var ans=[], index=0;
|
||
|
||
var isset = function(a) {
|
||
if (a == undefined || a == null) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
var getNumber = function (noparse) {
|
||
var num="";
|
||
while (index<route.length && !isNaN(route.charAt(index))) {
|
||
num+=route.charAt(index++);
|
||
}
|
||
if (num.length==0) num="1";
|
||
return isset(noparse)?num:parseInt(num);
|
||
}
|
||
|
||
while (index<route.length) {
|
||
var c=route.charAt(index++);
|
||
var number=getNumber();
|
||
|
||
switch (c) {
|
||
case "U": for (var i=0;i<number;i++) ans.push("up"); break;
|
||
case "D": for (var i=0;i<number;i++) ans.push("down"); break;
|
||
case "L": for (var i=0;i<number;i++) ans.push("left"); break;
|
||
case "R": for (var i=0;i<number;i++) ans.push("right"); break;
|
||
case "F": for (var i=0;i<number;i++) ans.push("forward"); break;
|
||
case "B": for (var i=0;i<number;i++) ans.push("backward"); break;
|
||
}
|
||
}
|
||
return ans;
|
||
}
|
||
|
||
MotaActionFunctions.ColorString_pre = function (ColorString) {
|
||
if (ColorString && !MotaActionFunctions.pattern.colorRe.test(ColorString))
|
||
throw new Error('颜色格式错误,形如:0~255,0~255,0~255,0~1');
|
||
return ColorString;
|
||
}
|
||
|
||
MotaActionFunctions.FontString_pre = function (FontString) {
|
||
if (FontString && !MotaActionFunctions.pattern.fontRe.test(FontString))
|
||
throw new Error('字体必须是 [italic] [bold] 14px Verdana 这种形式或不填');
|
||
return FontString;
|
||
}
|
||
|
||
MotaActionFunctions.pattern=MotaActionFunctions.pattern||{};
|
||
MotaActionFunctions.pattern.id=/^(flag|global|temp):([a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+)$/;
|
||
MotaActionFunctions.pattern.idWithoutFlag=/^[0-9a-zA-Z_][0-9a-zA-Z_\-:]*$/;
|
||
MotaActionFunctions.pattern.colorRe=/^[0-9 ]+,[0-9 ]+,[0-9 ]+(,[0-9. ]+)?$/;
|
||
MotaActionFunctions.pattern.fontRe=/^(italic )?(bold )?(\d+)px ([a-zA-Z0-9_\u4E00-\u9FCC]+)$/;
|
||
|
||
|
||
MotaActionFunctions.pattern.replaceStatusList = [
|
||
// 保证顺序!
|
||
["hpmax", "生命上限"],
|
||
["hp", "生命"],
|
||
["name", "名称"],
|
||
["lv", "等级"],
|
||
["atk", "攻击"],
|
||
["def", "防御"],
|
||
["mdef", "护盾"],
|
||
["manamax", "魔力上限"],
|
||
["mana", "魔力"],
|
||
["money", "金币"],
|
||
["exp", "经验"],
|
||
["steps", "步数"],
|
||
];
|
||
|
||
|
||
(function() {
|
||
// 读道具列表
|
||
MotaActionFunctions.pattern.replaceItemList = [];
|
||
for (var id in core.material.items) {
|
||
var name = core.material.items[id].name;
|
||
if (id && name && name != '新物品' && /^[a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+$/.test(name)) {
|
||
MotaActionFunctions.pattern.replaceItemList.push([id, name]);
|
||
}
|
||
}
|
||
|
||
MotaActionFunctions.pattern.replaceEnemyList = [];
|
||
for (var id in core.material.enemys) {
|
||
var name = core.material.enemys[id].name;
|
||
if (id && name && name != '新敌人' && /^[a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+$/.test(name)) {
|
||
MotaActionFunctions.pattern.replaceEnemyList.push([id, name]);
|
||
}
|
||
}
|
||
|
||
})();
|
||
|
||
MotaActionFunctions.pattern.replaceEnemyValueList = [
|
||
// 保证顺序!
|
||
["hp", "生命"],
|
||
["name", "名称"],
|
||
["atk", "攻击"],
|
||
["def", "防御"],
|
||
["money", "金币"],
|
||
["exp", "经验"],
|
||
["point", "加点"],
|
||
["special", "属性"],
|
||
];
|
||
|
||
MotaActionFunctions.disableReplace = false;
|
||
MotaActionFunctions.disableExpandCompare = false;
|
||
|
||
MotaActionFunctions.replaceToName_token = function (str) {
|
||
if (!str || MotaActionFunctions.disableReplace) return str;
|
||
var list = [];
|
||
list=list.concat(MotaActionFunctions.pattern.replaceStatusList)
|
||
list=list.concat(MotaActionFunctions.pattern.replaceItemList)
|
||
list=list.concat(MotaActionFunctions.pattern.replaceEnemyList)
|
||
list=list.concat(MotaActionFunctions.pattern.replaceEnemyValueList)
|
||
for(var index=0,pair;pair=list[index];index++){
|
||
if (pair[0]==str) {
|
||
return pair[1]
|
||
}
|
||
}
|
||
return str;
|
||
}
|
||
|
||
MotaActionFunctions.replaceFromName_token = function (str) {
|
||
if (!str || MotaActionFunctions.disableReplace) return str;
|
||
var list = [];
|
||
list=list.concat(MotaActionFunctions.pattern.replaceStatusList)
|
||
list=list.concat(MotaActionFunctions.pattern.replaceItemList)
|
||
list=list.concat(MotaActionFunctions.pattern.replaceEnemyList)
|
||
list=list.concat(MotaActionFunctions.pattern.replaceEnemyValueList)
|
||
for(var index=0,pair;pair=list[index];index++){
|
||
if (pair[1]==str) {
|
||
return pair[0]
|
||
}
|
||
}
|
||
return str;
|
||
}
|
||
|
||
MotaActionFunctions.replaceToName = function (str) {
|
||
if (!str || MotaActionFunctions.disableReplace) return str;
|
||
var map = {}, list = [];
|
||
MotaActionFunctions.pattern.replaceStatusList.forEach(function (v) {
|
||
map[v[0]] = v[1]; list.push(v[0]);
|
||
});
|
||
str = str.replace(new RegExp("status:(" + list.join("|") + ")\\b", "g"), function (a, b) {
|
||
return map[b] ? ("状态:" + map[b]) : b;
|
||
}).replace(/status:/g, "状态:");
|
||
str = str.replace(new RegExp("buff:(" + list.join("|") + ")\\b", "g"), function (a, b) {
|
||
return map[b] ? ("增益:" + map[b]) : b;
|
||
}).replace(/buff:/g, "增益:");
|
||
map = {}; list = [];
|
||
MotaActionFunctions.pattern.replaceItemList.forEach(function (v) {
|
||
map[v[0]] = v[1]; list.push(v[0]);
|
||
});
|
||
str = str.replace(new RegExp("item:(" + list.join("|") + ")\\b", "g"), function (a, b) {
|
||
return map[b] ? ("物品:" + map[b]) : b;
|
||
}).replace(/item:/g, "物品:");
|
||
str = str.replace(/flag:/g, "变量:").replace(/switch:/g, "独立开关:").replace(/global:/g, "全局存储:");
|
||
|
||
|
||
MotaActionFunctions.pattern.replaceEnemyValueList.forEach(function (v) {
|
||
map[v[0]] = v[1]; list.push(v[0]);
|
||
});
|
||
str = str.replace(new RegExp("enemy:([a-zA-Z0-9_]+)[.:](" + list.join("|") + ")\\b", "g"), function (a, b, c) {
|
||
return map[c] ? ("enemy:" + b + ":" + map[c]) : c;
|
||
}).replace(/(enemy:[a-zA-Z0-9_]+)[.::]/g, '$1:');
|
||
|
||
map = {}; list = [];
|
||
MotaActionFunctions.pattern.replaceEnemyList.forEach(function (v) {
|
||
map[v[0]] = v[1]; list.push(v[0]);
|
||
});
|
||
str = str.replace(new RegExp("enemy:(" + list.join("|") + ")\\b", "g"), function (a, b) {
|
||
return map[b] ? ("怪物:" + map[b]) : b;
|
||
}).replace(/enemy:/g, "怪物:");
|
||
|
||
str = str.replace(/blockId:/g, "图块ID:").replace(/blockNumber:/g, "图块数字:").replace(/blockCls:/g, "图块类别:").replace(/equip:/g, "装备孔:");
|
||
return str;
|
||
}
|
||
|
||
MotaActionFunctions.replaceFromName = function (str) {
|
||
if (!str || MotaActionFunctions.disableReplace) return str;
|
||
var map = {}, list = [];
|
||
MotaActionFunctions.pattern.replaceStatusList.forEach(function (v) {
|
||
map[v[1]] = v[0]; list.push(v[1]);
|
||
});
|
||
str = str.replace(new RegExp("状态[::](" + list.join("|") + ")(?:$|(?=[^a-zA-Z0-9_\\u4E00-\\u9FCC\\u3040-\\u30FF\\u2160-\\u216B\\u0391-\\u03C9]))", "g"), function (a, b) {
|
||
return map[b] ? ("status:" + map[b]) : b;
|
||
}).replace(/状态[::]/g, "status:");
|
||
str = str.replace(new RegExp("增益[::](" + list.join("|") + ")(?:$|(?=[^a-zA-Z0-9_\\u4E00-\\u9FCC\\u3040-\\u30FF\\u2160-\\u216B\\u0391-\\u03C9]))", "g"), function (a, b) {
|
||
return map[b] ? ("buff:" + map[b]) : b;
|
||
}).replace(/增益[::]/g, "buff:");
|
||
map = {}; list = [];
|
||
MotaActionFunctions.pattern.replaceItemList.forEach(function (v) {
|
||
map[v[1]] = v[0]; list.push(v[1]);
|
||
});
|
||
str = str.replace(new RegExp("物品[::](" + list.join("|") + ")(?:$|(?=[^a-zA-Z0-9_\\u4E00-\\u9FCC\\u3040-\\u30FF\\u2160-\\u216B\\u0391-\\u03C9]))", "g"), function (a, b) {
|
||
return map[b] ? ("item:" + map[b]) : b;
|
||
}).replace(/物品[::]/g, "item:");
|
||
str = str.replace(/变量[::]/g, "flag:").replace(/独立开关[::]/g, "switch:").replace(/全局存储[::]/g, "global:");
|
||
|
||
map = {}; list = [];
|
||
MotaActionFunctions.pattern.replaceEnemyList.forEach(function (v) {
|
||
map[v[1]] = v[0]; list.push(v[1]);
|
||
});
|
||
str = str.replace(new RegExp("(enemy:|怪物[::])(" + list.join("|") + ")(?:$|(?=[^a-zA-Z0-9_\\u4E00-\\u9FCC\\u3040-\\u30FF\\u2160-\\u216B\\u0391-\\u03C9]))", "g"), function (a, b, c, d) {
|
||
return map[c] ? ("enemy:" + map[c]) : c;
|
||
}).replace(/怪物[::]/g, "enemy:");
|
||
|
||
map = {}; list = [];
|
||
MotaActionFunctions.pattern.replaceEnemyValueList.forEach(function (v) {
|
||
map[v[1]] = v[0]; list.push(v[1]);
|
||
});
|
||
str = str.replace(new RegExp("enemy:([a-zA-Z0-9_]+)[::](" + list.join("|") + ")(?:$|(?=[^a-zA-Z0-9_\\u4E00-\\u9FCC\\u3040-\\u30FF\\u2160-\\u216B\\u0391-\\u03C9]))", "g"), function (a, b, c, d) {
|
||
return map[c] ? ("enemy:" + b + ":" + map[c]) : c;
|
||
}).replace(/(enemy:[a-zA-Z0-9_]+)[::]/g, '$1:');
|
||
|
||
str = str.replace(/图块I[dD][::]/g, "blockId:").replace(/图块数字[::]/g, "blockNumber:").replace(/图块类别[::]/g, "blockCls:").replace(/装备孔[::]/g, "equip:");
|
||
|
||
return str;
|
||
}
|
||
|
||
}
|