You are viewing a potentially older version of this package. View all versions.
explodingMods-LethalMoonUnlocks-2.4.3 icon

LethalMoonUnlocks

Unlock moons permanently or progressively reduce their costs. Adds new progression mechanics in Discovery Mode. Moon sales, Vanilla story mode and more.

Date uploaded a week ago
Version 2.4.3
Download link explodingMods-LethalMoonUnlocks-2.4.3.zip
Downloads 5458
Dependency string explodingMods-LethalMoonUnlocks-2.4.3

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2100 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2100
xilophor-LethalNetworkAPI-3.3.2 icon
xilophor-LethalNetworkAPI

A library/API to allow developers to easily add networking to their mods.

Preferred version: 3.3.2
IAmBatby-LethalLevelLoader-1.6.8 icon
IAmBatby-LethalLevelLoader

A Custom API to support the manual and dynamic integration of all forms of custom content in Lethal Company. (v73 Compatible)

Preferred version: 1.6.8
Hamunii-TypeLoadExceptionFixer-1.0.4 icon
Hamunii-TypeLoadExceptionFixer

Fixes issues caused by unloadable types.

Preferred version: 1.0.4

README

LethalMoonUnlocks

Unlock moons permanently or progressively reduce their costs.
Introducing new progression mechanics in Discovery Mode where you keep uncovering new moons as you play!

Overview

LethalMoonUnlocks gives players the power to customize their moon unlocking experience in a number of ways. Here's a quick look at what you can do:

  • Unlock Mode: Permanently unlock moons after just one purchase.
  • Discount Mode: Gradually unlock discounts until moons are free. Alternative to Unlock Mode.
  • Discovery Mode: Start with limited moons and discover new ones as you play.
  • Random Moon Sales: Enjoy spontaneous sales on moon prices.
  • Terminal Tags: Display extra information in the moon catalog (you can toggle this on or off).
  • Custom Moon Groups: Organize moons into groups.
  • Compatibility: Integrates with..
  • Extensive Configuration: Offers a wide variety of setups - your suggestions are welcome!

LethalMoonUnlocks is a great addition to modpacks suffering from paradox of choice because you just can't stop yourself from adding more custom moons. I know who you are. You're me :)

Special thanks to Permanent Moons by BULLETBOT for the original inspiration.

Why LethalMoonUnlocks?

Unfortunately, Permanent Moons is no longer maintained and has issues with certain custom moons (e.g., Atlas Abyss, Outpost-31) due to their names.
This was particularly frustrating in my personal modpack, where all moon prices were balanced around permanently unlocking them.
So, I took this as a learning opportunity to create LethalMoonUnlocks.

Can I use my Permanent Moons savegame?

Absolutely! LethalMoonUnlocks automatically imports your Permanent Moons data from existing save files when you load them.
Any data for moons that are not installed (or enabled) at the time or can't be matched for other reasons will be discarded.

You can uninstall Permanent Moons directly after installing this mod. There's no need to start the game with both installed.

Dependencies
  • LethalNetwork API: Used for sending data between host and clients.
  • LLL: Used for changing moon prices and visibility (discoverability), as well as adding tags to the moon catalog.

If you don't use LLL, you likely don't have custom moons, so you can continue using Permanent Moons (link above) without issue.

Note: All clients must have this mod installed!

Report issues on GitHub: LethalMoonUnlocks

Unlock Mode

Unlock Mode is the only feature enabled by default and works exactly like the original Permanent Moons mod.

Learn more

In Unlock Mode, you unlock paid moons by buying and routing to them once. From that point on, the moon's route will be free.

There are configuration options available to customize your experience in Unlock Mode.
Read this section for more information.

Unlocks Expire

Optional: Set unlocks to expire!

You can put a limit on how many times each unlock can be used.
After reaching the set limit of uses, the unlock expires, resetting the moon to its original price.

Discovery Mode Related

These options provide customization for when you're using Unlock Mode together with Discovery Mode.
For more information, read the section about Discovery Mode.

Show discovery related options

Unlocked Moons are Permanently Discovered

Optional: Keep access to moons once unlocked!*

When a moon is unlocked, it will be permanently discovered, meaning it's added to the moons available in the Terminal's moon catalog - on top of your base selection.
This ensures that any moon you've unlocked will always be available for travel in Discovery Mode.

Reset Permanent Discoveries on Expiry

Optional: Keeps things fresh by resetting discovery status on expiry!

When the unlock for a permanently discovered moon expires, it will also reset that moon's permanent discovery status, making it disappear from the moon catalog.

This is the only way permanent discoveries can vanish during a run, increasing variety in the late game.

Quota Unlocks

Optional: Get rewarded for meeting quotas!

Quota Unlocks reward you for meeting a quota by granting random unlocks for free.

Quota Unlock Configuration
  • Set the chance to trigger Quota Unlocks.
  • Set a minimum and maximum for the number of moons to unlock when triggered.
  • Limit Quota Unlocks to moons up to a certain price.
  • Limit the total number of times Quota Unlocks can be triggered.

Discount Mode

In Discount Mode, instead of directly unlocking moons, you will unlock a new discount rate each time you buy a moon, eventually making it free.

Learn more

Discount Mode provides a balanced approach for when you think directly unlocking moons is too easy or doesn't fit your gameplay style.

There are configuration options available to customize your experience in Discount Mode.
Read this section for more information.

Discount Rates

Optional: Set your own discount rates!

