# Categories and characters Implemented in `ackit/classify.py`; used both when building the shipped catalog (`tools/build_catalog.py`) and when a game build is not in the catalog (runtime scan), so every language/build gets the same scheme. ## Groups and categories Every sound has a **group** and a finer **category**, derived from its Wwise name (from the community hash list; unnamed IDs show as hex). First matching rule wins: | name starts with | group | category | |------------------|-------|----------| | `CHR_RadioScanner`, `PSO_CarRadio`, `Speech_RADIO`, `Speech_TV`, `Speech_CAMERAS`, `DIA_` | Speech | Radio & TV | | `Speech_TAPE_` | Speech | Interview tapes | | `Speech_INTERROGATION_` | Speech | Interrogations | | `Speech_CINEMATIC_`, `Speech_New_` | Speech | Cinematics | | `Speech_Boss_` / `Speech_BOSS_` | Speech | Boss fights | | `Speech_RIDDLER_`, `Speech_RIDDLES_` | Speech | Riddler | | `Speech_SIDE_` | Speech | Side missions | | `Speech_DLC_` | Speech | DLC | | `Speech_PRED_` | Speech | Predator chatter | | `Speech_COMBAT_`, `Speech_Bully_` | Speech | Combat barks | | `Speech_EMOTE_` | Speech | Efforts & emotes | | `Speech_REACT_` | Speech | Reactions | | `Speech_STREETS_`, `Speech_ZONES_`, `Speech_OUTCAST_`, `Speech_Vertical_` | Speech | Open-world chatter | | `Speech_CHAR_` | Speech | Character lines | | `Speech_CH_`, `Speech_SEQUENCE_`, `Speech_STEEL_`, `_MUSEUM_`, `_CHURCH_`, `_COURT_`, `_UNDER_`, `_GCPD_`, `_ZP1_` | Speech | Story missions | | `Speech_GAME_`, `Speech_MAP_`, `Speech_AUGMENTED_`, `Speech_FORENSICS_`, `Speech_TEMP_` | Speech | Gameplay & hints | | `NPC_...Crowd...` | Ambience | Crowds | | other `Speech_` | Speech | Other speech | | media of the `Music` / `Music_PDLC` stream packs, `Music*`, `MUS_` | Music | Music / Music (DLC) | | `AMB_`, `PSA_` | Ambience | Ambience | | `PSO_` (flies, drips, fans, lights) | Ambience | Ambient emitters | | `WND_` | Ambience | Wind | | `WTR_` | Ambience | Weather | | `VOL_`, `PVOL_` | Ambience | Room tone | | anything containing `Footstep` | SFX | Footsteps | | `CHR_`/`NPC_` containing `Combat`, `BoneBreak`, `Bodyfall` | SFX | Combat | | `SEQ_`, `MTN_` | SFX | Scripted sequences | | `OBJ_` | SFX | Objects | | `PX_`, `PHY_` | SFX | Physics | | `WPN_` | SFX | Weapons | | `DVC_` | SFX | Gadgets | | `GUI_`, `SBJ_` | SFX | Interface | | `VFX_` | SFX | Visual effects | | other `NPC_` | SFX | Enemies & NPCs | | `CHR_`, `GEN_` | SFX | Character foley | | `Global` | SFX | Global | | anything else (e.g. unnamed hex IDs) | Unknown | Unknown | BANK sounds (in-memory, `docs/formats/banks.md`) are classified by the name of their **soundbank** (e.g. `CHR_CatwomanFoleySuit`, `Speech_EMOTE_Batman`), which is more systematic than their event names. Counts in the ITA catalog: Story missions 1993, Predator chatter 1796, Character lines 1537, Open-world chatter 1295, Side missions 808, Combat barks 801, Efforts & emotes 616, Interview tapes 514, Riddler 360, Radio & TV 226, Gameplay & hints 199, DLC 167, Boss fights 150, Cinematics 150, Reactions 108, Interrogations 95. SFX archive: Music 389, Ambience 225, SFX 31, Unknown 6. ## Characters Two separate fields, because Wwise names describe a *scene*, not the speaker of each variation (a conversation alternates speakers between `NAME_1`, `NAME_2`, ...): - **character** - the verified speaker, only from the curated lists in `data/catalog/source//*.txt` (one file per character, listening-based). The lists name ITA sounds by their position in the ITA WAD (wemscan names); positions differ between languages, so each label is moved to the game's line name of that sound (`characters.csv`, empty `language`) and then applies to the same line in every language. Labels of sounds no event plays stay ITA-only (`language` = ITA). Checked against the speaker field of the game's dialogue objects: 955 / 955 labelled lines agree (spelling aside: TwoFace, Mysterious_stranger = Azrael). Display names: Calendar -> Calendar Man, Croc -> Killer Croc, Freeze -> Mr. Freeze, Ivy -> Poison Ivy, Madhatter -> Mad Hatter, Quinn -> Harley Quinn, Ras -> Ra's al Ghul, Strange -> Hugo Strange, Talia -> Talia al Ghul, Twoface -> Two-Face, Vicky -> Vicki Vale, Zsazz -> Victor Zsasz, Unknown -> Unknown (speaker checked but not identified). A line in two lists gets both ("A; B"). - **characters_inferred** - characters and roles *mentioned by the name* (token rules in `classify._TOKENS`, e.g. `BM`/`BATMAN` -> Batman, `PENG` -> Penguin, `TF` -> Two-Face, `THUG*`/`GENTHUG*` -> Thug, `TYGER` -> TYGER guard; interview tapes add Hugo Strange). A hint for the ~7,500 lines without a verified speaker, never shown as the speaker. In the editor the character filter matches verified speakers, and optionally inferred ones. Coverage (every language): 3,366 sounds with a verified speaker, 5,930 more with inferred characters, 1,520 with neither (mostly predator/efforts from unnamed thugs).