This commit is contained in:
2026-06-07 13:50:05 +08:00
commit aeb6dc46a4
28 changed files with 4458 additions and 0 deletions

View File

@@ -0,0 +1,94 @@
import type { Condition, Effect, ChoiceRecord } from '../types'
export class StateManager {
variables: Record<string, number> = {}
flags: Set<string> = new Set()
history: ChoiceRecord[] = []
init(initialVars: Record<string, number>) {
this.variables = { ...initialVars }
this.flags = new Set()
this.history = []
}
getVar(name: string): number {
return this.variables[name] ?? 0
}
setVar(name: string, value: number) {
this.variables[name] = value
}
addVar(name: string, delta: number) {
this.variables[name] = (this.variables[name] ?? 0) + delta
}
hasFlag(name: string): boolean {
return this.flags.has(name)
}
setFlag(name: string) {
this.flags.add(name)
}
clearFlag(name: string) {
this.flags.delete(name)
}
evaluate(conditions: Condition[]): boolean {
return conditions.every((c) => {
switch (c.op) {
case '==':
return this.variables[c.variable] === c.value
case '!=':
return this.variables[c.variable] !== c.value
case '>':
return (this.variables[c.variable] ?? 0) > (c.value as number)
case '<':
return (this.variables[c.variable] ?? 0) < (c.value as number)
case '>=':
return (this.variables[c.variable] ?? 0) >= (c.value as number)
case '<=':
return (this.variables[c.variable] ?? 0) <= (c.value as number)
case 'hasFlag':
return this.flags.has(c.variable)
default:
return false
}
})
}
apply(effects: Effect[]) {
for (const e of effects) {
switch (e.type) {
case 'set':
this.variables[e.target] = e.value as number
break
case 'add':
this.addVar(e.target, e.value as number)
break
case 'toggleFlag':
this.setFlag(e.target)
break
}
}
}
recordChoice(choice: ChoiceRecord) {
this.history.push(choice)
}
toJSON() {
return {
variables: { ...this.variables },
flags: [...this.flags],
history: [...this.history],
}
}
fromJSON(data: { variables: Record<string, number>; flags: string[]; history: ChoiceRecord[] }) {
this.variables = { ...data.variables }
this.flags = new Set(data.flags)
this.history = [...data.history]
}
}