Skip to content

A complete pack, end to end

This page walks through the smallest pack that actually does something useful: one named girl, a handful of images, and the wrapper file that tells the engine “this folder is a pack.” Read it once and you’ll know where every file goes and why.

We’ll build a pack called Marina containing a single girl of the same name. By the end you’ll have a folder you can drop into Resources/Packages/ and see show up in the Slave Market on the next new game.

Here’s everything we’re going to create:

Resources/Packages/Marina/
package.xml
Girls.girlsx
Characters/
Marina/
Profile/
portrait.png
Sex/
normal_01.png
normal_02.png

Five files in three folders. That’s the whole pack.

Every structured pack needs this file at its root. It’s the marker that says “this folder is a pack, please load it.” A folder without package.xml is ignored.

<?xml version="1.0" encoding="utf-8"?>
<Package
Name="Marina"
Id="marina_pack"
Author="Your Name"
Version="1.0"
Description="A former fisherwoman from a coastal village."
RequiresEngine="1.10.0">
<Tags>
<Tag>girls</Tag>
</Tags>
</Package>

The two fields that matter are Name (what players see) and Id (the unique identifier the engine uses internally). The Id must be unique across every installed pack, otherwise loading order decides who wins. Pick something specific to your pack.

RequiresEngine is the minimum game version this pack needs. If a player on an older engine installs your pack, they’ll get a warning instead of silent breakage. Set it to the lowest version that has the features you use.

Everything else (Author, Version, Description, Tags) is metadata for the Content Manager, the in-game pack browser, and future tooling. Worth filling in but never required.

This is where Marina actually lives as a character. One file can hold many girls; here we ship just one.

<Girls>
<Girl Name="Marina"
Desc="A former fisherwoman from a coastal village. Strong arms, stronger opinions."
Gold="20"
Charisma="30"
Happiness="80"
Libido="20"
Constitution="70"
Intelligence="30"
Confidence="60"
Agility="50"
Beauty="40"
Spirit="70"
Health="100"
Obedience="20"
Age="25"
NormalSex="15"
Service="20"
Combat="25"
Status="Slave">
<Trait Name="Strong" />
<Trait Name="Tough" />
</Girl>
</Girls>

Every attribute on <Girl> is a stat or skill defined by the engine; see girlsx-schema for the full list. Anything you omit defaults to zero, so you only need to set the values you care about.

Two things to know:

  • Status="Slave": this is what makes Marina available in the Slave Market. Without it she’s a unique girl who never appears in any pool and effectively never spawns. If you want a “wild” recruit-from-the-streets girl, set Status="Normal" and use her in a Lua hook instead. For most authors, Status="Slave" is what you want.
  • <Trait Name=...>: traits are referenced by name. The engine ships a long list of core traits; grep them before inventing a new one. Custom traits live in your pack’s Traits.traitsx (covered in traits-reference).

Images live under Characters/Marina/, in subfolders named for the category. The folder name has to match the Name attribute of the girl.

Characters/Marina/
Profile/
portrait.png
Sex/
normal_01.png
normal_02.png

Two categories here:

  • Profile: shown on the girl’s detail screen and anywhere the engine needs a “default” picture of her. Always ship at least one Profile image, otherwise she displays as a blank silhouette.
  • Sex: shown during sexual scenes. Filename hints (the normal token in normal_01.png) tell the engine which act this image fits. The inference is forgiving: split tokens on _, -, ., or whitespace, so normal_anal_01.png is read as both “normal” and “anal.”

That’s it for a starter pack. The full taxonomy of categories (Combat, Strip, BDSM, Beast, etc.) and per-image tagging lives in image-types and filename-cheatsheet. You can also override inference for specific images via an images.xml manifest, but you don’t need one until your filenames stop telling the truth.

Drop the whole Marina/ folder into Resources/Packages/. Start a new game. Marina should appear in the Slave Market within the first few weeks (she’s part of the random rotation now, not always week one).

If she doesn’t show up:

  1. Check the game log for pack-loader errors. A missing Id, malformed XML, or unknown trait name will get logged there.
  2. Run pack-validator.exe against your pack folder. It catches the common authoring mistakes before the engine does.
  3. Confirm Status="Slave" is on the <Girl> line. Forgetting this is the most common reason a girl never appears.

This pack works. To grow it:

  • More girls: add more <Girl> blocks to Girls.girlsx, one matching folder under Characters/ each.
  • Random-girl templates: ship RandomGirls.rgirlsx with archetypes the engine rolls into procedurally generated girls. Same XML shape, different file extension.
  • Custom traits or items: drop Traits.traitsx or Items.itemsx next to Girls.girlsx. Schemas are in traits-reference and items-reference.
  • A short script: a Lua/ folder with a meet-girl scene or a custom event. See lua-scripting.
  • A custom job or building: data-driven, lives under Jobs/ or as a building pack. See jobs-reference and the shipped Sample_Building/ for examples.

Each of these is additive. You can ship a girls-only pack forever and it’s a complete pack. The new format exists so that when you do want traits, items, or scripts in the same drop, they have a place to go.

  • Where packs go: the two valid drop locations and the loader rules.
  • The shipped sample packs under Resources/Packages/: Sample_Full/ is the kitchen-sink reference; Sample_GirlsOnly/ is a more compact named-and-random girl pack.