Moons will progress through a configurable list of discount rates. With each discount received, the next rate is unlocked.
You can set up as many discount rates as you like, and they don't necessarily have to go from low to high.

For example, you could set up discounts so that moons are 50% off after your first purchase, 75% after the second, and free after the third.
This would be achieved by setting the discount rates config option to 50,75,100.

Typically, the final rate would be 100 - making the moon free like a normal 'Unlock'.

Discounts Expire

Optional: Set discounts to expire.

You can put a limit on how many times a fully discounted moon can be travelled to for free. After reaching the set limit of uses, the discount expires, resetting the moon to its original price.

This option requires you to set up discount rates so that the final rate is free (100).

Discovery Mode Related

These options provide customization for when you're using Discount Mode together with Discovery Mode.
For more information, read the section about Discovery Mode.

Show discovery related options

Discounted Moons are Permanently Discovered

Optional: Keep access to discounted moons!

When a moon is discounted, it will be permanently discovered, meaning it's added to the moons available in the Terminal's moon catalog - on top of your base selection.
This ensures that any moon you've unlocked a discount for will always be available for travel in Discovery Mode.

Reset Permanent Discoveries on Expiry

Optional: Keeps things fresh by resetting discovery status on expiry!

When the discount for a permanently discovered moon expires, it will also reset that moon's permanent discovery status, making it disappear from the moon catalog.

This is the only way permanent discoveries can vanish during a run, increasing variety in the late game.

Quota Discounts

Optional: Get rewarded for meeting quotas!

Quota Discounts reward you for meeting a quota by granting random discounts for free.

Quota Discounts Configuration
  • Set the chance to trigger Quota Discounts.
  • Set a minimum and maximum for the number of moons to receive a discount (rate) when triggered.
  • Limit Quota Discounts to moons up to a certain price.
  • Limit the total number of times Quota Discounts can be triggered.

Quota Full Discounts

Optional: Get rewarded for meeting quotas!

Quota Full Discounts reward you for meeting a quota by unlocking the final discount rate for random moons for free.

Quota Full Discounts Configuration
  • Set the chance to trigger Quota Full Discounts.
  • Set a minimum and maximum for the number of moons to receive the final discount rate when triggered.
  • Limit Quota Full Discounts to moons up to a certain price.
  • Limit the total number of times Quota Full Discounts can be triggered.

Discovery Mode

In Discovery Mode, you start with a limited selection of moons for travel. You will discover new moons as you play.

Learn more

The configuration options for this mode are extensive.
Read this section for more information on Discovery Mode.

General

Discovery Mode is all about exploration and progression, synergizing really well with having a lot of custom moons.

There are various ways to discover new moons, adding a fresh layer to the game: Moon Progression.
New moons can be discovered regularly, as rewards, randomly, or any combination of those.

There's even support for moon group matching using custom-defined groups.
This means you can set up your own moon groups (galaxies, solar systems, tiers, etc.), and when you travel to a moon, you might discover more moons of the same group.
You can also use your existing LethalConstellations for this.

But first, let's start with the basics - your base selections.

Base Selections (Moon Rotation)

When you start a new game in Discovery Mode, your selection of moons available for travel in the Terminal's moon catalog is limited.
The number of available moons is determined by your moon base counts. There are three categories:

  • Free Moons: Moons that have an original route price of 0 credits.
  • Dynamic Free Moons: Moons that currently have a route price of 0 credits. Baseline but also through unlocks or discounts.
  • Paid Moons: Moons you have to pay for travelling to.

You can configure the base count for each of these categories, and you can also have them increase every time the current selection (or rotation) is shuffled.

Shuffling

By default, every time a new quota begins, the moon rotation will be shuffled, meaning the current selection is discarded, and new moons will be randomly selected.
You have options to change this to shuffle every day instead or never shuffle at all.

Discovered Moons (Discoveries)

Every moon available for travel in the Terminal is considered a discovered moon, including the base selections.
However, as mentioned before, there are more ways to discover moons that will be added on top of your base selection.
These will also vanish when the rotation is shuffled unless you make them permanent.

Permanently Discovered Moons (Permanent Discoveries)

Permanently discovered moons are just that - permanent. They are added on top of your base selection but do not vanish on shuffle.
Moons can be permanently discovered in various ways, depending on your configuration.

This could include:

  • Making discoveries permanent by unlocking them (or unlocking a discount).
  • Making discoveries permanent by landing a set number of times.
  • Making discoveries granted by a certain mechanic permanent.

Of course, you can also permanently discover moons from the base selections.

Permanent discoveries allow you to pick moons from your current rotation and keep them for the rest of the run.

Combined with the discovery mechanics below, this allows for granting more and more additional discoveries as the quota progresses, but to keep any of them, you have to purchase them.
This can incentivize buying moons even several days into a quota, especially when combined with Moon Sales.

The only way permanent discoveries can vanish is through the options associated with unlocks and discounts expiring.

This can enhance variety in the late game.

Quota Discoveries

Optional: Get rewarded for meeting quotas!

Quota Discoveries reward you for meeting a quota by granting one or more moon discoveries.

Quota Discoveries Configuration
  • Set the chance to trigger Quota Discoveries.
  • Set a minimum and maximum for the number of moons discovered.
  • Make moons discovered this way permanent discoveries.
  • Prefer discovering moons from the group of the currently cheapest undiscovered moon.
    • Allows you to unlock the next best tier of moons when combined with permanent discoveries.

