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
Meta Vens dc3abbddce GameData/Aetheria.cc: generic-designs apply on the base catalog through an ExpectUnchanged batch (sha256 34cbfacc50de6ba7945fe47c1e699d3125c7c3ba445675a8b8bfebfe58c057ba)
Produced by a Yggdrasil job (dotnet run AetherDb -- generic-designs apply at 7d1fa5ce) on the catalog at the base (1746e8bd, sha256 1a2cb55b63f77a113dea0571716994ef8311d5da572a4fc41cbd3a7d2561fb68). 89 records written; the other 169 are byte-identical to the base. Of the 89, 85 differ from the base only in Name/Description; four (Compact Sensor, Sensor Array, Long-Range Missile Rack, Guided Missile Launcher) are authored records and still re-encode their Behaviors through the typed object. A second run answers 'Already applied; nothing to do.' Dry-run text:

design name: "ClearPath" -> "Light Machine Gun"
design "Light Machine Gun" text: "Defend your precious cargo and have fun doing it. Comes with optional sound effects." -> "Light ballistic hose: many small rounds at short range."
design name: "6k Shooter" -> "Slug Rifle"
design "Slug Rifle" text: "The fastest gun in Elysium" -> "Single heavy slugs, fired as fast as the trigger."
design name: "Earp" -> "Long Slug Rifle"
design "Long Slug Rifle" text: "Bringing the Wild West to the New Frontier" -> "A lighter slug rifle with the longest ballistic reach."
design name: "DeathCluster" -> "Cluster Cannon"
design "Cluster Cannon" text: "Because why kill two birds with one stone when you could annihilate them with one hundred?" -> "Medium shotgun: a heavy volley of pellets."
design name: "pretty pretty bang bang" -> "Charged Scattergun"
design "Charged Scattergun" text: "make your last stand/ it's a pretty pretty mess you've got us into/ it's a pretty pretty pretty day to die/ locked and loaded we're going out with a bang" -> "Ballistic shotgun that charges for a heavier volley."
design name: "Spectra" -> "Light Laser"
design "Light Laser" text: "Travelling light, for those travelling light. Take out the competition without slowing down with Spectra." -> "The lightest beam: low damage, quick cycle, long reach."
design name: "FastBlast+-" -> "Cell Blaster"
design "Cell Blaster" text: "Do less damage, faster!" -> "Rapid energy bursts fed by cells that cut its reactor draw."
design name: "ColdFire" -> "Long Laser"
design "Long Laser" text: "Operates by taking advantage of the wave/particle duality in a way that has other scientist tearing their hair out. Fact: Adrasteia's R&D department is the reason Einstein's hair looked like that." -> "Heavy small beam: slow, hard-hitting, long reach."
design name: "CShot RainbowLite Lazer" -> "Heavy Beam Laser"
design "Heavy Beam Laser" text: "Light up the cold, infinite void with more than your smile! Our precision full spectrum lasers are both combat and concert ready." -> "The heaviest beam: nine cells, enormous damage and reach."
design name: "ChargeBlast+-" -> "Charged Blaster"
design "Charged Blaster" text: "A knockout weapon, the arms equivalent of downing 9 shots of Tollgan Swamp liquor." -> "One charged knockout shot."
design name: "ChargeBlast SG" -> "Charged Scatter Blaster"
design "Charged Scatter Blaster" text: "For those days when you really want to spread the pain around." -> "Charged energy shotgun."
design name: "plight" -> "Lightning Projector"
design "Lightning Projector" text: "Chain lightning has your enemies chain smoking while you enjoy a relaxing DragOnBreath vapepop, now available in 17! flavours (manufactured by DragOnBreath, a subsidary of Lucent Media)" -> "Charged chain lightning."
design name: "GT 3K" -> "Guided Missile Launcher"
design "Guided Missile Launcher" text: "Smaller, faster, and more determined than ever. The little missile that could!" -> "Fires guided missiles."
design name: "LRMM72" -> "Long-Range Missile Rack"
design "Long-Range Missile Rack" text: "" -> "Large missile rack for long engagements."
design name: "SRMM72" -> "Short-Range Missile Rack"
design "Short-Range Missile Rack" text: "" -> "Extra-large rack of short-range missiles."
design name: "pswarm" -> "Swarm Rocket Pod"
design "Swarm Rocket Pod" text: "let's set the stars on fire/ there's nothing left on earth to burn/ we're just killing time while we're filling space/ and catacombs in turn" -> "Dumbfire rockets in a swarm."
design name: "scorched void policy" -> "Incendiary Rocket Pod"
design "Incendiary Rocket Pod" text: "let's set the stars on fire/ there's nothing left on earth to burn/ we're just killing time while we're filling space/ and catacombs in turn" -> "Incendiary dumbfire rockets."
design name: "Arctica" -> "Adaptive Radiator"
design "Adaptive Radiator" text: "Go blazingly fast, without burning up." -> "Radiator whose output scales widely with conditions."
design name: "Iapyx" -> "Radiator"
design "Radiator" text: "" -> "Standard two-cell radiator."
design name: "Skiron" -> "Long Radiator"
design "Long Radiator" text: "" -> "Four-cell radiator with a large surface."
design name: "OK Disperser" -> "Heat Pump"
design "Heat Pump" text: "Adapted from the patented cooling system Lucent uses in their professional gaming setups. A high quality cooler, built to withstand even the most aggressive of rage quits." -> "Moves heat to where it can be shed."
design name: "cold like my heart" -> "Cryogenic Heat Pump"
design "Cryogenic Heat Pump" text: "nothing can touch me/ i'm an agent of entropy/ heat death in a bottle like a molotov cocktail" -> "Heavy heat pump that drives temperatures far down."
design name: "Core Power" -> "Compact Reactor"
design "Compact Reactor" text: "It gets the job done, but that's all." -> "Small reactor."
design name: "Manhattan" -> "Heavy Reactor"
design "Heavy Reactor" text: "Because might is right and finesse is for fools" -> "Large three-by-three reactor."
design name: "Notorious" -> "High-Yield Reactor"
design "High-Yield Reactor" text: "A reactor for those who want the biggest reaction" -> "Large reactor with a wide output range."
design name: "Vulcan" -> "Ring Reactor"
design "Ring Reactor" text: "High output, high heat. Blaze across the cosmos like the comet you were meant to be." -> "Ring-shaped reactor, four by four."
design name: "MoveOnPro" -> "Muon Fusion Reactor"
design "Muon Fusion Reactor" text: "The only muon catalyst fusion reactor on the market! Always gets a great reaction." -> "Compact fusion reactor that draws a reservoir."
design name: "Core Power Station Reactor" -> "Station Reactor"
design name: "Manhattan Station Reactor" -> "Heavy Station Reactor"
design "Heavy Station Reactor" text: "A reactor sized for a station's core." -> "A heavy reactor sized for a station's core."
design name: "Notorious Station Reactor" -> "High-Yield Station Reactor"
design "High-Yield Station Reactor" text: "A reactor sized for a station's core." -> "A high-yield reactor sized for a station's core."
design name: "Vulcan Station Reactor" -> "Ring Station Reactor"
design "Ring Station Reactor" text: "A reactor sized for a station's core." -> "A ring reactor sized for a station's core."
design name: "MoveOnPro Station Reactor" -> "Muon Fusion Station Reactor"
design "Muon Fusion Station Reactor" text: "A reactor sized for a station's core." -> "A muon fusion reactor sized for a station's core."
design name: "RevvITup 2.0" -> "High-Thrust Drive"
design "High-Thrust Drive" text: "" -> "Large drive: huge thrust, little torque."
design name: "deep space burnout" -> "Burn Drive"
design "Burn Drive" text: "go go go go go/ get the drift/ you'll burn before you stop " -> "Large drive that runs very hot."
design name: "Talaria" -> "Rugged Drive"
design "Rugged Drive" text: "" -> "Two-cell working drive."
design name: "Victoire" -> "Racing Drive"
design "Racing Drive" text: "The most responsive thruster on the market, for the most irresponsible of racing pilots." -> "Feather-light two-cell drive with extreme response."
design name: "The Bat" -> "Sensor Array"
design "Sensor Array" text: "" -> "Two-by-two long-range sensor array."
design name: "not if i see you first" -> "Compact Sensor"
design "Compact Sensor" text: "[TODO]" -> "One-cell sensor."
design name: "PotaT+-" -> "Capacitor"
design "Capacitor" text: "[TODO]" -> "Stores charge for burst draw."
design name: "SafeStuff II" -> "Secure Cargo Bay"
design "Secure Cargo Bay" text: "Your stuff is safe stuffed in the new, bigger SafeStuff" -> "Three-by-three secured hold."
design name: "Store-All Enterprise Edition" -> "Large Cargo Bay"
design "Large Cargo Bay" text: "A large amount of storage" -> "Six-by-six hold."
design name: "Store-All Plus" -> "Cargo Bay"
design "Cargo Bay" text: "Take your cargo wherever your shipgo" -> "Two-by-two hold."
design name: "Store-All Plus Mini" -> "Small Cargo Bay"
design "Small Cargo Bay" text: "Take some of your cargo wherever your shipgo" -> "One-cell hold."
product of "Autocannon" by Zhestokost: "Autocannon" -> "Hammerfall"
product "Hammerfall" text: "" -> "The rounds fall steadily, and they do not stop until the work is done."
design "Autocannon" text: "" -> "Belt-fed cannon: a steady stream of rounds at long reach."
product of "Cockpit 2x2" by Lightsail: "Cockpit 2x2" -> "Wheelhouse"
product "Wheelhouse" text: "" -> "Every Lightsail captain's favourite chair. The view comes standard."
design "Cockpit 2x2" text: "" -> "Two-by-two crew cockpit."
product of "Industrial Thermostatic Heater" by Lightsail: "Industrial Thermostatic Heater" -> "Hearth"
product "Hearth" text: "" -> "A warm hold, a warm crew, and a warm welcome at the cold end of the run."
design "Industrial Thermostatic Heater" text: "" -> "Turns reactor power into heat to keep the hull warm."
product of "Medium Drive" by Lightsail: "Medium Drive" -> "Steady Haul"
product "Steady Haul" text: "" -> "Keeps you going and going and going..."
design "Medium Drive" text: "Keeps you going and going and going..." -> "Mid-sized working drive."
product of "Small Drive" by Lightsail: "Small Drive" -> "Short Hop"
product "Short Hop" text: "" -> "Dock to dock, and not a metre further than the manifest says."
design "Small Drive" text: "" -> "Small working drive."
product of "Turret Control Module" by AU: "Turret Control Module" -> "Watchtower"
product "Watchtower" text: "" -> "Point it at the dark and get back to work. It keeps watch."
design "Turret Control Module" text: "" -> "Control module for a station turret."
product of "Medium Docking Bay" by AU: "Medium Docking Bay" -> "Open Berth"
product "Open Berth" text: "" -> "Room for a friend, a customer or a tug. We don't ask which."
design "Medium Docking Bay" text: "" -> "Docking bay for mid-sized ships."
product of "Mine Launcher" by DME: "Mine Launcher" -> "parting gift"
product "parting gift" text: "Lays a drifting proximity mine that arms after two seconds." -> "we were never here/ but we left you something/ it's waiting where we were"
design "Mine Launcher" text: "" -> "Lays a drifting proximity mine that arms after two seconds."
design "Large Drive" text: "Keeps you going and going and going..." -> "Large working drive."
design "Tractor Beam" text: "Trap your enemies in gravity wells. Haul thousands of tons of hay through space!" -> "Holds a target in a gravity well and hauls it in."
design "Smoke Proximity" text: "A Spectra that bursts by proximity, blast 8. For scenarios; no one builds it." -> "A Light Laser that bursts by proximity, blast 8. For scenarios; no one builds it."
design "Smoke Delayed" text: "A Spectra that bursts after two cells of metal, blast 4. For scenarios; no one builds it." -> "A Light Laser that bursts after two cells of metal, blast 4. For scenarios; no one builds it."
design "Smoke Refused" text: "A Spectra whose blast is wider than its reach, so it never fires. For scenarios; no one builds it." -> "A Light Laser whose blast is wider than its reach, so it never fires. For scenarios; no one builds it."
design "Smoke Refused Charge" text: "A ChargeBlast SG whose blast is wider than its reach, so it never charges. For scenarios; no one builds it." -> "A Charged Scatter Blaster whose blast is wider than its reach, so it never charges. For scenarios; no one builds it."
product "Victoire" text: "" -> "The most responsive thruster on the market, for the most irresponsible of racing pilots."
product "DragOnBreath" text: "The subsidiary plight's own description already namechecks: DragOnBreath, a Lucent Media property." -> "Chain lightning has your enemies chain smoking while you enjoy a relaxing DragOnBreath vapepop, now available in 17! flavours (manufactured by DragOnBreath, a subsidary of Lucent Media)"
product "Steadfast" text: "Rated for continuous operation. "Continuous" does not imply "uninterrupted." (new text)" -> "It gets the job done, but that's all. Rated for continuous operation. "Continuous" does not imply "uninterrupted.""
product "Steadfast Station" text: "" -> "Rated for continuous operation at station scale. The fine print scales too."
product "Manhattan Station" text: "" -> "A fortress needs a furnace. This is the furnace."
product "Notorious Station" text: "" -> "The biggest reaction in the system, and everyone docked here will hear about it."
product "Vulcan Station" text: "" -> "Keeps the lights on and the forges hot."
product "MoveOnPro Station" text: "" -> "The club never closes. Neither does the reactor."
product "LRMM72" text: "" -> "Engages targets at up to seventy-two kilometres!* *In a vacuum, against a cooperative target."
product "SRMM72" text: "" -> "seventy-two reasons/ to keep your distance/ all of them leaving at once"
product "Iapyx" text: "" -> "Two cells of honest fin. Bolt it on and forget it's there."
product "Skiron" text: "" -> "When the job runs hot, run a bigger fin."
product "Talaria" text: "" -> "Takes a knock, keeps pushing. Built for crews who work for a living."
product "RevvITup 2.0" text: "" -> "Floor it. The bass drops when you do."
product "PotaT+-" text: "[TODO]" -> "Holds the charge until the drop, then lets it all go at once."
product "not if i see you first" text: "[TODO]" -> "eyes in the dark/ you were seen before you looked/ say goodnight"
product "Space Tractor" text: "It's a tractor. In space." -> "It's a tractor. In space. Trap your enemies in gravity wells. Haul thousands of tons of hay through space!"
product "Panopticon" authoring note stripped: "Sees everything, judges nothing. Well, mostly nothing. (new text)" -> "Sees everything, judges nothing. Well, mostly nothing."
product "ClapBack" authoring note stripped: "Your target won't clock it until the killcam. (new text)" -> "Your target won't clock it until the killcam."
product "Panopticon Prime" authoring note stripped: "The upgrade nobody at Finch will admit they needed until they had it. (new text)" -> "The upgrade nobody at Finch will admit they needed until they had it."
product "LockOn Pro" authoring note stripped: "Same promise, sharper lock. (new text)" -> "Same promise, sharper lock."
product "ClapBack Ultra" authoring note stripped: "Now with main-character energy built in. (new text)" -> "Now with main-character energy built in."
product "LockOn" authoring note stripped: "Keeps the lights on your target. (new text)" -> "Keeps the lights on your target."
product "True North" authoring note stripped: "Gets your cargo there. Getting you there is your problem. (new text)" -> "Gets your cargo there. Getting you there is your problem."

