Claim set · data/claims/dopewars.yaml

dopewars (benmwebb/dopewars, 1.6.2)

Game: dopewars.

dopewars's credits say it derives from an MS-DOS game of the same name by an unknown author, which was based on John E. Dell's MS-DOS game Drug Wars. dopewars/derived-from

Developerdopewars source code · AUTHORS#L1-L3dopewars is derived from the MS-DOS game of the same name (author unknown). … This is turn was based upon the MS-DOS game "Drug Wars", by John E. Dell.dopewars source code · doc/index.html#L43-L45based upon the MS-DOS game of the same name, in turn derived from "DrugChecked by claude, 2026-10-20 — read AUTHORS L1-L3 and doc/index.html L43-L45 at the pinned commit

The same AUTHORS file credits Dan Wolf with “scary amounts of research (i.e. playing the game)” to help re-engineer the MS-DOS version, so dopewars's numbers come from play, not from that game's code.

Cited by: Commodity trading, dopewars, Drug Wars

An MS-DOS Dope Wars opens by calling itself based on John E. Dell's Drug Wars and credits the Happy Hacker Foundation. dopewars/hhf-dope-wars

VerifiedDope Wars (Happy Hacker Foundation, MS-DOS), DOPEWARS.EXE played in the emu2 emulator · opening screenBased on John E. Dell's old Drug Wars game, Dope Wars is a simulation of an imaginary drug market.Dope Wars (Happy Hacker Foundation, MS-DOS), DOPEWARS.EXE played in the emu2 emulator · opening screenDope Wars has been brought to you courtesy of the Happy Hacker Foundation.Programs: Doors: DopewarsThe program recieved an update from the "Happy Hacker Foundation" with the release of "Dope Wars"Checked by claude, 2026-10-27 — ran probes/trading/dope-wars-hhf.mjs in emu2; it checks that the opening screen holds both quotes from itProbe: probes/trading/dope-wars-hhf.mjs

The executable is dated 4 May 1991 in two archives. Matthew Lee's PalmOS port ships the same file as “the original DOS version”. Whether it is the build Ben Webb re-engineered is unknown; his credits name no author.

Cited by: Commodity trading, dopewars, Drug Wars

In emu2, the Happy Hacker Foundation's MS-DOS Dope Wars (Dopewars.exe of 4 May 1991) starts its first day in the Bronx with $2,000 cash, a $5,500 debt, and 100 spaces. dopewars/hhf-start

Value
{
 "cash": 2000,
 "debt": 5500,
 "space": 100,
 "place": "Bronx"
}
VerifiedDope Wars (Happy Hacker Foundation, MS-DOS), DOPEWARS.EXE played in the emu2 emulator · first day's screen, after the opening screen — the probe reads Cash, Debt, Space, and the location from the emulated text screenChecked by claude, 2026-10-27 — ran probes/trading/dope-wars-hhf.mjs in emu2; it reads Cash, Debt, Space, and the place from the first day's screen and compares them with the valueProbe: probes/trading/dope-wars-hhf.mjs

The executable's code isn't available to read; the run is the evidence, as for drug-wars/start. dopewars starts with the same cash, debt, and coat size (start).

Cited by: dopewars

Ben Webb's first GPL release of dopewars, version 1.4.0, came out on 27 April 1999. dopewars/first-gpl-release

Value: 1999-04-27

Developerdopewars source code · NEWS#L173-L17427th April 1999 …First GPL release of dopewars (1.4.0)Checked by claude, 2026-10-20 — read the oldest entry of NEWS at the pinned commit

README.md L104 gives the copyright as “Ben Webb 1998-2022”.

Cited by: Commodity trading, dopewars, Inventory capacity

dopewars's “antique” mode tries to keep to the original game as closely as possible. dopewars/antique-mode

Developerdopewars source code · README.md#L52-L54This is "antique" dopewars; it tries to keep to the original dopewars, based on the "Drug Wars" game by John E. Dell, as closely as possible.Checked by claude, 2026-10-20 — read README.md L52-L54 at the pinned commit

Cited by: dopewars

By default, dopewars plays multiplayer games, connecting to a dopewars server. dopewars/multiplayer

Developerdopewars source code · README.md#L56-L59By default, dopewars supports multi-player games. On starting a game, the program will attempt to connect to a dopewars serverChecked by claude, 2026-10-20 — read README.md L56-L59 at the pinned commit

Cited by: dopewars

Antique mode keeps the first six of the eight locations and drops the gun shop and the pub. dopewars/antique-differences

Codedopewars source code · src/dopewars.c#L2449-L2451GunShopLoc = RoughPubLoc = 0;dopewars source code · src/dopewars.c#L2474-L2478 if (antique) { defloc = 6;Checked by claude, 2026-10-20 — read SetupParameters at L2447-L2481; the six kept are the first six rows of DefaultLocation (L740-L745)

