#84: move 215 root files into a folder hierarchy

Everything lived in one flat directory, so a diff gave no clue what area it
touched and finding the file you wanted meant knowing its exact name. Twelve
folders now, grouped by what a thing IS rather than what type it is - a
vessel's definition, its component scenes and its upgrade resources sit
together, because that is the set you read when you change one of them.

  buildings  core  controllers  enemies  logistics  planets
  resources  shaders  surface  ui  vessels  vfx  world

332 files moved and every res:// reference rewritten - 306 files touched,
including the autoload and main-scene paths in project.godot. Nothing renamed:
this is purely where files sit, so the diff is a pile of pure moves and no
behaviour is buried in it. ui_theme.tres, icon.svg and web_shell.html stay at
the root, where Godot and the export preset expect them.

Verified three ways, because a suite alone would not have caught all of it:
the full 117 pass, the web export builds clean, and the game renders.

The export is why that matters. The FIRST export after the move failed with
"Attempt to open script 'res://GameState.gd'" - the old path - while
project.godot on disk plainly said res://core/GameState.gd. That is this
project's documented Android FUSE mtime trap: Godot served a cached copy of a
file whose content had changed. A `touch` fixed it. Nothing in the test suite
would have found that, because the suite runs from a copy on a native
filesystem - the one place the bug cannot happen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Loïc Wisniewski 2026-08-21 19:44:14 +02:00
commit 2f161621c3
495 changed files with 571 additions and 567 deletions

View file

@ -10,11 +10,11 @@ func _ready() -> void:
GameState.planet_id = "artillery_preview_gas"
GameState.planet_definition_id = "gas_giant"
GameState.surviving_ship_count = 3
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)
var shell: Node = load("res://ArtilleryShell.tscn").instantiate()
var shell: Node = load("res://enemies/ArtilleryShell.tscn").instantiate()
shell.aoe_radius = 220.0
surface.add_child(shell)
# Frozen with the shell part-way to its target, which is the moment the

View file

@ -10,11 +10,11 @@ func _ready() -> void:
GameState.planet_id = "artillery_preview_rocky"
GameState.planet_definition_id = "rocky"
GameState.surviving_ship_count = 3
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)
var shell: Node = load("res://ArtilleryShell.tscn").instantiate()
var shell: Node = load("res://enemies/ArtilleryShell.tscn").instantiate()
shell.aoe_radius = 220.0
surface.add_child(shell)
# Frozen with the shell part-way to its target, which is the moment the

View file

@ -15,7 +15,7 @@ func _ready() -> void:
func _spawn(planet_name: String, definition_id: String, at: Vector2, shape_seed: int) -> void:
var planet: Node2D = load("res://Planet.tscn").instantiate()
var planet: Node2D = load("res://planets/Planet.tscn").instantiate()
planet.planet_name = planet_name
planet.definition_id = definition_id
planet.shape_seed = shape_seed

View file

@ -16,7 +16,7 @@ func _ready() -> void:
# legible at full strength.
# Partly researched, to show the menu repacking around what is hidden.
GameState.unlocked = ["shipyards", "logistics"]
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("UI/BuildMenu").visible = true
main.get_node("BuildController")._refresh_build_status()

View file

@ -18,7 +18,7 @@ func _ready() -> void:
GameState.rocks = 500
GameState.add_building(GameState.BUILDING_MOTHERSHIP, Vector2(-900.0, 0.0))
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("AsteroidField").set_process(false)
main.get_node("EnemySpawner").set_process(false)

View file

@ -3,7 +3,7 @@ extends Node2D
# Preloaded by path rather than an `is CapturePoint` check - this preview
# runs through screenshot.sh, which (unlike run_tests.sh) does not run an
# import pass first, so the global class_name cache may not be warm yet.
const CAPTURE_POINT_SCRIPT = preload("res://CapturePoint.gd")
const CAPTURE_POINT_SCRIPT = preload("res://surface/CapturePoint.gd")
func _ready() -> void:
@ -12,7 +12,7 @@ func _ready() -> void:
GameState.planet_definition_id = "rocky"
GameState.surviving_ship_count = 3
GameState.rocks = 128
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)

View file

@ -13,4 +13,4 @@ func _ready() -> void:
GameState.gas = 46
GameState.fleet_cargo = 34
GameState.fleet_gas_cargo = 17
add_child(load("res://Main.tscn").instantiate())
add_child(load("res://world/Main.tscn").instantiate())

View file

@ -11,7 +11,7 @@ func _ready() -> void:
GameState.extractors.clear()
GameState.rocks = 500
GameState.vessel_levels = {"unlock_shield": 1, "unlock_gas_bomber": 1, "unlock_carrier": 1}
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("UI/CraftMenu").visible = true
main.get_node("BuildController")._refresh_craft_status()

View file

@ -13,7 +13,7 @@ func _ready() -> void:
GameState.rocks = 500
GameState.vessel_levels = {"unlock_shield": 1, "unlock_gas_bomber": 1, "unlock_carrier": 1}
GameState.stored_vessels = ["shield", "gas_bomber", "carrier"]
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
var fleet: Node = main.get_node("Fleet")
fleet.spawn_ships(2, Vector2.ZERO, PackedStringArray(["interceptor", "carrier"]))

View file

@ -8,13 +8,13 @@ extends Node
func _ready() -> void:
GameState.buildings.clear()
GameState.extractors.clear()
var main: Node2D = load("res://Main.tscn").instantiate()
var main: Node2D = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("AsteroidField").set_process(false)
main.get_node("EnemySpawner").set_process(false)
main.get_node("LandingController").set_process(false)
var building: Node2D = load("res://Building.tscn").instantiate()
var building: Node2D = load("res://buildings/Building.tscn").instantiate()
building.definition_id = GameState.BUILDING_MOTHERSHIP
building.position = Vector2(0, 420)
main.add_child(building)

View file

@ -18,7 +18,7 @@ func _ready() -> void:
GameState.fleet_gas_cargo = 12
GameState.unlocked = ["shipyards", "logistics", "freight"]
GameState.vessel_levels["unlock_gas_bomber"] = 1
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BackgroundLayer").visible = false
main.get_node("Fleet").visible = false

View file

