Posted March 07, 2025 by KermitTheGodFrog
In ‘Miscellaneous & Bugfixes’ I outlined some topics, and the goals associated, that I would independently develop before the next devlog. These topics were: ‘Improved star systems’, ‘Replayability’, ‘More content’ and ‘Miscellaneous improvements’.
I added most goals within all topics. I added all goals within ‘Improved star systems’, besides system hazards/modifiers, which I created the base architecture for but didn’t quite get around to implementing. I added an achievements system and a better game scoring system, constituting half of the goals within ‘Replayability’. I made huge (and hopefully final!) changes to the dialogue system, and added some content, working towards the aim of the ‘More content’ topic. I believe the ‘Miscellaneous improvements’ topic was a success, as I made a few enhancements in that regard.
This devlog will cover the more technical and/or interesting subjects that I worked on, including some subjects that weren’t quite present in any of last devlogs topics, being:
I decided to add achievements due to their potential to increase replayability. Implementation consists of a banner popup in-game, and an achievements list in the main menu (both shown below). The achievement calculation is performed every time a dialogue query is spoken. It compares each achievements criteria to the query data using existing dialogue methods, and unlocks any achievements whose entire criteria is met. This makes the syntax quite simple:
The only downside to this approach is that gaining an achievement will be delayed until, of course, a dialogue query is spoken. In the above example, the player could have fifty percent hull deterioration or more, but would only gain the achievement when interacting with a wormhole, station, anomaly, etc.
I am very happy with the achievement system, and I don't foresee it requiring future improvements. Right now, the achievement list is barren, but new achievements will be added to recognise rare events and challenges in the future.
New Planet Types
What always infuriated me about the generation in Stellar Cartographer was the prevalence of Terrestrial and Silicate planets. They were 'basic' (weren't temperature specific) and were therefore appended to every planet type choosing operation. Worse, they were heavily weighted. Entire star systems were filled with them.
I decided to remove these two planet types, and replace them with four new ones: Iron, Nickel, Sulfur and Coreless. They function nearly exactly the same, however are weighted slightly less overall. Their names are derived from their supposed core type, as there is a surprising lack of naming convention for barren rocky worlds. With these new types, I can no longer notice any repetition.
While researching planet types, I wrote down some descriptions which I plan to eventually add to the system list 'INFO' tab. Below are the descriptions for Sulfur and Ice worlds, respectively.
A solid planet composed of silicate, water, carbon and trace rare elements accompanied by a sulfur or iron-sulfur core.
A solid planet composed of silicate, water and carbon, with huge reservoirs of water, methane, ammonia and nitrogen at it's surface. Metallic core.
Naming Schemes
A long-standing suggestion for Stellar Cartographer was to make the naming scheme more 'scientific' - more akin to the seemingly random jumble of characters used to describe phenomena in real astronomy. Having put effort into the existing naming scheme, I decided to simply add two more and have the game randomly select between them:
Adding these new name schemes was an enjoyable task. Below are some extreme examples of the SCIENTIFIC name scheme.
bodyAPI and starSystemAPI Overhaul
Before this overhaul, any method involved in rendering bodies was filled with the 'or' keyword to differentiate between the 6~ body types, in spite of most bodies being rendered as a coloured sphere, or as small glint texture meant to communicate that the body is too small to be seen. It took a lot of refactoring, but I made every body inherit from one of two new classes: circularBodyAPI or glintBodyAPI, which are displayed relevantly. This will make working with the renderer a lot easier in the future.
Below is the before and after of this change.
This overhaul also included:
The aim is to use special star systems and special anomalies to make more interesting discoveries for the player in the future.
Dialogue updates stole a majority of development time. Below are three features which can be held partially accountable for this, but aren't important enough to cover in detail.
The primary update to the dialogue system regards the algorithm for rule picking. Previously, the 'BEST' query type compared rule criteria against query facts, and picked rules who had the highest number of matched criteria compared to all other rules. I had long suspected that instead of picking the rule with the most criteria matched, it would be more effective to pick the rule with the most criteria matched, from a list of rules of whom have ALL of their criteria matched. How this improves the 'effectiveness' of dialogue is displayed below.
Using the 'BEST' query type, there cannot simply be two rules for whether the 'wormholeAVFlair' is called, e.g:
Rule | Criteria |
wormholeTryAVFlairPass | concept: wormholeTryAVFlair, system_is_civilized: true, player_AUDIO_VISUALIZER_unlocked: true, pending_audio_profiles: true |
wormholeTryAVFlairFail | concept: wormholeTryAVFlair |
This is because one of the criteria keys other than the concept will most likely always be true. For example, if the player unlocks the Audio Visualizer module, the rule picked will always be 'wormholeTryAVFlairPass', even if the players star system isn't civilised, and the player does not have any pending audio profiles. By only allowing rules to be picked if ALL of their criteria is matched, this problem would disappear. Additionally, the large tally of rules in the above image required to check each criteria key individually to work around this issue, would thankfully no longer be necessary.
The new query type required to bring this idea to reality was to be called 'JUST_BEST'. Despite all of the logic and planning needed for the feat, the 'JUST_BEST' query type differs from the 'BEST' query type by merely two lines of code. After discovering that it performed perfectly, the 'BEST' query type became 'JUST_BEST', and the old 'BEST' query type became 'OLD_BEST'. Below is the condensed version of the above image, using the 'JUST_BEST' query type.
This relatively minor change has greatly improved rule writing efficiency, and the refactoring required was far from the devastation that I feared. With greater rule writing efficiency, I should be able to create new content faster in the future.
After much deliberation, I decided to completely change the survival mechanics in Stellar Cartographer. Below are the primary changes, followed by an explanation.
Previously, hull stress was incurred on LIDAR ping, where the amount of hull stress incurred depended on the size of the LIDAR scan arc. This was not popular with playtesters, as it required you to practically shoot yourself in the foot in order to cover larger areas. The result was that playtesters would not use larger scan arcs, instead relying on smaller arcs which made exploration infinitely more difficult.
The solution therefore was to remove LIDAR ping hull stress altogether. In order to keep the game challenging, I massively increased wormhole traversal hull stress. With five traversals between ports, the player would gain 125% hull stress, or 100% hull stress and 25% hull deterioration, each leap. This prompted the addition of random events and Rendezvous Point interactions to repair this hull stress, leading to the players survival being dictated by their luck in event outcomes and discovery value, but also their skill in spending nanites effectively.
Ever since I added morale as a survival indicator, I had planned around the assumption that a mutiny should start at 0% morale. Despite this, I had never decided what a mutiny would actually involve. My latest mutiny implementation guarantees the players death, along with a vague message, when 0% morale is reached. In the future, I would instead like to have:
I plan to make these changes by the next devlog. In fact, the dialogue already suggests that the players chance to survive a mutiny is dictated by Security Officer standing, so it shouldn't take too long.
The addition of Rendezvous Points originated from me wanting the player to have more dynamic interaction with their senior staff, and more ways to riskily save themselves in a crisis. I had the idea when a friend was showing me the ‘ask for help’ mechanic in the game Highfleet, which allows the player to ask contacts for essential resources, often at long term detriment; I quickly planned my own version of this concept on a digital whiteboard:
This concept was to be represented as a physical location within star systems which the player would discover and interact with (eventually becoming Rendezvous Points). Options to decrease and increase survival indicators, at a cost, would be available - First Officer to increase morale, Chief Engineer to decrease hull stress, Medical Officer to increase data value, Security Officer to increase mutiny backing. My first implementation followed this plan precisely, which exposed a few drawbacks:
In my second implementation, I fixed these three issues:
Overall, I think my second implementation comes closest to providing the player with more senior staff interaction and more methods to save themselves in a crisis. In the future, I’d like to expand upon Rendezvous Points by adding character story events at varying values of standing (think Stardew Valley), the ability to play cards with your senior staff in the mess hall, etc.
These updates have made the creation of new content much, much easier. For that reason, my current goals for the project are related to the creation of new content, both in dialogue and in gameplay. The creation of new content is also paramount as I plan to release v1.0.0.0 by the end of 2025, with no guarantee of further updates - it is currently March. Goals below.
Thank you for taking the time to read this devlog.
This devlog is the culmination of three updates: v0.2.0.0, v0.2.0.1 and v0.3.0.0. For future reference, their change-logs are below:
Change-log (0.2.0.0):
Change-log (0.2.0.1):
Change-log (0.3.0.0):