Cited by: dopewars

dopewars has 12 drugs, each with a price range, from Ludes at 11–60 to Cocaine at 15,000–29,000. Acid, Hashish, Ludes, and Weed can turn cheap; Cocaine, Heroin, Opium, and Speed can turn expensive. dopewars/drug-table

About: dopewars Commodity trading

Value
{
 "Acid": [
  1000,
  4400,
  true,
  false
 ],
 "Cocaine": [
  15000,
  29000,
  false,
  true
 ],
 "Hashish": [
  480,
  1280,
  true,
  false
 ],
 "Heroin": [
  5500,
  13000,
  false,
  true
 ],
 "Ludes": [
  11,
  60,
  true,
  false
 ],
 "MDA": [
  1500,
  4400,
  false,
  false
 ],
 "Opium": [
  540,
  1250,
  false,
  true
 ],
 "PCP": [
  1000,
  2500,
  false,
  false
 ],
 "Peyote": [
  220,
  700,
  false,
  false
 ],
 "Shrooms": [
  630,
  1300,
  false,
  false
 ],
 "Speed": [
  90,
  250,
  false,
  true
 ],
 "Weed": [
  315,
  890,
  true,
  false
 ]
}
Verifieddopewars source code · src/dopewars.c#L714-L734{N_("Cocaine"), 15000, 29000, FALSE, TRUE, ""},dopewars source code · src/dopewars.h#L255-L260 price_t MinPrice, MaxPrice; gboolean Cheap, Expensive;Checked by claude, 2026-10-20 — read DefaultDrug at L714-L734 and struct DRUG; the probe compiles the table and prints itProbe: probes/trading/dopewars.mjs

Prices are in dollars, per unit. A config file can replace every one of them.

Cited by: Commodity trading, dopewars

Each drug on sale gets a fresh price on every arrival, drawn uniformly from at least its MinPrice to below its MaxPrice; a price event then divides or multiplies one drug's price. dopewars/normal-price

About: dopewars Commodity trading

Verifieddopewars source code · src/dopewars.c#L809-L815 * Returns a random price not less than bot and less than top. … return (price_t)((float)(top - bot) * rand() / (RAND_MAX + 1.0)) + bot;dopewars source code · src/serverside.c#L3245-L3250To->Drugs[i].Price = prandom(Drug[i].MinPrice, Drug[i].MaxPrice);dopewars source code · src/serverside.c#L2400-L2417SendDrugsHere(To, TRUE);Checked by claude, 2026-10-20 — read prandom (L812-L815), GenerateDrugsHere (serverside.c L3205-L3252), and the E_ARRIVE case that calls SendDrugsHere with DisplayBusts TRUE; the probe runs GenerateDrugsHere a million times per location and every normal price falls in [MinPrice, MaxPrice)Probe: probes/trading/dopewars.mjs

Cited by: Commodity trading, dopewars

Each visit puts a random number of drugs on sale, from the location's MinDrug to one less than its MaxDrug; the rest have no price that day. dopewars/drugs-on-sale

About: dopewars Commodity trading

Verifieddopewars source code · src/serverside.c#L3239-L3251 NumRandom = brandom(Location[To->IsAt].MinDrug, Location[To->IsAt].MaxDrug);Checked by claude, 2026-10-20 — read L3209-L3251 (prices start at 0, and only drawn drugs get one) and brandom at dopewars.c L804-L807; the probe's counts per location run from MinDrug to MaxDrug − 1Probe: probes/trading/dopewars.mjs

Cited by: Commodity trading, dopewars

The eight locations differ in police presence and in how many drugs are on sale, from Manhattan (police 90, 4–9 drugs) to the Ghetto (police 5, 8–11 drugs). dopewars/locations

About: dopewars Commodity trading

Value
{
 "Bronx": [
  10,
  7,
  12
 ],
 "Ghetto": [
  5,
  8,
  12
 ],
 "Central Park": [
  15,
  6,
  12
 ],
 "Manhattan": [
  90,
  4,
  10
 ],
 "Coney Island": [
  20,
  6,
  12
 ],
 "Brooklyn": [
  70,
  4,
  11
 ],
 "Queens": [
  50,
  6,
  12
 ],
 "Staten Island": [
  20,
  6,
  12
 ]
}
Verifieddopewars source code · src/dopewars.c#L738-L748{N_("Manhattan"), 90, NUMDRUG / 2 - 2, NUMDRUG - 2},dopewars source code · src/dopewars.h#L248-L252 int PolicePresence; int MinDrug, MaxDrug;Checked by claude, 2026-10-20 — read DefaultLocation (NUMDRUG is 12, L736); the probe prints the compiled tableProbe: probes/trading/dopewars.mjs

