Sci-fi ARPG made in Unity
  • C# 85.7%
  • Python 5.3%
  • ShaderLab 2.4%
  • HLSL 2.3%
  • Ink 2%
  • Other 2.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-07-22 06:19:45 +01:00
.voidbot Publish player settings as a provider-owned Eve surface 2026-06-16 18:09:15 +01:00
.vscode Shields 2025-01-30 01:58:05 +00:00
Aetheria/.obsidian Worldbuilding Vault 2025-03-03 11:55:49 +00:00
Aetheria-Economy_WwiseProject Unified Volumetric Flow 2021-06-18 12:32:03 +01:00
Aetheria.Rts.Web Delete obsolete snapshot asset client 2026-07-14 16:40:48 +01:00
Aetheria.State Remove stale geometry ownership guidance 2026-07-22 04:14:03 +01:00
Aetheria.State.AuthoritySmoke Make runtime catalog a typed cached authority 2026-07-20 00:39:09 +01:00
Aetheria.State.Daemon Add entity-owned dynamic fog fields 2026-07-22 02:09:30 +01:00
Aetheria.State.Daemon.Smoke Let daemon gameplay state close the main menu 2026-07-20 05:22:39 +01:00
Aetheria.State.Freeze Migrate Aetheria geometry ownership 2026-07-22 04:08:57 +01:00
Aetheria.State.Import Make runtime catalog a typed cached authority 2026-07-20 00:39:09 +01:00
Aetheria.State.Replica Build typed Aetheria client surfaces 2026-06-25 18:09:33 +01:00
Aetheria.State.Smoke Keep bootstrap run records cold on restart 2026-07-20 03:00:28 +01:00
Aetheria.State.Unity Use canonical Eve surface documents 2026-07-01 15:26:48 +01:00
Aetheria.State.Unity.Smoke Collapse Eve surface projectors into typed documents 2026-06-29 04:31:20 +01:00
Aetheria.State.Verify Return idle Aetheria sessions to ready 2026-07-22 00:19:29 +01:00
Aetheria.Unity Pin released Geometry Unity stack 2026-07-22 05:51:18 +01:00
Asset Sources Define Blender entity authoring contract 2026-07-14 20:03:01 +01:00
Assets Fix CultRect render query access 2026-07-22 04:23:48 +01:00
conformance/eve feat(terminus): restore single-player pilot loop 2026-07-11 01:08:31 +01:00
docs Add entity-owned dynamic fog fields 2026-07-22 02:09:30 +01:00
GameData Recover ordinary hulls and rare drive generation 2026-07-16 17:27:01 +01:00
Packages Fix CultRect render query access 2026-07-22 04:23:48 +01:00
ProjectSettings Integrate CultMesh UI and URP cleanup 2026-06-30 19:14:49 +01:00
scripts Make Unity own daemon readiness 2026-07-21 20:10:13 +01:00
tools Stream Aetheria realtime SoA over QUIC 2026-07-19 22:15:50 +01:00
Vault/Aetheria Sector Map Entity Count Bugfix + Updated Readme 2025-07-19 05:42:57 +01:00
.gitattributes External Database Entries + Name File Cleaning + Faction Allegiance 2021-03-16 11:06:54 +00:00
.gitignore Persist Aetheria QUIC transport identity 2026-07-20 02:44:28 +01:00
.vsconfig Hellfire 2021-01-10 03:59:47 +00:00
Aetheria RTS.lnk Move RTS body icon authority to daemon 2026-07-05 15:12:29 +01:00
Aetheria.sln Remove stale generated CultMath project 2026-07-22 06:19:45 +01:00
AetheriaTexts.ctd Merge branch 'master' of https://github.com/hyperion51/Aetheria-Economy 2020-06-08 01:45:39 +01:00
AGENTS.md Publish CultMesh-native Aetheria Eve surfaces 2026-07-04 22:46:04 +01:00
Assets.meta Shitty uniform Poisson Disk Sampling 2020-02-28 12:42:00 +00:00
csc.rsp Sync daemon authority migration 2026-06-21 09:37:54 +01:00
GameCult.Aetheria.EveRuntime.csproj Move Aetheria EveUnity hooks into provider package 2026-07-09 20:39:54 +01:00
GameCult.Aetheria.State.Unity.csproj Remove stale generated CultMath project 2026-07-22 06:19:45 +01:00
GameCult.Brokkr.csproj Sync daemon authority migration 2026-06-21 09:37:54 +01:00
GameCult.Brokkr.Editor.csproj Sync daemon authority migration 2026-06-21 09:37:54 +01:00
GameCult.Eve.Surface.csproj Publish CultMesh-native Aetheria Eve surfaces 2026-07-04 22:46:04 +01:00
GameCult.Eve.UnityScene.csproj Compile EveUnity playable client bootstrap 2026-07-09 19:59:52 +01:00
GameCult.Eve.UnityUIToolkit.csproj Reference Eve UI Toolkit TeX adapter 2026-07-09 13:15:14 +01:00
LICENSE Change license to MPLv2 2020-12-12 03:46:54 +00:00
logRunSetup.txt Updated Wwise Integration 2021-04-30 07:09:07 +01:00
MessagePack.SourceDisabled.csproj Sync daemon authority migration 2026-06-21 09:37:54 +01:00
README.md Package canonical Aetheria state as one CultCache 2026-07-16 13:58:45 +01:00
WwiseUnityIntegration_Mac_Src.zip Updated Wwise Integration 2021-04-30 07:09:07 +01:00
WwiseUnityIntegration_Windows_Src.zip Updated Wwise Integration 2021-04-30 07:09:07 +01:00

