Randoloot/tests/items/equipment_comparison_test.gd
2026-10-12 23:35:17 +02:00

104 lines
5.3 KiB
GDScript

extends Node
const GAME := preload("res://scenes/game/game.tscn")
func _modifier(key: String, value: float) -> ItemStatModifier:
var modifier := ItemStatModifier.new()
modifier.stat_key = key
modifier.value = value
return modifier
func _item(value: float) -> ItemInstance:
var item := ItemInstance.new()
item.definition = preload("res://resources/items/reinforced_shield.tres")
item.primary_value_override = value
return item
func _ready() -> void:
GameState.start_new_run()
var game := GAME.instantiate()
add_child(game)
game.set_physics_process(false)
var ship := game.get_node("PlayerShip")
ship.set_physics_process(false)
ship.get_node("WeaponController").set_physics_process(false)
for enemy in get_tree().get_nodes_in_group("enemies"):
enemy.set_physics_process(false)
var inventory: ShipInventory = ship.get_node("ShipInventory")
var old := _item(2.0)
old.additional_modifiers.append(_modifier("damage_percent", 10.0))
old.additional_modifiers.append(_modifier("shield_regeneration", 1.0))
var candidate := _item(3.0)
candidate.additional_modifiers.append(_modifier("damage_percent", 2.0))
candidate.additional_modifiers.append(_modifier("damage_percent", 3.0))
candidate.additional_modifiers.append(_modifier("energy_regeneration", 4.0))
candidate.additional_modifiers.append(_modifier("shield_on_damage_percent", 2.0))
candidate.additional_modifiers.append(_modifier("experience_percent", 5.0))
assert(inventory.add_item(old))
assert(inventory.move_item("cargo", inventory.cargo.find(old), "module", 0))
assert(inventory.add_item(candidate))
var hull_before: float = ship.get("max_hull")
var shields_before: float = ship.get("max_shields")
var rows := inventory.get_item_comparison(candidate, old)
var deltas := {}
for row in rows:
deltas[row["key"]] = row["delta"]
assert(is_equal_approx(deltas["max_shields"], 1.0))
assert(is_equal_approx(deltas["damage_percent"], -5.0))
assert(is_equal_approx(deltas["shield_regeneration"], -1.0))
assert(is_equal_approx(deltas["energy_regeneration"], 2.0))
assert(inventory.get_item_comparison(old, old).is_empty())
assert(inventory.get_item_comparison(candidate, null)[0]["delta"] == 3.0)
assert(ship.get("max_hull") == hull_before and ship.get("max_shields") == shields_before)
assert(inventory.module_slots[0] == old and inventory.cargo.has(candidate))
# Percentage bonuses combine with flat stats and the rest of the equipment.
old.additional_modifiers.append(_modifier("shield_percent", 10.0))
candidate.additional_modifiers.append(_modifier("shield_percent", 5.0))
var armor := ItemInstance.new()
armor.definition = preload("res://resources/items/hull_plating.tres")
armor.additional_modifiers.append(_modifier("shield_percent", 20.0))
assert(inventory.add_item(armor))
assert(inventory.move_item("cargo", inventory.cargo.find(armor), "module", 1))
var expected: float = (float(ship.get("base_max_shields")) + 3.0) * 1.25 - (float(ship.get("base_max_shields")) + 2.0) * 1.3
var predicted := 0.0
for row in inventory.get_item_comparison(candidate, old):
if row["key"] == "max_shields":
predicted = row["delta"]
assert(is_equal_approx(predicted, expected))
var current_shields: float = ship.get("max_shields")
assert(inventory.move_item("cargo", inventory.cargo.find(candidate), "module", 0))
assert(is_equal_approx(float(ship.get("max_shields")) - current_shields, predicted))
assert(inventory.move_item("cargo", inventory.cargo.find(old), "module", 0))
assert(inventory.move_item("module", 1, "cargo", inventory.cargo.find(null)))
old.additional_modifiers.pop_back()
candidate.additional_modifiers.pop_back()
inventory._recalculate_ship_stats()
var hud := game.get_node("HUD/HUDRoot")
var slot := preload("res://scenes/ui/inventory_slot_view.tscn").instantiate()
slot.slot_index = inventory.cargo.find(candidate)
hud.add_child(slot)
slot.hide()
var tooltip: PanelContainer = slot._make_custom_tooltip(candidate.get_tooltip_text())
hud.add_child(tooltip)
tooltip.position = Vector2(240, 80)
var columns := tooltip.get_child(0)
assert(columns.get_child_count() == 3)
var comparison: RichTextLabel = columns.get_child(2)
assert(comparison.get_parsed_text().contains("Tarcze: +1.00 pkt"))
assert(comparison.get_parsed_text().contains("Obrażenia broni: -5.00 %"))
assert(comparison.get_parsed_text().contains("Odzysk tarcz z obrażeń: +2.00 %"))
assert(comparison.get_parsed_text().contains("Doświadczenie: +5.00 %"))
assert(not comparison.get_parsed_text().contains("100 DMG"))
assert(not comparison.get_parsed_text().contains("EXP /"))
assert(not comparison.get_parsed_text().contains("[LPM]"))
assert(not comparison.get_parsed_text().contains("→"))
assert(not comparison.get_parsed_text().contains("p.p."))
assert(comparison.get_parsed_text().contains("Regeneracja tarcz: -1.00 pkt/s"))
var debug: Label = hud.get_node("DebugScroll/DebugInfo")
assert(debug.get_theme_font("font").get_height(10) + debug.get_theme_constant("line_spacing") <= 13.0)
await get_tree().process_frame
await get_tree().process_frame
assert(tooltip.size.x < 1280 and tooltip.size.y < 620)
assert(debug.get_line_count() <= 26)
assert(debug.get_combined_minimum_size().y < 400)
print("EQUIPMENT_COMPARISON_TEST: PASS primary difference, addon loss, duplicate addon sum, regeneration scaling, empty slot, unchanged stats, side column, compact debug, actual percentage effects match equipping")