Dry run. Pass "apply" to write 89 records.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 22:56:49 +02:00
.voidbot Retire stale Aetheria Persona priority cue 2026-09-26 13:06:52 +02:00
.vscode Shields 2025-01-30 01:58:05 +00:00
Aetheria-Economy_WwiseProject Remove dead code, unused plugins, and multiplayer remnants 2026-09-11 22:14:57 +02:00
Aetheria.Shared Visibility 5: an item can be aimed at when the observer's book holds it and it is still fitted and whole 2026-10-13 04:15:35 +02:00
Asset Sources Carbon_Fibre: dielectric, metallic 0 (drop unused Metalness map) 2026-10-10 00:27:53 +02:00
Assets Briefs, comments and tests name current gear; generic-designs lands only its own records and rewrites the last flavour and brand design texts 2026-10-13 22:34:08 +02:00
docs Map: weapon damage over range (range falloff is never applied; census of authored curves; options) 2026-10-13 20:04:16 +02:00
GameData GameData/Aetheria.cc: generic-designs apply on the base catalog through an ExpectUnchanged batch (sha256 34cbfacc50de6ba7945fe47c1e699d3125c7c3ba445675a8b8bfebfe58c057ba) 2026-10-13 22:56:49 +02:00
Packages CultMath pin to 0.4.1 (BoundedLeastSquares stopping fix and Validate) 2026-10-11 08:44:02 +02:00
ProjectSettings Add Addressables as a direct dependency and settings, Content group entry 2026-09-18 04:31:28 +02:00
tests GenericDesignsCommandTests: import the MessagePack snapshot serializer the payload-widening helper uses 2026-10-13 22:39:21 +02:00
tools AetherDb: ExpectUnchanged belongs to generic-designs' batch, not roles-migrate's 2026-10-13 22:52:24 +02:00
Vault/Aetheria REC-095: delete confirmed-dead narrative test fixtures and zero-byte scratch file 2026-09-13 14:02:49 +02:00
.gitattributes Bake From Source: Cycles Selected-to-Active from Source onto her UV0, one albedo and normal pair per ship 2026-10-13 00:38:26 +02:00
.gitignore AetherDb for ship authors: rooted at a game folder, found in ModTools; ship-ID rule in create 2026-10-10 06:53:03 +02:00
.vsconfig Hellfire 2021-01-10 03:59:47 +00:00
AetheriaTexts.ctd Merge branch 'master' of https://github.com/hyperion51/Aetheria-Economy 2020-06-08 01:45:39 +01:00
Assets.meta Shitty uniform Poisson Disk Sampling 2020-02-28 12:42:00 +00:00
CLAUDE.md Make AetherDb the agent's data tool in project doctrine 2026-09-30 00:08:34 +02:00
Directory.Build.props CultMath pin to 0.4.1 (BoundedLeastSquares stopping fix and Validate) 2026-10-11 08:44:02 +02:00
Directory.Build.targets Pin CultMath 0.3.0 and make the pin guard fire on Linux 2026-10-09 14:02:36 +02:00
dotnet-tools.json Adopt Stryker.NET as a repo-local tool, for the mutation-testing spike 2026-09-22 15:50:34 +02:00
LICENSE Change license to MPLv2 2020-12-12 03:46:54 +00:00
README.md README: Twemoji CC BY 4.0 attribution 2026-10-08 22:45:46 +02: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.

