From 71978abfbec9d3091457970ec33625fdab451a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E5=85=B3=E5=85=B3?= <41182947+KggFromChina@users.noreply.github.com> Date: Sat, 2 Jan 2021 14:59:00 +0000 Subject: [PATCH] =?UTF-8?q?PageSwitch.js=20=E5=A2=9E=E5=8A=A0checkCases2?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E5=AE=9E=E7=8E=B0=E5=9C=A8=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E4=B8=AD=E5=86=99=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E7=9A=84=E5=B0=9D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 针对Issue中MikanHako1024提出的条件表达式格式,增加checkCases2方法,试图实现对该格式的条件表达式的提取与处理。 Issues链接:https://github.com/heartcase/WorldEffect/issues/5#issuecomment-752147495 --- js/plugins/PageSwitch.js | 87 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/js/plugins/PageSwitch.js b/js/plugins/PageSwitch.js index 0462516..f85f431 100644 --- a/js/plugins/PageSwitch.js +++ b/js/plugins/PageSwitch.js @@ -29,6 +29,93 @@ window.PageSwitch = {}; return true; }; + /* + 2021.1.2 开关关 + 下面的checkCases2方法针对的是写成这样的注释: + + + ( A or B ) and C + A : SelfData name is "HeartCase" + B : SelfData name is "AngelHeartCase" + C : GameVariable 5 > 10086 + + + A、B、C在下面的注释中被称为标记。 + 这段代码尚未测试。 + */ + const checkCases2 = (event, page) => { + // 第一步:读取注释内容到数组 + const list = page.list; + let started = -1; + let arrayExpression = []; + for (let i = 0; i < list.length; i++) { + if (started == -1) { + if(list[i].code == 108 && list[i].parameters[0].search('') != -1) { + started = i; + } + } else { + if(list[i].code == 400 || 108) { + if (list[i].parameters[0].search('') != -1) { + break; + } else { + arrayExpression.push(list[i].parameters[0]); + } + } + } + } + console.log('提取出注释中从中间的内容'); + console.log(arrayExpression); + // 以上是第一步 + // 第二步:计算每一行的结果(每个子条件)并记录 + const flag = {}; // 记录每行标记的名称和对应的结果 + // 翻译每条标记的表达式 + for (let i = 1; i < arrayExpression.length; i++) { + const flagName = arrayExpression[i].split(' : ')[0]; + const comment = arrayExpression[i].split(' : ')[1]; + // 下面这段是从checkCases中复制来的 + for (const key in casePatterns) { + const pattern = casePatterns[key]; + const handler = caseHandlers[key]; + const match = comment.match(pattern); + if (match) { + const [_, ...matches] = match; + const result = handler(event, ...matches); + flag[flagName] = result; + } + } + // 从checkCases中复制来的止于此 + } + console.log('各标记的表达式'); + console.log(flag); + // 以上是第二步 + // 第三步:翻译总表达式(母条件) + let headExpression = arrayExpression[0].split(' '); + let headFormula = ''; + for (let i = 0; i < headExpression.length; i++) { + switch headExpression[i] { + case '(': + headFormula += '( '; + break; + case ')': + headFormula += ') '; + break; + case 'or': + headFormula += '||'; + break; + case 'and': + headFormula += '&&'; + break; + default: + headFormula += '${flag[' + headExpression[i] + ']} '; + } + } + console.log('总表达式'); + console.log(headFormula); + let headResult = new Function('return ' + '`' + headFormula + '`')(); + return headResult; + }; + + const registerCase = (key, pattern, handler) => { casePatterns[key] = pattern; caseHandlers[key] = handler;