Randoloot/tests/items/affix_database_test.gd

75 lines
3.0 KiB
GDScript

extends Node
const GENERATOR := preload("res://scripts/items/item_generator.gd")
const DATABASE := preload("res://resources/items/affix_database.tres")
func _ready() -> void:
assert(DATABASE.affixes.size() == 15)
for level in [1, 50, 1000]:
for tier in [0, 1, 2]:
for sample in 50:
var item := GENERATOR.generate(level, tier)
assert(item.item_level == level)
if item.definition.category == ItemDefinition.Category.ACTIVE_EXTENSION:
assert(item.additional_modifiers.is_empty())
continue
assert(item.additional_modifiers.size() >= 1 and item.additional_modifiers.size() <= 5)
if tier == 2:
assert(item.additional_modifiers.size() >= 4)
var ids: Array[String] = []
for modifier in item.additional_modifiers:
assert(modifier.affix.can_roll(item.definition, level))
assert(modifier.affix.affix_id not in ids)
ids.append(modifier.affix.affix_id)
var bounds := modifier.affix.get_value_range(level)
assert(modifier.value >= bounds.x - 0.0001)
assert(modifier.value <= bounds.y + 0.0001)
assert(item.get_tooltip_text().contains(item.additional_modifiers[0].affix.display_name))
var weapon := ItemDefinition.new()
weapon.item_id = "test_weapon"
weapon.category = ItemDefinition.Category.WEAPON
var shield := ItemDefinition.new()
shield.item_id = "test_shield"
shield.category = ItemDefinition.Category.SHIELD
var first := ItemAffixDefinition.new()
first.affix_id = "first"
first.stat_key = "damage_percent"
first.category_mask = 1
assert(first.can_roll(weapon, 1))
assert(not first.can_roll(shield, 1))
first.allowed_item_ids = PackedStringArray(["another_weapon"])
assert(not first.can_roll(weapon, 1))
first.allowed_item_ids = PackedStringArray([weapon.item_id])
assert(first.can_roll(weapon, 1))
first.excluded_item_ids = PackedStringArray([weapon.item_id])
assert(not first.can_roll(weapon, 1))
first.excluded_item_ids.clear()
first.minimum_level = 10
first.maximum_level = 20
assert(not first.can_roll(weapon, 1))
assert(first.can_roll(weapon, 15))
assert(not first.can_roll(weapon, 21))
first.minimum_level = 1
first.maximum_level = 1000
var second := first.duplicate() as ItemAffixDefinition
second.affix_id = "second"
var database := ItemAffixDatabase.new()
database.affixes.assign([first, second])
assert(database.roll_affixes(weapon, 1, 5).size() == 2)
first.exclusive_group = "test_group"
second.exclusive_group = "test_group"
assert(database.roll_affixes(weapon, 1, 5).size() == 1)
first.exclusive_group = ""
second.exclusive_group = ""
first.incompatible_affix_ids = PackedStringArray([second.affix_id])
assert(not first.can_combine(second) and not second.can_combine(first))
assert(database.roll_affixes(weapon, 1, 5).size() == 1)
first.incompatible_affix_ids.clear()
first.selection_weight = 0.0
assert(database.roll_affixes(weapon, 1, 5)[0].affix == second)
second.enabled = false
assert(database.roll_affixes(weapon, 1, 5).is_empty())
print("AFFIX_DATABASE_TEST: PASS (450 generated items, category/ID/level filters, exclusions, weights and empty pools)")