No description
  • Emacs Lisp 48.4%
  • Python 39.5%
  • GDScript 11.1%
  • Makefile 0.9%
  • Shell 0.1%
Find a file
Kinneyzhang 42612524c3
Some checks failed
Repository structure / structure (push) Has been cancelled
feat(etaf-salvage): declare direct dependencies only
`Package-Requires` mixed direct and transitive providers: seven entries declared
`ebox` without one reference to it, `etaf-screensaver` declared `etaf-ui` and
never loaded it, and six packages called a provider's API without declaring it
(the games reach `etaf` through `etaf-gamekit`, the video player persists
through `etaf-db`, the playground renders through `ebox`). The rule is the one
package.el needs: declare what the sources actually `require` or call, let the
archive resolve the closure, and let `scripts/check-api.py` fail `make check`
for a declaration no source uses and for a provider used but not declared.

Repo: etaf-salvage
Validation: make -C etaf-salvage structure-check passed on the working copy before
  sealing; scripts/check-commit-message.py accepted this message.
2026-10-22 21:14:26 +08:00
.githooks feat(salvage): add the standalone Salvage Station application 2026-10-11 14:29:02 +08:00
.github/workflows chore(scripts): sync shared workspace tooling 2026-10-19 12:49:35 +08:00
benchmarks feat(salvage): add the standalone Salvage Station application 2026-10-11 14:29:02 +08:00
docs docs(salvage): point the examples at the flat workspace paths 2026-10-19 12:57:16 +08:00
examples docs(salvage): document installation, controls and screenshots 2026-10-13 00:35:23 +08:00
lisp feat(salvage): unify flight help in the application modal 2026-10-16 04:32:01 +08:00
native/godot feat(salvage): add the standalone Salvage Station application 2026-10-11 14:29:02 +08:00
scripts chore(scripts): sync shared workspace tooling 2026-10-22 13:16:13 +08:00
tests chore(salvage): follow the flat workspace layout 2026-10-19 12:49:01 +08:00
.editorconfig feat(salvage): add the standalone Salvage Station application 2026-10-11 14:29:02 +08:00
.gitignore feat(salvage): add the standalone Salvage Station application 2026-10-11 14:29:02 +08:00
etaf-salvage.el feat(etaf-salvage): declare direct dependencies only 2026-10-22 21:14:26 +08:00
LICENSE feat(salvage): add the standalone Salvage Station application 2026-10-11 14:29:02 +08:00
Makefile feat(salvage): add the standalone Salvage Station application 2026-10-11 14:29:02 +08:00
README.md feat(salvage): unify flight help in the application modal 2026-10-16 04:32:01 +08:00

Salvage Station

A real-time exploration and extraction game with a native ETAF interface and a headless Godot simulation, built as an independent GameKit application. Recover three power cores and return to the extraction dock; avoid or disable security drones, manage hull and energy, and use repair kits along the way.

Godot owns movement, collision, pathfinding, drones, energy, damage, score and victory or defeat. This application owns selection, tabs, dialogs and all presentation; GameKit supplies only the shared game instance and backend connection.

The station in the daylight light theme

The station in the deep-space dark theme

Capabilities

  • One headless simulation with a live HUD for hull, energy, cores, score and elapsed time, and a map for plotting routes.
  • Object selection, an expedition panel, EMP and shield actions, and a tactical pause that the game starts in.
  • Light daylight and dark deep-space palettes that keep the expedition running across a switch.
  • Explicit local snapshots through Save and Load; closing makes no implicit save.

Prerequisites

Requirement Why Check
Emacs 29.1 or newer the ETAF runtime emacs --version
ecss, ebox, etaf, etaf-ui the framework and catalog components every root entry is on load-path
etaf-gamekit and its Godot runtime simulation host, game instance and state publication make -C etaf-gamekit engine
Python 3.9 or newer GameKit's Godot setup script python3 --version

Installation

git clone https://github.com/emacs-taf/ecss.git
git clone https://github.com/emacs-taf/ebox.git
git clone https://github.com/emacs-taf/etaf.git
git clone https://github.com/emacs-taf/etaf-ui.git
git clone https://github.com/emacs-taf/etaf-gamekit.git
git clone https://github.com/emacs-taf/etaf-salvage.git
make -C etaf-gamekit engine

Add every provider root and this repository to load-path:

(add-to-list 'load-path "/path/to/ecss")
(add-to-list 'load-path "/path/to/ebox")
(add-to-list 'load-path "/path/to/etaf")
(add-to-list 'load-path "/path/to/etaf-ui")
(add-to-list 'load-path "/path/to/etaf-gamekit")
(add-to-list 'load-path "/path/to/etaf-salvage")
(require 'etaf-salvage)

(global-set-key (kbd "C-c v") #'etaf-salvage-open)

M-x etaf-salvage-open starts an independent instance and fits the view to its window. The Godot project lives in native/godot/ and is resolved relative to the application's own entry file.

Keys

Input Action
P or Launch / Pause Start or stop the simulation
W A S D Extend the navigation destination by one cardinal tile
Click deck Plot a route around bulkheads
Click an object Inspect it; use Plot route to target to navigate there
1 or EMP Disable drones within five tiles; costs 20 energy
2 or Shield Protect the hull for five seconds; costs 25 energy
Cargo → Repair Use one of two kits to restore up to 40 hull
?, F1 or Help Open searchable controls and flight notes in the current buffer
T or Light–Dark Switch between the light daylight and dark deep-space palettes
Save / Load Choose an explicit local snapshot path

etaf-salvage-appearance selects the initial palette: auto, the default, follows the frame's background mode. The status line and the log panel report events; the minimum canvas is 76 character columns by 30 rows, and narrower windows reflow or expose the panels.

Checks

make check   # structure, compilation, API and real-backend behavior scenarios

GUI scenarios and interaction latency measurements are separate acceptance surfaces; the manual describes them.

Documentation

License

GPL-3.0-or-later; see LICENSE.