Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Configurable Quota
Allows users to configure every aspect of the quota the way they want.
| Last updated | a week ago |
| Total downloads | 3566 |
| Total rating | 2 |
| Categories | Mods BepInEx Client-side Server-side |
| Dependency string | seechela-Configurable_Quota-1.3.1 |
| Dependants | 3 other packages depend on this package |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2305xilophor-LethalNetworkAPI
A library/API to allow developers to easily add networking to their mods.
Preferred version: 3.3.3README
Configurable Quota
Allows users to configure every aspect of the quota the way they want.
Features
- Configure starting credits, starting quota and deadline
- Configure curved quota growth with sharpness and randomizer
- Configure growth dampening which slows down quota increases the longer you play
- Configure player count scaling with threshold, cap and per player multiplier
- Configure rollover which transfers any extra fulfilment to the next quota
- Configure randomized deadline
- Configure credit penalties when crew members die
- Configure quota penalties when crew members die
- Configure randomly lost scrap items on a full crew wipe
- Configure reduced scrap value on full crew wipe
- Configure randomly lost purchased equipment on a full crew wipe
- Disable quota entirely
- Configure new quota animation speed
- Show actual penalty values on fine UI
- Configure the Company's buy rate with min/max clamp, random rate, last-day override and jackpot rolls
- Configure dynamic interior size that scales with player count
- Configure dynamic scrap value with player-count scaling (solo or full lobby can be boosted)
- Configure dynamic scrap item count with player-count scaling
- Configure dynamic enemy power that scales with player count
- LethalConstellations compatibility with per-constellation deadline modes [ fixed, random or use global ]
Configuration Options
0. Basic
- Starting Credits - Credits you start with on a new game
- Starting Quota - First quota value on a new game
- Days To Deadline - Days per quota. Ignored when
RandomizeDeadlineis on - Randomize Deadline - Pick a random deadline length each quota using the min/max below. Also used by constellations in
Use Globalmode - Deadline Min - Minimum days when random deadline is enabled
- Deadline Max - Maximum days when random deadline is enabled
- Deadline Must Change - Forces the next random deadline to differ from the previous one
- Base Increase - Base amount the quota goes up each quota
- Curve Sharpness - Controls how fast the quota scales. Higher = slower growth
- Randomizer Multiplier - Adds variation to quota increases. 0 = no randomness, 1 = vanilla variance
Quota growth formula
increase ≈ BaseIncrease * (1 + quota² / CurveSharpness) * randomFactor
randomFactor ∈ [1 - 0.5*RandomizerMultiplier, 1 + 0.5*RandomizerMultiplier]
Example with defaults (BaseIncrease=100, CurveSharpness=16, RandomizerMultiplier=1):
| Quota | Curve term | Avg increase | Cumulative quota (start 130) |
|---|---|---|---|
| 1 | 100 × (1 + 1/16) ≈ 106 | ~106 ± 53 | ~236 |
| 2 | 100 × (1 + 4/16) ≈ 125 | ~125 ± 63 | ~361 |
| 3 | 100 × (1 + 9/16) ≈ 156 | ~156 ± 78 | ~517 |
| 4 | 100 × (1 + 16/16) ≈ 200 | ~200 ± 100 | ~717 |
| 5 | 100 × (1 + 25/16) ≈ 256 | ~256 ± 128 | ~973 |
1. Leveling
- Final Level - Quota value where curved growth switches to flat. Set -1 to disable
- Final Increase - Flat increase used after hitting
FinalLevel - Quota Cap - Maximum quota value. Set -1 for no limit
- Enable Growth Dampening - Gradually reduces quota growth the longer you play
- Dampening Start At - How many fulfilled quotas before dampening kicks in
- Dampening Sharpness - How aggressively growth is reduced. Lower = stronger dampening
Dampening formula (only active after DampeningStartAt quota):
excess = currentQuota - DampeningStartAt
divisor = 1 + (excess / DampeningSharpness)²
finalIncrease = curveIncrease / divisor
Example: DampeningStartAt=6, DampeningSharpness=11, at quota 10:
excess = 10 - 6 = 4
divisor = 1 + (4/11)² ≈ 1.13
=> growth shrinks by ~12%
2. Player.Scaling
- Enable Player Multiplier - Scale quota increases based on how many players are connected
- Player Threshold - Player count where scaling starts
- Player Cap - Maximum players counted for scaling
- Multiplier Per Player - Extra multiplier per player above the threshold
Multiplier formula:
extra = clamp(playerCount - PlayerThreshold, 0, PlayerCap - PlayerThreshold)
multiplier = 1 + extra * MultPerPlayer
Example: 4 players, PlayerThreshold=2, PlayerCap=4, MultPerPlayer=0.25:
extra = clamp(4 - 2, 0, 4 - 2) = 2
multiplier = 1 + 2 * 0.25 = 1.5x
5th player would not raise this further because of the cap.
3. Optional
- Disable Quota - Disables the quota system entirely
- Rollover Amount - Percentage of excess fulfillment that carries over to the next quota. 0 = none
Rollover example: quota was 100, you sold $150 of scrap (overage = $50), RolloverAmount = 0.5:
carried = $50 * 0.5 = $25 → applied toward next quota
4. Penalties.Credits / 5. Penalties.Quota
- Enabled - Apply the penalty when crew members die
- On Gordion - Apply the penalty even at The Company
- Percent Per Player - Per-death amount when
Dynamic = false - Dynamic - Switch to ratio-based mode using
PercentCapas the scale - Percent Cap - Hard ceiling (fixed mode) / scale (Dynamic mode)
- Percent Threshold - Penalties below this percent are ignored
- Recovery Bonus - Recovered bodies reduce the penalty
Formulas:
fixedMode: pct = dead * PercentPerPlayer (clamped to PercentCap)
dynamicMode: pct = (dead / total) * PercentCap (naturally ≤ PercentCap)
if recovered > 0:
pct *= 1 - RecoveryBonus * (recovered / dead)
if pct < PercentThreshold: pct = 0
Example A — fixed mode, 8-player lobby, 2 dead, PercentPerPlayer=0.15, PercentCap=0.5:
pct = 2 * 0.15 = 30% (under 50% cap → applied as-is)
Example B — dynamic mode, 8-player lobby, 2 dead, PercentCap=0.05:
pct = (2 / 8) * 0.05 = 1.25%
Example C — recovery bonus, 4 dead, 2 recovered, RecoveryBonus=0.5, base 30%:
pct = 30% * (1 - 0.5 * 2/4) = 30% * 0.75 = 22.5%
6. Loss.Scrap
- Enabled - Randomly lose collected scrap items when the entire crew is wiped
- Items Safe Chance - Chance for each item to be protected from loss
- Lose Each Scrap Chance - Chance to lose an unprotected item
- Max Lost Scrap Items - Maximum scrap items that can be lost per round
Per-item loss chance:
lossChance = (1 - ItemsSafeChance) * LoseEachScrapChance
Example: 10 items on the ship, ItemsSafeChance=0.5, LoseEachScrapChance=0.1:
lossChance = 0.5 * 0.1 = 5% per item
expected losses ≈ 10 * 0.05 = 0.5 items per wipe (capped at MaxLostScrapItems)
7. Loss.Value
- Enabled - Reduce scrap value of all ship items on full crew wipe
- Percent - How much of scrap value to remove. Stacks on repeated wipes
Stacking example: Percent = 0.25 (each wipe removes 25%), 3 wipes in a row on the same scrap:
remaining = (1 - 0.25)³ = 0.75³ ≈ 0.42
=> scrap retains ~42% of its original value
8. Loss.Equipment
- Enabled - Randomly lose purchased equipment when the entire crew is wiped
- Lose Each Equipment Chance - Chance for each equipment item to be lost
- Max Lost Equipment Items - Maximum equipment items lost per round
Example: 6 equipment items on the ship, LoseEachEquipmentChance=0.05, MaxLostEquipmentItems=1:
expected losses ≈ 6 * 0.05 = 0.3 items per wipe (capped at 1)
9. UI
- Quota Animation Speed - Speed of the new quota pop-up animation. Higher = faster
A. Dynamic.Interior.Size
Scales the moons interior multiplier by player count.
- Enabled - Toggle
- BaseSize - Starting multiplier applied before the player factor
- PlayerThreshold - Player count where scaling kicks in
- ScalingDirection -
PerMissingPlayer(boost when below threshold) orPerExtraPlayer(boost when above threshold) - MultPerPlayer - Multiplier added per player
Formula:
count = PerMissingPlayer ? max(0, PlayerThreshold - playerCount)
: max(0, playerCount - PlayerThreshold)
factor = 1 + count * MultPerPlayer
size = BaseSize * factor
Example (PerExtraPlayer, PlayerThreshold=2, MultPerPlayer=0.10, BaseSize=1.0):
| Players | count | factor | size |
|---|---|---|---|
| 1 | 0 | 1.00 | 1.00 |
| 2 | 0 | 1.00 | 1.00 |
| 3 | 1 | 1.10 | 1.10 |
| 4 | 2 | 1.20 | 1.20 |
B. Dynamic.Scrap.Value
Scales the moon's current min/max total scrap value (after moon mods) with a player count factor.
- Enabled - Toggle
- ScrapValueOffset - Flat credits added to both min and max after scaling
- MinValueMultiplier / MaxValueMultiplier - Extra scale applied to the moon's current min/max values
- PlayerThreshold - Player count where scaling kicks in
- ScalingDirection -
PerMissingPlayer(boost when below threshold) orPerExtraPlayer(boost when above threshold) - MultPerPlayer - Multiplier added per player
Formula:
count = PerMissingPlayer ? max(0, PlayerThreshold - playerCount)
: max(0, playerCount - PlayerThreshold)
factor = 1 + count * MultPerPlayer
min = round(baseMinTotalScrapValue * MinValueMultiplier * factor) + ScrapValueOffset
max = round(baseMaxTotalScrapValue * MaxValueMultiplier * factor) + ScrapValueOffset
Solo boost example (PerMissingPlayer, PlayerThreshold=2, MultPerPlayer=0.15, MinMult=1.0, MaxMult=1.0, Offset=0):
| Players | factor | base min/max | scaled min/max |
|---|---|---|---|
| 1 (solo) | 1.15 | $1200 / $1800 | $1380 / $2070 |
| 2+ | 1.00 | $1200 / $1800 | $1200 / $1800 |
C. Dynamic.Scrap.Amount
Scales the moon's min/max scrap item count off baseMinTotalScrapValue, with a player count factor.
Dynamic Scrap Amount is independent from Dynamic Scrap Value output. Enabling both will not compound the two systems.
- Enabled - Toggle
- ValuePerScrapItem - Divisor on the scaled value: lower = more items per moon
- MinScrapFraction -
minScrap = round(maxScrap * this) - MaxScrapItemsCap - Hard ceiling on
maxScrap.-1disables the cap - PlayerThreshold - Player count where scaling kicks in
- ScalingDirection -
PerMissingPlayer(boost when below threshold) orPerExtraPlayer(boost when above threshold) - MultPerPlayer - Multiplier added per player
Formula:
count = PerMissingPlayer ? max(0, PlayerThreshold - playerCount)
: max(0, playerCount - PlayerThreshold)
factor = 1 + count * MultPerPlayer
maxScrap = max(1, round(baseMinTotalScrapValue * factor) / ValuePerScrapItem)
if cap >= 0: maxScrap = min(maxScrap, MaxScrapItemsCap)
minScrap = max(1, round(maxScrap * MinScrapFraction))
Solo boost example (defaults: PerMissingPlayer, PlayerThreshold=2, MultPerPlayer=0.15, Divisor=25, Fraction=0.6):
| baseMinTotalScrapValue | Players | factor | maxScrap | minScrap |
|---|---|---|---|---|
| $200 | 1 (solo) | 1.15 | 9 | 5 |
| $200 | 2+ | 1.00 | 8 | 5 |
| $1,000 | 1 | 1.15 | 46 | 28 |
| $1,000 | 4 | 1.00 | 40 | 24 |
Tighter cap (MaxScrapItemsCap=15):
| baseMinTotalScrapValue | Raw maxScrap | Capped | minScrap |
|---|---|---|---|
| $500 | 20 | 15 | 9 |
| $1,000 | 40 | 15 | 9 |
| $2,000 | 80 | 15 | 9 |
D. Dynamic.Enemy.Power
Scales moons enemy power budgets by player count. Higher budget = more / stronger enemies can spawn.
- Enabled - Toggle
- ScaleInside - Apply to
maxEnemyPowerCount - ScaleOutside - Apply to
maxOutsideEnemyPowerCount(night time outside enemies) - ScaleDaytime - Apply to
maxDaytimeEnemyPowerCount(daytime enemies) - PlayerThreshold - Player count where scaling kicks in. More players above this = more enemies
- MultPerPlayer - Multiplier added per extra player above the threshold
- MaxFactor - Safety cap on the resolved factor. Floor is always 1
Formula:
count = max(0, playerCount - PlayerThreshold)
factor = min(MaxFactor, 1 + count * MultPerPlayer)
maxEnemyPowerCount *= factor (if ScaleInside)
maxOutsideEnemyPowerCount *= factor (if ScaleOutside)
maxDaytimeEnemyPowerCount *= factor (if ScaleDaytime)
Example (defaults: PlayerThreshold=2, MultPerPlayer=0.15, MaxFactor=3.0):
| Players | count | factor | inside @ vanilla 8 | outside @ vanilla 8 |
|---|---|---|---|---|
| 1 | 0 | 1.00 | 8 | 8 |
| 2 | 0 | 1.00 | 8 | 8 |
| 3 | 1 | 1.15 | 9 | 9 |
| 4 | 2 | 1.30 | 10 | 10 |
| 8 | 6 | 1.90 | 15 | 15 |
X. Buy.Rate
Native port of BuyRateSettings features. All entries default OFF; the Company's daily buy rate is vanilla until you enable something here. The host computes the rate and broadcasts it to clients — no desync.
- MinMaxEnabled - Clamp daily buy rate to
[MinRate, MaxRate]. Required forRandomRateEnabled - MinRate / MaxRate - The clamp / random-pick bounds (e.g.
0.2= 20%) - RandomRateEnabled - Pick the daily rate uniformly in
[MinRate, MaxRate] - LastDayRateEnabled - On the deadline's last day, override using
LastDayMinRate / LastDayMaxRate - LastDayRangeChance - Chance to use the range; on miss, fall back to 100%
- LastDayMinRate / LastDayMaxRate - Last-day bounds (or fixed if equal)
- JackpotEnabled - Allow a chance to roll a jackpot rate
- JackpotLastDayOnly - Only roll the jackpot on the deadline's last day
- JackpotChance - Chance per eligible day (e.g.
0.01= 1%) - JackpotMinRate / JackpotMaxRate - Jackpot bounds (or fixed if equal)
- BuyRateAlertEnabled - Yellow on-screen alert when the rate changes (per-client)
- JackpotAlertEnabled - Red
SCRAP EMERGENCYalert with sound on jackpot (per-client) - AlertDelaySeconds - Delay before the alert displays. Increase to 8+ if it overlaps BetterEXP / DiscountAlerts
Precedence (host evaluates in order, first hit wins):
1. Jackpot → JackpotEnabled AND chance roll AND (last-day if LastDayOnly)
2. Last-day rate → LastDayRateEnabled AND daysUntilDeadline == 0
3. Random rate → RandomRateEnabled AND MinMaxEnabled
4. Min/Max clamp → MinMaxEnabled (clamps the vanilla rate)
5. Vanilla → none of the above
Sample run (JackpotEnabled=true, chance=1%, last-day-only, LastDayMin=Max=1.2, MinMax=true, Min=0.3, Max=1.0):
| Day | Result |
|---|---|
| Mid-quota, no jackpot | Vanilla rate clamped to [0.3, 1.0] |
| Last day, no jackpot | 1.2 (120%) from last-day override |
| Last day, jackpot hits | Random pick in [1.5, 3.0] + red alert |
Compatibility — LethalConstellations
A separate com.seeya.configurablequota_constellations.cfg is auto-generated only when LethalConstellations is detected. Each constellation gets its own block:
- DeadlineMode -
UseGlobal,Fixed, orRandom - FixedDaysToDeadline - Used when set to
Fixed - DeadlineMin / DeadlineMax - Used when set to
Random
FAQ
Q: Can I use this with other quota mods?
Not recommended.
Credits
- Developed by seeya
- Inspired mostly from QuotaOverhaul, AfineQuota, BuyRateSettings, CustomDeathPenalty and ChocoQuota
License
Distributed under the GPL v3 License.
💖 Support
If you enjoy my work, consider supporting me. Donations are optional but greatly appreciated.