extends SceneTree # Forgejo #27: gas giants are deterministic animated gas sources, and the # existing transporter route carries their gas without converting it to ore. var game_state: Node var stage: int = 0 var elapsed: float = 0.0 func _initialize() -> void: game_state = root.get_node("GameState") game_state.buildings.clear() game_state.extractors.clear() game_state.transporters.clear() game_state.gas = 0 game_state.rocks = 0 func _process(delta: float) -> bool: elapsed += delta if stage == 0: # A guaranteed gas source near the spawn is now a DEV MODE guarantee # rather than something every game gets - a normal game has to go and # find one. Dev mode is therefore where this premise still holds, and # where a play-tester reaching gas quickly still matters. game_state.dev_mode = true var nearby_chunk: Vector2i = Vector2i.ZERO for chunk in WorldGen.DEV_PLANET_CHUNKS: if String(WorldGen.DEV_PLANET_CHUNKS[chunk]) == "gas_giant": nearby_chunk = chunk var nearby_data: Dictionary = WorldGen.planet_data_at_chunk(nearby_chunk) var nearby_position: Vector2 = WorldGen.chunk_origin(nearby_chunk) + nearby_data.local_pos if not WorldGen.has_planet_at_chunk(nearby_chunk): return _fail("dev mode's gas giant chunk does not contain a planet") if String(nearby_data.get("definition_id", "")) != "gas_giant": return _fail("dev mode's guaranteed planet is not a gas source") if nearby_position.length() > WorldGen.CHUNK_SIZE * 2.0: return _fail("nearby gas giant spawned too far away: %s" % nearby_position) # Gas surfaces have vents only: no deferred ore pickups, and the vent # emission advances continuously so the source visibly looks active. game_state.planet_name = "Gas Test" game_state.planet_definition_id = "gas_giant" var surface: Node = load("res://PlanetSurface.tscn").instantiate() root.add_child(surface) var gas_field: Node = surface.get_node("SurfaceFeatures/ResourceProvider") if gas_field.get_script() != load("res://GasVentField.gd"): surface.free() return _fail("gas surface did not compose the gas feature scene") if surface.get_node_or_null("RockField") != null: surface.free() return _fail("gas surface tree contains an ore producer") gas_field._process(0.5) if gas_field.emission_phase <= 0.0: surface.free() return _fail("gas-source emission animation did not advance") surface.free() game_state.planet_definition_id = "rocky" var rocky_surface: Node = load("res://PlanetSurface.tscn").instantiate() root.add_child(rocky_surface) var rocky_features: Node = rocky_surface.get_node("SurfaceFeatures/ResourceProvider") if rocky_features.get_script() != load("res://RockField.gd"): rocky_surface.free() return _fail("rocky surface did not compose the ore feature scene") if rocky_surface.get_node_or_null("GasVentField") != null: rocky_surface.free() return _fail("rocky surface tree contains a gas producer") rocky_surface.free() var found_giant: bool = false for x in range(-12, 13): for y in range(-12, 13): var data: Dictionary = WorldGen.planet_data_at_chunk(Vector2i(x, y)) if String(data.get("definition_id", "")) == "gas_giant": found_giant = true break if found_giant: break if not found_giant: return _fail("world generation produced no deterministic gas giant") var giant: Node2D = load("res://Planet.tscn").instantiate() giant.definition_id = "gas_giant" root.add_child(giant) giant.visual._process(0.5) if giant.gas_phase <= 0.0: return _fail("gas giant animation did not advance") giant.free() game_state.add_building(GameState.BUILDING_MOTHERSHIP, Vector2.ZERO) game_state.add_building(GameState.BUILDING_TRANSPORT_HUB, Vector2(100, 0)) game_state.add_extractor("Aurelia", Vector2(400, 0), "gas") game_state.extractors[0].stock = game_state.transporter_load_limit() var transporter: Dictionary = game_state.transporters[0] transporter.state = GameState.TRANSPORTER_TO_EXTRACTOR transporter.target_id = 0 transporter.extractor_index = 0 transporter.carrying = 0 transporter.resource_type = "gas" transporter.progress = 1.0 transporter.from = Vector2(100, 0) transporter.to = Vector2(400, 0) game_state._arrive(transporter) if game_state.transporters[0].state != GameState.TRANSPORTER_TO_MOTHERSHIP_FROM_EXTRACTOR: return _fail("transporter did not collect gas from the extractor") game_state._arrive(transporter) if game_state.gas != game_state.transporter_load_limit() or game_state.rocks != 0: return _fail("gas delivery banked gas=%d ore=%d" % [game_state.gas, game_state.rocks]) var mothership_id: int = int(game_state.buildings[0].id) if game_state.transfer_gas_to_fleet(mothership_id, 7) != 7 or game_state.fleet_gas_cargo != 7: return _fail("could not load banked gas into fleet cargo") if game_state.transfer_gas_to_building(2, 7) != 7 or game_state.building_gas_holdings(2) != 7: return _fail("could not unload fleet gas into a building") print("gas giant animated; transporter banked %d gas without creating ore" % game_state.gas) print("TEST_GAS_SYSTEM: PASS") quit(0) return true return false func _fail(message: String) -> bool: print("TEST_GAS_SYSTEM: FAIL (%s)" % message) quit(1) return true