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)) 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)) var weapon: ItemInstance = inventory.weapon_slots[0] assert(is_equal_approx(deltas["weapon_damage_0"], weapon.get_stat_total("damage") * -0.05)) 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("Śr. obrażenia [LPM]:")) assert(not comparison.get_parsed_text().contains("→")) 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")