Skip to main content
BD2 Mod Manager recognizes five different mod types based on the .modfile naming pattern. Each type corresponds to different game assets and uses specific character or scene IDs.

Mod type overview

The application identifies mod types using regex patterns defined in src/models/models.py:50-59. Each mod type has a specific naming convention that must be followed.

IDLE mods

IDLE mods replace character idle animations and standard character assets. Naming pattern: char{character_id}.modfile Regex: ^char(\d+)\.modfile$ (case-insensitive) Examples:
char000101.modfile  // Character ID: 000101
char000234.modfile  // Character ID: 000234
char001050.modfile  // Character ID: 001050
The captured character_id is used to look up character information from the characters.csv data file.

CUTSCENE mods

CUTSCENE mods replace character cutscene animations. Naming pattern: cutscene_char{character_id}.modfile Regex: cutscene_char(\d+)\.modfile$ (case-insensitive) Examples:
cutscene_char000101.modfile  // Character ID: 000101
cutscene_char000234.modfile  // Character ID: 000234
CUTSCENE_CHAR001050.modfile  // Character ID: 001050 (case-insensitive)
Like IDLE mods, the captured character_id maps to entries in characters.csv.

SCENE mods

SCENE mods replace special illustrations, story packs, or special scene assets. Naming pattern: {prefix}{scene_id}[_{optional}].modfile Valid prefixes: specialillust, illust_special, storypack Regex: (?:specialillust|illust_special|storypack)(\d+)(?:_?\d+)?\.modfile$ (case-insensitive) Examples:
specialillust001.modfile      // Scene ID: 001
illust_special042.modfile     // Scene ID: 042
storypack123.modfile          // Scene ID: 123
specialillust001_02.modfile   // Scene ID: 001 (with optional suffix)
illust_special042_1.modfile   // Scene ID: 042 (with optional suffix)
The captured scene_id is stored but scene data lookup is currently not fully implemented in game_data.py:138-139.

NPC mods

NPC mods replace non-player character assets and talk illustrations. Naming pattern: npc{npc_id}.modfile or illust_talk{npc_id}.modfile Regex: ^(?:npc(\d+)|illust_talk(\d+))\.modfile$ (case-insensitive) Examples:
npc001.modfile           // NPC ID: 001
npc042.modfile           // NPC ID: 042
illust_talk001.modfile   // NPC ID: 001
illust_talk123.modfile   // NPC ID: 123
The captured npc_id is used to look up NPC information from npcs.csv. Some NPCs are linked to specific characters through the character_id field in the NPC data.

DATING mods

DATING mods replace dating scene illustrations. Naming pattern: illust_dating{dating_id}.modfile Regex: ^illust_dating(\d+)\.modfile$ (case-insensitive) Examples:
illust_dating001.modfile  // Dating ID: 001
illust_dating042.modfile  // Dating ID: 042
illust_dating123.modfile  // Dating ID: 123
The captured dating_id is used to look up the associated character from datings.csv, which maps dating IDs to character IDs.

ID mapping

The mod type system uses several types of IDs to map mods to game assets:

Character ID

Used by IDLE and CUTSCENE mods. Directly references a character in characters.csv. Format: Usually 6 digits (e.g., 000101, 000234) Lookup: game_data.get_character_by_id(character_id)

Scene ID

Used by SCENE mods. References special illustrations or story packs. Format: Variable digits (e.g., 001, 042, 123) Lookup: Currently returns empty Scene object

NPC ID

Used by NPC mods. References NPCs in npcs.csv, which may link to a character. Format: Variable digits (e.g., 001, 042, 123) Lookup: game_data.get_npc_by_id(npc_id) (may also resolve to a character)

Dating ID

Used by DATING mods. Maps to a character ID through datings.csv. Format: Variable digits (e.g., 001, 042, 123) Lookup: game_data.get_character_by_dating_id(dating_id)

Unknown mod types

If a .modfile doesn’t match any of the recognized patterns, the mod type is set to None and a warning is logged in models.py:72:
logger.warning("Unknown mod type for file: %s", path.name)
Unknown mods can still be managed but won’t have automatic character or scene associations.

Build docs developers (and LLMs) love