Randoloot/tests/levels/planet_threats_test.gd
2026-10-26 21:06:32 +01:00

110 lines
5.0 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node
const PROFILES := preload("res://scripts/planets/planet_profiles.gd")
const GEAR := preload("res://scripts/planets/captain_equipment.gd")
const EVENTS := preload("res://scripts/planets/surface_events.gd")
const REWARDS := preload("res://scripts/planets/planet_rewards.gd")
var captain: Resource
func set_gear(levels: Array) -> void:
for index in 3:
captain.gear_items[index].level = int(levels[index])
captain.gear_slots[GEAR.KINDS[index]] = index+1
func profile_for(total: float) -> Dictionary:
var fraction := total/300.0
return {"id":"threat-test","name":"Test zagrożeń","easy":total == 0.0,"seed":1234,"oxygen":80.0*(1.0-fraction),"temperature":40.0+60.0*fraction,"flora":50.0*fraction,"difficulty":fraction,"landing_damage":5}
func expect_chances(profile: Dictionary, expected: Array) -> void:
for stage in 3:
assert(is_equal_approx(PROFILES.success_chance(profile,captain,stage),float(expected[stage])/100.0))
func _ready() -> void:
captain = preload("res://scripts/captain/captain_progress.gd").new()
set_gear([0,0,0])
var safe := profile_for(0)
safe.temperature = 30
safe.oxygen = 98
assert(PROFILES.global_threat(safe,captain) == 0)
expect_chances(safe,[90,70,40])
assert(is_equal_approx(PROFILES.average_success_chance(safe,captain),2.0/3.0))
var extreme := profile_for(300)
assert(PROFILES.global_threat(extreme,captain) == 300)
expect_chances(extreme,[15,5,0])
expect_chances(profile_for(75),[52.5,37.5,20])
expect_chances(profile_for(150),[15,5,0])
expect_chances(profile_for(151),[15,5,0])
var cold := extreme.duplicate()
cold.temperature = -50
assert(PROFILES.global_threat(cold,captain) == 300)
for temperature in [-10,0,30,40]:
var normal := safe.duplicate()
normal.temperature = temperature
assert(PROFILES.global_threat(normal,captain) == 0)
var previous := 1.0
for index in 301:
var at := profile_for(float(index))
var raw := PROFILES.threat_report(at,captain)
assert(raw.raw_total >= 0 and raw.raw_total <= 300.0001)
var chance := PROFILES.success_chance(at,captain,0)
assert(chance <= previous+0.000001)
previous = chance
set_gear([1,1,1])
assert(PROFILES.global_threat(extreme,captain) == 294)
set_gear([25,25,25])
assert(PROFILES.global_threat(extreme,captain) == 150)
set_gear([26,26,26])
assert(PROFILES.global_threat(extreme,captain) == 144)
expect_chances(extreme,[18,7.6,1.6])
set_gear([50,0,0])
var report := PROFILES.threat_report(extreme,captain)
assert(report.effective.oxygen == 0 and report.effective.temperature == 100 and report.effective.biology == 100)
assert(report.total == 200)
set_gear([0,50,0])
report = PROFILES.threat_report(extreme,captain)
assert(report.effective.temperature == 0 and report.total == 200)
set_gear([0,0,50])
report = PROFILES.threat_report(extreme,captain)
assert(report.effective.biology == 0 and report.total == 200)
set_gear([50,50,50])
assert(PROFILES.global_threat(extreme,captain) == 0)
expect_chances(extreme,[90,70,40])
set_gear([100,100,100])
expect_chances(extreme,[90,70,40])
assert(PROFILES.threat_report(extreme,captain).raw_total == 300)
assert(REWARDS.material_multiplier(extreme) == 3)
assert(REWARDS.module_bonus_range(extreme) == Vector2i(2,10))
# Equipment changes effective odds, never the underlying planet rewards.
set_gear([0,0,0])
var state: Resource = captain.expedition
assert(state.begin_visit(extreme))
state.lander_hp = 100
captain.parts = 100
var rng := RandomNumberGenerator.new()
rng.seed = 45
var rng_before := rng.state
var poi := {"kind":"ruins","stage":2,"complete":false}
var result: Dictionary = state.resolve_poi(captain,poi,rng)
assert(result.success and poi.complete and result.modules.size() == 1)
assert(state.lander_hp == 100 and rng.state != rng_before)
var evacuation := {"kind":"evacuation","seed":1234,"complete":false}
EVENTS.prepare(evacuation,captain,state)
evacuation.stage = 2
assert(EVENTS.chance(evacuation,captain,state) == 0)
var balance: float = captain.parts
result = EVENTS.resolve(evacuation,"help",captain,state)
assert(result.blocked and captain.parts == balance and not evacuation.complete)
assert(is_equal_approx(EVENTS.chance({"kind":"rescue"},captain,state),0.15))
assert(is_equal_approx(EVENTS.chance({"kind":"prototype"},captain,state),0.05))
set_gear([50,50,50])
assert(is_equal_approx(EVENTS.chance(evacuation,captain,state),0.40))
assert(is_equal_approx(EVENTS.chance({"kind":"rescue"},captain,state),0.90))
var scan := PROFILES.scan_description(extreme,captain)
assert(scan.contains("ŁUP POI: ×2.00") and not scan.contains("Etapy POI"))
assert(scan.contains("Bez sprzętu: 300.0%"))
for index in 1000:
var generated := PROFILES.generate(99,index,"Biom")
var raw := PROFILES.raw_threats(generated)
assert(is_equal_approx(float(generated.difficulty),(float(raw.oxygen)+float(raw.temperature)+float(raw.biology))/300.0))
print("PLANET THREATS PASS: 0..300 total, three independent protections, 2 pp/level, L50 immunity, exact POI curves, 150 threshold, zero-chance guards, event risk, scan average, raw reward difficulty")
get_tree().quit()