The price ranges are the same everywhere; a location changes only how many drugs are on sale and how often the police appear.

Cited by: Commodity trading, dopewars

Each visit has no price event with probability 0.30, one with 0.42, two with 0.266, and three with 0.014. dopewars/event-chances

About: dopewars Commodity trading

Value
[
 0.3,
 0.42,
 0.266,
 0.014
]
Verifieddopewars source code · src/serverside.c#L3213-L3219 if (brandom(0, 100) < 70) NumEvents = 1; if (brandom(0, 100) < 40 && NumEvents == 1) NumEvents = 2; if (brandom(0, 100) < 5 && NumEvents == 2) NumEvents = 3;Checked by claude, 2026-10-20 — read L3213-L3219 (0.7 · 0.6, 0.7 · 0.4 · 0.95, 0.7 · 0.4 · 0.05); the probe counts events over eight million visits and matches to within 0.002Probe: probes/trading/dopewars.mjs

Cited by: Commodity trading, dopewars

A price event picks a random drug that can turn; a cheap drug costs a quarter of a normal price, and an expensive one four times. dopewars/event-prices

About: dopewars Commodity trading

Value
{
 "cheapDivide": 4,
 "expensiveMultiply": 4
}
Verifieddopewars source code · src/serverside.c#L3221-L3237 To->Drugs[i].Price = prandom(Drug[i].MinPrice, Drug[i].MaxPrice) * Drugs.ExpensiveMultiply;dopewars source code · src/dopewars.c#L751-L756 N_("Cops made a big %tde bust! Prices are outrageous!"), N_("Addicts are buying %tde at ridiculous prices!"), 4, 4Checked by claude, 2026-10-20 — read the event loop at L3221-L3237 and DefaultDrugs (CheapDivide 4, ExpensiveMultiply 4, per struct DRUGS at dopewars.h L263-L266); the probe finds cheap prices only on Cheap drugs, within MinPrice/4 to MaxPrice/4, and expensive ones only on Expensive drugs, within 4× the rangeProbe: probes/trading/dopewars.mjs

Every event drug also counts toward the visit's number of drugs on sale (L3244), so an event always puts its drug on sale. An expensive price takes one of the two bust messages at random (L3281-L3283).

Cited by: Commodity trading, dopewars

A dopewars game starts on 1 December 1984 with $2,000 cash, a $5,500 debt, and a trenchcoat that holds 100. dopewars/start

Codedopewars source code · src/dopewars.c#L114price_t StartCash = 2000, StartDebt = 5500;dopewars source code · src/dopewars.c#L86-L881, 12, 1984dopewars source code · src/dopewars.c#L882NewPlayer->CoatSize = 100;Checked by claude, 2026-10-20 — read L86-L88, L114, and NewPlayer at L873-L882

Cited by: Commodity trading, dopewars, Inventory capacity

Each jet to another location takes one day, and asking to jet on the 31st turn ends the game, so a game has 31 days of trading. dopewars/turns

Value: 31 days

Codedopewars source code · src/dopewars.c#L226int NumTurns = 31;dopewars source code · src/serverside.c#L452-L463 if (NumTurns > 0 && Play->Turn >= NumTurns … Play->Turn++; g_date_add_days(Play->date, 1);Checked by claude, 2026-10-20 — read the C_REQUESTJET case at L452-L470 and the starting Turn = 1 at dopewars.c L873; L457 also refuses a jet to the current location

Cited by: Commodity trading, dopewars

Each jet multiplies the loan shark's debt by 1.10, in integer arithmetic, so $5,500 left unpaid grows to $95,917 over 30 jets. dopewars/debt-interest

About: dopewars Commodity trading

Value
{
 "rate": 10,
 "after30": 95917
}
Verifieddopewars source code · src/dopewars.c#L108int DebtInterest = 10, BankInterest = 5;dopewars source code · src/serverside.c#L464Play->Debt = Play->Debt * (DebtInterest + 100) / 100;Checked by claude, 2026-10-20 — read L108 and the jet case at L464-L465; the probe runs those lines 30 times from StartDebtProbe: probes/trading/dopewars.mjs

Cited by: Commodity trading, Compound interest, dopewars

Each jet multiplies the bank balance by 1.05, so $2,000 deposited grows to $8,614 over 30 jets. dopewars/bank-interest

About: dopewars Commodity trading

Value
{
 "rate": 5,
 "after30": 8614
}
Verifieddopewars source code · src/dopewars.c#L108int DebtInterest = 10, BankInterest = 5;dopewars source code · src/serverside.c#L466Play->Bank = Play->Bank * (BankInterest + 100) / 100;Checked by claude, 2026-10-20 — read L108 and L466-L467; the probe runs those lines 30 times from $2,000Probe: probes/trading/dopewars.mjs

