extends RefCounted # These visually inspected families contain land, oceans and atmospheric clouds. const EARTHLIKE_FAMILIES := ["Terrestrial", "Lush", "Tropical"] const MATERIALS := ["silicon", "copper", "nickel", "tungsten", "mercury"] const MATERIAL_NAMES := {"silicon": "Krzem", "copper": "Miedź", "nickel": "Nikiel", "tungsten": "Wolfram", "mercury": "Rtęć"} static func is_earthlike(texture: Texture2D) -> bool: if texture == null: return false for family in EARTHLIKE_FAMILIES: if texture.resource_path.contains("/Solid/%s/" % family): return true return false static func earthlike_textures() -> Array[Texture2D]: var found: Array[Texture2D] = [] for texture in preload("res://scripts/levels/celestial_texture_catalog.gd").PLANET_TEXTURES: if is_earthlike(texture): found.append(texture) return found static func generate(system_seed: int, index: int, name: String) -> Dictionary: var rng := RandomNumberGenerator.new() rng.seed = system_seed ^ (index * 0x504c414e) ^ 0x42494f4d var easy := rng.randf() < 0.7 var oxygen := rng.randi_range(81, 100) if easy else rng.randi_range(0, 80) var temperature := rng.randi_range(-10, 40) if easy else rng.randi_range(-50, 100) var flora := 0 if easy else rng.randi_range(5, 50) var o := maxf(0.0, 80.0 - oxygen) / 80.0 var t := maxf(0.0, maxf(-10.0 - temperature, temperature - 40.0)) / 60.0 var f := float(flora) / 50.0 var difficulty := clampf((o + t + f) / 3.0, 0, 1) return {"id": "%d:planet:%d" % [system_seed, index], "name": name, "oxygen": oxygen, "temperature": temperature, "flora": flora, "easy": easy, "difficulty": difficulty, "landing_damage": roundi(lerpf(5.0, 20.0, difficulty)), "seed": rng.randi(), "index": index} static func success_chance(profile: Dictionary, captain: Resource, stage: int) -> float: var gear := preload("res://scripts/planets/captain_equipment.gd") var penalties := [ maxf(0, 80.0 - float(profile.oxygen)) / 80.0, maxf(0, maxf(-10.0 - float(profile.temperature), float(profile.temperature) - 40.0)) / 60.0, float(profile.flora) / 50.0] var environment := 0.0 var equipment_bonus := 0.0 for index in 3: var rank: int = gear.level(captain, gear.KINDS[index]) var protection := minf(0.8, maxf(0, rank - 1) * 0.06) environment += penalties[index] * (1.0 - protection) / 3.0 equipment_bonus += maxf(0, rank - 1) * 0.004 var base: float = [0.90, 0.60, 0.35][clampi(stage, 0, 2)] return clampf(base - environment * 0.35 + minf(0.12, equipment_bonus), 0.08, 0.98) static func biome_name(profile: Dictionary) -> String: if bool(profile.easy): return "Łagodna biosfera" if int(profile.temperature) < -10: return "Zimna biosfera" if int(profile.temperature) > 40: return "Gorąca biosfera" return "Dzika biosfera" static func scan_description(profile: Dictionary, captain: Resource) -> String: var oxygen := int(profile.oxygen) var temperature := int(profile.temperature) var flora := int(profile.flora) var breathing := "dogodne oddychanie" if oxygen > 80 else "system oddychania poprawia szanse" var climate := "łagodny klimat" if temperature >= -10 and temperature <= 40 else "skafander ogranicza ryzyko" var biology := "brak zagrożeń biologicznych" if flora == 0 else "broń ręczna ogranicza zagrożenia" return "%s · %s\nTLEN %d%% — %s\nTEMPERATURA %d°C — %s\nFLORA %d/50 — %s\nLądowanie: −%d HP · Lądownik: %d%%\nPierwszy etap POI: %d%% szans z obecnym sprzętem" % [ profile.name,biome_name(profile),oxygen,breathing,temperature,climate,flora,biology, profile.landing_damage,ceili(captain.expedition.lander_hp),roundi(success_chance(profile,captain,0)*100)]