Travel Discoveries

Optional: Discover new moons while travelling!

Travel Discoveries randomly grant moon discoveries as you route and travel to paid moons.

Travel Discoveries Configuration
  • Set the chance to trigger a Travel Discovery.
  • Set a minimum and maximum for the number of moons discovered.
  • Make moons discovered this way permanent discoveries.
  • Prefer discovering moons that belong to the same group as the one you've routed to (see Moon Groups).

New Day Discoveries

Optional: Get more travel options as the quota progresses!

New Day Discoveries randomly grant moons when a new day begins.

Combine this with Unlocks are permanently discovered and you'll get additional moons to travel to from day to day, but to keep them around you have to buy them or they will vanish when the rotation is shuffled next quota.

New Day Discoveries Configuration
  • Set the chance to trigger a New Day Discovery.
  • Set a minimum and maximum for the number of moons discovered.
  • Make moons discovered this way permanent discoveries.
  • Prefer discovering moons that belong to the same group as the one you're currently located at (see Moon Groups).

LethalConstellations Discovery

Together with LethalConstellations there are some changes to how Discovery Mode works.

Constellations are tracked as separate progression state. They are excluded from the moon rotation and need to be discovered via other means. Once discovered, a constellation stays discovered i.e., it's always a permanent discovery.

Moon rotation is still configured with the normal free / dynamic free / paid counts, but those picks are selected locally for the current constellation instead of globally across all moons. That means each constellation has its own set of discoveries.

When a constellation's default moon is locked behind progression like one of Wesley's moons, it will prevent the entire constellation from being discovered. Make sure you don't lock yourself out!

LethalConstellations Discovery Configuration
  • Whitelist, acceptable starting constellations as well as a policy on which to choose: random or cheapest.
  • Whether to only make a constellation available for discovery once the progression lock on its default moon has been cleared or discover it immediately.
  • Quota, travel, and new day discovery triggers can be configured to target moons, constellations, or both.
    • Each trigger has their own additional constellation-discovery chance.
  • Regarding the default moon:
    • constellations can be set to automatically inherit their base price.
    • the action of routing to a constellation can be mirrored onto its base moon – effectively also buying its route.

Terminal Tags

Optional: LethalMoonUnlocks will display information about each moon directly in the Terminal's moon catalog.

Learn more

Terminal Tags are disabled by default.
If you're using anything but unlocks, it's recommended to turn them on.

Terminal Tags present all information relevant to LethalMoonUnlocks directly in the moon catalog.
The tags displayed depend on the current state of each moon and your configuration.

You can enable or disable each tag individually.

Here's an example where I tried to fit all tags on a single screenshot. Explanation for each tag below.

Example of LMU Terminal Tags

Looks too crowded? Check this out

There's a config option in the advanced section allowing you to control the maximum tag line length.
This can give the moon catalog a more organized look at the cost of more scrolling.

More organized example of Terminal Tags

Tag Information
[IN ORBIT] Indicates the moon you're currently orbiting.
[UNEXPLORED] Indicates which moons you haven't landed on.
[EXPLORED: X] Indicates which moons you have landed on and keeps track of your total landings.
[UNLOCK] Indicates the moon is unlocked.
[UNLOCK EXPIRES:X] Indicates how many times you can route to the moon for free before the unlock expires.
[DISCOUNT-XX%] Discount Mode: indicates the moon is on discount and shows the currently unlocked rate.
[DISCOUNT EXPIRES:X] Indicates how many times you can route to the moon for free until the discount expires.
[NEW] Indicates the moon has been discovered for the first time this run. Resets every day.
[PINNED] Indicates the moon has been permanently discovered - effectively pinning it in the moon catalog.
[SALE-XX%] Indicates the moon is on sale and shows the sales rate.
[MoonGroups] For example, [ZEEKERS GALAXY] or [VANILLA/FOREST]. Indicates the name(s) of the custom group(s) or LLL Tag(s) a moon belongs to. Only if moon group custom or tag matching is enabled.

Tags are added to the moon catalog using an event provided by LLL and will also show with TerminalFormatter!

Moon Sales

Optional: Moons have a random chance to go on sale.

Learn more

Each moon has a random chance to go on sale every time the sales are shuffled.
Moon Sales are multiplicative with other price reductions like discounts from Discount Mode.

You can configure the chance as well as the minimum and maximum sale rate.
They can either be shuffled every quota or every day.

Shuffling Moon Sales daily can incentivize buying moons even days into a quota.

Moon Group Matching

LethalMoonUnlocks supports matching moons by group, which is relevant for certain discovery mechanics.

Learn more

In Discovery Mode, all new discoveries are randomly selected. With moon group matching, LethalMoonUnlocks will prefer selecting from group matches instead of all moons.

This is always in reference to a matching moon. For Travel Discoveries, that is the moon you've routed to, and for New Day Discoveries, it's the moon you're currently at.

Moon group matching can be enabled or disabled individually for each of these mechanics.

Additionally, when no moons can be matched, you can set that particular discovery mechanic to fall back to choosing from all moons or not.

There are multiple group matching methods available.

Price

Match moons based on their price using the following methods:

  • Price: Matches all moons that share the exact same price.
  • PriceRange: Matches all moons within a configurable ± price range.
  • PriceRangeUpper: Same as PriceRange but only considers equally or more expensive moons.

