Initial commit: SpaceshipTest, a top-down space RTS in Godot 4.7.1
A fleet of neon-outlined ships explores a procedurally generated, seeded
infinite world: tap/joystick steering, pinch zoom, formation pivoting,
planet landings, an ore economy with extractors and haulers, and player
built structures (mothership, ship crafter, command centre).
All art is hand-drawn with draw_* calls rather than textures, and the
backgrounds are camera-relative shaders so they stay precise at large
world coordinates.
Includes a 35-test headless suite (tests/run_tests.sh) plus screenshot
tooling that renders real frames through Xvfb and Mesa softpipe, since
--headless has no GPU.
Excluded from version control: .godot/ (import cache, and it holds
export credentials), builds/, android/build/ and packaged APKs - all
regenerable, and ~325 MB combined.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 18:41:58 +02:00
|
|
|
#!/data/data/com.termux/files/usr/bin/bash
|
|
|
|
|
# Renders a real screenshot of a Godot scene from Termux, via the Godot
|
|
|
|
|
# 4.7.1 Linux arm64 build inside the proot-distro Ubuntu container, using
|
|
|
|
|
# Xvfb (virtual display) + Mesa's softpipe software rasterizer.
|
|
|
|
|
#
|
|
|
|
|
# NOTE: Mesa's default software rasterizer, llvmpipe, crashes with
|
|
|
|
|
# SIGILL in this environment (confirmed via feasibility spike - its LLVM
|
|
|
|
|
# JIT appears to emit a CPU instruction this ARM64/proot/Android setup
|
|
|
|
|
# doesn't actually support, reproduced even with an empty project and no
|
|
|
|
|
# script). softpipe is Mesa's older non-JIT (pure C) rasterizer - slower,
|
|
|
|
|
# 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]
|
|
|
|
|
# Example: bash tests/screenshot.sh res://Main.tscn /tmp/out.png 60 720x1280
|
|
|
|
|
#
|
|
|
|
|
# The resolution matters for anything with UI in it: the game is authored
|
|
|
|
|
# for a 720x1280 portrait viewport, so rendering at the default landscape
|
|
|
|
|
# size stretches the layout and makes it useless for judging whether
|
|
|
|
|
# controls fit. Pass 720x1280 when checking UI.
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
|
|
|
GODOT_BIN="/root/Godot_v4.7.1-stable_linux.arm64"
|
|
|
|
|
|
|
|
|
|
SCENE_PATH="${1:?usage: screenshot.sh <scene_res_path> <output_png_path> [wait_frames] [WxH]}"
|
|
|
|
|
OUTPUT_PATH="${2:?usage: screenshot.sh <scene_res_path> <output_png_path> [wait_frames] [WxH]}"
|
|
|
|
|
WAIT_FRAMES="${3:-60}"
|
|
|
|
|
RESOLUTION="${4:-1280x720}"
|
|
|
|
|
|
|
|
|
|
proot-distro login ubuntu -- bash -c "
|
Show buildings on the world map, and extractors on their planets
Forgejo #11: buildings the player has placed now appear on the world
map. They are placed freely in space rather than tied to a chunk, so
they get their own pass in WorldMapContent._draw() rather than riding
along with the chunk markers. Each type has its own shape and colour,
mirroring Building.gd's constants so a marker reads as the same
building you built.
Forgejo #9: a planet with an extractor built on it now shows it, in
both places you look at a planet - an amber derrick on its outline in
space, and a matching badge on its world-map marker. The extractor
lives on PlanetSurface.tscn, a scene you are not looking at from
space, so an already-mined planet was otherwise indistinguishable
from an untouched one until you landed on it.
The positioning steps are factored out (building_markers(),
chunk_has_extractor_badge(), extractor_derrick_tip()) so headless
tests can assert on them - --headless has no GPU and draws no pixels,
so there is nothing to check in _draw() itself. Both features were
also rendered for real via tests/screenshot.sh and looked at.
extractor_derrick_tip() exists because the first version of the
"derrick is not buried inside the planet" check measured the furthest
of all four derrick points, which passes a derrick pointing straight
into the ground: the base corners sit a half-width off the rim vertex
and clear the outline on their own. Mutation-testing caught it.
screenshot.sh now clears a stale /tmp/.X99-lock. A run killed
mid-screenshot leaves it behind and Xvfb then refuses :99, which
resurfaces later as Godot's misleading "X11 Display is not available".
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 15:29:56 +02:00
|
|
|
# A killed run (or a session that ended mid-screenshot) leaves /tmp/.X99-lock
|
|
|
|
|
# behind, and Xvfb then refuses to claim :99 - which surfaces much later and
|
|
|
|
|
# far less obviously as Godot's 'X11 Display is not available'. Nothing else
|
|
|
|
|
# uses :99 here, so a lock with no live Xvfb behind it is always stale.
|
|
|
|
|
if ! pgrep -x Xvfb >/dev/null; then
|
|
|
|
|
rm -f /tmp/.X99-lock /tmp/.X11-unix/X99
|
|
|
|
|
fi
|
Initial commit: SpaceshipTest, a top-down space RTS in Godot 4.7.1
A fleet of neon-outlined ships explores a procedurally generated, seeded
infinite world: tap/joystick steering, pinch zoom, formation pivoting,
planet landings, an ore economy with extractors and haulers, and player
built structures (mothership, ship crafter, command centre).
All art is hand-drawn with draw_* calls rather than textures, and the
backgrounds are camera-relative shaders so they stay precise at large
world coordinates.
Includes a 35-test headless suite (tests/run_tests.sh) plus screenshot
tooling that renders real frames through Xvfb and Mesa softpipe, since
--headless has no GPU.
Excluded from version control: .godot/ (import cache, and it holds
export credentials), builds/, android/build/ and packaged APKs - all
regenerable, and ~325 MB combined.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 18:41:58 +02:00
|
|
|
Xvfb :99 -screen 0 ${RESOLUTION}x24 &
|
|
|
|
|
XVFB_PID=\$!
|
|
|
|
|
sleep 2
|
|
|
|
|
mkdir -p /tmp/xdgrt && chmod 700 /tmp/xdgrt
|
|
|
|
|
cd '$PROJECT_DIR'
|
|
|
|
|
DISPLAY=:99 XDG_RUNTIME_DIR=/tmp/xdgrt GALLIUM_DRIVER=softpipe '$GODOT_BIN' --rendering-driver opengl3 --rendering-method gl_compatibility --resolution '$RESOLUTION' -s res://tests/_screenshot_tool.gd -- '$SCENE_PATH' '$OUTPUT_PATH' '$WAIT_FRAMES'
|
|
|
|
|
kill \$XVFB_PID
|
|
|
|
|
"
|