Configurable Quota
Allows users to configure every aspect of the quota the way they want.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 Wipe Penalty - lose percentage of banked rollover when the entire crew dies. 0.5 = 50%
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 moons min/max total scrap value 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 moons 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 moons min/max scrap item count off baseMinTotalScrapValue, with a player count factor.
- 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.