@ -23,7 +23,7 @@ const CELLS: Array = [
func _ready() -> void:
RenderingServer.set_default_clear_color(Color(0.02, 0.03, 0.06))
var building_scene: PackedScene = load("res://Building.tscn")
var building_scene: PackedScene = load("res://buildings/Building.tscn")
for i in range(CELLS.size()):
var cell: Dictionary = CELLS[i]
var b: Node2D = building_scene.instantiate()

View file

@ -5,11 +5,11 @@ extends Node2D
# others are meant to be more distinctive than.
# bash tests/screenshot.sh res://tests/_enemy_gallery_preview.tscn /tmp/enemies.png 15 720x1280
const ENEMY_DEFINITIONS = preload("res://EnemyDefinitions.gd")
const ENEMY_DEFINITIONS = preload("res://enemies/EnemyDefinitions.gd")
func _ready() -> void:
var enemy_scene: PackedScene = load("res://Enemy.tscn")
var enemy_scene: PackedScene = load("res://enemies/Enemy.tscn")
var ids: Array = ["chaser", "sniper", "artillery", "turret_spawner", "enemy_mothership"]
var y: float = 200.0
for id in ids:

View file

@ -6,7 +6,7 @@ func _ready() -> void:
GameState.transporters.clear()
GameState.fleet_cargo = 9
GameState.fleet_gas_cargo = 4
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
var planet: Node2D
for planets in main.get_node("PlanetField").populated_chunks.values():

View file

@ -11,7 +11,7 @@ func _ready() -> void:
GameState.rocks = 200
GameState.gas = 30
GameState.fleet_cargo = 0
var scene: Node = load("res://Main.tscn").instantiate()
var scene: Node = load("res://world/Main.tscn").instantiate()
add_child(scene)
var fleet: Node = scene.get_node("Fleet")
fleet.spawn_ships(3, Vector2.ZERO, PackedStringArray(["interceptor", "interceptor", "shield"]))

View file

@ -13,7 +13,7 @@ func _initialize() -> void:
print("gui/theme/custom = '%s'" % ProjectSettings.get_setting("gui/theme/custom", ""))
print("gui/theme/custom_font = '%s'" % ProjectSettings.get_setting("gui/theme/custom_font", ""))
var scene: Node = load("res://Main.tscn").instantiate()
var scene: Node = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
for path in ["UI/BuildMenu/InfoPopup/Panel/TitleLabel",

View file

@ -6,7 +6,7 @@ func _ready() -> void:
GameState.extractors.clear()
GameState.transporters.clear()
GameState.vessel_levels["unlock_gas_bomber"] = 1
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BackgroundLayer").visible = false
main.get_node("AsteroidField").visible = false
@ -37,7 +37,7 @@ func _ready() -> void:
drag.position = press.position + Vector2(-245, -235)
skill.handle_drag(drag)
for offset in [Vector2(-65, 0), Vector2(45, -45), Vector2(55, 65)]:
var enemy: Node = load("res://Enemy.tscn").instantiate()
var enemy: Node = load("res://enemies/Enemy.tscn").instantiate()
enemy.position = skill.aim_target + offset
main.add_child(enemy)
enemy.speed = 0.0 # after add_child - _ready() sets it from the definition

View file

@ -15,7 +15,7 @@ func _ready() -> void:
GameState.extractors.clear()
GameState.rocks = 500
GameState.unlocked = ["shipyards", "logistics", "coordination", "freight", "vessel_science", "power_systems"]
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("UI/BuildMenu").visible = true
main.get_node("BuildController")._refresh_build_status()

View file

@ -17,7 +17,7 @@ func _ready() -> void:
GameState.fleet_cargo = 24
GameState.fleet_gas_cargo = 12
GameState.unlocked = ["shipyards", "logistics", "freight", "power_systems"]
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BuildingField").place(GameState.BUILDING_GAS_BURNER, Vector2(400.0, 0.0))
var burner_id: int = int(GameState.buildings[-1].id)

View file

@ -9,6 +9,6 @@ func _ready() -> void:
GameState.gas = 46
GameState.fleet_cargo = 34
GameState.fleet_gas_cargo = 17
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)

View file

@ -13,7 +13,7 @@ func _ready() -> void:
GameState.VESSEL_SHIELD, GameState.VESSEL_SHIELD,
GameState.VESSEL_GAS_BOMBER,
]
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BackgroundLayer").visible = false
main.get_node("AsteroidField").visible = false

View file

@ -13,7 +13,7 @@ func _ready() -> void:
GameState.vessel_levels["unlock_gas_bomber"] = 1
GameState.deposit_fleet_resource(GameState.RESOURCE_ENERGY, 200)
GameState.deposit_fleet_resource(GameState.RESOURCE_GAS, 200)
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("EnemySpawner").set_process(false)
main.get_node("AsteroidField").set_process(false)

View file

@ -18,7 +18,7 @@ func _ready() -> void:
GameState.add_building(GameState.BUILDING_TRANSPORT_HUB, Vector2(480.0, 0.0))
GameState.add_building(GameState.BUILDING_SHIP_LAB, Vector2(820.0, 0.0))
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("AsteroidField").set_process(false)
main.get_node("EnemySpawner").set_process(false)

View file

@ -13,7 +13,7 @@ func _ready() -> void:
GameState.bank_inventory.set_amount(GameState.RESOURCE_ORE, 310)
GameState.fleet_inventory.set_amount(GameState.RESOURCE_ORE, 47)
GameState.research_points = 4
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("EnemySpawner").set_process(false)
main.get_node("AsteroidField").set_process(false)

View file

@ -12,7 +12,7 @@ func _ready() -> void:
GameState.extractors.clear()
GameState.transporters.clear()
GameState.vessel_levels["unlock_laser"] = 1
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BackgroundLayer").visible = false
main.get_node("AsteroidField").visible = false
@ -43,7 +43,7 @@ func _ready() -> void:
drag.position = press.position + Vector2(-245.0, -235.0)
skill.handle_drag(drag)
for t in [0.35, 0.6]:
var enemy: Node = load("res://Enemy.tscn").instantiate()
var enemy: Node = load("res://enemies/Enemy.tscn").instantiate()
enemy.position = fleet.get_centroid().lerp(skill.aim_target, t)
main.add_child(enemy)
enemy.speed = 0.0 # after add_child - _ready() sets it from the definition

View file

@ -37,7 +37,7 @@ func _ready() -> void:
GameState.add_extractor(data.name, WorldGen.chunk_origin(best) + data.local_pos)
print("extractor on '%s' at chunk %s" % [data.name, best])
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
# open_map(), not `visible = true` - opening also recentres the view on
# the fleet, and without that the map is drawn from its own origin in the

View file

