Files
hank/hank-godot/scripts/HInterface.gd
Nat Quayle Nelson b0a3c0b3d9
Some checks failed
/ test (push) Failing after 41s
Make hank work in GDScript
2025-10-30 21:42:19 -05:00

488 lines
13 KiB
GDScript

class_name HInterface
var BOOLEAN_OPS: Array[String] = ["&&", "||", "!"]
var parser: Parser
var interp: HankInterp
var viewCounts: Variant
func _init(storyTree: StoryNode, viewCounts2: Variant) -> void:
self.parser = Parser.new()
if true:
var op: String = "*"
self.parser.opPriority.__set(op, -2)
if true:
var op: String = "&"
self.parser.opPriority.__set(op, -2)
if true:
var op: String = "->"
self.parser.opPriority.__set(op, -2)
self.interp = HankInterp.new(self)
if true:
var v = func(v) -> bool:
return HInterface.isTruthy(viewCounts2, v)
self.interp.variables.__set("_isTruthy", v)
if true:
var v = func(val):
return HInterface.valueOf(viewCounts2, val)
self.interp.variables.__set("_valueOf", v)
if true:
var variables: Variant = self.interp.variables
var v = func(name: String):
return HInterface.resolveInScope(variables, name)
self.interp.variables.__set("_resolve", v)
if true:
var variables: Variant = self.interp.variables
var v = func(container, name: String):
return HInterface.resolveField(variables, container, name)
self.interp.variables.__set("_resolveField", v)
self.viewCounts = viewCounts2
func setStory(story: Story) -> void:
self.interp.setStory(story)
func addVariable(identifier: String, value) -> void:
var this1: Variant = self.interp.variables
this1.__set(identifier, value)
value
func getVariable(identifier: String):
var this1: Variant = self.interp.variables
var tempResult = this1.__get(identifier)
return tempResult
func runEmbeddedHaxe(h: String, scope: Array[Variant]) -> void:
var this1: Variant = self.interp.variables
this1.__set("scope", scope)
scope
var expr: Variant = self.parser.parseString(h, "hscript")
expr = self.transmute(expr)
self.interp.execute(expr)
func expr(h: String, scope: Array[Variant]):
var this1: Variant = self.interp.variables
this1.__set("scope", scope)
scope
var expr: Variant = self.parser.parseString(h, "hscript")
expr = self.transmute(expr)
var val = self.interp.expr(expr)
if (val == null):
assert(false, str("Expression " + h + " evaluated to null"))
var val2 = HInterface.valueOf(self.viewCounts, val)
return val2
func cond(h: String, scope: Array[Variant]) -> bool:
var val = self.expr(h, scope)
return HInterface.isTruthy(self.viewCounts, val)
func evaluateExpr(h: String, scope: Array[Variant]) -> String:
return str(self.expr(h, scope))
func boolify(expr: Variant) -> Variant:
var newExpr = self.transmute(expr)
return { "_index": 8, "e": { "_index": 1, "v": "_isTruthy" }, "params": ([newExpr] as Array[Variant]) }
func valify(expr: Variant) -> Variant:
return { "_index": 8, "e": { "_index": 1, "v": "_valueOf" }, "params": ([self.transmute(expr)] as Array[Variant]) }
func transmute(expr: Variant):
if (expr == null):
return null
var tempResult
match (expr._index):
1:
var _g: String = expr.v
if true:
var name: String = _g
tempResult = { "_index": 8, "e": { "_index": 1, "v": "_resolve" }, "params": ([{ "_index": 0, "c": { "_index": 2, "s": name } }] as Array[Variant]) }
2:
var _g: String = expr.n
var _g1 = expr.t
var _g2 = expr.e
if true:
var name: String = _g
var nested = _g2
if true:
if true:
var this1: Variant = self.interp.variables
var v = null
this1.__set(name, v)
v
tempResult = { "_index": 6, "op": "=", "e1": { "_index": 1, "v": name }, "e2": self.transmute(nested) }
3:
var _g: Variant = expr.e
if true:
var nested: Variant = _g
tempResult = { "_index": 3, "e": self.transmute(nested) }
4:
var _g: Array[Variant] = expr.e
var nestedExpressions: Array[Variant] = _g
var tempArray
if true:
var _g2: Array[Variant] = ([] as Array[Variant])
if true:
var _g1: int = 0
while (_g1 < nestedExpressions.size()):
var nested: Variant = nestedExpressions[_g1]
_g1 += 1
_g2.push_back(self.transmute(nested))
tempArray = _g2
tempResult = { "_index": 4, "e": tempArray }
5:
var _g: Variant = expr.e
var _g1: String = expr.f
if true:
var nested: Variant = _g
var f: String = _g1
tempResult = { "_index": 8, "e": { "_index": 1, "v": "_resolveField" }, "params": ([self.transmute(nested), { "_index": 0, "c": { "_index": 2, "s": f } }] as Array[Variant]) }
6:
var _g: String = expr.op
var _g1: Variant = expr.e1
var _g2: Variant = expr.e2
if true:
var op: String = _g
var e1: Variant = _g1
var e2: Variant = _g2
if (self.BOOLEAN_OPS.find(op) != -1):
tempResult = { "_index": 6, "op": op, "e1": self.boolify(e1), "e2": self.boolify(e2) }
else:
if (op == "="):
tempResult = { "_index": 6, "op": op, "e1": e1, "e2": e2 }
else:
tempResult = { "_index": 6, "op": op, "e1": self.valify(e1), "e2": self.valify(e2) }
7:
var _g: String = expr.op
var _g1: bool = expr.prefix
var _g2: Variant = expr.e
if true:
var op: String = _g
var prefix: bool = _g1
var e: Variant = _g2
if (self.BOOLEAN_OPS.find(op) != -1):
tempResult = { "_index": 7, "op": op, "prefix": prefix, "e": self.boolify(e) }
else:
tempResult = expr
8:
var _g: Variant = expr.e
var _g1: Array[Variant] = expr.params
if true:
var e: Variant = _g
var params: Array[Variant] = _g1
if true:
if (e._index == 5):
var _g2: Variant = e.e
var _g3: String = e.f
if true:
var innerE: Variant = _g2
var f: String = _g3
if true:
var obj = self.interp.expr(innerE)
if (obj != null):
return expr
else:
pass
var tempArray1
if true:
var _g2: Array[Variant] = ([] as Array[Variant])
if true:
var _g3: int = 0
while (_g3 < params.size()):
var ex: Variant = params[_g3]
_g3 += 1
_g2.push_back(self.transmute(ex))
tempArray1 = _g2
tempResult = { "_index": 8, "e": self.transmute(e), "params": tempArray1 }
9:
var _g: Variant = expr.cond
var _g1: Variant = expr.e1
var _g2 = expr.e2
if true:
var cond: Variant = _g
var e1: Variant = _g1
var e2 = _g2
if true:
if (e2 == null):
e2 = { "_index": 0, "c": { "_index": 2, "s": "" } }
tempResult = { "_index": 9, "cond": self.boolify(cond), "e1": self.transmute(e1), "e2": self.transmute(e2) }
10:
var _g: Variant = expr.cond
var _g1: Variant = expr.e
if true:
var cond: Variant = _g
var e: Variant = _g1
tempResult = { "_index": 10, "cond": self.boolify(cond), "e": self.transmute(e) }
11:
var _g: String = expr.v
var _g1: Variant = expr.it
var _g2: Variant = expr.e
if true:
var v: String = _g
var it: Variant = _g1
var e: Variant = _g2
tempResult = { "_index": 11, "v": v, "it": self.transmute(it), "e": self.transmute(e) }
14:
var _g: Array[Variant] = expr.args
var _g1: Variant = expr.e
var _g2 = expr.name
var _g3 = expr.ret
if true:
var args: Array[Variant] = _g
var e: Variant = _g1
var name = _g2
var ret = _g3
tempResult = { "_index": 14, "args": args, "e": self.transmute(e), "name": name, "ret": ret }
15:
var _g = expr.e
if true:
var e = _g
tempResult = { "_index": 15, "e": self.transmute(e) }
16:
var _g: Variant = expr.e
var _g1: Variant = expr.index
if true:
var e: Variant = _g
var index: Variant = _g1
tempResult = { "_index": 16, "e": self.transmute(e), "index": self.transmute(index) }
17:
var _g: Array[Variant] = expr.e
if true:
var e: Array[Variant] = _g
var tempArray2
if true:
var _g2: Array[Variant] = ([] as Array[Variant])
if true:
var _g1: int = 0
while (_g1 < e.size()):
var ex: Variant = e[_g1]
_g1 += 1
_g2.push_back(self.transmute(ex))
tempArray2 = _g2
tempResult = { "_index": 17, "e": tempArray2 }
18:
var _g: String = expr.cl
var _g1: Array[Variant] = expr.params
if true:
var cl: String = _g
var params: Array[Variant] = _g1
var tempArray3
if true:
var _g2: Array[Variant] = ([] as Array[Variant])
if true:
var _g3: int = 0
while (_g3 < params.size()):
var ex: Variant = params[_g3]
_g3 += 1
_g2.push_back(self.transmute(ex))
tempArray3 = _g2
tempResult = { "_index": 18, "cl": cl, "params": tempArray3 }
19:
var _g: Variant = expr.e
if true:
var e: Variant = _g
tempResult = { "_index": 19, "e": self.transmute(e) }
20:
var _g: Variant = expr.e
var _g1: String = expr.v
var _g2 = expr.t
var _g3: Variant = expr.ecatch
if true:
var e: Variant = _g
var v: String = _g1
var t = _g2
var ecatch: Variant = _g3
tempResult = { "_index": 20, "e": self.transmute(e), "v": v, "t": t, "ecatch": self.transmute(ecatch) }
21:
var _g: Array[Variant] = expr.fl
var fl: Array[Variant] = _g
var tempArray4
if true:
var _g2: Array[Variant] = ([] as Array[Variant])
if true:
var _g1: int = 0
while (_g1 < fl.size()):
var pair: Variant = fl[_g1]
_g1 += 1
_g2.push_back({
"name": pair.get("name"),
"e": self.transmute(pair.get("e"))
})
tempArray4 = _g2
tempResult = { "_index": 21, "fl": tempArray4 }
22:
var _g: Variant = expr.cond
var _g1: Variant = expr.e1
var _g2: Variant = expr.e2
if true:
var cond: Variant = _g
var e1: Variant = _g1
var e2: Variant = _g2
tempResult = { "_index": 22, "cond": self.boolify(cond), "e1": self.transmute(e1), "e2": self.transmute(e2) }
23:
var _g: Variant = expr.e
var _g1: Array[Variant] = expr.cases
var _g2 = expr.defaultExpr
if true:
var e: Variant = _g
var cases: Array[Variant] = _g1
var defaultExpr = _g2
var tempArray5
if true:
var _g3: Array[Variant] = ([] as Array[Variant])
if true:
var _g4: int = 0
while (_g4 < cases.size()):
var arm: Variant = cases[_g4]
_g4 += 1
var tempArray6
if true:
var _g5: Array[Variant] = ([] as Array[Variant])
if true:
var _g6: int = 0
var _g7: Array[Variant] = arm.get("values")
while (_g6 < _g7.size()):
var value: Variant = _g7[_g6]
_g6 += 1
_g5.push_back(self.transmute(value))
tempArray6 = _g5
_g3.push_back({
"values": tempArray6,
"expr": self.transmute(arm.get("expr"))
})
tempArray5 = _g3
tempResult = { "_index": 23, "e": self.transmute(e), "cases": tempArray5, "defaultExpr": self.transmute(defaultExpr) }
24:
var _g: Variant = expr.cond
var _g1: Variant = expr.e
if true:
var cond: Variant = _g
var e: Variant = _g1
tempResult = { "_index": 24, "cond": self.boolify(cond), "e": self.transmute(e) }
25:
var _g: String = expr.name
var _g1: Array[Variant] = expr.args
var _g2: Variant = expr.e
if true:
var name: String = _g
var args: Array[Variant] = _g1
var e: Variant = _g2
var tempArray7
if true:
var _g3: Array[Variant] = ([] as Array[Variant])
if true:
var _g4: int = 0
while (_g4 < args.size()):
var arg: Variant = args[_g4]
_g4 += 1
_g3.push_back(self.transmute(arg))
tempArray7 = _g3
tempResult = { "_index": 25, "name": name, "args": tempArray7, "e": self.transmute(e) }
26:
var _g: Variant = expr.e
var _g1: Variant = expr.t
if true:
var e: Variant = _g
var t: Variant = _g1
tempResult = { "_index": 26, "e": self.transmute(e), "t": t }
_:
tempResult = expr
return tempResult
static func resolveInScope(variables: Variant, name: String):
var scope: Array[Variant] = (variables.__get("scope") as Array[Variant])
var _g: int = 0
while (_g < scope.size()):
var container = scope[_g]
_g += 1
if true:
var _g2: Variant = HInterface.resolve(variables, container, name)
match (_g2._index):
0:
var _g3 = _g2.v
var v = _g3
return v
1:
pass
assert(false, str("Could not resolve " + name + " in scope " + str(scope) + "."))
static func resolveField(variables: Variant, container, name: String):
return Extensions.unwrap(HInterface.resolve(variables, container, name))
static func resolve(variables: Variant, container, name: String) -> Variant:
if (variables.exists(name)):
return { "_index": 0, "v": variables.__get(name) }
else:
if (((container as Variant) is StoryNode)):
var node: StoryNode = (container as StoryNode)
return node.resolve(name)
else:
var val = container.get(name)
if (val != null):
return { "_index": 0, "v": val }
else:
return { "_index": 1 }
static func isTruthy(viewCounts2: Variant, v) -> bool:
if (((v as Variant) is StoryNode)):
var node: StoryNode = (v as StoryNode)
return viewCounts2.__get(node) > 0
if (((v as Variant) is bool)):
return v
else:
if (((v as Variant) is int) || ((v as Variant) is float)):
return v > 0
else:
if (((v as Variant) is String)):
if (v == "false"):
return false
else:
return v.length > 0
assert(false, str("" + str(v) + " cannot be coerced to a boolean"))
return false
static func valueOf(viewCounts2: Variant, val):
var tempResult
if (((val as Variant) is StoryNode)):
var node: StoryNode = (val as StoryNode)
tempResult = viewCounts2.__get(node)
else:
tempResult = val
return tempResult
static func viewCountOf(viewCounts2: Variant, val) -> Variant:
var tempResult
if (((val as Variant) is StoryNode)):
var node: StoryNode = (val as StoryNode)
tempResult = { "_index": 0, "v": viewCounts2.__get(node) }
else:
tempResult = { "_index": 1 }
return tempResult