extends SceneTree var failures: Array[String] = [] func _init() -> void: _run.call_deferred() func _run() -> void: var effect_definition_script: Script = load("res://resources/effects/effect_definition.gd") var effect_instance_script: Script = load("res://resources/effects/effect_instance.gd") var stat_modifier_script: Script = load("res://resources/effects/stat_modifier.gd") var defense_modifier_script: Script = load("res://resources/effects/defense_modifier.gd") var action_rule_modifier_script: Script = load("res://resources/effects/action_rule_modifier.gd") _expect(effect_definition_script != null, "EffectDefinition script should load") _expect(effect_instance_script != null, "EffectInstance script should load") _expect(stat_modifier_script != null, "StatModifier script should load") _expect(defense_modifier_script != null, "DefenseModifier script should load") _expect(action_rule_modifier_script != null, "ActionRuleModifier script should load") if effect_definition_script == null or effect_instance_script == null or stat_modifier_script == null or defense_modifier_script == null or action_rule_modifier_script == null: _finish() return var definition: Resource = effect_definition_script.new() definition.set("id", &"test_effect") definition.set("duration_type", &"beats") definition.set("duration", 4.0) _expect_int(int(definition.get("max_stacks")), 1, "EffectDefinition max_stacks default") var stat_modifier: Resource = stat_modifier_script.new() stat_modifier.set("stat", &"damage") stat_modifier.set("operation", "multiply") stat_modifier.set("value", 1.2) var stat_modifiers: Array[Resource] = [stat_modifier] definition.set("stat_modifiers", stat_modifiers) var defense_modifier: Resource = defense_modifier_script.new() defense_modifier.set("defense_state", &"SuperArmor") var defense_modifiers: Array[Resource] = [defense_modifier] definition.set("defense_modifiers", defense_modifiers) var action_rule_modifier: Resource = action_rule_modifier_script.new() action_rule_modifier.set("block_movement", true) var action_rule_modifiers: Array[Resource] = [action_rule_modifier] definition.set("action_rule_modifiers", action_rule_modifiers) var instance: RefCounted = effect_instance_script.call("create", definition, &"test") _expect(instance != null, "EffectInstance.create should return an instance") if instance != null: _expect_float(float(instance.get("remaining")), 4.0, "EffectInstance should copy beat duration") instance.call("tick_beats", 1.0) _expect_float(float(instance.get("remaining")), 3.0, "EffectInstance should tick beat duration") _expect_bool(bool(instance.call("matches_event_context", {"action_tags": [&"melee"]})), true, "EffectInstance should accept unrestricted context") _expect_int((definition.get("stat_modifiers") as Array).size(), 1, "EffectDefinition should hold stat modifiers") _expect_int((definition.get("defense_modifiers") as Array).size(), 1, "EffectDefinition should hold defense modifiers") _expect_int((definition.get("action_rule_modifiers") as Array).size(), 1, "EffectDefinition should hold action rule modifiers") _finish() func _expect(condition: bool, label: String) -> void: if not condition: failures.append(label) func _expect_bool(actual: bool, expected: bool, label: String) -> void: if actual != expected: failures.append("%s: expected %s, got %s" % [label, expected, actual]) func _expect_int(actual: int, expected: int, label: String) -> void: if actual != expected: failures.append("%s: expected %d, got %d" % [label, expected, actual]) func _expect_float(actual: float, expected: float, label: String) -> void: if not is_equal_approx(actual, expected): failures.append("%s: expected %.3f, got %.3f" % [label, expected, actual]) func _finish() -> void: if failures.is_empty(): print("PASS effect resources") quit(0) else: for failure: String in failures: push_error(failure) quit(1)