@ -12,7 +12,7 @@ var main: Node
func _ready() -> void:
GameState.buildings.clear()
GameState.extractors.clear()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BackgroundLayer").visible = false
main.get_node("AsteroidField").visible = false
@ -26,12 +26,12 @@ func _ready() -> void:
if is_instance_valid(ship):
ship.set_physics_process(false)
var mothership: Node = load("res://Enemy.tscn").instantiate()
var mothership: Node = load("res://enemies/Enemy.tscn").instantiate()
mothership.enemy_id = "enemy_mothership"
mothership.position = Vector2(-500, -300)
main.add_child(mothership)
var beam: Node2D = load("res://EnemyBigLaserBeam.tscn").instantiate()
var beam: Node2D = load("res://enemies/EnemyBigLaserBeam.tscn").instantiate()
beam.charge_time = 10.0 # frozen mid-countdown for the screenshot
beam.beam_range = 1400.0
beam.beam_half_width = 35.0

View file

@ -17,7 +17,7 @@ func _ready() -> void:
func _spawn(planet_name: String, at: Vector2, shape_seed: int) -> void:
var planet: Node2D = load("res://Planet.tscn").instantiate()
var planet: Node2D = load("res://planets/Planet.tscn").instantiate()
planet.planet_name = planet_name
planet.shape_seed = shape_seed
planet.position = at

View file

@ -16,7 +16,7 @@ func _initialize() -> void:
print("engine boot to _initialize: %d ms" % boot)
t0 = Time.get_ticks_msec()
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
print("load(Main.tscn): %d ms" % (Time.get_ticks_msec() - t0))
t0 = Time.get_ticks_msec()

View file

@ -9,6 +9,6 @@ func _ready() -> void:
GameState.planet_definition_id = "research_lab"
GameState.surviving_ship_count = 3
GameState.rocks = 128
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)

View file

@ -14,4 +14,4 @@ func _ready() -> void:
GameState.gas = 46
GameState.fleet_cargo = 34
GameState.fleet_gas_cargo = 17
add_child(load("res://PlanetSurface.tscn").instantiate())
add_child(load("res://surface/PlanetSurface.tscn").instantiate())

View file

@ -15,6 +15,6 @@ func _ready() -> void:
GameState.gas = 46
GameState.fleet_cargo = 34
GameState.fleet_gas_cargo = 17
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)

View file

@ -16,7 +16,7 @@ extends SceneTree
# surface profile from planet_definition_id - so without this the tool can
# only ever photograph the default planet:
#
# ... -- res://PlanetSurface.tscn out.png 90 planet_definition_id=gas_giant
# ... -- res://surface/PlanetSurface.tscn out.png 90 planet_definition_id=gas_giant
var wait_frames: int = 60
var frames: int = 0

View file

@ -7,6 +7,6 @@ extends Node2D
func _ready() -> void:
var editor: Node = load("res://PlanetSetupEditor.tscn").instantiate()
var editor: Node = load("res://surface/PlanetSetupEditor.tscn").instantiate()
add_child(editor)
editor._on_load_pressed()

View file

@ -2,7 +2,7 @@ extends Node2D
func _ready() -> void:
var editor: Node = load("res://PlanetSetupEditor.tscn").instantiate()
var editor: Node = load("res://surface/PlanetSetupEditor.tscn").instantiate()
add_child(editor)
editor.new_setup("preview_setup", "Preview Setup", "rocky")
editor.add_capture_point(Vector2(300, 150))

View file

@ -7,6 +7,6 @@ func _ready() -> void:
GameState.planet_definition_id = "rocky"
GameState.surviving_ship_count = 3
GameState.rocks = 128
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)

View file

@ -16,7 +16,7 @@ func _ready() -> void:
GameState.bank_inventory.set_amount(GameState.RESOURCE_GAS, 85)
GameState.fleet_inventory.set_amount(GameState.RESOURCE_ORE, 17)
GameState.research_points = 6
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("EnemySpawner").set_process(false)
main.get_node("AsteroidField").set_process(false)

View file

@ -26,7 +26,7 @@ func _ready() -> void:
GameState.buildings.clear()
GameState.extractors.clear()
GameState.transporters.clear()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BackgroundLayer").visible = false
main.get_node("AsteroidField").visible = false
@ -58,13 +58,13 @@ func _process(_delta: float) -> void:
for projectile in get_tree().get_nodes_in_group("player_projectiles"):
projectile.queue_free()
var chaser: Node = load("res://Enemy.tscn").instantiate()
var chaser: Node = load("res://enemies/Enemy.tscn").instantiate()
chaser.enemy_id = "chaser"
chaser.position = Vector2(-160, -80)
main.add_child(chaser)
chaser.speed = 0.0
var sniper: Node = load("res://Enemy.tscn").instantiate()
var sniper: Node = load("res://enemies/Enemy.tscn").instantiate()
sniper.enemy_id = "sniper"
sniper.position = Vector2(160, -80)
main.add_child(sniper)

View file

@ -17,7 +17,7 @@ func _ready() -> void:
GameState.fleet_cargo = 24
GameState.fleet_gas_cargo = 12
GameState.unlocked = ["shipyards", "logistics", "freight"]
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BuildingField").place(GameState.BUILDING_SHIP_CRAFTER, Vector2(400.0, 0.0))
var crafter_id: int = int(GameState.buildings[-1].id)

View file

@ -30,7 +30,7 @@ func _ready() -> void:
returning.from = Vector2(-380.0, 150.0)
returning.to = Vector2(420.0, 150.0)
var main: Node = load("res://Main.tscn").instantiate()
var main: Node = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("AsteroidField").set_process(false)
main.get_node("EnemySpawner").set_process(false)

View file

@ -15,7 +15,7 @@ func _ready() -> void:
GameState.buildings.clear()
GameState.extractors.clear()
GameState.transporters.clear()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
add_child(main)
main.get_node("BackgroundLayer").visible = false
main.get_node("AsteroidField").visible = false
@ -43,13 +43,13 @@ func _process(_delta: float) -> void:
for projectile in get_tree().get_nodes_in_group("player_projectiles"):
projectile.queue_free()
var chaser: Node = load("res://Enemy.tscn").instantiate()
var chaser: Node = load("res://enemies/Enemy.tscn").instantiate()
chaser.enemy_id = "chaser"
chaser.position = Vector2(-160, -80)
main.add_child(chaser)
chaser.speed = 0.0
var turret: Node = load("res://Enemy.tscn").instantiate()
var turret: Node = load("res://enemies/Enemy.tscn").instantiate()
turret.enemy_id = "turret_spawner"
turret.position = Vector2(160, -80)
main.add_child(turret)