All mechanics are developed to be engine-agnostic, while Unity was chosen as a renderer and editor environment for its accessibility and extensibility. Many custom features have been developed, such as a database frontend with configurable backing store for managing game content, a novel visual input rebinding system, and a volumetric cloud renderer with groundbreaking fidelity, any of which can easily add value to other open source gamedev projects. We'd love to see other teams building on our foundation to deliver their own vision and contribute to the ecosystem we're creating.

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 implementing and polishing the ARPG gameplay as a standalone title, first as a rogue-lite combat demo and then adding a story-driven campaign mode.

Architecture

Project Structure

There are two solutions in this repository. One is a Unity project containing the desktop client for Aetheria, and the other is a .NET Core application intended to run on Linux cloud servers. The bulk of the game's code is shared between them, located at Assets/Scripts/ServerShared, defining a common protocol, world simulation code and data serialization format.

Third Party Libraries

Client-Server communication is implemented using LiteNetLib, a semi-reliable UDP transport library which we use to transmit MessagePack over the wire.

Game content lives in GameData/Aetheria.cc, a CultCache store that is read-only at runtime. Run state and player state (settings and bindings) live in their own .cc stores in the same cache. Persistent data types carry MessagePack attributes; some also carry JSON.Net attributes.

Emoji are drawn from Twemoji v17.0.3, converted to a colour font (Assets/Fonts/Emoji/Twemoji.ttf, built by tools/emoji/fetch_emoji_font.py; the artwork itself is not edited). Copyright (c) 2022–present Jason Sofonia & Justine De Caires; copyright (c) 2014–2021 Twitter. The graphics are licensed under CC BY 4.0; the full notice is Assets/Fonts/Emoji/LICENSE.txt.

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

All of the persistent state classes inherit from the DatabaseEntry class, which uses a GUID as each entry's primary key. Whenever a reference to a database entry must be held, it should be stored as a GUID and when needed, retrieved directly from the DatabaseCache held by the appropriate manager, usually ItemManager for references to ItemData. The ItemManager contains GetData helper methods for retrieving the ItemData for the various subclasses of ItemInstance.

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 6000.3.24f1 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.

Database Editor Tools

Game content in GameData/Aetheria.cc is edited in Unity with CultCache Studio, from the org.gamecult.caching.unity package.

Editing Items

Studio lists records by type; selecting one opens its fields in the inspector, including references to other records. Save writes the store back to GameData/Aetheria.cc.

Command Line

tools/AetherDb is a console project for inspecting the catalog without Unity: dotnet run --project tools/AetherDb -- <command>. Commands are census, factions, station-fit, hardpoint-fit, loadout [seed], save, settings, settings-dump and dangling. dangling lists references to records that do not exist; dangling clear <Type.Member> apply removes them for that member.

Testing Locally

The game reads the same GameData/Aetheria.cc, so saved edits show up the next time you enter Play mode. Start from the "Main Menu" scene: it sets up the world (loading or generating a galaxy) before loading the "ARPG" scene.

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).