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()