View file

@ -9,8 +9,8 @@ extends Node2D
# bash tests/screenshot.sh res://tests/_vfx_preview.tscn out.png 20
const VFX_SCRIPTS: Array = [
"res://ShipExplosionVFX.gd", "res://EnemyExplosionVFX.gd",
"res://AsteroidExplosionVFX.gd", "res://LightBurstVFX.gd",
"res://vfx/ShipExplosionVFX.gd", "res://vfx/EnemyExplosionVFX.gd",
"res://vfx/AsteroidExplosionVFX.gd", "res://vfx/LightBurstVFX.gd",
]
@ -18,7 +18,7 @@ func _ready() -> void:
RenderingServer.set_default_clear_color(Color(0.02, 0.03, 0.06))
# Bolts at several headings, held still so they can be inspected.
var bolt_scene: PackedScene = load("res://Projectile.tscn")
var bolt_scene: PackedScene = load("res://vessels/Projectile.tscn")
for i in range(6):
var bolt: Area2D = bolt_scene.instantiate()
bolt.position = Vector2(-460.0 + float(i) * 90.0, -220.0)

View file

@ -10,6 +10,6 @@ func _ready() -> void:
GameState.planet_name = "Event Zero"
GameState.planet_definition_id = "black_hole"
GameState.surviving_ship_count = 3
var surface: Node = load("res://PlanetSurface.tscn").instantiate()
var surface: Node = load("res://surface/PlanetSurface.tscn").instantiate()
surface.get_node("SurfaceController").fade_duration = 0.0
add_child(surface)

View file

@ -10,7 +10,7 @@
# a phone's frame budget is not.
#
# Usage: bash tests/profile_shader.sh <shader_res_path> [timed_frames] [warmup] [WxH]
# Example: bash tests/profile_shader.sh res://lunar_surface.gdshader 30 10 720x1280
# Example: bash tests/profile_shader.sh res://shaders/lunar_surface.gdshader 30 10 720x1280
set -e
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"

View file

@ -13,7 +13,7 @@
#
# 1. It runs from a COPY on Termux's own filesystem, not from the project
# directory. The project lives under ~/storage/shared, which is Android's
# FUSE bridge; read through proot on top of that, `load("res://Main.tscn")`
# FUSE bridge; read through proot on top of that, `load("res://world/Main.tscn")`
# alone took 8.5s per test, against ~2s from a native path. Nearly every
# test loads Main.tscn, and none of that time is gameplay. The copy is
# ~1.4s for the whole suite and its .godot import cache is kept between

View file

@ -11,8 +11,8 @@
# but doesn't hit this crash. Good enough for one-shot screenshots.
#
# Usage: bash tests/screenshot.sh <scene_res_path> <output_png_path> [wait_frames] [WxH] [key=value ...]
# Example: bash tests/screenshot.sh res://Main.tscn /tmp/out.png 60 720x1280
# bash tests/screenshot.sh res://PlanetSurface.tscn /tmp/gas.png 90 720x1280 planet_definition_id=gas_giant
# Example: bash tests/screenshot.sh res://world/Main.tscn /tmp/out.png 60 720x1280
# bash tests/screenshot.sh res://surface/PlanetSurface.tscn /tmp/gas.png 90 720x1280 planet_definition_id=gas_giant
#
# Trailing key=value pairs are set on the GameState autoload before the
# scene loads - see tests/_screenshot_tool.gd.

View file

@ -32,7 +32,7 @@ func _initialize() -> void:
game_state = root.get_node("GameState")
game_state.buildings.clear()
game_state.extractors.clear()
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
field = scene.get_node("BuildingField")

View file

@ -43,7 +43,7 @@ var elapsed: float = 0.0
func _initialize() -> void:
ARTILLERY_SHELL_SCRIPT = load("res://ArtilleryShell.gd")
ARTILLERY_SHELL_SCRIPT = load("res://enemies/ArtilleryShell.gd")
game_state = root.get_node("GameState")
game_state.buildings.clear()
game_state.extractors.clear()
@ -52,7 +52,7 @@ func _initialize() -> void:
game_state.build_time_scale = 0.02
game_state.reset_progression()
game_state.rocks = 2000
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
@ -83,7 +83,7 @@ func _process(delta: float) -> bool:
origin = impact_point + Vector2(400, 400)
travel_time = origin.distance_to(impact_point) / 300.0
shell = load("res://ArtilleryShell.tscn").instantiate()
shell = load("res://enemies/ArtilleryShell.tscn").instantiate()
shell.shell_speed = 300.0
shell.aoe_radius = 220.0
shell.damage = 3
@ -145,7 +145,7 @@ func _process(delta: float) -> bool:
# moves after the shot is fired ---------------------------------
fleet.spawn_ships(1, Vector2(9000, 0))
far_ship = fleet.ships[0]
artillery = load("res://Enemy.tscn").instantiate()
artillery = load("res://enemies/Enemy.tscn").instantiate()
artillery.enemy_id = "artillery"
artillery.position = far_ship.position + Vector2(300, 0)
main.add_child(artillery)

View file

@ -32,14 +32,14 @@ func _initialize() -> void:
game_state.buildings.clear()
game_state.extractors.clear()
game_state.reset_progression()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
current_scene = main
fleet = main.get_node("Fleet")
func _spawn_asteroid(at: Vector2) -> Node2D:
var rock: Node2D = load("res://Asteroid.tscn").instantiate()
var rock: Node2D = load("res://world/Asteroid.tscn").instantiate()
rock.position = at
main.add_child(rock)
return rock
@ -128,13 +128,13 @@ func _process(delta: float) -> bool:
# --- E. abandoned ore expires, authored ore does not ----------
_clear_sky()
var abandoned: Node2D = load("res://Rock.tscn").instantiate()
var abandoned: Node2D = load("res://surface/Rock.tscn").instantiate()
abandoned.build_shape(1)
abandoned.lifetime = 0.4
# Far from every ship, or it would be collected rather than expire.
abandoned.position = fleet.get_centroid() + Vector2(9000.0, 0.0)
main.add_child(abandoned)
var authored: Node2D = load("res://Rock.tscn").instantiate()
var authored: Node2D = load("res://surface/Rock.tscn").instantiate()
authored.build_shape(2)
authored.position = fleet.get_centroid() + Vector2(9600.0, 0.0)
main.add_child(authored)