By default any price reductions (unlocks, discounts or sales) are ignored. This can be disabled.

Tag

Picks a random LLL content tag and matches all other moons sharing that tag.

Custom

Custom allows you to define fully custom groups. A group is defined by name and a list of members (moons).

A moon will always match with all members of the same group.
If a moon is a member of multiple groups, a random group will be selected for matching.
The group name will be displayed in various locations in-game, e.g., Autopilot discovered new moons during travel to Zeekers Galaxy.

Other Stuff

Cheap Moon Bias

Learn more

LethalMoonUnlocks randomly selects moons during Travel Discovery or for your paid rotation.
You can use Cheap Moon Bias to increase the odds of cheaper moons being selected.

This makes it less likely - especially in the early game - to only discover moons you can't afford yet or are considered too valuable.

The bias can be enabled and tweaked individually for every mechanic that randomly selects moons.

Compatibility

Learn more

LethalConstellations

LethalMoonUnlocks is compatible with LethalConstellations!

Most mechanics that work on moons also work for constellations. That means constellation can also be unlocked and have discounts as well as sales.

In Discovery Mode each constellation has its own discovery state. That means only discovered constellations are available for routing. Once discovered constellations stay discovered permanently.

Moon discovery state is local to each constellation. That means each constellation will have the following combination of moons discovered:

  • its default moon which is always discovered
  • moons that are discovered as part of the current rotation (which shuffles when enabled)
  • moons that are discovered via other means like new day discoveries or travel discoveries
  • permanent discoveries

The LethalConstellations terminal menu will have additional info about how many moons are discovered within each constellation and also shows LMU tags when enabled.

LethalConstellations custom unlock conditions

LMU will also generate a separate constellation config:

com.xmods.lethalmoonunlocks.constellations.generated.cfg

Every section is disabled by default, so it has no gameplay effect unless you configure it.

Each constellation section currently supports:

  • RequiredQuotaCount
  • RequiredVisitedMoons
  • RequiredUniqueMoonVisits
  • MatchMode (Any vs All)
  • IgnoreDefaultMoonStoryLock

These rules act as a progression gate on discovering their respective constellation and essentially work exactly like a moon that would be locked behind story progression. You can even combine both.

  • other mods can still call UnlockManager.TryReleaseStoryLock* to unlock the story related progression gate.
  • constellation unlock conditions are another progression gate.
  • by default both gates must be open before LMU can make the constellation available.
  • once that happens, Story release behavior decides whether the constellation is immediately discovered or added to the hidden backlog of constellations that can be discovered.
  • with IgnoreDefaultMoonStoryLock the story progression gate can be ignored to where the unlock conditions alone are all that matters.

Wesley's Moons / JLL story progression (Story Locks)

LMU respects the story progression of mods such as Wesley's Moons. Any mod using JLL to unlock moons are implicitly compatible LMU.

When a moon is both hidden and locked in its default state, it is considered to be potentially gated behind story progression.

As mod maker, when your progression trigger fires, call UnlockManager.TryReleaseStoryLock(...) or UnlockManager.TryReleaseStoryLockShowAlert(...) on LMU instead of unhiding it directly.

LMU will handle these moons as expected, only making them available for routing after their trigger was activated.
In discovery mode this means they will be added to the pool of discoverable moons once that happens.

LMU also added its own Vanilla story progression in which you'll need to perform certain actions to gain access to Embrion and Artifice.
Spoilers in the configuration file.

UnlockManager.OnCollectStoryLockedMoons still exists for compatibility reasons, but was depreacted as it is no longer required.

You can globally disable Story Locks in the advanced configuration section which will override story moon locking behavior and treat it like any regular moon.

TerminalFormatter

Tags are shown in TerminalFormatter moons node. Thanks @mrov!

LethalQuantities

Advanced config option to prefer LQ risk levels in the moon catalog.

Malfunctions

Advanced config option to enable interpreting Malfunctions' Navigation malfunction as routing to a moon.
If it's a paid moon, LethalMoonUnlocks will see it as buying the moon - even though you didn't pay.

All Mods Displaying Alert Messages

LethalMoonUnlocks uses a queue for sending alert messages.
Alerts from other mods and the vanilla game are added to the same queue to avoid overlapping and missing messages.

Example Configurations

In this section, I provide some ideas of what's possible using all the different config options.
Only showing settings that are not default.

Simple Discounts
Display tags in terminal = true  
Discount rates = 50,75,90,100  
Discounts expire = 3  
Enable Quota Discounts = true  
Quota Discount trigger chance = 33  
Maximum discounted moon count = 2  
Enable Quota Full Discounts = true  
Quota Full Discount trigger chance = 10  
Moon Sales = true  
Shuffle sales daily = true  

A simple setup with slightly modified discounts, rewards on quota completion, and moon sales.

Progression Focused
Display tags in terminal = true  
Unlocked moons are permanently discovered = true  
Enable Discovery Mode = true  
Free moons base count = 99  
Paid moons base count = 3  
Enable Quota Discoveries = true  
Quota Discovery trigger chance = 100  
Maximum quota discovery moon count = 3  
Enable Travel Discoveries = true  
Travel Discovery trigger chance = 50  
Travel Discovery group matching = true  
Enable New Day Discoveries = true  
New Day Discovery trigger chance = 50  
New Day Discovery group matching = true  
Group Matching Method = PriceRange  
Price range = 500  

