add: channel switch

This commit is contained in:
Vick Scarlet
2026-07-27 14:28:08 +08:00
parent 988fcacd2d
commit 50411b82a0
16 changed files with 484 additions and 524 deletions
+79 -82
View File
@@ -1,127 +1,124 @@
function parseCondition(condition) {
const conditions = [];
const length = condition.length;
const stack = [];
stack.unshift(conditions);
let cursor = 0;
const conditions = []
const length = condition.length
const stack = []
stack.unshift(conditions)
let cursor = 0
const catchString = i => {
const str = condition.substring(cursor, i).trim();
cursor = i;
if(str) stack[0].push(str);
};
const str = condition.substring(cursor, i).trim()
cursor = i
if (str) stack[0].push(str)
}
for(let i=0; i<length; i++) {
switch(condition[i]) {
case ' ': continue;
case '(':
catchString(i);
cursor ++;
const sub = [];
stack[0].push(sub);
stack.unshift(sub);
break;
for (let i = 0; i < length; i++) {
switch (condition[i]) {
case ' ': continue
case '(': {
catchString(i)
cursor++
const sub = []
stack[0].push(sub)
stack.unshift(sub)
break
}
case ')':
catchString(i);
cursor ++;
stack.shift();
break;
catchString(i)
cursor++
stack.shift()
break
case '|':
case '&':
catchString(i);
catchString(i+1);
break;
default: continue;
catchString(i)
catchString(i + 1)
break
default: continue
}
}
catchString(length);
catchString(length)
return conditions;
return conditions
}
export function checkCondition(property, condition) {
const conditions = parseCondition(condition);
return checkParsedConditions(property, conditions);
const conditions = parseCondition(condition)
return checkParsedConditions(property, conditions)
}
function checkParsedConditions(property, conditions) {
if(!Array.isArray(conditions)) return checkProp(property, conditions);
if(conditions.length == 0) return true;
if(conditions.length == 1) return checkParsedConditions(property, conditions[0]);
if (!Array.isArray(conditions)) return checkProp(property, conditions)
if (conditions.length == 0) return true
if (conditions.length == 1) return checkParsedConditions(property, conditions[0])
let ret = checkParsedConditions(property, conditions[0]);
for(let i=1; i<conditions.length; i+=2) {
switch(conditions[i]) {
let ret = checkParsedConditions(property, conditions[0])
for (let i = 1; i < conditions.length; i += 2) {
switch (conditions[i]) {
case '&':
if(ret) ret = checkParsedConditions(property, conditions[i+1]);
break;
if (ret) ret = checkParsedConditions(property, conditions[i + 1])
break
case '|':
if(ret) return true;
ret = checkParsedConditions(property, conditions[i+1]);
break;
default: return false;
if (ret) return true
ret = checkParsedConditions(property, conditions[i + 1])
break
default: return false
}
}
return ret;
return ret
}
function checkProp(property, condition) {
const length = condition.length
let i = condition.search(/[><!?=]/)
const length = condition.length;
let i = condition.search(/[><\!\?=]/);
const prop = condition.substring(0, i)
const symbol = condition.substring(i, (i += condition[i + 1] == '=' ? 2 : 1))
const d = condition.substring(i, length)
const prop = condition.substring(0,i);
const symbol = condition.substring(i, i+=(condition[i+1]=='='?2:1));
const d = condition.substring(i, length);
const propData = property.get(prop)
const conditionData = d[0] == '[' ? JSON.parse(d) : Number(d)
const propData = property.get(prop);
const conditionData = d[0]=='['? JSON.parse(d): Number(d);
switch(symbol) {
case '>': return propData > conditionData;
case '<': return propData < conditionData;
case '>=': return propData >= conditionData;
case '<=': return propData <= conditionData;
switch (symbol) {
case '>': return propData > conditionData
case '<': return propData < conditionData
case '>=': return propData >= conditionData
case '<=': return propData <= conditionData
case '=':
if(Array.isArray(propData))
return propData.includes(conditionData);
return propData == conditionData;
if (Array.isArray(propData)) return propData.includes(conditionData)
return propData == conditionData
case '!=':
if(Array.isArray(propData))
return !propData.includes(conditionData);
return propData != conditionData;
if (Array.isArray(propData))
return !propData.includes(conditionData)
return propData != conditionData
case '?':
if(Array.isArray(propData)) {
for(const p of propData)
if(conditionData.includes(p)) return true;
return false;
if (Array.isArray(propData)) {
for (const p of propData)
if (conditionData.includes(p)) return true
return false
}
return conditionData.includes(propData);
return conditionData.includes(propData)
case '!':
if(Array.isArray(propData)) {
for(const p of propData)
if(conditionData.includes(p)) return false;
return true;
if (Array.isArray(propData)) {
for (const p of propData)
if (conditionData.includes(p)) return false
return true
}
return !conditionData.includes(propData);
return !conditionData.includes(propData)
default: return false;
default: return false
}
}
export function extractMaxTriggers(condition) {
// Assuming only age related talents can be triggered multiple times.
const RE_AGE_CONDITION = /AGE\?\[([0-9\,]+)\]/;
const match_object = RE_AGE_CONDITION.exec(condition);
const RE_AGE_CONDITION = /AGE\?\[([0-9,]+)\]/
const match_object = RE_AGE_CONDITION.exec(condition)
if (match_object == null) {
// Not age related, single trigger.
return 1;
return 1
}
const age_list = match_object[1].split(",");
return age_list.length;
}
const age_list = match_object[1].split(',')
return age_list.length
}