Merge pull request #582 from nonameShijian/PR-Branch

player.when新增vars配置,尝试修复then中箭头函数不带大括号报错我问题
This commit is contained in:
Spmario233 2023-10-26 13:51:48 +08:00 committed by GitHub
commit 2b2203b0d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 48 additions and 22 deletions

View File

@ -20741,7 +20741,7 @@
this.markSkill('stratagem_fury'); this.markSkill('stratagem_fury');
} }
/** /**
* version 1.4 * version 1.6
* *
* 链式创建一次性技能的api * 链式创建一次性技能的api
* *
@ -20779,7 +20779,7 @@
//triggerNames = [ 'xxAfter', 'yyBegin' ] //triggerNames = [ 'xxAfter', 'yyBegin' ]
if(triggerNames.every(t=>typeof t=='string')) trigger={player:triggerNames}; if(triggerNames.every(t=>typeof t=='string')) trigger={player:triggerNames};
//triggerNames = [ {player: 'xxAfter'}, {global: 'yyBegin'} ] //triggerNames = [ {player: 'xxAfter'}, {global: 'yyBegin'} ]
//此处不做特殊的合并处理,由使用者自行把握 //此处不做特殊的合并处理,由使用者自行把握,同名属性后者覆盖前者
else if(triggerNames.every(t=>get.is.object(t))) trigger=triggerNames.reduce((pre,cur)=>Object.assign(pre,cur)); else if(triggerNames.every(t=>get.is.object(t))) trigger=triggerNames.reduce((pre,cur)=>Object.assign(pre,cur));
} }
if(!trigger) throw 'player.when传参数类型错误:'+triggerNames; if(!trigger) throw 'player.when传参数类型错误:'+triggerNames;
@ -20787,12 +20787,13 @@
do{ do{
skillName='player_when_'+Math.random().toString(36).slice(-8); skillName='player_when_'+Math.random().toString(36).slice(-8);
}while(lib.skill[skillName]!=null); }while(lib.skill[skillName]!=null);
let after=`${skillName}After`; const after=`${skillName}After`;
if(!trigger.player) trigger.player=after; if(!trigger.player) trigger.player=after;
else if(Array.isArray(trigger.player)) trigger.player.add(after); else if(Array.isArray(trigger.player)) trigger.player.add(after);
else if(typeof trigger.player=='string') trigger.player=[trigger.player,after]; else if(typeof trigger.player=='string') trigger.player=[trigger.player,after];
const vars={};
let skill={ let skill={
trigger, trigger:trigger,
forced:true, forced:true,
charlotte:true, charlotte:true,
popup:false, popup:false,
@ -20801,6 +20802,10 @@
//充分条件 //充分条件
filter2Funs:[], filter2Funs:[],
contentFuns:[], contentFuns:[],
//外部变量
get vars() {
return vars;
},
get filter(){ get filter(){
return (event,player,name)=>{ return (event,player,name)=>{
if(name==`${skillName}After`){ if(name==`${skillName}After`){
@ -20818,6 +20823,35 @@
}; };
} }
}; };
const warnVars=['event','step','source','player','target','targets',
'card','cards','skill','forced','num','trigger','result'];
const errVars=['_status','lib','game','ui','get','ai'];
const createContent=()=>{
let varstr='';
for (const key in vars) {
if(warnVars.includes(key)) console.warn(`Variable '${key}' should not be referenced by vars objects`);
if(errVars.includes(key)) throw new Error(`Variable '${key}' should not be referenced by vars objects`);
varstr+=`var ${key}=lib.skill['${skillName}'].vars['${key}'];\n`;
}
let str=`
function content(){
${varstr}if(event.triggername=='${skillName}After'){
player.removeSkill('${skillName}');
delete lib.skill['${skillName}'];
delete lib.translate['${skillName}'];
return event.finish();
}
`;
for(let i=0;i<skill.contentFuns.length;i++){
const fun2=skill.contentFuns[i];
const a=fun2.toString();
//防止传入()=>xxx的情况
const begin=a.indexOf("{")==a.indexOf("}")&&a.indexOf("{")==-1?a.indexOf("=>")+2:a.indexOf("{")+1;
const str2=a.slice(begin,a.lastIndexOf("}")!=-1?a.lastIndexOf("}"):undefined).trim();
str+=`'step ${i}'\n\t${str2}\n\t`;
}
skill.content=eval(str+`\n};content;`);
};
Object.defineProperty(lib.skill,skillName,{ Object.defineProperty(lib.skill,skillName,{
configurable:true, configurable:true,
//这类技能不需要被遍历到 //这类技能不需要被遍历到
@ -20834,6 +20868,7 @@
forced:true, forced:true,
charlotte:true, charlotte:true,
popup:false, popup:false,
vars:{},
} }
}); });
},skillName); },skillName);
@ -20863,23 +20898,7 @@
then(fun){ then(fun){
if(lib.skill[skillName]!=skill) throw `This skill has been destroyed`; if(lib.skill[skillName]!=skill) throw `This skill has been destroyed`;
skill.contentFuns.push(fun); skill.contentFuns.push(fun);
let str=` createContent();
function content(){
if(event.triggername=='${skillName}After'){
player.removeSkill('${skillName}');
delete lib.skill['${skillName}'];
delete lib.translate['${skillName}'];
return event.finish();
}
`;
for(let i=0;i<skill.contentFuns.length;i++){
let fun2=skill.contentFuns[i];
let a=fun2.toString();
let str2=a.slice(a.indexOf("{")+1,a.lastIndexOf("}")!=-1?a.lastIndexOf("}"):undefined).trim();
str+=`'step ${i}'\n\t${str2}\n\t`;
}
let result=eval(str+`\n};content;`);
skill.content=result;
return this; return this;
}, },
popup(str){ popup(str){
@ -20895,10 +20914,17 @@
} }
return this; return this;
}, },
assign(obj) { assign(obj){
if(lib.skill[skillName]!=skill) throw `This skill has been destroyed`; if(lib.skill[skillName]!=skill) throw `This skill has been destroyed`;
if(typeof obj=='object'&&obj!==null) Object.assign(skill,obj); if(typeof obj=='object'&&obj!==null) Object.assign(skill,obj);
return this; return this;
},
vars(arg){
if(lib.skill[skillName]!=skill) throw `This skill has been destroyed`;
if(!get.is.object(arg)) throw 'vars的第一个参数必须为对象';
Object.assign(vars,arg);
createContent();
return this;
} }
}; };
} }