All free and unlocked moons are always available for travel.
Three paid moons available, which are shuffled every quota. Additionally, discover new moons on completing the quota, new day, and traveling.
Buy them before the quota ends, and you keep them; otherwise, they will be lost with shuffle.
Repeat every quota and grow your catalog.

Full Exploration
Display tags in terminal = true  
Enable Discount Mode = true  
Discounts expire = 3  
Enable Discovery Mode = true  
Never shuffle = true  
Free moons base count = 1  
Dynamic free moons base count = 0  
Paid moons base count = 2  
Enable Travel Discoveries = true  
Travel Discovery trigger chance = 100  
Travel Discovery group matching = true  
Enable New Day Discoveries = true  
New Day Discovery trigger chance = 50  
Maximum new day discovery moon count = 2  
New Day Discovery group matching = true  
Group Matching Method = Custom  
Custom moon groups = ...  

Assumes fully set up custom moon groups.

Start with only one free and two paid moons. Never shuffle the base selection.
Instead, discover new moons mainly by travel and on new days. Due to moon group matching, you'll discover moons group by group.
Fully discover a group, and you'll discover moons from other groups.
Add quota rewards to preference.

Depending on the number of custom moons you have, a setup like this would probably require modifying quota steepness.

Special Thanks

CHANGELOG

v2.4.3

Fixed

  • Fixed config file not being created on first time setups.

v2.4.2

Changed

  • TerminalStuff Compatibility:
    • Ensure LMU pricing immediately applies after routing on clients
  • LethalConstellations Compatibility:
    • Sort logging table by constellation regardless of discovery mode being enabled.

Fixed

  • Fixed a bug where LMU pricing would not apply after taking off from company moon with an incomplete quota until another event triggered a refresh.

v2.4.1

Fixed

  • Fixed clients buying moons through the TerminalStuff MoonsPlus menu sometimes not registering as paid route.

v2.4.0

BREAKING UPDATE!
Parts of your config will reset! Previous saves are incompatible!
This is NOT targeted at v80+! Might still work though. May fully depend on LLL and Dawn. You let me know.

Added

  • LethalConstellations progression rewrite:
    • Added separate constellation progression state with its own discovery, unlock, discount and sales handling. Also configurable as quota reward.
    • Added constellation-specific discovery settings for starter selection, whitelist/backlog handling, per-trigger moon vs constellation targeting, and separate constellation-discovery chances.
    • Added constellation tags for LMU state such as [NEW], [UNLOCKED], [DISCOUNT ...], and [SALE ...].
  • LethalConstellations custom unlock conditions:
    • LMU now generates new config LethalMoonUnlocks - Constellations.cfg
    • You can configure unlock conditions for each constellation. For now..
      • minimum completed quota count
      • minimum number of moons visited
      • list of moons required to be visited once
      • list of bestiary logs required to scan and read on terminal
      • list of story logs required to find and read on terminal
    • For each you can choose whether one or all conditions have to be satisfied.
    • You can optionally choose to ignore any type of story progression gated access to the constellation's default moon.
  • Discovery Mode:
    • Added a config option to control whether moons that are locked behind story progression will be added as new discovery immediateyly or added to the pool of moons available for discovery

Changed

  • LethalConstellations:
    • Once discovered, constellations stay discovered for the run instead of being shuffled away with the moon rotation.
    • When a constellations default moon is locked behind story progression, that will apply to the entire constellation.
    • Each constellation now has its own moon rotation. Your rotation specific configurations apply per constellation.
    • In addition to the rotation each constellation will have its default moon discovered (always) plus additional temporary and permanent discovered moons.
    • Constellation routing can optionally be mirrored onto the default moon so it also gets the unlock, discount, potential travel discovery, etc..
  • Story/Progression Locks:
    • UnlockManager.OnCollectStoryLockedMoons is now obsolete.
    • UnlockManager.TryReleaseStoryLock() now works on any moon that starts locked and hidden.
    • UnlockManager.TryReleaseStoryLockShowAlert() now works on any moon that starts locked and hidden.
  • Many config options have been updated or reworded. Some have been moved (mostly constellations related ones).
  • Continued improvement to logging and in-game messages/alerts.

Fixed

  • Bunch of stuff in the process of rewriting the LethalConstellations extension.
  • Various client sync issues with Vanilla story mode.
  • Rounding error causing terminal tags to show incorrect discount rates.
  • Removed now redundant patches for LethalConstellations and TerminalStuff.

v2.3.5

Changed

  • LethalConstellations:
    • Improved formatting of the moon table in logs.
      • With LethalConstellations present, it is now grouped by constellation.

Fixed

  • LethalConstellations:
    • Fixed an issue where LMU was assigning default moons to constellations when not in discovery mode.

v2.3.4

Added

  • Added a config option to only allow moons to go on sale after a specified number of days
  • Added a compatibility setting to prefer Galetry over Gordion for LMU's automatic deadline reroute.
    • When enabled and Galetry is available and routable, LMU will reroute there instead of the Company building.
  • Added progression config to lock Galetry behind selling a customizable number of paintings to the company.
    • In discovery mode Galetry will be discovered immediately and permanently after selling the required number of paintings.

