This page explains the most player-relevant BalanceFlags — the tuning knobs the game
actually reads at runtime — in plain English, grouped by gameplay system. Every value below is verified against the decompiled
Blueprint bytecode and the BalanceFlags DataTable, not guessed or scraped from community wikis. For the raw 62–entry
listing see All Balance Flags.
Datamined & Verified:
All formulas and values on this page are pulled from decompiled Kismet bytecode of baseNPC_C,
salesManager_C, statisticsManager_C, policeManager_C, gangManager_C,
and BlueprintHelpers_C, cross–referenced with the BalanceFlags and ExpoEventsDatabase
DataTables in the 11 GB game pak.
Heat is internally called exposition (expoFactorLevel). It is not a counter from
0 to 100. It is a weighted average of recent sales and recent
ExpoEvents (e.g. arrests, raids, taser hits), with older entries (>200 timecodes) pruned. The result is clamped to
[expoMin, expoMax] and multiplied by ExpoFactorMultiplier. Difficulty changes those bounds:
| Parameter | Easy | Normal | Hard / Hardcore |
|---|---|---|---|
| expoFactorDropRatePS | 0.18 | 0.13 | 0.10 |
| expoFactorMin | 35.0 | 50.0 | 80.0 |
| ExpoFactorMultiplier | 0.70 | 1.00 | 1.20 |
| expoLevelDEA_start | 600.0 | 500.0 | 400.0 |
The events that feed into the average come from ExpoEventsDatabase. Each has a value and a
MedianePoints weight — higher weight = more influence on the average:
| Event ID | Value | Weight | Context |
|---|---|---|---|
| DEA-RAID | 3,000 | 2.0 | DEA raid on hideout (worst single event) |
| POLICE-TASED | 2,000 | 2.0 | Tased by police |
| CAUGHT-POLICE-HOURS | 1,500 | 1.5 | Arrested / detained |
| POLICE-SEARCH-CAUGHT | 1,400 | 1.5 | Caught during search |
| CODE-HARDCORE | 1,100 | 10.0 | Hardcore baseline (dominates the average) |
| POLICE-CHASE | 800 | 2.0 | Police chase initiated |
| DEALER-ARRESTED | 600 | 1.0 | Your dealer got arrested |
| CLIENT-OD | 600 | 1.0 | Client overdosed |
| CLIENT-SAMPLE | 500 | 1.0 | Gave a sample to a client |
| POLICE-SEARCH | 400 | 1.2 | Searched by police (no contraband found) |
| CHEAT-EXPO | 200 | 1.0 | Debug / cheat–added expo |
Night sales/events get reduced weight: EXPO-NIGHT-SALE-MULTIPLIER = 0.70
(sales count for 70%) and EXPO-NIGHT-EVENT-MULTIPLIER = 0.60
(events count for 60%). Selling between 9 PM and 6 AM is genuinely lower heat.
Patrol spawning is gated by POLICE-SPAWN-RAND-TIMEOUT = 150.0 seconds (a global cooldown
between patrol spawns) and POLICE-SPAWN-CHANCE-LOW/HI = 0.40 / 1.00 (probability buckets that
scale with current expo).
New clients appear every 6–9 minutes of game time
(NEW-CLIENT-INTERVAL-MIN = 360.0, NEW-CLIENT-INTERVAL-MAX = 540.0),
capped by the per–area client limit in SaleAreaDatabase. Once a client is on your roster, their personal order timer
is 6–10 minutes (CLIENT-ORDER-INTERVAL-MIN/MAX = 360 / 600),
modulated by CLIENT-ORDER-INTERVAL-MULTIPLIER = 1.42 globally.
Weekends double order quantity (WEEKEND-ORDER-QUANTITY-MULTIPLIER = 2.00) and order frequency
is 25% faster (WEEKEND-ORDER-ORDER-INTERVAL-MULTIPLIER = 1.25). Friday–Sunday are the most
profitable real–world day equivalents.
Each newly generated client is assigned an expected quality equal to
areaMeta.BaseExpectedQuality + Random(0, 0.05). Richer areas (Downtown 0.80, Old Town 0.75)
expect closer to pure product; poor areas (Two Towers 0.35, Stink 0.50) accept much weaker cuts.
Whether a client accepts a price is a pure ratio check, not a tier system. From checkClientInterested():
There is no "rep modifier × territory demand × desperation × variance" formula.
Price tolerance is just repThreshold = rep/100 + offset, and even with acceptable prices a regular
client randomly declines 30% of the time. Addicts are easier to overprice, dealers harder.
Product quality is computed in processReceivedDrugs():
Strength can give a quality kicker of up to +30%
(contentRatio × 0.2 × 1.5) but never more — the
Clamp(strengthRatio, 0, 1.5) caps the bonus.
The player XP curve is quadratic, from calcExpForLevelUp():
Per–sale XP is from calcSaleExp() in baseNPC_C:
Max Quick Learner skill (5/5) adds +40% XP
(bonus = 1.0 + skill/skillMax / 2.5). Quick Learner rank 3+ (skill ≥ 50) also grants
+2 bonus skill points per level on top of the base allocation.
Dealer leveling is a separate triangular curve:
Mixes are computed in BlueprintHelpers.MixToDrugData() as a weighted sum of substance properties:
The product the client sees is then run through the endProductQuality formula above.
There is no fixed "−0.05 per gram of Sugar" or per–agent penalty table — each
cutting agent's contribution comes from its own DrugProperties struct in the DrugDatabase DataTable, and the
damage to quality is purely proportional dilution. Use stronger filler (higher strength) and the
strengthRatio bonus can claw back up to +30%.
Overdose chance is a two–branch system based on the toxicity of the received product
(from processReceivedDrugs()):
There is no escalating curve at high toxicity — the moment the product crosses 12.0 toxicity, the OD chance jumps to a flat 25%
and stays there no matter how much higher it goes. A dead lowToxOdPercent = 0.1 constant exists in the bytecode but is
never used.
Gang orders fire on a base interval of GANG-ORDER-INTERVAL = 24000.0 seconds, reduced by up
to 30% as you level up the gang (GANG-INTERVAL-MAX-DROP = 0.30). Order quantity ranges are
per–gang:
| Gang | Min Order (g) | Max Order (g) |
|---|---|---|
| Ballena | 8 | 25 |
| Keiji | 20 | 110 |
Deadlines are +4 days (before 2 PM) or +5 days (after 2 PM). Early delivery = full
GANG-REP-PER-DELIVERY = 80.0 rep, same–day delivery = 85% of that. Max level per gang is
GANG-MAX-LEVEL = 10, each gang level raises your player order limit by $2,000.
Gang quality check is stricter than a regular client:
proportion × Clamp(strengthRatio, 1.0, 1.22) ≥ curOrderPackageQuality
— and toxicity must satisfy drugReceived.toxicity / drugExpected.toxicity < 1.8.
Penalties: −5 wrong quantity, −15 bad
quality or toxic.
Eddie's order cap scales linearly with player level:
| Player Level | Eddie Limit ($) |
|---|---|
| 1 | $195 |
| 5 | $375 |
| 10 | $600 |
| 20 | $1,050 |
| 30 | $1,500 |
Earlier versions of this page (and several community guides) described mechanics that simply are not present in the decompiled code. Each of these is wrong:
statisticsManager.UpdateExpositionLevel(). It is
clamped to [expoFactorMin, expoFactorMax] (Normal: 50–1000) and multiplied by
ExpoFactorMultiplier. There is no 0–100 bar — values typically range in the hundreds.
DrugDatabase have no heat field. Sale exposure is computed in
calcSaleExposure() as Clamp(50 + qty*10, 60, 200) (15g+ caps at 200), with a 1.2× night
bonus on the sale's contribution.
generalSatisfaction per client, clamped to
[-1.0, 3.0]. Each sale produces a satisfactionDelta = Clamp((quality/adjustedExpect - 0.95) * 0.3,
-0.5, +0.25) — it's easier to lose 0.5 than gain 0.25.
chance = Clamp(((addictiveness - 0.5) / 13) / 3, 0.01, 0.12) — 1–12% per sale, gated by the
"new drugs" quest being active. There is no count–to–N counter.
saleAreaRespect[] / saleAreaExposure[] arrays on
saleAreaManager_C. There is no global gang dominance percent — each area has its own respect value
accumulated by sales there and decayed by RESPECT-DROP-PS = 0.04/sec.
DrugDatabase are Amphetamine, Meth, Ecstasy, Marijuana, LSD, DMT, Mushrooms,
Cocaine, Heroin and Fentanyl (mixing–only). Hashish and Crack only exist via community DataTable patches.
Datamined from BalanceFlags, ExpoEventsDatabase, baseNPC_C, salesManager_C,
statisticsManager_C, policeManager_C, gangManager_C, and BlueprintHelpers_C in
the DDS1 game pak. Last updated May 2026.