99 lines
4.9 KiB
GDScript
99 lines
4.9 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))
|
|
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")
|