View file

@ -31,7 +31,7 @@ var ships_at_start: int = 0
func _initialize() -> void:
root.get_node("GameState").reset_formation()
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
field = scene.get_node("AsteroidField")

View file

@ -18,7 +18,7 @@ var stage: int = 0
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")
@ -31,7 +31,7 @@ func _process(delta: float) -> bool:
# Wait one tick so Fleet._ready() has run and fleet.ships is
# populated before we grab a ship reference.
target_ship = fleet.ships[0]
var asteroid_scene: PackedScene = load("res://Asteroid.tscn")
var asteroid_scene: PackedScene = load("res://world/Asteroid.tscn")
asteroid = asteroid_scene.instantiate()
asteroid.position = target_ship.position
asteroid.velocity = Vector2.ZERO

View file

@ -34,7 +34,7 @@ func _initialize() -> void:
quit(1)
return
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")

View file

@ -82,14 +82,14 @@ func _initialize() -> void:
print("dark matter is generic: in resource_types(), own definition, own colour %s" % dm_color)
# --- structural: the black hole definition itself -----------------------
var black_hole_def: Resource = load("res://PlanetDefinitions.gd").get_definition("black_hole")
var black_hole_def: Resource = load("res://planets/PlanetDefinitions.gd").get_definition("black_hole")
if black_hole_def.resource_id != "dark_matter":
_fail("black_hole planet's resource_id is '%s', expected 'dark_matter'" % black_hole_def.resource_id)
return
if black_hole_def.surface_profile_id != "void":
_fail("black_hole planet's surface_profile_id is '%s', expected 'void'" % black_hole_def.surface_profile_id)
return
var void_profile: Resource = load("res://PlanetSurfaceProfiles.gd").get_profile("void")
var void_profile: Resource = load("res://surface/PlanetSurfaceProfiles.gd").get_profile("void")
if void_profile.features_scene != null:
_fail("void surface profile has a features_scene - dark matter must never be a surface pickup")
return
@ -101,7 +101,7 @@ func _initialize() -> void:
game_state.planet_id = "test_black_hole"
game_state.planet_name = "Event Zero"
game_state.planet_definition_id = "black_hole"
scene = load("res://PlanetSurface.tscn").instantiate()
scene = load("res://surface/PlanetSurface.tscn").instantiate()
root.add_child(scene)
current_scene = scene

View file

@ -46,7 +46,7 @@ func _initialize() -> void:
for node in GameState.SKILL_TREE:
game_state.unlocked.append(node.id)
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
controller = scene.get_node("BuildController")
popup = scene.get_node("UI/BuildMenu/InfoPopup")

View file

@ -32,7 +32,7 @@ func _initialize() -> void:
game_state.transporters.clear()
game_state.reset_progression()
game_state.rocks = 500
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
controller = scene.get_node("BuildController")

View file

@ -25,7 +25,7 @@ const EXPECTED: Dictionary = {
func _initialize() -> void:
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)

View file

@ -1,10 +1,10 @@
extends SceneTree
const BUILDING_DEFINITIONS = preload("res://BuildingDefinitions.gd")
const BUILDING_DEFINITIONS = preload("res://buildings/BuildingDefinitions.gd")
func _initialize() -> void:
var scene: PackedScene = load("res://Building.tscn")
var scene: PackedScene = load("res://buildings/Building.tscn")
for definition in BUILDING_DEFINITIONS.all():
if definition.placement_mode != "space":
continue

View file

@ -36,7 +36,7 @@ func _initialize() -> void:
var game_state: Node = root.get_node("GameState")
game_state.buildings.clear()
game_state.extractors.clear()
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
field = scene.get_node("BuildingField")

View file

@ -52,7 +52,7 @@ func _initialize() -> void:
# wall clock. See GameState.build_time_scale.
game_state.build_time_scale = 0.02
game_state.unlocked = ["shipyards", "coordination", "wing", "squadron", "armada"]
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
field = scene.get_node("BuildingField")

View file

@ -23,7 +23,7 @@ var identical_frames: int = 0
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")

View file

@ -38,8 +38,8 @@ var progress_before_drain: float = 0.0
func _initialize() -> void:
CAPTURE_POINT_SCRIPT = load("res://CapturePoint.gd")
PLANET_SETUP_SCRIPT = load("res://PlanetSetup.gd")
CAPTURE_POINT_SCRIPT = load("res://surface/CapturePoint.gd")
PLANET_SETUP_SCRIPT = load("res://surface/PlanetSetup.gd")
game_state = root.get_node("GameState")
game_state.planet_capture.clear()
@ -51,11 +51,11 @@ func _initialize() -> void:
fake_setup.capture_points = PackedVector2Array([Vector2(0, 0), Vector2(500, 0)])
game_state.planet_id = restore_planet_id
var host1: Node = load("res://PlanetSetupHost.tscn").instantiate()
var host1: Node = load("res://surface/PlanetSetupHost.tscn").instantiate()
host1.apply_setup(fake_setup)
game_state.mark_point_captured(restore_planet_id, 0) # simulates a completed prior visit
var host2: Node = load("res://PlanetSetupHost.tscn").instantiate()
var host2: Node = load("res://surface/PlanetSetupHost.tscn").instantiate()
host2.apply_setup(fake_setup)
var restored: Node = null
var fresh: Node = null
@ -77,7 +77,7 @@ func _initialize() -> void:
game_state.extractors.clear()
game_state.rocks = 200
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
@ -93,7 +93,7 @@ func _process(delta: float) -> bool:
for a in get_nodes_in_group("asteroids"):
a.queue_free()
point = load("res://CapturePoint.tscn").instantiate()
point = load("res://surface/CapturePoint.tscn").instantiate()
point.point_index = 0
point.capture_time = 1.0
point.capture_radius = 200.0

View file

@ -42,7 +42,7 @@ func _initialize() -> void:
# primitives work off GameState, not off the spawned node - so this stays
# a display test rather than becoming one about the building system.
mothership_id = game_state.add_building(GameState.BUILDING_MOTHERSHIP, Vector2.ZERO)
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)

View file

@ -49,7 +49,7 @@ func _initialize() -> void:
game_state.build_time_scale = 0.02
game_state.rocks = 500
game_state.research_points = 1
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
controller = scene.get_node("BuildController")
@ -205,7 +205,7 @@ func _process(delta: float) -> bool:
# same frame - a false positive, not the carrier firing.
if elapsed < 0.3:
return false
var enemy_scene: PackedScene = load("res://Enemy.tscn")
var enemy_scene: PackedScene = load("res://enemies/Enemy.tscn")
enemy = enemy_scene.instantiate()
enemy.position = fleet.get_centroid() + Vector2(220.0, 0.0)
scene.add_child(enemy)