Changed

  • Updated DawnLib reference to 0.8.x.
  • LethalConstellations:
    • Default moon assignment is now more robust in both discovery and non-discovery modes.
    • In non-discovery mode, constellations now prefer a valid visible/unlocked default moon instead of keeping an invalid hidden or locked default.
  • Wesley's moons / JLL compatibility:
    • Route discovery alerts are rewritten to better align with LMU's language. Varies between discovery and non-discovery modes.
  • Random selection / Cheap moon bias:
    • Using our own source of randomness. Avoids issues with other mods that might interfere with the game's randomness.
    • Updated the cheap moon bias formula to more closely reflect the behaviour described in config descriptions.
    • Updated cheap moon bias config description to simpler wording.

Fixed

  • DawnLib compatibility:
    • More robust matching of moons with DawnLib's registry.
    • Moon defaults are now initialized properly from DawnLib on every lobby creation.
    • Baseline hidden, locked and price defaults are now pulled correctly from DawnLib even for moons with funky names.
  • TerminalStuff compatibility:
    • Buying a moon from the MoonsPlus menu now counts as purchasing that moon even when TerminalStuff skips the vanilla buy nodes.
    • LMU terminal tags are now cleared cleanly when tag display is disabled.
    • (Temporary fix) StorePlus page size now correctly follows the user's TerminalStuff config.
  • LethalConstellations compatibility:
    • Constellations no longer duplicate after reloading a save.
    • Moons in the currently routed constellation now have their full LMU state reapplied instead of being forced into an incorrect routable state.
    • (Temporary fix) Constellations menu now correctly hides hidden constellations.
  • Fixed a bug where moon prices and hidden/locked states were not restored to original values on disconnect and could leak into the next savefile.
  • Loading a save no longer overwrites fresh original hidden/locked defaults with stale LMU saved data.
  • Hidden-by-default moons now recompute whether they should remain hidden from defaults and current progression instead of relying on potentially inaccurate saved state.
  • The Permanently discover hidden moons on visit setting now correctly keeps visited hidden moons permanently discovered.
  • Moon prices will now correctly reset to original price when a discount or unlock expires.

v2.3.3

Fixed

  • Fixed compatibility with darmuh's TerminalStuff
    • Restored full LMU terminal tags in the catalog.
    • Added a line break for visual clarity when tags are enabled.
    • Added a temporary fix so the user configured page size in TerminalStuff's MoonsPlus config is properly applied.
    • I recommend using something around 3-5 moons per MoonsPlus page to avoid unnecessary scrolling. Of course this depends on how many tags you have enabled (per line).

v2.3.2

Fixed

  • Fixed a NullReferenceException which could prevent players from rerouting the ship.
    • This would happen with DawnLib present and certain moons installed.
    • Added extra safety checks to my terminal patch to avoid entirely bricking the routing if this were to occur again.

v2.3.1

Added

  • DawnLib compatibility (soft dependency):
    • Moon visibility and pricing are applied via DawnLib APIs when DawnLib is present.
    • LMU terminal tags are injected into the DawnLib moon catalog.

Changed

  • LethalConstellations extension is no longer shipped as a separate .dll.
    • Merged back into the main assembly as a concrete class.
    • No more TypeLoadExceptions on my side. Let me know.
  • Updated LLL reference to v1.6.8.
  • Terminal scroll amount is now properly normalized giving consistent behaviour regardless of catalog size.
    • LLL's own scroll prefix is unpatched when LMU's custom scroll is active.
    • Config description updated to clarify behaviour.

Fixed

  • Embrion story unlock condition no longer triggers before the bestiary entry has been read.

v2.3.0

Added

  • Dynamic compatibility layer for LethalConstellations
    • LethalConstellationsExtension is now shipped as separate .dll

Changed

  • Recompiled for game version v73
  • Temporarily added dependency to pacoito-LethalLevelLoaderUpdated-1.5.1 to make mod work

Fixed

  • TypeLoadException that prevented game initialization when LethalConstellations was not present
  • Various other TypeLoadException Errors or warnings when LethalConstellation was not present

v2.2.3

Added

  • Added UnlockManager.TryReleaseStoryLockShowAlert(string) for other mods to use.
    • Will make LMU display a generic alert message on releasing a story lock.

Fixed

  • Fixed a compatibility issue with Wesley's moons (JLL) introduced with LMU v2.2.1 where playing a tape failed to release the story lock.

v2.2.2

Fixed

  • Compatibility hotfix attempt

v2.2.1

Added

  • Added a config setting to globally enable (or disable) the Story Lock feature introduced in v2.2.0.
    • Enabled by default.
    • Disabling this ignores any requests to lock moons behind story progression. Such moons will be handled like any other regular moon.
  • Added alert messages when the LMU vanilla story progression is advanced.
  • Added a config setting to enable (or disable) automatically rerouting the ship to company on deadline.
    • Located in advanced config section.
    • Enabled by default.

