Finite Galaxy is a free and open source space exploration game; the repository containing all files is located at https://github.com/finite-galaxy/finite-galaxy/ It is derived from Endless Sky, a game created by Michael Zahniser, which is located at https://github.com/endless-sky/endless-sky/
Both games can be installed alongside and played independently of each other. Although derived from the same source code and basically using the same content, Finite Galaxy and Endless Sky have diverged and are no longer compatible. If you transpose a save game from one to the other, you are likely to encounter hundreds of errors.
Open your terminal and enter:
- to install dependencies:
- on ArchLinux:
pacman -S --needed git gcc scons sdl2 libpng libjpeg-turbo mesa glew openal libmad pango ttf-linux-libertine
- on Debian/Ubuntu:
sudo apt-get install git g++ scons libsdl2-dev libpng-dev libjpeg-dev libgl1-mesa-dev libglew-dev libopenal-dev libmad0-dev libpango fonts-linuxlibertine
- on Fedora/RHEL/CentOS:
sudo dnf install git gcc-c++ scons SDL2-devel libpng-devel libjpeg-turbo-devel mesa-libGL-devel glew-devel openal-soft-devel libmad-devel pango linux-libertine-fonts
(replacednf
withyum
on some versions).
- on ArchLinux:
git clone https://github.com/finite-galaxy/finite-galaxy.git
to get a local copy of the repository.cd finite-galaxy/
to open the directory.git pull
to update the game.scons
to compile the game../finite-galaxy
to run the game.
For more help, consult the man page (the finite-galaxy.6
file).
If you have trouble compiling or encounter errors, please post here.
To build Finite Galaxy, you will first need to download Xcode from the App Store.
Next, install Homebrew (from http://brew.sh).
Once Homebrew is installed, use it to install the libraries you will need:
brew install libpng
brew install libjpeg-turbo
brew install libmad
brew install sdl2
brew install pango
If the versions of those libraries are different from the ones that the Xcode project is set up for, you will need to modify the file paths in the “Frameworks” section in Xcode.
It is possible that you will also need to modify the “Header Search Paths” and “Library Search Paths” in “Build Settings” to point to wherever Homebrew installed those libraries.
Library paths
To create a Mac OS X binary that will work on systems other than your own, you may also need to use install_name_tool
to modify the libraries so that their location is relative to the @rpath.
sudo install_name_tool -id "@rpath/libpng16.16.dylib" /usr/local/lib/libpng16.16.dylib
sudo install_name_tool -id "@rpath/libmad.0.2.1.dylib" /usr/local/lib/libmad.0.2.1.dylib
sudo install_name_tool -id "@rpath/libturbojpeg.0.dylib" /usr/local/opt/libjpeg-turbo/lib/libturbojpeg.0.dylib
sudo install_name_tool -id "@rpath/libSDL2-2.0.0.dylib" /usr/local/lib/libSDL2-2.0.0.dylib
sudo install_name_tool -id "@rpath/pango-1.44.7.dylib" /usr/local/lib/pango-1.44.7.dylib
If you have trouble compiling or encounter errors, please post here.
- Acquire the files with
git clone https://github.com/finite-galaxy/finite-galaxy.git
or click “Download ZIP” and extract it. - If you don't have it already, open
finite-galaxy/fonts/LinLibertine_DRah.ttf
and install the font (or copy it to the appropiate location). - For building the game, see https://github.com/endless-sky/endless-sky/wiki/BuildInstructions#Windows
Why did I start this project? Why not contribute to Endless Sky instead?
- Although I like Endless Sky as a whole, it also contains things I don't like. Conversation scenes, news and portraits, tribute, and plundering of installed outfits are just a few examples.
- The original creator, Michael Zahniser, seemed to disappear and pace of development appeared to slow down: there were only nine commits in September 2018 and zero in October. (I started Finite Galaxy on October 18.)
- Numerous pull requests over there have been open for over a year, reviews are haphazard, there are many lengthy discussions on unimportant things, while useful proposals were often ignored.
- The direction and vision is not always clear.
- Support for plug-ins is rather limited.
In short, I consider it a better use of time to work on a project where I can incorporate most of my ideas, where I can remove things I dislike, and where I can contribute whenever I like, without having to wait weeks or months for a review or wasting my time on something that won't be included.
Finite Galaxy is very much a work in progress. Nevertheless, it can be compiled and played without errors. Feel free to try it out yourself!
- Hyperjump fuel is based on your ship's effective mass (including cargo and carried ships)
- Hyperjump fuel is no longer free, its price depends on the planet (when landing) or the government (when hailing ships in space)
- Ships continuously consume energy, based upon the number of bunks, to represent life-support
- Ship categories are based on total mass
ship mass = hull mass + outfit space + cargo space
- Introduced core space, reserved for energy generators, shields and hull systems, and hyperdrives
outfit space = core space + engine space + weapon space
- Installed outfits can no longer be plundered by default; outfits in cargo still can
- Minimum depreciation value raised to 50%, time lowered to one year
- Weapon projectile damage is a random number between
damage
anddamage + random damage
- Guns fire in parallel by default, i.e. no harmonized angle convergence.
- Ship info display shows more stats
- Redistributed most human ships and many outfits to have more regional specialization
- Removed tribute from planets (relevant code is still present for plug-ins)
- Removed news and portraits (relevant code is still present for plug-ins)
- Distances from planets to the sytem's centre are trebled; as a result space feels larger, thrusters are more desirable, and players won't always land immediately in the middle of a space fight
- Non-missile weapons have their weapon range increased by about a third
- Exploding ships are significantly more dangerous
- Add support for Unicode and different writing directions
See changelog.txt
, ship_overview.txt
, and https://github.com/finite-galaxy/finite-galaxy/commits/master
- Add quotation mark preference
- Add “Licences” tab in player info panel
- Add “Tribute” tab in player info panel
- Add “Manufacturer” to ships
- Add functionality to deposit credits at the bank for a fixed time (e.g. one year), receiving either the sum plus interest when it expires, or the sum minus a penalty when you claim it beforehand
- Add planet landing fees support
- Allow friendly fire
- Allow sorting available jobs (by e.g. cargo size, distance, name, payment, etc.)
- Allow sorting outfits by cost, mass, name
- Allow sorting ships by cost, mass, name, outfit space, shields, etc.
- Display flagship speed by default and display target's speed with tactical scanner
- De-hardcode jump radius
- Increase jump radius if you have multiple jump drives installed, perhaps 100*(jump drive)^0.5
- Limit the commodities for sale on specific planets
- Make ship explosion ‘weapon’ automatically proportional to mass (base, empty, or total mass)
- Separate fleet overview column in outfitter and shipyard from ship info display
- Separate slots for guns and missile launchers
- Ships entering a system from hyperspace should be positioned near the system's centre, instead of near the first inhabited planet
- https://github.com/endless-sky/endless-sky/wiki/DevelopmentRoadmap
Contributions are welcome; anyone can contribute; feel free to open issues or make pull requests.
Code:
- De-hardcode Drone/Fighter classes (currently a boolean is used), to allow for multiple, customizable fighter/bay types (e.g. small, medium, large).
- De-hardcode hardpoint slots (currently a boolean is used), to allow for multiple, customizable hardpoint types (e.g. gun slots, missile bays, turret mounts).
- Implementing the ideas listed above.
- Other new mechanics that make the game more enjoyable.
Art: Because my Blender skills are non-existent, I could use help from people who are capable and willing to:
- Make new outfit sprites and turret hardpoints (e.g. six-gun blaster turret).
- Modify existing ship sprites and thumbnails.
- Produce ship thumbnails for ships that only have sprites.
- Create new ships. See open issues.
Miscellaneous: Unfortunately I'm unable to test things on platforms other than my own (Fedora Linux). BSD, MacOS X, and Windows users could help by trying compiling and running the game, and if necessary, correct the appropiate files accordingly.
The issues page on GitHub is for tracking bugs and for art, content, and feature requests. When posting a new issue, please:
- Be polite and always assume good faith.
- Check to make sure it's not a duplicate of an existing issue.
- Create a separate “issue” for each bug, problem, question, or request.
If requesting a new feature, first ask yourself: will this make the game more fun or interesting? Remember that this is a game, not a simulator. Changes will not be made purely for the sake of realism, especially if they introduce needless complexity or aggravation.
If you believe your issue has been resolved, you can close the issue yourself.
If you are posting a pull request, please:
- Do not combine multiple unrelated changes into a single pull.
- Check the diff and make sure the pull request does not contain unintended changes.
- If proposing a major pull request, start by posting an issue and discussing the best way to implement it. Often the first strategy that occurs to you will not be the cleanest or most effective way to implement a new feature.
audio/
:- file names are lower case and use underscores instead of spaces
- insert yourself in the
copyright.txt
file
code/
:- follow the coding standard.
- C++17
- do not use tabs; use two spaces instead
- make numbers with many digits easier to read for humans by inserting
'
- (decimal numbers) at intervals of three digits if there are more than four in a row (e.g.
100'000
) - (hexadecimal numbers) at intervals of four digits if there are more than six in a row (e.g.
FFFF'FFFF
)
- (decimal numbers) at intervals of three digits if there are more than four in a row (e.g.
- use Oxford English
data/
:- do not use tabs; use two spaces instead
- use Oxford spelling (the variant of English used by many scientific journals and international organizations such as the United Nations), instead of American, British, Canadian, or other national varieties.
- no diacritics in English:
- á, à, â → a; same for other vowels
- å → aa
- æ, ä → ae
- œ, ø, ö → oe
- ü → ue
- İ/ı → I/i
- ç → c
- č, ć, ċ → ch
- š, ś, ş → sh
- ñ → nh
- ß → ss
- text strings (conversations, descriptions, mission dialogues, tooltips, etc.):
- avoid abbreviations (e.g., i.e., etc.); contractions (isn't) are fine
- use an Oxford comma when giving more than two items (e.g. one, two, and three; not one, two and three)
- use U+2013 – en-dash for number ranges (e.g. 10–12) and for parenthetical expressions – like this – instead of parentheses, em-dashes, or hyphens
- use U+2026 … horizontal ellipsis instead of three full stops
- use U+202F narrow non-breaking space as a thousands separator for numbers with five or more digits (e.g. 12 345)
- use U+2212 − minus sign for negative numbers, subtractions, and deductions
- use the " quote for direct speech and ' apostrophe within direct speech; the source code replaces these with proper “primary” and ‘secondary’ opening and closing quotation marks; surround such strings with ` backticks
- repeatedly check and double check any new or changed strings to avoid unnecessary typos; e.g. mind the difference between it's (cf. he's, she's) and its (cf. his, her).
images/
:- file names are lower case and use underscores instead of spaces
- add both normal and @2x versions
- for ships, also create thumbnails
- for turrets, also create hardpoints
- insert yourself in the copyright.txt file
- include all assets (Blender, GIMP, other files) in the opening post
Part of the fun of the game is travelling around and exploring. However, if you don't have time for that and simply want to reveal everything in the entire galaxy, then open your save game, find # What you know:
and insert the following lines directly afterwards:
visited "1 Axis"
visited "10 Pole"
visited "11 Autumn Above"
visited "11 Spring Below"
visited "12 Autumn Above"
visited "14 Pole"
visited "14 Summer Above"
visited "14 Winter Below"
visited "16 Autumn Rising"
visited "3 Axis"
visited "3 Pole"
visited "3 Spring Rising"
visited "4 Axis"
visited "4 Spring Rising"
visited "4 Summer Rising"
visited "4 Winter Rising"
visited "5 Axis"
visited "5 Spring Below"
visited "5 Summer Above"
visited "5 Winter Above"
visited "7 Autumn Rising"
visited "8 Winter Below"
visited "9 Spring Above"
visited "Ablodab"
visited "Ablub"
visited "Acamar"
visited "Achernar"
visited "Acrux"
visited "Adhara"
visited "Aescolanus"
visited "Al Dhanab"
visited "Albaldah"
visited "Albireo"
visited "Alcyone"
visited "Aldebaran"
visited "Alderamin"
visited "Aldhibain"
visited "Algedi"
visited "Algenib"
visited "Algenubi"
visited "Algieba"
visited "Algol"
visited "Algorel"
visited "Alheka"
visited "Alhena"
visited "Alioth"
visited "Alkaid"
visited "Almaaz"
visited "Almach"
visited "Alnair"
visited "Alnasl"
visited "Alnilam"
visited "Alnitak"
visited "Alniyat"
visited "Alpha Arae"
visited "Alpha Centauri"
visited "Alpha Hydri"
visited "Alphard"
visited "Alphecca"
visited "Alpheratz"
visited "Altair"
visited "Aludra"
visited "Ancient Hope"
visited "Ankaa"
visited "Answer"
visited "Antares"
visited "Antevorta"
visited "Ap'arak"
visited "Arcturus"
visited "Arculus"
visited "Arneb"
visited "Ascella"
visited "Asikafarnut"
visited "Aspidiske"
visited "Atria"
visited "Avior"
visited "Aya'k'k"
visited "Beginning"
visited "Bellatrix"
visited "Belonging"
visited "Belug"
visited "Belugt"
visited "Beta Lupi"
visited "Betelgeuse"
visited "Bloptab"
visited "Blubipad"
visited "Blugtad"
visited "Boral"
visited "Bore Fah"
visited "Bote Asu"
visited "Bright Void"
visited "Broken Bowl"
visited "Caeculus"
visited "Canopus"
visited "Capella"
visited "Caph"
visited "Cardax"
visited "Cardea"
visited "Castor"
visited "Cebalrai"
visited "Celeborim"
visited "Chalawan"
visited "Charm"
visited "Chikatip"
visited "Chimitarp"
visited "Chirr'ay'akai"
visited "Chornifath"
visited "Chy'chra"
visited "Cinxia"
visited "Coluber"
visited "Companion"
visited "Convector"
visited "Cor Caroli"
visited "Da Ent"
visited "Da Lest"
visited "Dabih"
visited "Danoa"
visited "Dark Hills"
visited "Debrugt"
visited "Delta Capricorni"
visited "Delta Sagittarii"
visited "Delta Velorum"
visited "Deneb"
visited "Denebola"
visited "Diphda"
visited "Dokdobaru"
visited "Dschubba"
visited "Dubhe"
visited "Due Yoot"
visited "Durax"
visited "Eber"
visited "Eblumab"
visited "Edusa"
visited "Ehma Ti"
visited "Ek'kek'ru"
visited "Ekuarik"
visited "Elnath"
visited "Eltanin"
visited "Eneremprukt"
visited "Enif"
visited "Es'sprak'ai"
visited "Eshkoshtar"
visited "Eteron"
visited "Fah Root"
visited "Fah Soom"
visited "Fala"
visited "Fallen Leaf"
visited "Far Horizon"
visited "Farbutero"
visited "Farinus"
visited "Faronektu"
visited "Fasitopfar"
visited "Fell Omen"
visited "Feroteri"
visited "Ferukistek"
visited "Fingol"
visited "Flugbu"
visited "Fomalhaut"
visited "Fornarep"
visited "Four Pillars"
visited "Furmeliki"
visited "Gacrux"
visited "Gamma Cassiopeiae"
visited "Gamma Corvi"
visited "Gienah"
visited "Girtab"
visited "Glubatub"
visited "Gomeisa"
visited "Good Omen"
visited "Gorvi"
visited "Graffias"
visited "Gupta"
visited "Hadar"
visited "Hamal"
visited "Han"
visited "Hassaleh"
visited "Hatysa"
visited "Heia Due"
visited "Hesselpost"
visited "Hevru Hai"
visited "Hi Yahr"
visited "Hintar"
visited "Holeb"
visited "Homeward"
visited "Host"
visited "Hunter"
visited "Ik'kara'ka"
visited "Ildaria"
visited "Imo Dep"
visited "Insitor"
visited "Io Lowe"
visited "Io Mann"
visited "Ipsing"
visited "Iyech'yek"
visited "Izar"
visited "Ka'ch'chrai"
visited "Ka'pru"
visited "Kaliptari"
visited "Kappa Centauri"
visited "Kashikt"
visited "Kasikfar"
visited "Kaus Australis"
visited "Kaus Borealis"
visited "Ki War Ek"
visited "Kiro'ku"
visited "Kiru'kichi"
visited "Kochab"
visited "Kor Ak'Mari"
visited "Kor En'lakfar"
visited "Kor Fel'tar"
visited "Kor Men"
visited "Kor Nor'peli"
visited "Kor Tar'bei"
visited "Kor Zena'i"
visited "Kornephoros"
visited "Korsmanath"
visited "Kraz"
visited "Kugel"
visited "Kursa"
visited "Last Word"
visited "Lesath"
visited "Levana"
visited "Limen"
visited "Lolami"
visited "Lom Tahr"
visited "Lone Cloud"
visited "Lucina"
visited "Lurata"
visited "Makferuti"
visited "Markab"
visited "Markeb"
visited "Matar"
visited "Mebla"
visited "Mebsuta"
visited "Meftarkata"
visited "Mei Yohn"
visited "Mekislepti"
visited "Membulem"
visited "Men"
visited "Menkalinan"
visited "Menkar"
visited "Menkent"
visited "Merak"
visited "Mesuket"
visited "Miaplacidus"
visited "Miblulub"
visited "Mimosa"
visited "Minkar"
visited "Mintaka"
visited "Mirach"
visited "Mirfak"
visited "Mirzam"
visited "Mizar"
visited "Moktar"
visited "Mora"
visited "Muhlifain"
visited "Muphrid"
visited "Naos"
visited "Naper"
visited "Nashira"
visited "Nenia"
visited "Nihal"
visited "Nocte"
visited "Nunki"
visited "Oblate"
visited "Orbona"
visited "Orvala"
visited "Ossipago"
visited "Over the Rainbow"
visited "Pantica"
visited "Parca"
visited "Peacock"
visited "Pelubta"
visited "Peragenor"
visited "Peresedersi"
visited "Perfica"
visited "Persian"
visited "Persitar"
visited "Phact"
visited "Phecda"
visited "Pherkad"
visited "Phurad"
visited "Pik'ro'iyak"
visited "Plort"
visited "Polaris"
visited "Pollux"
visited "Porrima"
visited "Prakacha'a"
visited "Procyon"
visited "Pug Iyik"
visited "Quaru"
visited "Rajak"
visited "Rasalhague"
visited "Rastaban"
visited "Rati Cal"
visited "Regor"
visited "Regulus"
visited "Remembrance"
visited "Rigel"
visited "Ruchbah"
visited "Rutilicus"
visited "Ruwarku"
visited "Sabik"
visited "Sabriset"
visited "Sadachbia"
visited "Sadalmelik"
visited "Sadalsuud"
visited "Sadr"
visited "Sagittarius A*"
visited "Saiph"
visited "Salipastart"
visited "Salm"
visited "Sargas"
visited "Sarin"
visited "Sayaiban"
visited "Scheat"
visited "Schedar"
visited "Segesta"
visited "Seginus"
visited "Seketra"
visited "Sepetrosk"
visited "Sepriaptu"
visited "Sevrelect"
visited "Shaula"
visited "Sheratan"
visited "Si'yak'ku"
visited "Sich'ka'ara"
visited "Silikatakfar"
visited "Silver Bell"
visited "Silver String"
visited "Similisti"
visited "Sirius"
visited "Situla"
visited "Skeruto"
visited "Sko'karak"
visited "Sobarati"
visited "Sol"
visited "Sol Arachi"
visited "Sol Kimek"
visited "Sol Saryds"
visited "Solifar"
visited "Sospi"
visited "Speloog"
visited "Spica"
visited "Steep Roof"
visited "Stercutus"
visited "Suhail"
visited "Sumar"
visited "Sumprast"
visited "Tais"
visited "Talita"
visited "Tania Australis"
visited "Tarazed"
visited "Tarf"
visited "Tebuteb"
visited "Tejat"
visited "Terminus"
visited "Terra Incognita"
visited "Torbab"
visited "Tortor"
visited "Turais"
visited "Ula Mon"
visited "Ultima Thule"
visited "Umbral"
visited "Unagi"
visited "Unukalhai"
visited "Uwa Fahn"
visited "Vega"
visited "Vindemiatrix"
visited "Volax"
visited "Wah Ki"
visited "Wah Oh"
visited "Wah Yoot"
visited "Waypoint"
visited "Wazn"
visited "Wei"
visited "Wezen"
visited "World's End"
visited "Ya Hai"
visited "Yed Prior"
visited "Zaurak"
visited "Zeta Aquilae"
visited "Zeta Centauri"
visited "Zosma"
visited "Zuba Zub"
visited "Zubenelgenubi"
visited "Zubenelhakrabi"
visited "Zubeneschamali"
"visited planet" "Ember Reaches"
"visited planet" "Ember Threshold"
"visited planet" "Ember Wormhole"
"visited planet" "Hai Wormhole"
"visited planet" "Pirate Wormhole"
"visited planet" "Pug Wormhole"
"visited planet" "Quarg Wormhole"
"visited planet" "Remnant Wormhole"
"visited planet" "Rim Wormhole"
"visited planet" "The Eye"