Drop-in content: cars/<id>/stats.tres (+optional car.glb), levels/<id>/level.glb or .tscn with a Spawn marker. Raycast arcade car (boost, drift, drift-earns-boost), chase cam, HUD, menu built from registry scan. Placeholder Woolies carpark with shuntable parked cars. Headless smoke test + windowed screenshot harness. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
30 lines
1.1 KiB
GDScript
30 lines
1.1 KiB
GDScript
extends SceneTree
|
|
## Headless smoke test:
|
|
## /Applications/Godot.app/Contents/MacOS/Godot --headless --path . --script tests/smoke.gd
|
|
## Registry finds content, game boots, car drives forward under throttle.
|
|
|
|
func _initialize() -> void:
|
|
_run()
|
|
|
|
func _run() -> void:
|
|
var cars := Registry.cars()
|
|
var levels := Registry.levels()
|
|
assert(not cars.is_empty(), "no cars found")
|
|
assert(not levels.is_empty(), "no levels found")
|
|
for p in cars.values():
|
|
var s: CarStats = load(p)
|
|
assert(s != null and s.engine_power > 0.0, "bad stats: %s" % p)
|
|
Game.car_path = cars.values()[0]
|
|
Game.level_path = levels.values()[0]
|
|
var game: Game = (load("res://src/game.tscn") as PackedScene).instantiate()
|
|
root.add_child(game)
|
|
await process_frame # _ready doesn't run until the main loop starts
|
|
var start: Vector3 = game.car.global_position
|
|
Input.action_press("throttle")
|
|
for i in 180:
|
|
await physics_frame
|
|
var dist := start.distance_to(game.car.global_position)
|
|
assert(dist > 5.0, "car didn't move (%.1f m)" % dist)
|
|
print("smoke ok: %d cars, %d levels, drove %.1f m, %.0f km/h" % [cars.size(), levels.size(), dist, game.car.speed_kmh()])
|
|
quit(0)
|