View file

@ -32,14 +32,14 @@ func _initialize() -> void:
game_state.extractors.clear()
game_state.reset_progression()
game_state.vessel_levels["unlock_shield"] = 1
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
current_scene = main
fleet = main.get_node("Fleet")
func _spawn_enemy(enemy_id: String, at: Vector2) -> Node2D:
var enemy: Node2D = load("res://Enemy.tscn").instantiate()
var enemy: Node2D = load("res://enemies/Enemy.tscn").instantiate()
enemy.enemy_id = enemy_id
enemy.position = at
main.add_child(enemy)
@ -60,7 +60,7 @@ func _process(delta: float) -> bool:
hazard.queue_free()
fleet.spawn_ships(1, Vector2.ZERO, PackedStringArray([GameState.VESSEL_INTERCEPTOR]))
var definitions: Script = load("res://EnemyDefinitions.gd")
var definitions: Script = load("res://enemies/EnemyDefinitions.gd")
if not bool(definitions.get_definition("chaser").dies_on_contact):
return _fail("the chaser is not marked dies_on_contact")
if bool(definitions.get_definition("sniper").dies_on_contact):

View file

@ -0,0 +1 @@
uid://bjqhkqmw1ls04

View file

@ -27,7 +27,7 @@ var elapsed: float = 0.0
func _initialize() -> void:
game_state = root.get_node("GameState")
game_state.planet_capture.clear()
host_scene = load("res://PlanetSetupHost.tscn")
host_scene = load("res://surface/PlanetSetupHost.tscn")
func _process(delta: float) -> bool:
@ -85,14 +85,14 @@ func _process(delta: float) -> bool:
func _make_setup(capture_count: int, enemy_count: int) -> Resource:
var setup: Resource = load("res://PlanetSetup.gd").new()
var setup: Resource = load("res://surface/PlanetSetup.gd").new()
setup.setup_id = "in_memory"
setup.surface_profile_id = "rocky"
var points: PackedVector2Array = PackedVector2Array()
for i in range(capture_count):
points.append(Vector2(200.0 * float(i + 1), 0.0))
setup.capture_points = points
var spawn_script: Script = load("res://PlanetSetupSpawn.gd")
var spawn_script: Script = load("res://surface/PlanetSetupSpawn.gd")
for i in range(enemy_count):
var spawn: Resource = spawn_script.new()
spawn.enemy_id = "chaser"

View file

@ -29,7 +29,7 @@ func _initialize() -> void:
game_state.buildings.clear()
game_state.extractors.clear()
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
field = scene.get_node("BuildingField")

View file

@ -52,7 +52,7 @@ func _initialize() -> void:
game_state.fleet_cargo = 0
game_state.stored_vessels.clear()
game_state.build_time_scale = 0.02
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
controller = scene.get_node("BuildController")
fleet = scene.get_node("Fleet")

View file

@ -34,7 +34,7 @@ func _initialize() -> void:
game_state.buildings.clear()
game_state.extractors.clear()
game_state.reset_progression()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
current_scene = main
fleet = main.get_node("Fleet")

View file

@ -0,0 +1 @@
uid://bgbmbg1bd8r4v

View file

@ -116,7 +116,7 @@ func _process(delta: float) -> bool:
return _fail("starting a normal game after a dev one kept the dev stock")
print("starting a normal game afterwards clears dev mode entirely")
menu = load("res://MainMenu.tscn").instantiate()
menu = load("res://ui/MainMenu.tscn").instantiate()
root.add_child(menu)
current_scene = menu
elapsed = 0.0

View file

@ -109,7 +109,7 @@ func _process(delta: float) -> bool:
# --- C continued: the SpeedFader visibly follows it down ----------
if elapsed < 0.2:
return false
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
fader = main.get_node("UI/SpeedFader")

View file

@ -32,7 +32,7 @@ func _initialize() -> void:
game_state.reset_progression()
game_state.vessel_levels["unlock_distorder"] = 1
game_state.deposit_fleet_resource(GameState.RESOURCE_ENERGY, 500)
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
fader = main.get_node("UI/SpeedFader")

View file

@ -22,7 +22,7 @@ var started: bool = false
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")
@ -45,7 +45,7 @@ func _physics_process(delta: float) -> bool:
root.get_node("GameState").unlocked.append_array(["wing", "squadron", "armada"])
fleet.spawn_ships(5, Vector2.ZERO)
target_ship = fleet.ships[0]
var enemy_scene: PackedScene = load("res://Enemy.tscn")
var enemy_scene: PackedScene = load("res://enemies/Enemy.tscn")
enemy = enemy_scene.instantiate()
enemy.position = target_ship.position
main_scene.add_child(enemy)

View file

@ -23,7 +23,7 @@ var started: bool = false
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")
@ -45,7 +45,7 @@ func _physics_process(delta: float) -> bool:
# a full one.
root.get_node("GameState").unlocked.append_array(["wing", "squadron", "armada"])
fleet.spawn_ships(5, Vector2.ZERO)
var enemy_scene: PackedScene = load("res://Enemy.tscn")
var enemy_scene: PackedScene = load("res://enemies/Enemy.tscn")
enemy = enemy_scene.instantiate()
enemy.position = fleet.get_centroid() + SPAWN_OFFSET
main_scene.add_child(enemy)

View file

@ -23,7 +23,7 @@ func _initialize() -> void:
if chaser_def.enemy_id != "chaser" or chaser_def.max_hp != 3:
return _fail("EnemyDefinitions did not resolve the chaser definition")
main_scene = load("res://Main.tscn").instantiate()
main_scene = load("res://world/Main.tscn").instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")
main_scene.get_node("EnemySpawner").set_process(false)
@ -38,7 +38,7 @@ func _initialize() -> void:
inner.name = "Inner"
nested_host.add_child(inner)
enemy = load("res://Enemy.tscn").instantiate()
enemy = load("res://enemies/Enemy.tscn").instantiate()
enemy.position = fleet.get_centroid() + Vector2(600, 0)
inner.add_child(enemy)

View file

