Skip to main content

Overview

The character browser provides a comprehensive view of all Brown Dust 2 characters, their costumes, character IDs, and which characters have mods installed. It automatically updates when new characters are added to the game.

Character data sources

Character data is loaded from CSV files that contain:
  • Character names - Base character names
  • Costumes - Different costume variants for each character
  • Character IDs - Unique identifiers used by mods
  • Collaboration status - Whether the character is from a collaboration event
  • Dating availability - Which characters have dating scenes
  • NPC information - NPC characters and their associations
The data loading is handled in src/services/game_data.py:26-79:
class BD2GameData:
    def __init__(self,
                 characters_csv: Union[str, Path],
                 datings_csv: Union[str, Path],
                 npcs_csv: Union[str, Path]
                 ) -> None:
        self.characters_csv = Path(characters_csv)
        self.datings_csv = Path(datings_csv)
        self.npcs_csv = Path(npcs_csv)
        
        self._characters = {}
        self._datings = {}
        self._npcs = {}
        
        self.refresh()

Browsing characters

The character browser displays characters organized by:

Grouping

Characters are grouped by their base character name, with all costume variants listed together. For example:
  • Angelica
    • Original
    • Swimsuit
    • School Uniform
    • Christmas
This grouping is created in src/models/mod_manager_model.py:422-435:
for character in sorted(
    self.game_data.get_characters(), key=lambda char: char.character
):
    group = character.character
    mods_status.setdefault(group, []).append(
        {
            "character": character,
            "cutscene": character.id in mods_ids_cutscenes,
            "idle": character.id in mods_ids_idles,
            "dating": character.id in mods_ids_dating
            if character in dating_chars else None,
        }
    )

Character information

For each character costume, you can view:
  • Character name - The base character name
  • Costume name - The specific costume variant
  • Character ID - The unique ID used in mod files
  • Collaboration status - Icon or indicator if from a collaboration

Mod status indicators

The character browser shows which characters have mods installed:

Mod type indicators

For each character costume, see if you have:
  • Idle mod - Character idle animation mod
  • Cutscene mod - Character cutscene animation mod
  • Dating mod - Dating scene mod (if applicable)
These indicators update in real-time based on your enabled mods.

Status calculation

The mod status is calculated by checking enabled mods for each character (see src/models/mod_manager_model.py:400-417):
mods_ids_cutscenes = set()
mods_ids_idles = set()
mods_ids_dating = set()

for mod_name, mod_entry in self._mod_entries.items():
    if not mod_entry.enabled or mod_entry.character is None:
        continue
    
    if mod_entry.mod.type == BD2ModType.CUTSCENE:
        mods_ids_cutscenes.add(mod_entry.character.id)
    elif mod_entry.mod.type == BD2ModType.IDLE or mod_entry.mod.type == BD2ModType.NPC:
        mods_ids_idles.add(mod_entry.character.id)
    elif mod_entry.mod.type == BD2ModType.DATING:
        mods_ids_dating.add(mod_entry.character.id)
Only enabled mods are counted in the character browser. Disabled mods don’t show up as installed.

Character IDs

Each character costume has a unique ID used by the modding system. These IDs are crucial for:
  • Creating mods - Mod files must use the correct character ID
  • Mod detection - The manager uses IDs to associate mods with characters
  • Troubleshooting - Identifying which character a mod is for
Character IDs are extracted from CSV data (see src/services/game_data.py:92-101):
def get_characters(self) -> list[Character]:
    """
    Returns a list of all characters.
    """
    return [
        Character(
            id=char["id"], 
            character=char["character"], 
            costume=char["costume"], 
            is_collab=char["is_collab"]
        )
        for char in self._characters.values()
    ]

Dating characters

Some characters have dating scenes available. The character browser indicates which characters support dating mods:
  • Dating available - Character has dating scenes in the game
  • Dating mod indicator - Shows if you have a dating mod installed
Dating character data is loaded separately from datings.csv and linked to character IDs (see src/services/game_data.py:103-108):
def get_dating_characters(self) -> list[Character]:
    return [
        Character.from_dict(self._characters.get(dating["character_id"]))
        for dating in self._datings.values()
        if self._characters.get(dating["character_id"])
    ]

NPC characters

The browser also includes NPC (Non-Player Character) data:
  • NPC names - Story NPCs that can have mods
  • Character associations - NPCs linked to playable characters
  • NPC IDs - Unique identifiers for NPC mods
NPCs are loaded from npcs.csv (see src/services/game_data.py:67-79):
def _load_npcs(self):
    """Load npcs from the CSV file."""
    if not self.npcs_csv.exists():
        raise FileNotFoundError(
            f"Scenes data file not found at {self.npcs_csv}.")
    
    with self.npcs_csv.open("r", encoding="utf-8") as file:
        reader = DictReader(file)
        self._npcs = {
            str(row["id"]): {"id": row["id"],
                             "name": row["name"],
                             "character_id": row["character_id"]}
            for row in reader}

Auto-updates for new characters

The character database automatically updates when:
  • New characters are added to the game
  • New costumes are released
  • Dating scenes are added for existing characters
  • New NPCs are introduced
You can manually refresh the character data:
1

Open settings or tools

Navigate to the settings menu or character browser.
2

Refresh character data

Click Refresh Character Data or a similar option.
3

Automatic download

The manager downloads the latest character CSV files from the community repository.
4

Browser updates

The character browser refreshes to show new characters and updated information.
The refresh mechanism is implemented in src/models/mod_manager_model.py:828-829:
def refresh_game_data(self) -> None:
    self.game_data.refresh()

Searching characters

Find specific characters quickly:
  • Search by name - Type character or costume names
  • Filter by collaboration - Show only collaboration characters
  • Filter by mod status - Show only characters with/without mods
  • Filter by dating availability - Show characters with dating scenes

Character full names

Characters can be displayed with their full name combining character and costume:
def full_name(self, separator: Optional[str] = None) -> str:
    return (
        f"{self.character} {self.costume}"
        if not separator
        else f"{self.character} {separator} {self.costume}"
    )
From src/models/models.py:109-114, this allows flexible display formats like:
  • “Angelica Swimsuit”
  • “Angelica - Swimsuit”
  • “Angelica | Swimsuit”

Use cases

Finding missing mods

Quickly identify which of your favorite characters don’t have mods yet:
  1. Browse the character list
  2. Look for characters without mod indicators
  3. Search for mods for those characters

Verifying mod installation

Confirm that mods are properly detected:
  1. Install a character mod
  2. Enable it in the mod manager
  3. Check the character browser to see the mod indicator appear

Discovering moddable characters

Explore which characters and costumes are available for modding by browsing the complete character list with IDs.
The character browser is especially useful for mod creators who need to know exact character IDs for their mod files.

Build docs developers (and LLMs) love