Skip to content

Police Pressure

This page covers the knobs that control how cops interact with dealers — the reach and timing settings in config.lua (client-side) and the outcome/tuning settings in server/server.config.lua (server-only).

Frisk (Search) Reach

lua
Config.search = {
    reach = 2.2,   -- metres
}
OptionPurposeDefault
reachHow close a cop must stay to the dealer throughout a frisk. Stepping outside this range aborts the interaction.2.2

Interrogation Reach and Time Limit

lua
Config.interrogate = {
    reach = 2.2,     -- metres
    maxMs = 30000,   -- milliseconds
}
OptionPurposeDefault
reachHow close a cop must stay to the dealer throughout an interrogation round.2.2
maxMsMaximum time (ms) the cop has to complete a round before the dealer outlasts them.30000

Dealer Panic

An armed dealer under pressure can pull a weapon mid-interaction.

lua
Config.panic = {
    stress = 65,    -- dealer stress at/over which a botch can trigger a panic pull
    chance = 45,    -- % chance per botched frisk read or mistimed interrogation press
    fireMs = 3000,  -- how long the dealer fires at the cop before bolting
}
OptionPurposeDefault
stressDealer must be at or above this stress level for a panic pull to be possible.65
chancePercentage chance per botched interaction that a panic pull occurs (when stress is high enough).45
fireMsMilliseconds the dealer fires at the cop before fleeing.3000

Unarmed dealers cannot panic-pull. Lowering stress means danger begins earlier; raising chance makes botched reads more punishing for the cop.


Server-Side Search Tuning (ServerConfig.Defaults.Settings.copPress)

These values are seeded into the database on first start and are the source of truth thereafter. Edit the database rows and run /npcsell_reload to apply changes.

lua
copPress = {
    cooldownSec        = 300,
    perCopCooldownSec  = 600,
    attemptDecaySec    = 300,
    pressurePerAttempt = 20,
    bustedCooldownSec  = 900,
    bustArrestSec      = 120,
    searchHeat         = 15,
    armedResistChance  = 35,
    bustUnits          = 8,
    seizeToCop         = false,
    cashToCop          = false,
    bounty             = { base = 250, perUnit = 40, weapon = 300 },
    bodyFrac           = { base = 1.0, perResist = 0.005, min = 0.35 },
}
OptionPurposeDefault
cooldownSecSeconds before the same dealer can be frisked or interrogated again by any cop.300
perCopCooldownSecSeconds before the same cop can interact with the same dealer again.600
attemptDecaySecSeconds per consecutive press attempt that the cumulative pressure decays by 1.300
pressurePerAttemptAdded to the success roll for each consecutive attempt on the same dealer. Repeated attempts become more likely to succeed.20
bustedCooldownSecSeconds the dealer is off the streets after a confiscation (bust).900
bustArrestSecSeconds the busted dealer remains standing before being hauled off — time for cuff/escort RP.120
searchHeatMinimum dealer heat to trigger probable cause for a frisk.15
armedResistChancePercentage chance an armed dealer shoves the cop off and bolts mid-frisk.35
bustUnitsOn-body units found at or above which a full bust is triggered.8
seizeToCopIf true, seized contraband goes to the officer's inventory. If false, it is destroyed/sent to evidence.false
cashToCopIf true, seized dealer cash goes to the officer's inventory. If false, it goes to evidence.false
bounty.baseBase cash reward paid to a cop on a successful bust.250
bounty.perUnitAdditional reward per unit found on the dealer.40
bounty.weaponAdditional reward if the dealer was carrying a weapon.300
bodyFrac.baseBase fraction of on-body stock the cop finds during a frisk.1.0
bodyFrac.perResistFraction subtracted per point of snitch resist (higher resist = harder to find everything).0.005
bodyFrac.minMinimum fraction found regardless of resist.0.35

Server-Side Interrogation Tuning (ServerConfig.Defaults.Settings.interrogate)

lua
interrogate = {
    surrenderHp    = 175,
    roundsDivisor  = 60,
    minRounds      = 1,
    maxRounds      = 4,
    perCopCooldown = 45,
    failStress     = 18,
    failsToLawyer  = 3,
    lawyerWindowSec = 600,
    lockoutSec     = 600,
    diff           = { loyal = 0.6, tier = 0.3, stress = 0.25 },
    pool           = { 'sequence', 'spotlie', 'alibi', 'timeline', 'tell' },
}
OptionPurposeDefault
surrenderHpUnused — reserved, not read by any current gate. Interrogation has no HP/subdue requirement; the board opens directly.175
roundsDivisorControls how many rounds a tier takes: ceil((snitchResist + loyalty) / roundsDivisor). Lower values = fewer rounds per tier = easier crack.60
minRoundsMinimum rounds per tier.1
maxRoundsMaximum rounds per tier (compression knob).4
perCopCooldownSeconds between a single cop's consecutive attempts on the same dealer.45
failStressStress added to the dealer on each failed round.18
failsToLawyerConsecutive failures within lawyerWindowSec before the dealer lawyers up.3
lawyerWindowSecRolling window (seconds) within which consecutive failures count toward the lawyer lockout.600
lockoutSecDuration (seconds) of the lawyer lockout — dealer refuses all interrogation.600
nonceTtlSecSeconds a challenge stays valid after being issued. Must be longer than the board play window; an expired nonce rejects the submission.180
diff.loyalWeight of dealer loyalty in the difficulty roll.0.6
diff.tierWeight of current tier depth in the difficulty roll.0.3
diff.stressWeight of dealer stress in the difficulty roll (stressed dealers are easier to crack).0.25
poolActive minigame IDs the server draws from per interrogation session. Remove an ID to disable that game; the list can hold up to 10 IDs.{ 'sequence', 'spotlie', 'alibi', 'timeline', 'tell' }

Tuning difficulty

Difficulty weights (diff.*) sum is not required to equal 1 — results are clamped 0–1. A higher loyal weight makes loyal dealers significantly harder to crack. Raising failsToLawyer gives cops more attempts before a lockout.

Minigame Pool

Each interrogation round, the server picks a game from pool using a per-cop shuffle-bag (each game appears once before any repeats). The five shipped games are:

IDNameWhat the cop does
sequenceArrow MemoryWatch a sequence of directional arrows, then repeat it in order. Length 3–6 based on difficulty.
spotlieSpot the LieA grid of arrows where most point the same way. Click the ones that don't. Grid grows with difficulty.
alibiMastermindDeduce a hidden colour code using black/white peg feedback. Code never sent to the client; feedback is server-authoritative.
timelineTimelineSort a set of statements by the time shown on each.
tellTellTwo near-identical statements side by side. Click every word that differs between them.

Remove an ID from pool to disable that game entirely. The bag refills automatically when all remaining games have been used.

Robicore