This file applies to this repository (Sturmgeist). Upstream ET: Legacy uses the same norms; for policy that only applies upstream, see etlegacy/etlegacy CONTRIBUTING.md.
ET: Legacy development is a collaborative effort done in an open, transparent and friendly manner. Anyone is welcome to join our efforts!
If you only have a question and don't want to read this whole document:
Do NOT file an issue to ask a question. You will get faster results by using the resources below:
- etlegacy/#general on Discord
- #etlegacy on irc.libera.chat
See also our FAQ.
When reporting an issue, ensure to be as clear as possible, and include:
- description of the issue (current behavior, expected/desired behavior)
- minimal steps to reproduce the problem
- motivation and use case for changing the behavior (if relevant)
- version used, and behaviour on older versions (if relevant)
Do note that we can only fix issues happening in the engine or in our own mod. Issues specific to third party mods can't be fixed by us.
The project has defined scope for its goals and ambition.
As a result, feature requests might not be accepted if they are considered out of scope. In case of doubt, you might also want to discuss your idea with us before starting to implement it.
If you are interested to participate, ensure to read first our contribution guidelines:
To pull the latest changes from the main ET: Legacy repository without merging yet:
pixi run upstream-fetch
# then: git log --oneline HEAD..FETCH_HEAD
# merge or rebase when ready: git merge FETCH_HEAD # or your preferred workflowFormatting and workflow checks used in CI can be run locally with pixi install and pixi run -e validation check-changes. The default comparison branch is read from .upstream-remote-branch when that file exists (for example origin/main on forks that use main as the default branch).
Continuous integration is documented briefly in README.md under CI and workflows (main workflow, ETLBuild, Snap, optional Discord webhook).
Bundled native library bumps that belong in the libs submodule may be prepared as mailbox patches under misc/patches/ (see misc/patches/README.md) when you cannot push to the libs remote directly.
The scheduled Coverity Scan workflow (.github/workflows/coverity-scan.yml) does nothing unless you add repository secrets COVERITY_SCAN_TOKEN and COVERITY_SCAN_EMAIL from your Coverity Scan project. Without them, the workflow completes successfully and skips the build.
Optional variable COVERITY_PROJECT (repository Actions → Variables) should match your Coverity project slug (for example timfox/sturmgeist). If unset, the workflow defaults to etlegacy/etlegacy for compatibility with the upstream project.
The on-screen joystick library is kept under app/libs/joystick/ as normal project files (not a git submodule). app/libs/joystick/gradle/wrapper/ (gradle-wrapper.properties and gradle-wrapper.jar) must remain committed (the repo-wide gradle/ ignore rule is negated for that path so CI can run ./gradlew). Keep the JoyStick Gradle distribution URL in step with the root project’s gradle/wrapper/gradle-wrapper.properties so dependency bytecode matches the wrapper’s ASM. When upgrading Android Gradle Plugin or the library itself, keep app/libs/joystick/build.gradle in step with the root build.gradle classpath version. Optional: compare with etlegacy/JoyStick upstream and port changes manually.
Communication happens online at:
- etlegacy/#etlegacy on Discord
- #etlegacy on irc.libera.chat