Aetheria

Aetheria is an ambitious (AA quality) open source tactical action role-playing game with a sprawling sci-fi setting that combines stunning visuals with unprecedented simulation depth while maintaining accessibility.

Aetheria is being rebuilt as a renderless daemon-owned game. The daemon owns rules, simulation state, level generation, assets, operations, and the high-performance view documents clients need to render the world. Eve/CultUI owns the portable surface, field-description, and world-state lowering contract. Unity, Godot, Electron, Hermodr, and later runtimes should be game-agnostic Eve lowerers: they render, capture input, cache native views, and submit typed operations without becoming gameplay authorities.

It is our ambition to forge a new paradigm of open source game development, as to our knowledge there are no other open source projects of this scope building up a foundation from scratch. Game development is notoriously averse to this model and nobody wants to share their shiny toys for fear of losing their competitive advantage. By building and sharing immersive and compelling experiences like this, we hope to change that.

Contact Us

If you want to chat, please join our Discord server for detailed development updates and discussions about the game design, narrative, art direction, and general topics. Shitposting welcome!

Trailer (outdated)

Trailer

Screenshots

Table of Contents

  1. Game Design
  2. Previous Work
  3. Current Work
  4. Architecture
  5. Contributing
  6. Galaxy Editor
  7. Contact Us

Game Design

The ARPG game design document is available here, while the RTS gameplay is documented here. There's also a document explaining how some of the shaders work here.

The eventual goal is to essentially create two games which both take place in the same persistent universe, allowing players with vastly different preferences to struggle together for the survival of mankind. Each instance of the game lasts until the inevitable destruction of the entire population at the hands of aliens, after which the universe resets. Each loop is designed to last up to a couple of months, during which the hostility of the aliens steadily increases until the players are unable to hold back the tide. As players gain proficiency with the systems, the length of the time loop may increase, allowing us to organically inject new content into the timeline.

Previous Work

The concept for Aetheria goes back many years, during which I have steadily acquired my current skill with the primary objective of becoming competent enough to realize my vision. Previously I have built prototypes of the ARPG gameplay, here's a video of the most recent one. While it included stations, AI opponents, multiple ships and a complex loadout system which simulates heat transfer between all of the ship's hardpoints with temperature affecting the performance of each item differently, the world was rather static and empty.