@ -34,7 +34,7 @@ func _initialize() -> void:
game_state.extractors.clear()
game_state.transporters.clear()
game_state.reset_progression()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
@ -52,7 +52,7 @@ func _process(delta: float) -> bool:
fleet.spawn_ships(1, Vector2.ZERO)
# --- A. beyond detection_range: no movement at all ---------------
chaser = load("res://Enemy.tscn").instantiate()
chaser = load("res://enemies/Enemy.tscn").instantiate()
chaser.enemy_id = "chaser"
var pursuit: Node = null
main.add_child(chaser)
@ -60,7 +60,7 @@ func _process(delta: float) -> bool:
chaser.position = fleet.get_centroid() + Vector2(pursuit.detection_range + 300.0, 0.0)
chaser_start = chaser.position
sniper = load("res://Enemy.tscn").instantiate()
sniper = load("res://enemies/Enemy.tscn").instantiate()
sniper.enemy_id = "sniper"
main.add_child(sniper)
var standoff: Node = sniper.get_component("standoff")
@ -98,7 +98,7 @@ func _process(delta: float) -> bool:
print("chaser correctly idle beyond range, closes in once inside it")
# --- D. the mothership closes in from far beyond a chaser's range -
mothership = load("res://Enemy.tscn").instantiate()
mothership = load("res://enemies/Enemy.tscn").instantiate()
mothership.enemy_id = "enemy_mothership"
main.add_child(mothership)
var mother_pursuit: Node = mothership.get_component("pursuit")

View file

@ -53,11 +53,11 @@ var elapsed: float = 0.0
func _initialize() -> void:
game_state = root.get_node("GameState")
beam_script = load("res://EnemyBigLaserBeam.gd")
beam_script = load("res://enemies/EnemyBigLaserBeam.gd")
# Four vessels are crewed below, past BASE_FLEET_SIZE's 3 slots, so the
# capacity doctrines are granted rather than assumed.
game_state.unlocked.append_array(["wing", "squadron", "armada"])
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
@ -92,7 +92,7 @@ func _process(delta: float) -> bool:
if not shield_ship.has_shield():
return _fail("shield ship has no shield right after being added")
var beam_scene: PackedScene = load("res://EnemyBigLaserBeam.tscn")
var beam_scene: PackedScene = load("res://enemies/EnemyBigLaserBeam.tscn")
beam = beam_scene.instantiate()
beam.charge_time = 0.5
beam.beam_range = 1000.0
@ -153,7 +153,7 @@ func _process(delta: float) -> bool:
fleet.ships.clear()
fleet.spawn_ships(1, Vector2(3000, 0))
mothership = load("res://Enemy.tscn").instantiate()
mothership = load("res://enemies/Enemy.tscn").instantiate()
mothership.enemy_id = "enemy_mothership"
mothership.position = Vector2.ZERO
main.add_child(mothership)

View file

@ -24,13 +24,13 @@ func _initialize() -> void:
game_state.build_time_scale = 0.02
game_state.reset_progression()
game_state.rocks = 2000
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
func _fire_at(ship: Node) -> void:
var projectile: Area2D = load("res://EnemyProjectile.tscn").instantiate()
var projectile: Area2D = load("res://enemies/EnemyProjectile.tscn").instantiate()
projectile.global_position = ship.global_position
projectile.launch(Vector2.ZERO) # already on top of the target
scene.add_child(projectile)

View file

@ -15,7 +15,7 @@ var teleported: bool = false
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")

View file

@ -59,7 +59,7 @@ func _initialize() -> void:
for node in GameState.SKILL_TREE:
game_state.unlocked.append(node.id)
main_scene = load("res://Main.tscn").instantiate()
main_scene = load("res://world/Main.tscn").instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")
controller = main_scene.get_node("BuildController")

View file

@ -17,7 +17,7 @@ func _initialize() -> void:
state.transporters.clear()
state.fleet_cargo = 0
state.fleet_gas_cargo = 0
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
controller = scene.get_node("BuildController")

View file

@ -37,7 +37,7 @@ func _initialize() -> void:
game_state.buildings.clear()
game_state.extractors.clear()
game_state.reset_progression()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
current_scene = main
fleet = main.get_node("Fleet")
@ -92,7 +92,7 @@ func _process(delta: float) -> bool:
return _fail("the default vessel has no weapon component to test")
# Parked at a third of fire range, dead ahead: the old auto-aiming
# gun would have opened up on this immediately.
decoy = load("res://Enemy.tscn").instantiate()
decoy = load("res://enemies/Enemy.tscn").instantiate()
decoy.position = ship.global_position + Vector2(weapon.fire_range * 0.33, 0.0)
main.add_child(decoy)
decoy.speed = 0.0

View file

@ -51,7 +51,7 @@ var tuned: Dictionary = {}
func _initialize() -> void:
var game_state: Node = root.get_node("GameState")
game_state.reset_progression()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
current_scene = main
fleet = main.get_node("Fleet")

View file

@ -42,7 +42,7 @@ func _initialize() -> void:
game_state.extractors.clear()
game_state.rocks = 100
game_state.fleet_cargo = 0
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
field = scene.get_node("BuildingField")
@ -67,7 +67,7 @@ func _process(delta: float) -> bool:
# pool Rock.gd credits on pickup, and a test that calls the new
# API by hand passes just as happily with Rock.gd left untouched.
banked_before = game_state.rocks
var rock: Area2D = load("res://Rock.tscn").instantiate()
var rock: Area2D = load("res://surface/Rock.tscn").instantiate()
rock.build_shape(1)
rock.global_position = fleet.ships[0].global_position
scene.add_child(rock)

View file

@ -33,7 +33,7 @@ func _initialize() -> void:
game_state.rocks = 500
game_state.fleet_cargo = 0
mothership_id = game_state.add_building(GameState.BUILDING_MOTHERSHIP, Vector2.ZERO)
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
current_scene = scene
@ -61,7 +61,7 @@ func _process(delta: float) -> bool:
# --- B. a full hold refuses a pickup, the rock stays ------------
fleet.spawn_ships(1, Vector2.ZERO, PackedStringArray(["interceptor"]))
game_state.fleet_cargo = 20
rock = load("res://Rock.tscn").instantiate()
rock = load("res://surface/Rock.tscn").instantiate()
rock.build_shape(1)
rock.global_position = fleet.ships[0].global_position
scene.add_child(rock)
@ -123,7 +123,7 @@ func _process(delta: float) -> bool:
# test in this suite.
if elapsed < 0.3:
return false
scene = load("res://PlanetSurface.tscn").instantiate()
scene = load("res://surface/PlanetSurface.tscn").instantiate()
root.add_child(scene)
current_scene = scene
elapsed = 0.0

