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;