As a result of lessons learned, we then focused on the economy system, and built a client-server architecture for the networked simulation of a persistent universe. We created an RTS client, allowing players to take the role of a corporation, where they can define roles for their population, gather resources, build infrastructure, research new technology and produce items in order to make as much money as possible.

Current Work

At the moment we are focused on moving Aetheria gameplay authority into the daemon and proving that both RTS and ARPG clients can be reconstructed from daemon-published typed state, CultMesh CDN assets, and Eve/CultUI surfaces. Starbridge is the first product pressure test for this model.

Developer Navigation

The repo is currently in a major typed-state migration. Before making runtime changes, read docs/developer-navigation.md for the current project map, command list, migration rules, and where the daemon, Eve, and runtime-lowering boundaries live. The target renderless architecture is mapped in docs/renderless-aetheria-architecture.md.

Architecture

Project Structure

The current repository still contains Unity-era source, an Electron Starbridge client, shared runtime packages, and the C# Aetheria daemon. The target shape is not "two clients sharing a game library." The target shape is one daemon-owned game publishing typed CultMesh state, render fields, assets, operations, and Eve/CultUI surfaces. Runtime code is a lowering boundary: Unity and Godot lower ARPG world surfaces, Electron and Hermodr lower RTS world surfaces, and all of them consume the same game-agnostic Eve/runtime primitives.

Third Party Libraries

Aetheria's new persistence spine is Aetheria.State: typed CultCache .cc documents exposed through CultNet/CultMesh. Legacy MessagePack catalog files are migration inputs only; they are fingerprinted and mapped into typed item, faction, and name-file documents before runtime systems are allowed to treat them as state.

Programming Paradigms

The codebase makes heavy use of C#'s Language Integrated Queries (LINQ), allowing for the concise representation of operations that modify or filter collections (though they do generate some garbage so must be avoided within the update loop). Asynchronous stream processing is often performed using the functional reactive programming paradigm, which is achieved using Microsoft's Reactive Extensions on the server and Reactive Extensions for Unity. Combining Observables with LINQ allows for extremely powerful expressions of the programmer's intent.

Data Structures

Persistent state belongs in typed CultCache documents with explicit record keys and CultNet schema bindings. Legacy DatabaseEntry identities may appear as migration provenance while the Unity runtime is being lowered onto the new state spine, but they are not the durable state owner.

Equipment

Items in the game which can be equipped are defined as subclasses of EquippableItemData, including the HullData class which defines a space ship, station or turret, and the GearData class which defines anything that can be equipped onto a Hull.

Behaviors

Equippable Items can hold any number of Behaviors, which define the functionality of that item in game. Everything from radiating heat into space to moving a ship, firing a weapon or boosting the stats of another item is defined as a Behavior.

Performance Stats

While some stats are fixed, others can vary according to the condition the item is in. Such stats are PerformanceStats. These can vary depending on the item's remaining durability, the current temperature of the item, and the quality with which it was crafted.

Blueprints

In order to make an item craftable in-game, that item needs to be associated with one or more Blueprints. A Blueprint defines the ingredients (or components) necessary to build an item. In addition, specific ingredients can be associated with particular PerformanceStats for the resulting item's Behaviors, allowing a single item to be crafted in various ways, with its final stats varying in accordance with the supply chain and quality control of the manufacturer.

Contributing

Contributor Agreement

By pushing to this repository or submitting a pull request, you are implicitly providing us (GameCult) permission to relicense your work as we see fit. This means that your contribution will automatically be under the same license as this repository, but also grants us the right to release your contribution under a different license should we see fit. This agreement exists mostly because we have witnessed the difficulties some open source projects have had when they did not have such a contributor agreement in place.

Getting the Files

