Wiki / DDS1 / Getting Started

Game Balance Flags (Datamined)

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.

Police & Heat

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
expoFactorDropRatePS0.180.130.10
expoFactorMin35.050.080.0
ExpoFactorMultiplier0.701.001.20
expoLevelDEA_start600.0500.0400.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-RAID3,0002.0DEA raid on hideout (worst single event)
POLICE-TASED2,0002.0Tased by police
CAUGHT-POLICE-HOURS1,5001.5Arrested / detained
POLICE-SEARCH-CAUGHT1,4001.5Caught during search
CODE-HARDCORE1,10010.0Hardcore baseline (dominates the average)
POLICE-CHASE8002.0Police chase initiated
DEALER-ARRESTED6001.0Your dealer got arrested
CLIENT-OD6001.0Client overdosed
CLIENT-SAMPLE5001.0Gave a sample to a client
POLICE-SEARCH4001.2Searched by police (no contraband found)
CHEAT-EXPO2001.0Debug / 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).

Client Economy

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.

Drug Sales — Real Price & Quality Math

Whether a client accepts a price is a pure ratio check, not a tier system. From checkClientInterested():

priceRatio = salePrice / expectedPrice
priceFactor = (priceRatio - 1.0) / priceMultiplierDef

# reputation–based price tolerance:
Dealer: repThreshold = rep/100 + 0.075
Normal (not hooked): repThreshold = rep/100 + 0.20
Addicted to drug: repThreshold = rep/100 + 0.05

priceIsHigh = (priceFactor > repThreshold)
priceTooHigh = (priceFactor > repThreshold)

# non–dealer, non–addicted clients also roll a 70% interest gate
Interested = (clientDealerTookDope OR !priceTooHigh) AND RandomBoolWithWeight(0.7)

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():

contentRatio = proportion of the expected drug in the received product
strengthRatio = drugReceived.strength / drugExpected.strength
clampedStrength = Clamp(strengthRatio, 0.0, 1.5)

endProductQuality = contentRatio + (contentRatio × 0.2 × clampedStrength)

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.

XP & Levels

The player XP curve is quadratic, from calcExpForLevelUp():

XP_threshold(L) = L × levelExpFirstLevel × (1 + L × levelExpRaiseRatio)

Per–sale XP is from calcSaleExp() in baseNPC_C:

raw = drugReceivedQuantity × 10.0
clamped = Clamp(raw, 30.0, 800.0)

Client / sample sale: XP = 100.0 + clamped # 130–900 XP
Dealer cash delivery: XP = (100.0 + clamped) / 3.0 # 43–300 XP, 3× less

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:

DealerLevel = floor( (1 + sqrt(1 + 8 × dealerExp / 225)) / 2 )
XPperGramAsDealer = 14.0 # DEALER-XP-PER-GRAM
DEALER-XP-LEVEL-RATIO = 225.0
DEALER-MAX-LEVEL = 10

Cutting & Quality

Mixes are computed in BlueprintHelpers.MixToDrugData() as a weighted sum of substance properties:

for each substance in MixContents:
  weight = MixProportions[i]
  toxicity += drug.toxicity × weight
  strength += drug.strength × weight
  addictiveness += drug.addictiveness × weight
  mixStrengthening += drug.mixStrengthening × weight

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

Overdose chance is a two–branch system based on the toxicity of the received product (from processReceivedDrugs()):

minODToxicity = 3.9 # below this: ZERO OD chance
highToxLevel = 12.0 # at/above this: flat 25% OD

if tox > 3.9:
  if tox ≥ 12.0:
    ODchance = 0.25 # flat 25%
  else:
    ODchance = Clamp( ((tox-3.9)/3.9) / 20.0, 0.001, 0.08 )
    # scaled from 0.1% (just above 3.9) to 8% (just below 12.0)

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

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)
Ballena825
Keiji20110

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 (Supplier Limit)

Eddie's order cap scales linearly with player level:

EddieLimit($) = EDDIE-LIMIT-BASE + EDDIE-LIMIT-PER-LEVEL × playerLevel
        = 150.0 + 45.0 × playerLevel
Player Level Eddie Limit ($)
1$195
5$375
10$600
20$1,050
30$1,500

Debunked: Systems That Do Not Exist

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:

No 0–100 DEA heat scale
Exposition is an unbounded weighted average produced by 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.
No per–drug "heat per sale" value
Drugs in 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.
No satisfaction tiers (Loyal / Satisfied / Unhappy / Lost)
Satisfaction is a floating–point 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.
No addiction "purchase counter"
Addiction is a per–sale probability roll: 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.
No gang "territory control percentage"
Territory control is the per–area 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.
"Hashish" and "Crack" are not vanilla drugs
The 10 vanilla entries in 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.

Was this article helpful?
🖨 Print
Created by Staff Last edited by mifsopo 2 revisions Published May 11, 2026

💬 Discussion