Cited by: Commodity trading, Compound interest, dopewars

The dopewars loan shark, in the Bronx, only takes repayments and offers no new loans. dopewars/loan-repay-only

About: dopewars Commodity trading

Codedopewars source code · src/serverside.c#L500-L507 case C_PAYLOAN: money = strtoprice(Data);dopewars source code · src/serverside.c#L2350-L2351if (To->IsAt + 1 == LoanSharkLoc && To->Debt > 0) {dopewars source code · src/dopewars.h#L216#define DEFLOANSHARK 1Checked by claude, 2026-10-20 — read C_PAYLOAN (the only message that changes Debt outside interest; a search of serverside.c for Debt finds no other increase) and E_LOANSHARK, which asks only in location 1, the Bronx, and only while Debt > 0

Cited by: dopewars

On arrival, dopewars rolls for an encounter, 24 in 100 below $1 million net worth, 39 in 115 above it, and 54 in 130 above $3 million. dopewars/encounter-chance

About: dopewars Commodity trading

Value
{
 "under1M": 0.24,
 "over1M": 0.339,
 "over3M": 0.415
}
Codedopewars source code · src/serverside.c#L2315-L2321 if (Money > 3000000) i = 130; else if (Money > 1000000) i = 115; else i = 100; if (brandom(0, i) > 75) {Checked by claude, 2026-10-20 — read L2259 (Money = Cash + Bank − Debt) and L2315-L2324; brandom(0, i) returns 0 to i − 1, so 76 to i − 1 is i − 76 values of i

Cited by: Commodity trading, dopewars

An encounter is an offer, a random event, or a police attack, and a location's police presence raises the share of attacks. Half of all offers are a helper who carries drugs, or a bigger trenchcoat in antique mode; the rest offer a gun, unless the game is sanitized or has no guns, the player already carries two more guns than helpers, or the drawn gun won't fit the coat, and then nothing is offered. dopewars/encounter-kind

About: dopewars Commodity trading

Codedopewars source code · src/serverside.c#L2441-L2459 i = brandom(0, 80 + Location[To->IsAt].PolicePresence); … if (i < 33) { return (OfferObject(To, Force == FORCEBITCH)); } else if (i < 50) { return (RandomOffer(To));dopewars source code · src/serverside.c#L3163-L3186 if (brandom(0, 100) < 50 || ForceBitch) { if (WantAntique) { … text = dpg_strdup_printf(_("YN^Would you like to buy a bigger " … text = dpg_strdup_printf(_ ("YN^Hey dude! I'll help carry your %tde for a " … } else if (!Sanitized && NumGun > 0 && (TotalGunsCarried(To) < To->Bitches.Carried + 2)) { … …Checked by claude, 2026-10-22 — read OfferObject at L3159-L3193 after three benchmark auditors flagged the coat, and again in the audit (2026-10-27) for the gun offer's conditions (L3181-L3186); the coat offer is antique-only, the default game offers a helper. Read SendCopOffer at L2437-L2462; in the Bronx (presence 10) the draw runs 0 to 89, so 40 of 90 values attack, and in Manhattan (90) 120 of 170

Police attacks need guns and cops to exist (L2455); a game with neither turns them into nothing.

Cited by: Commodity trading, dopewars

One random event in ten is a mugging that leaves 80 to 94 percent of the cash. dopewars/mugging

About: dopewars Commodity trading

Codedopewars source code · src/serverside.c#L3052-L3058 if (!Sanitized && (r < 10)) { g_string_assign(text, _("You were mugged in the subway!")); To->Cash = To->Cash * (price_t)brandom(80, 95) / 100l;Checked by claude, 2026-10-20 — read RandomOffer at L3047-L3058; brandom(80, 95) returns 80 to 94

Cited by: dopewars

In antique mode, half of all offers are a bigger trenchcoat for $200 to $299, and each one adds 10 to the coat's space. dopewars/bigger-coat

About: dopewars Commodity trading

Codedopewars source code · src/serverside.c#L3164-L3168 if (brandom(0, 100) < 50 || ForceBitch) { if (WantAntique) { To->Bitches.Price = prandom(MINTRENCHPRICE, MAXTRENCHPRICE);dopewars source code · src/serverside.c#L64static const price_t MINTRENCHPRICE = 200, MAXTRENCHPRICE = 300;dopewars source code · src/serverside.c#L3545-L3548Play->CoatSize += 10;Checked by claude, 2026-10-20 — read OfferObject at L3159-L3178, the trenchcoat price range at L64, GainBitch at L3542-L3549, and BuyObject at L3517-L3526, which calls GainBitch once for each one bought

Cited by: dopewars