Skip to content

Pricing reference

Why does one girl cost 500 gold and the next 5,000? Why does the same girl pay 30 gold for one shift and 200 the next? This page walks through the numbers the engine actually uses.

Two completely separate systems are at work:

  • Girl pricing: what a girl costs to buy at Slave Market or sells for in the Dungeon. Built on the girl’s stats and skills.
  • Job wages: how much gold a working girl earns each shift. Built on her job’s performance curve and her ask price.

Both are tunable from XML. Pack authors who want to rebalance an economy mostly do it by editing performance.xml / wage.xml per job, or by editing the trait/item effects that feed into stats and skills.


Every girl carries an AskPrice stat in the 0-100 range. It is derived, not authored: the engine recomputes it whenever stats change. You should not set it in Girls.girlsx; it gets overwritten.

Formula (from GirlManager::CalculateAskPrice):

askPrice = ((Beauty + Charisma) / 2) * 0.6
askPrice += Confidence / 10
askPrice += Intelligence / 10
askPrice += Fame / 2
askPrice += Level * 10 (if Level > 0)
askPrice += random(-10..+10) (only on initial generation)
askPrice = min(askPrice, 100) (hard cap)

What this means in practice:

  • Beauty and Charisma dominate the floor. A girl with 80 Beauty / 80 Charisma gets +48 from this term alone, before anything else.
  • Confidence and Intelligence are minor on their own (10 points each per +1) but they round out the price.
  • Fame is the biggest swing factor for trained girls. A girl who hits 100 Fame contributes +50 from that single term. Train a slave girl into a celebrity and her ask price doubles.
  • Level is a flat +10 per level. Most random girls stay at level 1; named pack girls or veterans climb.
  • The cap at 100 means a maxed-out girl’s AskPrice reads “100” and stops growing, but the slave-market price keeps growing through skills (see below).

The slave market price multiplies AskPrice by 15 and then layers skill, level, and virginity bonuses on top (from cTariff::slave_base_price):

basePrice = AskPrice * 15
basePrice += sum of all 12 skills
basePrice += extra (skill - 75) * 2 for each skill above 75
basePrice += Agility
basePrice += Level * 100
basePrice *= 1.5 if Virgin

Then the displayed buy price applies the difficulty multiplier cfg.out_fact.slave_cost() (configured in config.xml); the sell price uses cfg.in_fact.slave_sales().

Worked example, two girls side by side:

Stat / skillGirl A “fresh capture”Girl B “trained star”
Beauty5090
Charisma4090
Confidence2080
Intelligence3070
Fame0100
Level15
Service skill2090
Performance skill095
Other 10 skills~10 avg~50 avg
Virginnoyes

Girl A: AskPrice ~= 33. Slave base ~= 33*15 + (sum ~120) + 0 + 100 = ~715 gold.

Girl B: AskPrice = 100 (capped). Slave base = 100*15 + (sum ~700, plus high-skill bonuses ~80) + 70 + 500 = ~2,850, then *1.5 for virginity = ~4,275 gold.

The 5x gap players see between cheap and expensive girls is mostly Fame and skills, not Beauty. A girl can be gorgeous and cheap; a famous virgin with 90+ skills is the one that crosses 5,000 gold.

In rough order of how much they move the slave-market number:

  1. Fame (one-time training jobs that raise it pay back many times over)
  2. Trained skills above 75 (each point above 75 contributes 3x its raw value to slave base)
  3. Beauty + Charisma (they cap your AskPrice ceiling)
  4. Level (slow but flat +100/level to slave base)
  5. Virginity (1.5x the entire base price)
  6. Confidence / Intelligence (minor, rounds things off)

Stats that do not affect pricing today: Constitution, Spirit, Strength, Health, Happiness, Tiredness. These show up in performance and survival, not at the auction block.

In v1.13.3+, trait and item effects feed GetStat and GetSkill directly via the live modifier cache. So a trait that grants <effect type="stat" name="Beauty" value="20"/> raises AskPrice automatically the next time it’s recalculated; you do not need to handle pricing separately.

This is why the v1.13.3 trait pricing fix was a big deal: before that, traits could change a girl’s stats but the modifier cache was being silently dropped on the read path, so girls were priced as if their traits did nothing.


For jobs that ship a wage.xml, the flow is:

  1. performance.xml computes a Performance score from a weighted combination of stats, skills, traits, and brothel state. Higher = better shift.
  2. wage.xml maps that Performance score to gold via a piecewise linear curve (see reference/jobs-reference.md).
  3. Tips and side payments (see below) add on top.

So a Bar Singer with 80 Performance skill and 60 Charisma might score 245 on the Performance curve and earn 155 gold; the same girl tired and grumpy might score 70 and earn -5 (a small loss, because audiences boo and refund).

A pack author rebalancing wages does it by editing wage.xml’s <Point> table. No code change.

A handful of jobs (whore, brothelmasseuse, brothelstripper) earn wages keyed off the girl’s AskPrice rather than a Performance curve:

girl->m_Pay += askprice + flat_bonus

The flat bonus depends on the act (e.g. masseuse-with-sex = +60; strip-only = +10). This is why a famous, beautiful whore earns a multiple of what a fresh-from-the-dungeon girl earns for the exact same act; the askprice term carries her stat profile into the per-customer payout.

For jobs that resolve customer interactions (whore, escort, masseuse-with-sex), the customer can leave a tip:

  • Customer’s Happiness > 90 after the act
  • Customer has >= 20 gold remaining
  • Tip is up to 20 gold, capped at customer’s wallet

Tips go to the girl’s m_Pay if she is free, or to the brothel’s finance pool if she is a slave.

Some jobs deduct from the brothel’s support budget instead of paying the girl as gold-on-hand:

  • Matron: g_Gold.girl_support(wages) plus m_Pay accounting
  • House jobs (cook, clean, headgirl, mistress, etc.): mostly support-pool entries, often zero or negative against general income
  • Training jobs: typically no wage.xml, so no income

Pack authors who want a job to be “household service” (no income) simply omit wage.xml. Authors who want a job to cost the player simply give it negative <Point> values at low Performance.

Free girls keep their m_Pay at end of week. Slave girls’ earnings flow through brothel finance: their m_Pay is recorded for the books but the actual gold goes to the player. This is bookkeeping, not gameplay; you don’t need to model it in pack data.


Common levers, weakest to strongest:

  • Change a single trait’s stat effect: moves all girls who have it.
  • Change a job’s wage.xml curve: rebalances that one job globally.
  • Change performance.xml weights: changes which stats matter for that job.
  • Change cfg.out_fact.slave_cost (in config.xml, not pack data): global slave-market multiplier.

Test changes by saving and watching one girl across two-three shifts. Performance scores and per-action wages are logged to content_loading.txt when the engine runs.


  • reference/jobs-reference.md: complete performance.xml and wage.xml schema
  • reference/effects-reference.md: <Effects> block grammar (used inside jobs)
  • reference/traits-reference.md: trait effect types that feed stats and skills
  • reference/visible-synergies.md: discipline for building visible cross-girl synergies