Changed

  • Any changes to story locked moons by other mods (like Wesley's moons / JLL) will now apply immediately.
    • This resolves some inconsistencies when looking at the moon catalog before taking off.
  • Switched to using the BepInEx default config file (BaseUnityPlugin.Config).
    • Your config is automatically migrated. Just in case a backup is created (com.xmods.lethalmoonunlocks.cfg.legacy).
    • This enables LethalConfig to automatically detect LMU's configuration and allows to change it in-game.
    • Note: You can expect most settings to apply mid-game unless stated otherwise. Messing with settings may or may not lead to unexpected behaviour in certain scenarios.
  • Moved Story Lock/Progression config settings to their own section under 6 - Advanced settings.
    • If you previously enabled Vanilla Story Progression it may reset.
  • The moon preview text in the terminal will no longer be replaced when Display Tags in Terminal and Override Terminal Font Size are both disabled.
  • UnlockManager.TryReleaseStoryLock(string, bool=false) was extended to support showing a generic alert message on releasing a story lock.

v2.2.0

Added

  • Story Lock feature:
    • Allows mod and moon creators to exclusively lock moons behind story progression.
    • Reference LethalMoonUnlocks and check if the assembly is loaded using BepInEx.Chainloader.PluginInfos.
    • Subscribe to UnlockManager.OnCollectStoryLockedMoons. Your subscriber should return a list of moons.
    • To release the lock on your moon, call UnlockManager.TryReleaseStoryLock(string).
    • Once the lock is released, LMU will handle your moon like any other, showing it in the terminal immediately or, in discovery mode, adding it to the pool of moons that can be picked by various mechanics.
  • Vanilla Story Progression:
    • Exemplary use of story lock feature.
    • Configurable in advanced section. Disabled by default.
    • Applies story locks to Embrion and Artifice:
      • Embrion: Gain access by scanning a certain bird.
      • Artifice: Gain access by landing on Adamance three times.
    • After gaining access, these moons will be added to the moon catalog or made available for discovery. They will not be hidden.
    • This feature was initially used for testing the story lock system but has been kept in the release.

Changed

  • Adapted to LLL's new loading/saving system to ensure correct defaults for moons.
  • Reworked how overrides are applied to prevent saving overridden defaults.
  • Improved the table of moons and their states in the console/logs.
  • Streamlined internal logic to reduce complexity introduced over time.

Fixed

  • Fixed an error that occurred during Quota Discovery (group) when LethalConstellations was selected for matching but not present.

v2.1.11

Fixed

  • Fixed an issue that would occur on creating a new save when a moon you put on the locked override list was selected as part of the discovery shuffle rotation

v2.1.10

Added

  • Overrides:
    • Added advanced config options to hard override hidden and locked moons (what LMU considers default)
    • Adds two new lists to the advanced config section.
    • When the override is enabled LMU will consider only moons in that list as hidden or locked by default respectively.
    • Every other source for that information (vanilla, LLL config, other mods) will be ignored.
    • Attempt to avoid bugs around moons that are hidden or locked by default (vanilla or custom) for some players.
  • Added config option to include the weather in 'preview risk' moon preview text

Changed

  • Recompiled for v69 - Nice!
  • Bumped dependency versions
  • Improved compatibility with LQ prices
  • Continued improvements to in-game messages and alerts
  • Clarified some logs

Fixed

  • Fixed Discovery Mode being completely broken on loading existing saves
    • At some point LLL started saving and restoring locked and hidden information of moons which interfered with LMU's save and restore logic. Sorry for not realizing this sooner..
    • Unfortunately this also means that LMU can no longer fetch baseline information set in LLL config when loading existing saves
      • Use the new hard override advanced config options if you want to change which moons are always hidden/locked on existing saves
      • LMU still retrieves this information from LLL on fresh saves
  • Fixed the free moon exploit - bad news for all you filthy cheaters out there ;)
    • This is an 'issue' where you could buy a moon, quit to menu, load back into the save and still be at the moon you bought without any credits lost.
    • This is probably an interaction between
      • The base game logic not saving the moon you're at or the amount of credits you have if you quit from the lobby.
      • LLL saving the moon you're currently located at as soon as you arrive.
    • Since this was only happening for some users there are likely other mods out there that already address this.
    • If this band aid solution happens to cause any issues, it can be disabled in the advanced settings section.
  • Fixed an issue where loading a save with Discovery Mode enabled that previously had it disabled would result in no moons showing in moons catalog.

v2.1.9

Added

  • Terminal Scrolling:
    • Added an option to smooth terminal scrolling and avoid skipping moons when you have a lot visible at once.
    • Disabled by default. Toggling requires game restart.
    • Can be configured in Advanced config section.
    • This is the same patch used by StoreConfigRotation and TerminalFormatter. Don't use more than one or the effect will multiply!
    • Currently has no effect when AdvancedCompany is installed.
    • Thanks @pacoito123 for the transpiler patch!
    • Thanks BULLETBOT for making me aware of the skipping moons issue!
  • Quota Discovery:
    • New Match cheapest constellation option
    • Use this config setting to change the behaviour of Match cheapest group to discover the next cheapest undiscovered constellation instead of the one that has the cheapest undiscovered moon.

Changed

  • Quota Discovery:
    • Chat message will now print the group name similar to other chat messages.

Fixed

  • Fixed an issue where disabling Discovery Mode and loading an existing savegame that previously had it enabled would not show all moons.

v2.1.8

Fixed

  • An issue where certain moon names could break the moons catalog.

v2.1.7

Added

  • WeatherTweaks:
    • Added a compatibility workaround to ensure WT's custom weather types are displayed on terminal until a better solution is found.

Changed

  • Alert messages: removed redundant alert messages when an entire LethalConstellation or custom group was discovered on Quota Discovery with Match cheapest group enabled.

Fixed

  • An issue with Reset permanent discoveries on .. expiry config settings resetting the discovery status more often than they should.
  • An issue where the new day discoveries are permanent config setting was not respected.

v2.1.6

Changed

  • Group tags (custom groups and LethalConstellation) will now show on terminal regardless of whether they are used for any discovery mechanic group matching..
    • .. as long as the respective group matching method is selected and the tag itself is enabled.