View file

@ -23,7 +23,7 @@ var checkpoint_positions: Array = []
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
fleet = main_scene.get_node("Fleet")

View file

@ -96,7 +96,7 @@ func _process(delta: float) -> bool:
# --- B. what actually flies ----------------------------------
game_state.reset_new_game()
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
elapsed = 0.0

View file

@ -49,7 +49,7 @@ func _initialize() -> void:
game_state.transporters.clear()
game_state.stored_vessels.clear()
game_state.reset_progression()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")

View file

@ -32,7 +32,7 @@ extends SceneTree
# period whenever the camera crosses a wrap boundary. Unless the hashes
# are wrapped to match, the whole sky rearranges itself at that instant
const SHADER_PATH := "res://gas_surface.gdshader"
const SHADER_PATH := "res://shaders/gas_surface.gdshader"
# Sample spacing along the scan, in cells. Small enough that a genuinely
# smooth field moves very little between samples.
const STEP := 0.001

View file

@ -77,7 +77,7 @@ func _initialize() -> void:
return
game_state.fleet_gas_cargo = 20
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
skill = main.get_node("GasBombController")
@ -127,12 +127,12 @@ func _process(delta: float) -> bool:
# enemy's definition, which would otherwise clobber a
# pre-add_child override the instant the enemy entered the tree.
for offset in [Vector2(-60, 0), Vector2(70, 35)]:
var enemy: Node = load("res://Enemy.tscn").instantiate()
var enemy: Node = load("res://enemies/Enemy.tscn").instantiate()
enemy.position = skill.aim_target + offset
main.add_child(enemy)
enemy.speed = 0.0
inside_enemies.append(enemy)
outside_enemy = load("res://Enemy.tscn").instantiate()
outside_enemy = load("res://enemies/Enemy.tscn").instantiate()
outside_enemy.position = skill.aim_target + Vector2(AOE_RADIUS_FOR_TEST + 80.0, 0)
main.add_child(outside_enemy)
outside_enemy.speed = 0.0

View file

@ -43,7 +43,7 @@ func _initialize() -> void:
game_state.rocks = 0
game_state.gas = 0
game_state.fleet_gas_cargo = 0
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
skill = main.get_node("GasBombController")

View file

@ -14,7 +14,7 @@ func _initialize() -> void:
state.vessel_levels["unlock_gas_bomber"] = 1
# #60: shots draw from the fleet hold now - stock enough for both fires.
state.fleet_gas_cargo = 20
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
fleet = main.get_node("Fleet")
skill = main.get_node("GasBombController")

View file

@ -32,7 +32,7 @@ func _initialize() -> void:
game_state.extractors.clear()
game_state.transporters.clear()
game_state.reset_progression()
main = load("res://Main.tscn").instantiate()
main = load("res://world/Main.tscn").instantiate()
root.add_child(main)
current_scene = main
controller = main.get_node("BuildController")
@ -65,7 +65,7 @@ func _process(delta: float) -> bool:
return _fail("could not stock the burner with gas")
# --- A. it offers pause, as its primary action ----------------
var definition: Resource = load("res://BuildingDefinitions.gd") \
var definition: Resource = load("res://buildings/BuildingDefinitions.gd") \
.get_definition(GameState.BUILDING_GAS_BURNER)
var visual: Node = definition.visual_scene.instantiate()
var provider: Node = visual.get_node_or_null("ActionProvider")

View file

@ -42,10 +42,10 @@ func _process(delta: float) -> bool:
# 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()
var surface: Node = load("res://surface/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"):
if gas_field.get_script() != load("res://surface/GasVentField.gd"):
surface.free()
return _fail("gas surface did not compose the gas feature scene")
if surface.get_node_or_null("RockField") != null:
@ -58,10 +58,10 @@ func _process(delta: float) -> bool:
surface.free()
game_state.planet_definition_id = "rocky"
var rocky_surface: Node = load("res://PlanetSurface.tscn").instantiate()
var rocky_surface: Node = load("res://surface/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"):
if rocky_features.get_script() != load("res://surface/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:
@ -80,7 +80,7 @@ func _process(delta: float) -> bool:
break
if not found_giant:
return _fail("world generation produced no deterministic gas giant")
var giant: Node2D = load("res://Planet.tscn").instantiate()
var giant: Node2D = load("res://planets/Planet.tscn").instantiate()
giant.definition_id = "gas_giant"
root.add_child(giant)
giant.visual._process(0.5)

View file

@ -1,6 +1,6 @@
extends SceneTree
const INVENTORY = preload("res://Inventory.gd")
const INVENTORY = preload("res://resources/Inventory.gd")
const TEST_RESOURCE: String = "crystal"

View file

@ -19,7 +19,7 @@ func _initialize() -> void:
game_state.transporters.clear()
game_state.stored_vessels.clear()
game_state.rocks = 100
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
fleet = scene.get_node("Fleet")
controller = scene.get_node("BuildController")
@ -71,7 +71,7 @@ func _process(delta: float) -> bool:
# Context actions are compact until expanded. A mothership unfolds
# research and hangar; transfer stays as a persistent shortcut beside
# Build and is not duplicated in the foldout.
var mothership: Node2D = load("res://Building.tscn").instantiate()
var mothership: Node2D = load("res://buildings/Building.tscn").instantiate()
mothership.set("building_type", GameState.BUILDING_MOTHERSHIP)
mothership._ready()
controller.current_building = mothership

View file

@ -38,7 +38,7 @@ const EXCLUSIVE_PAIRS: Array = [["building_action_button", "hangar_button"]]
func _initialize() -> void:
scene = load("res://Main.tscn").instantiate()
scene = load("res://world/Main.tscn").instantiate()
root.add_child(scene)
controller = scene.get_node("BuildController")
readout = scene.get_node("UI/ResourceReadout")

View file

@ -20,7 +20,7 @@ var press_count: int = 0
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
world_map = main_scene.get_node("UI/WorldMap")

View file

@ -13,7 +13,7 @@ var press_count: int = 0
func _initialize() -> void:
var packed: PackedScene = load("res://Main.tscn")
var packed: PackedScene = load("res://world/Main.tscn")
main_scene = packed.instantiate()
root.add_child(main_scene)
map_button = main_scene.get_node("UI/MapButton")

Some files were not shown because too many files have changed in this diff Show more