Randoloot/tests/items/laser_energy_regeneration_test.gd
2026-10-12 22:16:09 +02:00

53 lines
2.5 KiB
GDScript

extends Node2D
const GENERATOR := preload("res://scripts/items/item_generator.gd")
const REGEN := preload("res://resources/items/affixes/energy_regeneration.tres")
class MeasuredLaser:
extends "res://scripts/game/weapon_controller.gd"
var shots := 0
func _consume_energy(amount: float) -> bool:
var consumed := super._consume_energy(amount)
if consumed:
shots += 1
return consumed
func _ready() -> void:
seed(54321)
GameState.start_new_run()
var ship := preload("res://scenes/game/player_ship.tscn").instantiate() as CharacterBody2D
add_child(ship)
ship.get_node("WeaponController").set_physics_process(false)
var inventory := ship.get_node("ShipInventory") as ShipInventory
var laser := GENERATOR.generate_for_definition(preload("res://resources/items/beam_laser.tres"), 5)
assert(inventory.add_item(laser))
assert(inventory.move_item("cargo", inventory.cargo.find(laser), "weapon", 0))
# Five separate level-5 regeneration affixes, on the five equipment categories.
for index in 5:
var module := ItemInstance.new()
module.definition = [preload("res://resources/items/reinforced_shield.tres"), preload("res://resources/items/hull_plating.tres"), preload("res://resources/items/engine_extension.tres"), preload("res://resources/items/compact_generator.tres"), preload("res://resources/items/ship_computer.tres")][index]
module.item_level = 5
var addon := ItemStatModifier.new()
addon.affix = REGEN
addon.stat_key = REGEN.stat_key
addon.value = REGEN.roll_value(5)
module.additional_modifiers.append(addon)
assert(inventory.add_item(module))
assert(inventory.move_item("cargo", inventory.cargo.find(module), "module", index))
print("REGEN_BONUS_%d: %.4f energy/s" % [index + 1, module.get_stat_total("energy_regeneration")])
var controller := MeasuredLaser.new()
ship.add_child(controller)
await get_tree().physics_frame
ship.set("energy", 80.0)
assert(ship.call("get_solar_regeneration") == 0.0)
print("LASER_SETUP: level=5 DMG=%s addons=%d cost=%.2f regen=%.4f" % [laser.get_damage_range_text(), laser.get_addon_count(), laser.get_energy_cost(), ship.get("energy_regeneration")])
Input.action_press("ship_fire_primary")
for frame in 600:
await get_tree().physics_frame
Input.action_release("ship_fire_primary")
var final_energy := float(ship.get("energy"))
assert(controller.shots > 0)
assert(final_energy < 80.0)
print("LASER_ENERGY_TEST: PASS duration=10s shots=%d initial=80 final=%.4f loss=%.4f" % [controller.shots, final_energy, 80.0 - final_energy])
get_tree().quit()