Fixed

  • Fixed/changed a few chat messages being sent even if chat messages were disabled.

v2.1.5

Fixed

  • An issue where group tags wouldn't display when using custom groups and Quota Discoveries match cheapest group was the only group matching option enabled.
  • An issue where Quota Discovery match cheapest group wouldn't correctly match moons under certain conditions.

v2.1.4

Added

  • Terminal Formatting:
    • Customizable font size config for the moons catalog.

Changed

  • LethalConstellations:
    • Ensured the default constellation is set correctly for better integration.
  • Terminal Formatting:
    • Attempting to prevent some inconsistent ugly line breaks in the moons catalog.
    • LLL changes the font size depending on the numbers of moons visible.
    • LMU now overrides that behaviour and enforces a constant font size.
    • The max line width config was changed accordingly to allow for longer lines when using smaller font sizes
  • Group tags:
    • All Custom groups and LethalConstellations tags are now displayed in uppercase for visual consistency with the LethalConstellations page and other LMU terminal tags.

Fixed

  • Minor bugs, inconsistencies and config descriptions.

v2.1.3

Changed

  • LethalConstellations:
    • Removed LethalConstellations patch.
    • Subscribed to the new RouteConstellationSuccess event (thanks @darmuh!)

Fixed

  • Resolved warnings and errors that occurred when LethalConstellations was not installed.
    • This was due to an interaction between Linq compiler magic and referenced types that are not present, along with runtime reflection.
  • Fixed a bug where attempting to route to an unaffordable constellation was incorrectly interpreted as purchasing the constellation's default moon.
  • Corrected an error when LethalConstellations was selected as the group matching method but was not installed.

v2.1.2

Fixed

  • Addressed an issue where the assembly was missing from the v2.1.1 release package.

v2.1.1

Fixed

  • Hotfix for the moon catalog breaking when LethalConstellations was not present.

v2.1.0

Added

  • LethalConstellations compatibility:
    • Introduced a new group matching method for LethalConstellations.
    • In Discovery Mode, constellations are discovered when at least one moon is discovered.
    • The number of discovered moons is displayed in the LethalConstellations Terminal screen ([optionals] in your LethalConstellations config)
    • Terminal tag (shares 'Group tag' config)
    • Show alerts when discovering new constellations.
    • Config option to override constellation prices with the cheapest discovered moon, applying unlocks and discounts to constellations.
  • Quota Discovery:
    • New option to match the currently cheapest not fully discovered group (custom group or LethalConstellation).
  • Fallback options:
    • Added fallback options for group matching in all additional discovery mechanics.

Changed

  • Cheap Moon Bias:
    • Now applies to Quota Unlocks, Quota Discounts, and Quota Full Discounts.
    • Separate toggle and bias values for each applicable mechanic.
    • Added an option to ignore price changes.
  • updated in-game messages

Fixed

  • Corrected some incorrect logs and other minor issues.

v2.0.3

Added

  • Alert Messages Networking:
    • Improved alert message handling across the network.

Changed

  • Discovery Mode Safety Check:
    • Now considers moons on the whitelist.
    • Added several fallbacks for better reliability.
  • Whitelist Verbosity:
    • Enhanced error messages for incorrect entries in the whitelist.

Fixed

  • Resolved issues with alert messages not displaying on clients.
  • Fixed a bug where a moon was incorrectly added to the rotation when both free and dynamic free base counts were set to 0 but a whitelist was used.

v2.0.2

Fixed

  • Corrected the display of terminal tags, which were shown with default settings.

v2.0.0

Note: This is a major update. Please refer to the README and configuration for detailed information on new features and options. It is recommended to delete your existing config for optimal performance.

Added

  • New Unlock Mode Mechanics:
    • Unlocks can expire.
    • Introduced Quota Unlocks.
  • New Discount Mode Mechanics:
    • Discounts can expire.
    • Added Quota Discounts and Quota Full Discounts.
  • Discovery Mode:
    • Base selections and shuffling mechanics.
    • Introduced Quota Discoveries, Travel Discoveries, and New Day Discoveries.
    • Added Cheap Moon Bias
    • Added Moon Group Matching (including custom groups).
    • Automated ship rerouting on deadlines and after shuffles.
    • Extensive configuration options for all features.
  • Terminal Tags and Formatting:
    • Improved compatibility with LethalQuantities (LQ risk level preference).
  • Alert Messages:
    • Implemented a queue system for alerts, with compatibility for other alert sources.
  • Malfunctions Compatibility: Navigation malfunction can be handled as buying a moon.

Changed

  • Code Rewrite: A significant portion of the old code was rewritten to improve functionality while maintaining existing features.

The behavior of LethalMoonUnlocks in default configuration remains unchanged.

Fixed

  • Resolved a bug where purchasing equipment after routing to a free moon was incorrectly counted as buying the moon.
  • Fixed several smaller bugs from v1.0.1.

v1.0.1

Changed

  • Code Optimization: Refactored and optimized code related to original prices.
    • Always retrieve original prices from LLL and restore them on disconnect.
  • Updated chat message on new quota unlock.
  • Updated various logs.
    • Consolidated excessive logs from development.
  • Minor performance and stability improvements.

Fixes

  • Corrected issues with discounted prices not reflecting changes to moon prices (e.g., via LLL config) when loading existing saves.
  • Fixed incorrect log data during saving.

v1.0.0

  • Initial Release