In order to checkout the project, you need a git client (Github's zip download will not work!). You also need to have installed Git LFS (Large File Storage). This is necessary because assets in gamedev projects can get rather large, and Git is essentially a text versioning system that does not by itself support that use case well. After installing LFS you'll need a Git client. I recommend Github Desktop, which has a nice simplified workflow and integrates with the site. For more advanced users, there's nothing wrong with using the command line or a more comprehensive client like GitKraken, but beginners beware that it's easy to shoot yourself in the foot that way.

When you have synced with the repository, you can open the project using Unity. The project uses Unity 2020.3.2f1 at the moment, and while it may work with newer or older versions, that cannot be guaranteed. You can open the project by opening the root of this repository either directly with the Unity Editor, or using Unity Hub, which will also take care of downloading the correct version of the Editor.

Choosing a Task

We are organizing according to an Agile development schedule, with the progress of each sprint being tracked on its own board in the Github Projects tab. If you wish to take on a task from the board, please contact us to become an official contributor so that the task can be assigned to you directly. Some issues are not on the sprint schedule, those are ideal for developers who want to jump in but are shy about joining. We use the good first issue label for issues that don't require heavy knowledge of the codebase.

You don't have to be a programmer to contribute, either! We have issue labels for and very much welcome contributions from writers and game designers.

Typed State Tools

The state spine lives in Aetheria.State. It defines CultCache documents, CultNet schema bindings, an embedded state node, and smoke coverage for writing, flushing, reopening, and reading GameData/aetheria-world.cc.

Importing Legacy Catalog Data

Use Aetheria.State.Import to quarantine the checked-in legacy catalog files and map stable MessagePack payload fields into typed CultCache state. The importer records path, size, and SHA-256 provenance for GameData/AetherDB.msgpack and GameData/NameFile/*.msgpack, then emits typed item, faction, and name-file records for the fields that have earned migration authority.

Use Aetheria.State.Verify after import to prove the materialized .cc file is internally coherent and self-contained. Verification opens a temporary copy of the tracked monolith, so ignored .cc.records files cannot accidentally satisfy the proof. Migration-ledger counts must match actual typed catalog records, and legacy-ID lookups must resolve through Aetheria.State rather than importer-local key strings.

Editing Items

Item editing should target typed CultCache documents and CultMesh/Eve surfaces. The old Unity database inspector has been removed from authority; if it returns, it should be a lowering over the state spine, not a separate store.

Testing Locally

Testing the game entirely offline should use typed local state under GameData/aetheria-world.cc. Until the Unity runtime is fully lowered onto Aetheria.State, the checked-in legacy catalog files remain migration inputs and should be regenerated only by explicit import tooling.

Debug Console

Pressing the tilde key (`) while running the game allows you to access the console. Here you can view the debug log as well as entering commands which aid in testing various game mechanics. Console commands are registered with the console controller. Our current convention is to perform command registration inside ActionGameManager.cs:Start().

Commands

Galaxy Editor

When you select a galaxy asset in the Unity scene hierarchy, a custom editor opens in the inspector which enables the procedural generation of a new galaxy. There you can find some variables pertaining to the galaxy as a whole, such as the number and twist of the spiral arms.

Map Layer Data

Below that is an editor for map layer data which allows the creation of a density map defining the value of some variable as it varies over the space containing the galaxy, which can be previewed at the top of the inspector. By default the star density map layer is displayed, which controls the distribution of stars. Any number of map layers can be created, defining variables such as the radius of zones and the presence of life and resources to be mined.

Star Tools

After the map layer data section is a foldout containing tools which allow you to generate stars according to the star density map. Stars are placed by accumulating density while walking over a space-filling Hilbert curve, maintaining some minimum distance between stars. This isn't as good as a proper sampling algorithm like Poisson disk sampling or Mitchell’s best-candidate algorithm, but it gets the job done (please feel free to contribute a better sampling algorithm!).

After generating stars, you can generate the links between them, which performs a Delaunay Tessellation, and then remove some proportion of links until the desired sparsity is reached. The algorithm for filtering star links is also not ideal, there's an issue for fixing that, too!

License

The majority of this repository is under the Mozilla Public License and therefore available for anyone to use. Note that the MPL is per-file and therefore the license only applies to files which contain the MPL header. If you believe a file has been created by us and is missing the header, please let us know (we do forget sometimes).