64 lines
2.3 KiB
GDScript3
64 lines
2.3 KiB
GDScript3
|
|
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:
|
||
|
|
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("planet_type", "")) == "gas_giant":
|
||
|
|
found_giant = String(data.get("resource_type", "")) == "gas"
|
||
|
|
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.planet_type = "gas_giant"
|
||
|
|
giant._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()
|
||
|
|
game_state.transporters.append({"hub_id": 2, "state": GameState.TRANSPORTER_TO_EXTRACTOR,
|
||
|
|
"target_id": 0, "extractor_index": 0, "carrying": 0, "resource_type": "gas",
|
||
|
|
"progress": 1.0, "from": Vector2(100, 0), "to": Vector2(400, 0)})
|
||
|
|
game_state._arrive(game_state.transporters[0])
|
||
|
|
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(game_state.transporters[0])
|
||
|
|
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])
|
||
|
|
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
|