Refactor variable handling in parser.ts

This commit is contained in:
kwaroran
2024-03-28 18:33:48 +09:00
parent 9ad8262eb6
commit 25696c8d60

View File

@@ -648,36 +648,27 @@ const matcher = (p1:string,matcherArg:matcherArg) => {
const v = arra[1] const v = arra[1]
switch(arra[0]){ switch(arra[0]){
case 'getvar':{ case 'getvar':{
const db = get(DataBase) return getChatVar(v)
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
const chat = char.chats[char.chatPage]
return (chat.scriptstate ?? {})['$' + v] ?? 'null'
} }
case 'calc':{ case 'calc':{
return calcString(v).toString() return calcString(v).toString()
} }
case 'addvar': case 'addvar':{
if(matcherArg.rmVar){
return ''
}
if(matcherArg.runVar){
setChatVar(v, (Number(getChatVar(v)) + Number(arra[2])).toString())
return ''
}
return null
}
case 'setvar':{ case 'setvar':{
if(matcherArg.rmVar){ if(matcherArg.rmVar){
return '' return ''
} }
if(matcherArg.runVar){ if(matcherArg.runVar){
const db = get(DataBase) setChatVar(v, arra[2])
const selectedChar = get(selectedCharID)
const char = db.characters[selectedChar]
const chat = char.chats[char.chatPage]
chat.scriptstate = chat.scriptstate ?? {}
if(arra[0] === 'addvar'){
chat.scriptstate['$' + v] = Number(chat.scriptstate['$' + v]) + Number(arra[2])
}
else{
chat.scriptstate['$' + v] = arra[2]
}
char.chats[char.chatPage] = chat
db.characters[selectedChar] = char
setDatabase(db)
return '' return ''
} }
return null return null
@@ -1150,87 +1141,26 @@ export function risuChatParser(da:string, arg:{
return nested[0] + result return nested[0] + result
} }
export function getVarChat(targetIndex = -1, chara:character|groupChat = null){
export function getChatVar(key:string){
const db = get(DataBase) const db = get(DataBase)
const selchar = chara ?? db.characters[get(selectedCharID)] const selectedChar = get(selectedCharID)
const chat = selchar.chats[selchar.chatPage] const char = db.characters[selectedChar]
let i =0; const chat = char.chats[char.chatPage]
if(targetIndex === -1 || targetIndex >= chat.message.length){ chat.scriptstate = chat.scriptstate ?? {}
targetIndex = chat.message.length - 1 return (chat.scriptstate['$' + key]).toString() ?? 'null'
} }
let vars:{[key:string]:string} = {}
let rules:{
key:string
rule:string
arg:string
}[] = []
const fm = selchar.firstMsgIndex === -1 ? selchar.firstMessage : selchar.alternateGreetings[selchar.firstMsgIndex]
const rg = /(\{\{setvar::(.+?)::(.+?)\}\})/gu
const rg2 = /(\{\{addvar::(.+?)::(.+?)\}\})/gu
const rg3 = /(\{\{varrule_(.+?)::(.+?)::(.+?)\}\})/gu
function process(text:string){
const m = text.matchAll(rg)
for(const a of m){
if(a.length === 4){
vars[a[2]] = a[3]
}
}
const m2 = text.matchAll(rg2)
for(const a of m2){
if(a.length === 4){
vars[a[2]] = (parseInt(vars[a[2]]) + parseInt(a[3])).toString()
}
}
const m3 = text.matchAll(rg3)
for(const a of m3){
if(a.length === 5){
rules.push({
key: a[3],
rule: a[2],
arg: a[4]
})
}
}
}
process(fm)
while( i <= targetIndex ){
process(chat.message[i].data)
i += 1
}
for(const rule of rules){ export function setChatVar(key:string, value:string){
if(vars[rule.key] === undefined){ const db = get(DataBase)
continue const selectedChar = get(selectedCharID)
} const char = db.characters[selectedChar]
switch(rule.rule){ const chat = char.chats[char.chatPage]
case "max":{ chat.scriptstate = chat.scriptstate ?? {}
if(parseInt(vars[rule.key]) > parseInt(rule.arg)){ chat.scriptstate['$' + key] = value
vars[rule.key] = rule.arg char.chats[char.chatPage] = chat
} db.characters[selectedChar] = char
break setDatabase(db)
}
case "min":{
if(parseInt(vars[rule.key]) < parseInt(rule.arg)){
vars[rule.key] = rule.arg
}
break
}
case 'overflow':{
const exArg = rule.arg.split(":")
let rv = parseInt(vars[rule.key])
const val = parseInt(exArg[0])
const tg = exArg[1]
if(isNaN(val) || isNaN(rv)){
break
}
vars[tg] = (Math.floor(rv / val)).toString()
vars[rule.key] = (Math.floor(rv % val)).toString()
}
}
}
return vars
} }