Atlas de Bretonnie

Atelier des moddeurs · guide · 83 min de lecture

RPFM, le guide : ajouter une unité, une faction et un seigneur dans Total War: Warhammer III

RPFM (Rusted PackFile Manager) ouvre et fabrique les packs de Total War. Ce guide montre pas à pas comment s'en servir, puis déroule trois procédures complètes pour Total War: Warhammer III : ajouter une unité, une faction, un seigneur légendaire ou jouable. Les pièges viennent de la communauté et de notre chantier.

Relu le 25 septembre 2026, mise à jour 9.0. Vérifié sur le code, le fichier de langue et le manuel de RPFM 5.0.6, les données du jeu et l'Assembly Kit au patch 8.1. Les changements de la 9.0 qui touchent notre chantier sont ajoutés ; le reste n'a pas été revérifié. Corrigé le 5 octobre 2026 : faits prouvés depuis sur le jeu en 9.0.2, et versions parues depuis (CAIME 1.1.0, RPFM 5.1.1). Dans le doute, vérifiez, et dites-le-nous.

Ce que fait RPFM, et ce qu'est un pack§

Un mod de Total War est un fichier .pack, une archive que le jeu lit dans son dossier data. RPFM (Rusted PackFile Manager, de Frodo45127, sous licence MIT) ouvre les packs du jeu en lecture et fabrique les vôtres. Un pack range des tables (db/), des textes (text/db/<fichier>.loc), des scripts Lua (script/), des images (ui/), des définitions de modèles (variantmeshes/) et, pour une campagne, sa position de départ (campaigns/<campagne>/startpos.esf).

Anatomie d'un packatlas_chevaliers.packvotre mod : une archive, posée dans le dossier data du jeudb/land_units_tables/ne jamais le renommer ni le déplacer (RPFM)atlas_land_unitsle vôtre, à votre préfixe ; @ ou ! devant : seulement pourmodifier une ligne du jeudata__le nom de la table du jeu : jamais dans votre packtext/db/atlas.locune clé par phrase ; vaut pour toutes les languesscript/campaign/mod/atlas_script.luachargé tout seul par le jeuui/units/icons/<carte>.pngla carte d'unité : 60 × 130ui/flags/<faction>/les drapeauxui/portraits/portholes/portrait_settings*.binles réglages des portraits, par art setvariantmeshes/variantmeshdefinitions/*.variantmeshdefinitionun modèle neufcampaigns/<campagne>/startpos.esfproduit par le jeu ; un par campagnecampaign_maps/<carte>/hlp_data.esf · spd_data.esfproduits par le jeu, pour une carte neuvesettings.rpfm_reserved · notes.rpfm_reservedles réglages et notes de RPFM, ignorés par le jeuTables et .loc : fusionnés par clé.Autres fichiers : même chemin, un seul gagne.
Un pack range chaque fichier à son chemin. Les fragments d'une même table (un dossier _tables), comme les .loc, se fusionnent par clé ; pour tout autre fichier, deux fichiers au même chemin ne se chargent pas tous les deux : un seul gagne. En or, ce que le jeu produit ; en gris, ce que seul RPFM lit.

Ce guide a été écrit sur RPFM 5.0.6 (sortie le 1er août 2026) et des tables relevées au patch 8.1. Depuis sont sorties la 5.1.0 (28 septembre 2026) et la 5.1.1 (4 octobre 2026), qui corrigent la fuite de mémoire des sessions MCP et l'ordre des clés écrites dans twad_key_deletes depuis la 9.0 du jeu : prenez la dernière ; le manuel en ligne décrit la 5.1 (155 outils MCP). Les schémas de RPFM pour la 9.0 sont sortis le jour de la mise à jour (24 septembre) ; les tables citées ici n'ont pas été relues une à une depuis : dans le doute, vérifiez. Toute modification suit ces six étapes :

  1. Trouver

    La ligne du jeu la plus proche.

    View → Toggle Global Search Window (Ctrl+Shift+F)

  2. Copier

    Dans votre table (db/<table>_tables/<fichier>), sous une clé à vous (la même pour modifier une ligne du jeu).

    clic droit sur la racine du pack → Create… → Create DB, puis Paste as New Row

  3. Nommer

    Les textes affichés au joueur, dans text/db/<fichier>.loc.

    clic droit sur la racine du pack → Create… → Create Loc

  4. Contrôler

    Références, clés, champs vides.

    panneau Diagnostics → Check PackFile

  5. Essayer

    Le pack installé dans <jeu>\data\, en jeu.

    clic droit sur la racine du pack → Install

  6. Publier

    La version optimisée.

    clic droit sur la racine du pack → Save Pack For Release… (sur une copie)

Les mots du métier§

MotSens
Packl'archive d'un mod, posée dans le dossier data du jeu
Tableun tableau de la base du jeu, rangé dans db/<table>_tables/
Cléce qui identifie une ligne, unique dans sa table (parfois plusieurs colonnes)
Fragmentun fichier de table ; le jeu lit tous les fragments d'une table, les siens et ceux des mods
Datacoreun fragment nommé comme celui du jeu (data__), qui remplace la table entière
.locun fichier de textes : une clé par phrase affichée
Schémala description des tables : colonnes, clés, liens (celle de RPFM, ou celle du kit : TWaD_*.xml)
Cache des dépendancesles données du jeu, préparées par RPFM pour chercher et contrôler
Assembly Kitle kit officiel de Creative Assembly (Steam → Bibliothèque → Outils)
Sous-typele type exact d'un personnage (agent_subtypes)
Art setl'ensemble des apparences d'un personnage (campaign_character_art_sets)
Startposstartpos.esf, la sauvegarde du tour 0 d'une campagne
Racine du packla première ligne de l'arbre du pack, à son nom ; son clic droit porte Create…, Install, Uninstall, Save Pack For Release… et Build Startpos
Palettela recherche par nom de RPFM : Ctrl+Shift+P pour une action, Ctrl+P pour un fichier
%APPDATA%le dossier des réglages de votre compte Windows : tapez %APPDATA% dans la barre d'adresse de l'Explorateur
Groupe militairemilitary_group, le groupe de recrutement d'une faction : une unité permise à un groupe l'est à toutes ses factions (chez CA, les factions de Bretonnie ont wh_main_group_bretonnia)
twad_key_deletesla table qui retire des lignes du jeu au lancement (Warhammer III, depuis le patch 6.3) : colonnes table_name et key
MixerMIXER – Mixu's Unlocker, un mod de Mixu : son startpos rend jouables toutes les factions des Empires Immortels et des Royaumes du Chaos ; selon le wiki, c'est le seul mod de startpos de la plupart des joueurs
Error / Warning / Infoles trois gravités des diagnostics : Error, un problème en jeu ; Warning, un problème probable ; Info, à savoir. Visez zéro Error

Installer et configurer RPFM 5.0.6§

Dans ses versions publiées, prenez l'archive Windows (pour la 5.0.6, rpfm-v5.0.6-x86_64-pc-windows-msvc.zip ; prenez la dernière version), décompressez-la dans un dossier à vous, hors de Program Files, et lancez rpfm_ui.exe : c'est la fenêtre de RPFM (rpfm_server.exe, à côté, est son serveur, qu'elle lance elle-même). Puis, une fois pour toutes :

  1. PackFile → Settings. Game Paths : le Game Folder (le dossier de l'exécutable du jeu) et l'Assembly Kit Folder. Extra Paths : le MyMod's Folder, hors de Program Files, où Windows protège l'écriture. Default Game : Warhammer 3.
  2. About → Check Updates, puis, dans le gestionnaire de mises à jour, le bouton de la ligne Schema Updates : le schéma dit à RPFM comment lire chaque table du patch en cours (vous pouvez aussi cocher Check Schema Updates on Start dans les réglages).
  3. Game Selected → Generate Dependencies Cache, quelques minutes : RPFM prépare les données du jeu pour ses recherches et ses contrôles. Sans Assembly Kit configuré, il prévient que ses diagnostics donneront de faux positifs.
Régler RPFM : trois gestesPackFile → SettingsSettingsGame PathsWarhammer 3Game Folder<jeu>Assembly Kit Folder<Assembly Kit>Extra PathsMyMod's Folder<MyMod>pas dans Program Files : Windows y protège l'écritureDefault GameWarhammer 31About → Check UpdatesUpdate ManagerProgram Updates:Schema Updates:Lua Autogen Updates:Old AK Updates:à cocher aussi, dans Settings : Check Schema Updates on Start2Game Selected → Generate Dependencies Cacheles données du jeule cachequelques minutes ; pour ses recherches et ses contrôlesSans Assembly Kit configuré, RPFM prévient : de fauxpositifs dans les diagnostics.3Après une mise à jour du jeu : refaites 2 et 3.
Schéma, disposition courante. Trois réglages à faire une fois, dans l'ordre : les dossiers (1), les schémas des tables (2), le cache des dépendances (3) ; après une mise à jour du jeu, on refait 2 et 3.

Les gestes de base§

La fenêtre de RPFM 5.0.6, zone par zone :

atlas_chevaliers.packPackFile MyMod View Game Selected Tools Aboutatlas_main_unitsatlas.locPack Contentsatlas_chevaliers.packdbmain_units_tablesatlas_main_unitstextdbatlas.locunitland_unitcasteatlas_chevaliersatlas_chevaliersmelee_cavalrySave Pack As…Save Pack For Release…InstallUninstallChange PackFile Type ▸Optimize PackFileBuild StartposDependenciesGame FilesParent FilesAssembly Kit Filesclic droit → ImportDiagnosticsCheck PackFileErrorWarningInfoErrorInvalid referenceatlas_main_unitsland_unitGlobal Search · Ctrl+Shift+F123456789
  1. Les menusPackFile, MyMod, View, Game Selected, Tools, About. Les réglages : PackFile → Settings (Ctrl+,) ; les schémas : About → Check Updates ; le cache : Game Selected → Generate Dependencies Cache.
  2. Les ongletsun par fichier ouvert.
  3. Pack Contentsl'arbre du pack ; sa première ligne, la racine, porte le nom du pack.
  4. Le clic droit sur la racineSave Pack As…, Save Pack For Release…, Install, Uninstall, Change PackFile Type, Optimize PackFile, Build Startpos (et d'autres actions) : ce qui touche au pack entier.
  5. Dependenciesles fichiers du jeu, des mods parents et de l'Assembly Kit, en lecture seule ; clic droit → Import en amène un dans votre pack.
  6. La table ouvertevotre ligne, surlignée ; en rouge, une référence invalide : aucune ligne de land_units ne porte encore cette clé. Le fichier atlas_main_units n'a pas de @ : il ajoute une clé neuve.
  7. DiagnosticsCheck PackFile relit le pack ; chaque ligne a sa gravité : Error, Warning ou Info. Visez zéro Error.
  8. Global Searchmasquée au départ : View → Toggle Global Search Window (Ctrl+Shift+F) ; sources Game Files ou Assembly Kit Tables.
  9. La barre d'étatles messages brefs de la dernière opération.
Schéma, disposition courante. Les réglages, les schémas et le cache sont dans les menus (1) ; ce qui touche au pack entier, au clic droit sur sa racine (4). Toute action se retrouve aussi par son nom dans la palette : Ctrl+Shift+P.

Créer son mod§

MyMod → New MyMod. Choisissez le jeu (Warhammer 3) et un nom avec des soulignés, sans espace ni .pack (auteur_description). RPFM crée le pack <MyMod>\warhammer_3\<nom>.pack et, à côté, le dossier <MyMod>\warhammer_3\<nom>\ pour vos fichiers de travail (plus un dépôt Git ou un projet VSCode si vous les cochez), puis ouvre le pack. Le dossier MyMod doit être réglé avant, sinon RPFM refuse.

Trouver une donnée du jeu§

View → Toggle Global Search Window (Ctrl+Shift+F) : source Game Files (ou Assembly Kit Tables), type DB (Loc pour les textes), puis la clé, soulignés compris ; un clic ouvre la table à la bonne ligne, en lecture seule. Autres voies : PackFile → Load All CA Packs (lecture seule ; grisée quand le cache des dépendances est chargé), ou View → Toggle Dependencies Window, clic droit → Import, qui amène un fichier du jeu dans votre pack : renommez aussitôt une table amenée ainsi (F2), car sous le nom data__ elle remplacerait celle du jeu.

Créer une table§

Clic droit sur la racine du pack → Create… → Create DB ; choisissez la table (land_units_tables) et nommez le fichier avec votre préfixe : db/land_units_tables/atlas_land_units. Le nom compte : quand votre fichier et celui du jeu (data__) donnent la même clé, celui dont le nom trie en premier gagne. Pour ajouter des lignes (clés neuves), tout nom à vous convient ; pour modifier une ligne du jeu (même clé), commencez le nom par @ ou ! (le détail : « Les règles des packs »).

Partir d'une ligne du jeu§

  1. Dans la table du jeu, sélectionnez la ligne modèle (cliquez son numéro) : Copy… → Copy.
  2. Dans votre table : Paste as New Row (Ctrl+Shift+V). Pour ajouter une ligne, changez la clé en premier : sinon votre ligne n'ajoute rien, elle entre en concurrence avec celle du jeu.
  3. Pour dupliquer une de vos lignes : Clone… → Clone and Append.

Suivre une clé§

Clic droit sur une cellule → Go To… → Go To Definition (la ligne citée), Go To Loc Entry (son texte) ou Find References (tout ce qui cite cette clé) ; Rename References renomme une clé partout (le manuel l'appelle Cascade Edition). C'est ainsi qu'on démonte une unité ou un seigneur, table après table.

Suivre une cléatlas_chevaliersclic droit sur une celluleGo To…Find References3Rename References4Go To Definition1Go To Loc Entry2building_units_allowed · unitunits_custom_battle_permissions · unit…3Find Referencesqui la citemain_unitsunitatlas_chevaliers3land_unitatlas_chevaliers11Go To Definitionla ligne citéeland_unitskeyatlas_chevaliers22Go To Loc Entryson textetext/db/atlas.locland_units_onscreen_name_atlas_chevalierstextle nom affiché4Rename References : renomme la clé partoutle manuel l'appelle Cascade Edition
Schéma : au clic droit sur une cellule, quatre gestes suivent une clé d'une table à l'autre : la ligne qu'elle cite (1), son texte (2), tout ce qui la cite (3) ; Rename References la renomme partout (4). Chaque cellule porte le numéro du geste qui en part.

Écrire les textes§

  1. Clic droit sur la racine du pack → Create… → Create Loc, par exemple text/db/atlas.loc.
  2. Trois colonnes : key (la clé), text (le texte affiché) et tooltip, dont le rôle est inconnu selon le manuel de RPFM : faites comme les lignes de CA.
  3. La clé a la forme <table>_<colonne>_<clé de la ligne>. Exemple : le nom de l'unité atlas_chevaliers (colonne onscreen_name de land_units) a pour clé land_units_onscreen_name_atlas_chevaliers.
  4. Clic droit sur la racine du pack → Generate Loc Data produit deux fichiers. zzz_… : les clés qui manquent à vos tables ; renommez-le ou recopiez ses lignes dans votre .loc, puis remplissez-les. aaa_… : les textes du jeu que vos tables citent ; n'en gardez que ce que vous changez. Ne publiez aucun des deux sous son nom d'origine : RPFM les réécrit à chaque génération, et l'optimiseur retire aaa_… (et zzz_… s'il est vide).
Une clé de texteland_unitsla table+_onscreen_name_la colonne+atlas_chevaliersla clé de la ligneland_units_onscreen_name_atlas_chevaliersdans votre .loc : le nom de l'unitéClic droit sur la racine → Generate Loc Datazzz_…vos clés sans texte : renommez-le, ou recopiez ses lignes dansvotre .loc, puis remplissez-lesaaa_…des textes du jeu que vos tables citent : n'en gardez que ce quevous changezNi l'un ni l'autre sous son nom d'origine : RPFM les réécrità chaque génération ; l'optimiseur retire aaa_… (et zzz_…s'il est vide).
Une clé de texte suit la forme <table>_<colonne>_<clé de la ligne>. Generate Loc Data produit deux fichiers : zzz_… pour vos clés sans texte, aaa_… pour les textes du jeu que vos tables citent.

Votre premier mod, en dix minutes§

Un essai court, qui vérifie aussi votre installation : rendre une unité du jeu plus chère en bataille personnalisée. Les diagnostics et l'installation du pack sont détaillés juste après (« Vérifier, tester, publier ») ; pourquoi le @ fait gagner votre fichier, dans « Les règles des packs ».

Un premier mod en dix minutesMyMod → New MyModWarhammer 3 ; RPFM crée le pack, puis l'ouvre.moi_premier_mod.pack1View → Toggle Global Search WindowCtrl+Shift+F ; Game Files, DB, puis la clé :wh_dlc07_brt_cav_knights_errant_0main_units_tablesla table du jeu, en lecture seule2Copy… → Copyun clic sur le numéro de la ligne, puis clic droit3Create… → Create DBclic droit sur la racine de votre pack : tablemain_units_tables, nom @moi_main_unitsles deux fichiers, lus par ordre de nom :@moi_main_unitsle vôtre, trié avant : il gagnedata__celui du jeu4Paste as New Row · Ctrl+Shift+Vmême clé : vous modifiez l'unité du jeumultiplayer_cost700999son prix en bataille personnalisée ; 700 chez CA5Panneau Diagnostics → Check PackFileaucune ligne Error6Ctrl+S, puis clic droit sur la racine → Installcochez le mod dans le lanceurEn bataille personnalisée, les Chevaliers errantscoûtent 999.7
Sept gestes, de la table du jeu à l'essai en jeu : votre fichier @moi_main_units trie avant celui du jeu (data__), sa ligne gagne donc, et les Chevaliers errants passent de 700 à 999 en bataille personnalisée. Pour ajouter une unité au lieu de la modifier, on change la clé : c'est la procédure 1.
  1. MyMod → New MyMod : jeu Warhammer 3, nom moi_premier_mod.
  2. View → Toggle Global Search Window (Ctrl+Shift+F) : source Game Files, type DB ; cherchez wh_dlc07_brt_cav_knights_errant_0, puis cliquez le résultat de main_units_tables : la table du jeu s'ouvre à la bonne ligne, en lecture seule.
  3. Cliquez le numéro de la ligne, puis clic droit → Copy… → Copy.
  4. Clic droit sur la racine de votre pack → Create… → Create DB : table main_units_tables, nom @moi_main_units. Le @ fait trier votre fichier avant celui du jeu (data__) : c'est donc le vôtre qui gagne.
  5. Clic droit dans la table vide → Paste as New Row (Ctrl+Shift+V). Gardez la clé : ici, on modifie l'unité du jeu. Passez multiplayer_cost (son prix en bataille personnalisée ; 700 chez CA) à 999.
  6. View → Toggle Diagnostics Window → Check PackFile : aucune ligne Error.
  7. Ctrl+S, puis clic droit sur la racine du pack → Install ; cochez le mod dans le lanceur. En bataille personnalisée, les Chevaliers errants de Bretonnie coûtent 999.

Pour ajouter une unité au lieu de la modifier, on change la clé : c'est la procédure 1.

Vérifier, tester, publier§

Les diagnostics§

View → Toggle Diagnostics Window → Check PackFile, avant chaque essai : un défaut repéré ici épargne un lancement du jeu pour rien. Chaque ligne porte une gravité : Error (un problème en jeu), Warning (un problème probable), Info (à savoir) ; visez zéro Error. Un double-clic sur une ligne ouvre la cellule fautive ; un faux positif s'ignore au clic droit sur la ligne (Ignore… : dans un fichier, une colonne, un dossier ou tout le pack), et ce choix est enregistré dans le pack lui-même (manuel de RPFM, page Diagnostics). La figure suit un mod du diagnostic jusqu'au jeu.

Du diagnostic au jeuCheck PackFiledans le panneau DiagnosticsError, Warning, Info : visez zéro Error.1Ctrl+Senregistre les packs ouverts.2Clic droit sur la racine → InstallRPFM copie le pack dans le dossier data du jeu.3Cocher le moddans le lanceur, Kaedrin's Mod Manager ou Runcher.Absent de la liste : clic droit sur la racine → ChangePackFile Type → Mod, et Index Includes Timestamp décoché.4Essayer en jeuune unité : bataille personnalisée ; une faction, unseigneur : campagne neuve.Le jeu plante au lancement : retour à 1Invalid reference, Value Cannot be Empty,Banned TableUn script ne fait rien : lisez son journalscript/enable_console_logging →script_log_*.txtLe jeu se referme à chaque lancement : une ligne restéeuser.script.txt :quit_after_campaign_processing;5
Cinq marches, dans l'ordre : chaque essai en jeu commence par Check PackFile. Si le jeu plante, si un script se tait ou si le jeu se referme sans cesse, la branche rouge correspondante dit où regarder.

RPFM contrôle :

Essayer en jeu§

  1. Ctrl+S (enregistre les packs ouverts), puis clic droit sur la racine du pack (la première ligne de l'arbre, à son nom) → Install : RPFM copie le pack dans <jeu>\data\.
  2. Cochez le mod dans le lanceur de Creative Assembly, ou dans un gestionnaire tiers (Kaedrin's Mod Manager, Runcher).
  3. Même menu → Uninstall : retire la copie.

Publier§

Gardez votre pack de travail : copiez-le d'abord (ou Save Pack As… sous un autre nom), car Save Pack For Release… enregistre la version optimisée à la place du pack ouvert. Clic droit sur la racine du pack → Save Pack For Release… : l'optimiseur s'ouvre, puis le pack est enregistré ; Optimize PackFile, au même menu, fait le même travail sans enregistrer, pour relire avant. L'optimiseur ne fait que ce que vous cochez :

Publier sans rien casserD'abord, une copiePack de travailgardé tel quelSa copiecelle qu'on publieSave Pack As…, sous un autre nom, fait aussi une copie.1Dans la copie : Save Pack For Release…, au clicdroit sur la racineatlas_chevaliers.packSave Pack As…Save Pack For Release…Optimize PackFileOptimize PackFile, au même menu : le même travail, sansenregistrer, pour relire avant.Il enregistre la version optimisée à la place du packouvert.2L'optimiseur ne fait que ce qui est cochéIdentiques au jeu, doublons, fichiers videscoché par défautCompresser le packcoché par défautArt sets et variantes inutilisés des portraitsdécoché par défautImport datacores into twad_key_deletesdécoché par défaut ; cochez-le si votre pack contient unetable recopiée (Warhammer III)3Après l'option des datacorestwad_key_deletestable_name · keyvérifiez-la, puis renommez-la : RPFM la réécriraitdb/land_units_tables/data__la table recopiée du jeu : supprimez-la vous-même4
Schéma. Save Pack For Release… remplace le pack ouvert par sa version optimisée : travaillez sur une copie. L'optimiseur ne fait que ce qui est coché (ici, ses réglages par défaut) ; son option des datacores inscrit dans twad_key_deletes les lignes retirées, et c'est à vous de supprimer ensuite la table recopiée.

Envoyer sur le Workshop par le lanceur de CA : le lanceur retente seul 4 fois chaque envoi, et il crée un objet vide à chaque tentative d'un objet neuf. « error code #25 » veut dire limite atteinte, côté compte ou côté Steam (refus avant tout envoi), pas une faute de votre pack ; le lanceur ne l'affiche pas. Un envoi à la fois, puis lisez son journal (%APPDATA%\The Creative Assembly\Launcher\launcher.log, heures en UTC) ; après une erreur 25, ne renvoyez ni ne créez rien : retentez des heures plus tard, et vérifiez la page.

Après une mise à jour du jeu§

  1. About → Check Updates, bouton des schémas.
  2. Game Selected → Generate Dependencies Cache : sinon RPFM compare vos tables à un jeu périmé.
  3. Sur chaque table signalée Outdated table : clic droit → Update Table.
  4. Relisez les colonnes nouvelles : RPFM y met des valeurs par défaut, pas forcément les bonnes pour vos lignes.

À la 9.0, les schémas de RPFM sont sortis le jour même de la mise à jour. Si vous écrivez aussi dans l'Assembly Kit : Steam le met à jour après le jeu, séparément, et à chaque mise à jour du jeu ou du kit (9.0, puis 9.0.2) il réécrit raw_data\db ; les lignes que vous y aviez ajoutées disparaissent. Vérifiez-les et restaurez-les avant de régénérer le cache des dépendances et de reconstruire quoi que ce soit ; après la restauration, comptez chaque lot contre sa source.

Les règles des packs : qui passe devant qui§

Le jeu lit tous les fragments d'une table, les siens et ceux de chaque mod : tant que les clés diffèrent, les lignes s'additionnent. Quand deux fragments donnent la même clé, celui dont le nom trie en premier gagne ; et un fragment qui porte le chemin exact d'un fichier du jeu le remplace tout entier.

La figure ci-dessous montre qui gagne quand plusieurs fragments d'une même table donnent la même clé.

Les fragments d'une tabledb/land_units_tables/! # $ % & ' ( ) + , - ; = @ 0-9 a-z [ ] ^ _ ` { } ~lus par ordre de nom, du premier au dernier (wiki, page Submodding)@mon_modwh_dlc07_brt_cav_knights_errant_0 · valeur Avotre mod, trié avant le jeudata__wh_dlc07_brt_cav_knights_errant_0 · valeur Bla table du jeuzmon_modwh_dlc07_brt_cav_knights_errant_0 · valeur Cvotre mod, trié après le jeu : ne comptez pas sur lui pour modifierune ligne du jeuLe jeu garde la valeur A : le premier nom trié gagne.data__ · dans votre modMême chemin que le fichier du jeu : il le remplace en entier(un « datacore »). Les mises à jour de CA sur cette table nepassent plus ; deux datacores de la même table s'excluent.Retirer une ligne du jeutwad_key_deletes : table_name = land_units · key = <clé>clic droit sur les lignes du jeu→ Add Selection to Key DeletesWarhammer III, depuis le patch 6.3
Trois fragments d'une même table donnent la même clé : le jeu garde celui dont le nom trie en premier, les autres sont ignorés. Un nom en z sert à des lignes neuves que d'autres mods doivent pouvoir corriger (manuel de RPFM, page Datacores), qui range pourtant ztable avant data__ : pour modifier une ligne du jeu, le choix sûr est @ ou !. Un fragment nommé comme le fichier du jeu le remplace tout entier ; pour retirer une ligne du jeu, une table twad_key_deletes.

Exemple : la table des unités de bataille du jeu est le fichier db/land_units_tables/data__. Dans l'ordre de tri du wiki (page Submodding), @mon_mod trie avant data__ et zmon_mod après ; le manuel de RPFM range pourtant ztable avant data__ (page Datacores). Pour modifier une ligne du jeu, le choix sûr est donc un nom qui commence par @ ou !. Un fragment nommé data__ remplace la table entière : c'est un « datacore », que les diagnostics signalent (« Leaving them named data__ will overwrite the base game files », prévient Casualfield).

Quatre règles qui évitent les pires surprises§

Vos textes, dans toutes les languesLe jeu charge vos .loc quelle que soit la langue dujoueur.Une clé neuveland_units_onscreen_name_atlas_chevaliersvotre texte, dans toutes les languesUne clé du jeu reprisefactions_screen_name_wh_main_brt_bordeleauxremplace le texte officiel, dans toutes les languesPour une seconde langue : un second packdans text/db/, lus par ordre de nom :!atlas_de.locexemple : le pack de traduction, vos clés traduites ; trié avant,il gagneatlas.locvotre mod
Un .loc de mod vaut pour toutes les langues : n'y mettez que des clés neuves. Pour une seconde langue, un second pack reprend vos clés dans un .loc dont le nom commence par ! (wiki, page Submodding).

Retirer une ligne du jeu§

  1. Créez une fois twad_key_deletes_tables dans votre pack (clic droit sur la racine → Create… → Create DB), sous un nom de fichier à votre préfixe.
  2. Ouvrez la table du jeu et sélectionnez les lignes à retirer.
  3. Clic droit → Add Selection to Key Deletes → votre table : RPFM y écrit les clés, même quand la clé porte sur plusieurs colonnes. Exception : depuis la 9.0 du jeu, RPFM 5.0.6 écrit à l'envers la clé de land_units_to_unit_abilites_junctions, et la ligne n'est pas retirée ; passez à la 5.1.0 ou plus, ou écrivez-la à la main (land_unit puis ability), et vérifiez en jeu.

Attention : retirer une ligne encore citée par une autre table fait planter le jeu, et les diagnostics ne le voient pas encore (manuel de RPFM, page Datacores). Deux tables seulement ont en plus une case mod_disabled (character_skill_node_set_items, faction_agent_permitted_subtypes), que le schéma de CA présente comme le moyen donné aux moddeurs, faute de pouvoir retirer une ligne.

Procédure 1 : ajouter une unité§

La voie sûre : copier une unité du jeu qui ressemble à la vôtre, puis changer ce qui doit changer. Exemple suivi : les Chevaliers errants de Bretonnie, wh_dlc07_brt_cav_knights_errant_0.

Avant de commencer : l'unité modèle§

La figure suivante montre les tables d'une unité et les colonnes qui les relient.

Une unitémain_unitsclé : unitland_unit → land_unitscoûts, caste, ui_unit_group_landminimumland_unitsclé : key (la même que unit chez CA)caractéristiques, armesman_entity → battle_entitiesprimary_melee_weapon → melee_weaponsminimumunit_variantsclé : faction + unitunit → land_unitsvariant → variantsunit_card → ui/units/iconsminimumui/units/icons/<carte>.pngune image PNG de 60 × 130minimumvariantsclé : variant_nameseulement pour un modèle neuf→ .variantmeshdefinitionfacultatifunit_description_short_texts· unit_description_historical_textsun texte propre à l'unitéfacultatifunits_to_groupings_military_permissionsclés : unit, military_groupmilitary_group = factions.military_group(wh_main_group_bretonnia)campagnebuilding_units_allowedclé : key (un nombre unique)building → building_levelsécuries 2 à 5 : une ligne chacunecampagneunits_custom_battle_permissionsclé : unit + faction + general_unitla bataille personnaliséegeneral_unit = 0minimumtext/db/<mod>.locland_units_onscreen_name_<clé>minimum
Les tables d'une unité, en arbre : chaque fiche donne sa clé et ses liens. Minimum : ce qu'il faut pour la bataille personnalisée ; campagne : en plus, pour la recruter en campagne ; facultatif : selon l'unité. La carte d'unité est une image (PNG de 60 × 130), pas une table.

Les étapes de l'unité§

  1. Global Search sur la clé du modèle : elle figure dans 24 tables du kit ; le tableau ci-dessous donne celles qu'il faut.
  2. Pour chacune : Create DB (un fichier à votre préfixe), Paste as New Row, puis changez ce qui fait l'unité et gardez le reste (voir « Ce qui change, ce qui reste »). Comme CA, donnez la même clé à main_units.unit et à land_units.key.
  3. Réglez caractéristiques, coûts, apparence et carte, puis le recrutement, la bataille personnalisée et les textes.
  4. Contrôle : clic droit sur votre clé → Find References. Le manuel de RPFM conseille ce contrôle après l'ajout d'une unité : il montre si elle est reliée partout où il faut (coûts, recrutement, factions).
  5. Diagnostics, Install, essai en bataille personnalisée.
TableÀ mettreCléLiens
main_unitsla copie ; coûts, caste, ui_unit_group_landunitland_unit → land_units.key
land_unitsla copie ; caractéristiques, armeskeyman_entity → battle_entities ; primary_melee_weapon → melee_weapons ; short_description_text → unit_description_short_texts ; historical_description_text → unit_description_historical_texts
unit_variantsname = votre clé (comme CA), faction vide (= toutes les factions), variant, unit_cardfaction + unitunit → land_units.key ; variant → variants.variant_name ; la carte : ui/units/icons/<unit_card>.png
variantsseulement pour un modèle neuf : variant_filenamevariant_name→ variantmeshes/variantmeshdefinitions/<nom>.variantmeshdefinition
units_to_groupings_military_permissionsl'unité et le groupe militaireles deux colonnesmilitary_group = factions.military_group (par exemple wh_main_group_bretonnia)
building_units_allowedbuilding, unit, key (un nombre unique), faction videkeybuilding → building_levels.level_name ; unit → main_units
units_custom_battle_permissionsla faction de bataille (chez CA : wh_main_brt_bretonnia), general_unit = 0unit + faction + general_unit→ main_units, factions
unit_description_short_texts, unit_description_historical_textsseulement pour un texte propre à l'unitékeycitées par land_units
Copier une unité de CAclé de CAwh_dlc07_brt_cav_knights_errant_0votre cléatlas_chevaliersEn vert, ce qui change ; « gardé », la valeur de CA.Vos fichiers : db/<table>_tables/atlas_…sans @ : vous ajoutezmain_unitsunitclé de CA→atlas_chevaliersland_unitclé de CA→atlas_chevalierscastemelee_cavalrygardéland_unitskeyclé de CA→atlas_chevaliersmelee_attack28gardéunit_variantsnameclé de CA→atlas_chevaliersfaction(vide)gardéunitclé de CA→atlas_chevaliersvariantwh_dlc07_brt_knights_errantgardéunit_cardwh_dlc07_brt_knights_errantgardéname : hors clé ; CA y met la clé de l'unité, etunit_variants_colours le cite.units_to_groupings_military_permissionsunitclé de CA→atlas_chevaliersmilitary_groupwh_main_group_bretonniagardébuilding_units_allowedkey→4 nombres neufsunitclé de CA→atlas_chevaliersbuildingwh_main_brt_stables_2 … _5gardéchez CA : 60317, 60343, 63497, 63640, une ligne par écurie ; et deuxports de Copher.les nombres : clic droit → Generate Ids.units_custom_battle_permissionsunitclé de CA→atlas_chevaliersfactionwh_main_brt_bretonniagardégeneral_unit0gardétext/db/atlas.locun fichier à vouskeyland_units_onscreen_name_atlas_chevalierstextle nom affichéUne clé de CA oubliée : votre ligne concurrence celle de CA.
L'exemple du guide, rempli avec les lignes de CA des Chevaliers errants (Assembly Kit, patch 8.1) : votre clé partout où figure celle de CA (name de unit_variants compris) et des nombres neufs dans building_units_allowed, en vert ; le reste gardé pour un premier essai, en gris. Contrôle : clic droit sur votre clé → Find References.

Ce qui change, ce qui reste§

RPFM a aussi un Unit Editor, expérimental : il ne s'active (menu Tools) qu'une fois cochée la case Enable Unit Editor (EXPERIMENTAL) des réglages (PackFile → Settings). Ce guide suit la voie des tables.

Les tables facultatives de l'unité§

D'après le guide de Casualfield, selon ce que l'unité doit faire :

Les textes de l'unité§

Le minimum viable de l'unité§

Les pièges de l'unité§

Ce que l'unité demande au startpos§

Rien, sauf pour exister dès le tour 0 (start_pos_land_units, start_pos_settlement_garrisons, réserves de mercenaires) ; même alors, un script dispense du startpos : cm:create_force_with_general pose une armée, cm:add_unit_to_faction_mercenary_pool garnit une réserve.

Vérifier que l'unité marche§

  1. Diagnostics : ni référence invalide ni texte manquant.
  2. Bataille personnalisée avec la faction de bataille choisie : l'unité est dans la liste, avec sa carte et son nom ; en bataille, le modèle est entier.
  3. Campagne neuve : l'unité se recrute à chaque niveau de bâtiment listé.

Procédure 2 : ajouter une faction§

Une faction tient en quelques tables, mais elle n'existe sur la carte que par le startpos.

Avant de commencer : ce qu'il faut réunir§

Une campagne cible, une culture et une sous-culture existantes, les drapeaux, et le temps de générer un startpos.

La figure montre les tables d'une faction, et le chemin des tables de départ jusqu'au startpos.

Une factionfactionsclé : keysubculture → cultures_subculturesname_group → names_groupsmilitary_group → groupings_militaryflags_path = ui\flags\<clé>ui/flags/<clé>/mon_24.png · mon_64.png · mon_256.png…les drapeaux : des images à fournirfaction_agent_permitted_subtypesclé : faction + agent + subtypesubtype → agent_subtypesles seigneurs et héros permistext/db/<mod>.locfactions_screen_name_<clé>factions_screen_adjective_<clé>factions_screen_name_when_rebels_<clé>factions_attack_desc_<clé>factions_defend_desc_<clé>start_pos_factionsclé : ID (un entier neuf)faction, campaign, playable, is_majorcai_personality_groupobligatoirestart_pos_regionsclé : region + campaignowning_faction → start_pos_factions.IDstart_pos_charactersclé : IDfaction → start_pos_factions.IDType = generalministerial_position = faction_leaderstart_pos_land_unitsclé : idgeneral → start_pos_characters.IDunit_type → main_unitsPuis le startposstart_pos_*vos tablesle jeugénèrestartpos.esfdans le packEmpires Immortels et Royaumes du Chaos : passez par Mixer ;un seul startpos par campagne.
Une faction : sa ligne de factions, ses drapeaux, ses seigneurs permis, ses textes et ses tables start_pos_*. Le jeu en tire le startpos, un seul par campagne, que votre mod remplace en entier : pour les Empires Immortels et les Royaumes du Chaos, la communauté passe par Mixer.

Les étapes de la faction§

  1. factions : copiez une faction voisine (wh_main_brt_bordeleaux) sous une clé neuve ; réglez subculture, name_group, military_group, flags_path = ui\flags\<clé> et les couleurs (ou Tools → Faction Painter). Ne reprenez jamais les lignes d'une table *_ownership_content_pack_junctions (par exemple faction_ownership_content_pack_junctions) pour une faction à vous : CA y verrouille ses DLC, et le jeu se ferme au lancement sans message ; un verrou de DLC se fait par script.
  2. Les drapeaux : un dossier ui/flags/<clé>/ comme ceux de CA : mon_24.png, mon_64.png, mon_256.png (24, 64 et 256 pixels), mon_64_glow.png, mon_icon.png, mon_rotated.png, mon_banner.dds (noms de fichiers de CA, « mon » compris, relevés au patch 8.1). Lesquels sont indispensables n'est pas confirmé : fournissez tout le jeu.
  3. faction_agent_permitted_subtypes : les lignes du modèle, qui disent quels seigneurs et héros la faction peut avoir (Bordeleaux en a 12 : general, colonel, minister, champion, wizard).
  4. Les textes, puis les tables de départ du tableau, dans le kit (Dave) ou dans le pack (RPFM), plus start_pos_character_to_settlements pour un chef en garnison et start_pos_diplomacy.
  5. Le startpos régénéré (voir « Ce qui exige un nouveau startpos »), rangé dans campaigns/<campagne>/startpos.esf du pack ; puis Diagnostics, Install (sauf pour un pack ouvert depuis le dossier data, qu'Install refuse), campagne neuve.
TableÀ mettreCléLiens
factionsla factionkeysubculture → cultures_subcultures ; name_group → names_groups ; military_group → groupings_military
faction_agent_permitted_subtypesles seigneurs et héros permisfaction + agent + subtype→ agent_subtypes
start_pos_factionsID (un entier neuf), faction, campaign, playable, is_major, cai_personality_groupID→ factions, campaigns
start_pos_regionsowning_faction = cet ID, faction_capitalregion + campaign→ start_pos_factions.ID
start_pos_charactersle chef : Type = general, subtype, ministerial_position = faction_leader, portrait_id, startx et starty, Name et SurnameIDfaction → start_pos_factions.ID ; Name → names.id ; portrait_id → campaign_character_art_sets
start_pos_land_unitsl'armée : unit_type, general, soldiersid→ main_units ; → start_pos_characters.ID
Les drapeaux d'une factionfactionsflags_pathui\flags\<clé>ui/flags/<clé>/mon_24.png24 pxmon_64.png64 pxmon_256.png256 pxQuatre autres fichiers :mon_64_glow.png100 × 100mon_icon.png256 × 256mon_rotated.png112 × 90mon_banner.dds256 × 256 (DXT5)« mon » : le nom de fichier de CA ; noms et tailles relevés sur lesfichiers du jeu (patch 8.1)?Lesquels sont indispensables : non confirmé.Fournissez tout le jeu.
Le dossier ui/flags/<clé>/ d'une faction, comme ceux de CA : trois tailles (24, 64 et 256 pixels) et quatre autres fichiers, noms et tailles relevés sur les fichiers du jeu (patch 8.1), « mon » compris. Lesquels sont indispensables n'est pas confirmé : fournissez tout le jeu.

Les textes de la faction§

factions_screen_name_<clé>, factions_screen_adjective_<clé>, factions_screen_name_when_rebels_<clé>, factions_attack_desc_<clé> et factions_defend_desc_<clé> ; le nom du chef vient de names_name_<id>.

Le minimum viable de la faction§

factions, les drapeaux, faction_agent_permitted_subtypes, les textes, start_pos_factions, une région ou un chef avec son armée, et le startpos régénéré.

Les pièges de la faction§

Ce que la faction demande au startpos§

Tout ce qui la fait exister : le wiki range parmi ce qui demande un startpos les factions jouables, comme celles qui apparaissent en cours de partie. Une fois la faction dans le startpos, le script prend le relais : cm:transfer_region_to_faction(region, faction), cm:create_force_with_general(...), ou le système Campaign Custom Starts de CA (régions, armées, diplomatie, effets).

Vérifier que la faction marche§

  1. Diagnostics propres ; campaigns/<campagne>/startpos.esf est bien dans le pack, daté de la génération.
  2. Tables de départ passées par un pack de mod : %APPDATA%\The Creative Assembly\Warhammer3\crash_report\bad_mods_report.txt nomme l'enregistrement fautif, un à la fois. Il ne voit pas tout : une jonction de propriété de DLC ou un campaigns.mask non vide font fermer ou planter le jeu sans rapport ; retirez alors une table à la fois, sur une copie du pack.
  3. Campagne neuve : la faction est sur la carte, dans sa région, avec son drapeau et son nom ; son chef mène son armée.
  4. Jouable, elle se choisit à l'écran de sélection, une fois la procédure 3 faite pour son chef.

Procédure 3 : ajouter un seigneur légendaire ou jouable§

Trois paliers : A, le seigneur existe dans la base de données ; B, un script le fait apparaître dans une faction existante ; C, il se choisit à l'écran « Nouvelle campagne », et ce palier seul demande un startpos. Prérequis : son unité de bataille (procédure 1), son modèle, son portrait. Un exemple complet suit les trois procédures : le Duc écarlate, plus bas.

Un seigneur en trois paliersSans startposALa base de donnéesagent_subtypesunits_custom_battle_permissionset l'apparence, les compétences, les textes ;general_unit = 1 : pour la bataille personnaliséeIl se choisit en bataille personnalisée.BUn script?cm:spawn_character_to_poolpour une faction qui existe déjàà tester : non éprouvé dans Warhammer IIIPartie neuve : parmi les seigneurs à recruter.Avec un startpos régénéréCL'écran « Nouvelle campagne »start_pos_charactersstart_pos_starting_general_optionsfrontend_faction_leadersstartpos.esfet playable = 1 dans start_pos_factionsSa fiche paraît à l'écran de sélection.
Trois paliers : A, le seigneur existe dans la base ; B, un script le fait paraître dans une faction qui existe déjà (à tester) ; C, il se choisit à l'écran « Nouvelle campagne ». Seul le palier C demande un startpos régénéré.

Palier A : le seigneur dans la base de données§

  1. agent_subtypes : copiez un seigneur voisin (wh_dlc07_brt_alberic) ; auto_generate décoché pour un personnage unique, associated_unit_override = son unité, recruitment_category = legendary_lords, recruitable = 1 et cap = -1 (comme Alberic). Laissez magic_lore vide : rempli, avec legendary_lords, il peut masquer les autres seigneurs légendaires de la réserve de recrutement (wiki, page Agent subtypes tables).
  2. L'apparence : campaign_character_art_sets → campaign_character_arts (un id unique) → agent_uniforms → variants.
  3. Le portrait : Warhammer III le lit dans ui/portraits/portholes/portrait_settings*.bin, rangé par art set (pour Alberic, portrait_settings__3.bin, vignette de 300 × 164 : relevés sur les fichiers de CA, patch 8.1). Dans RPFM : Create… → Create Portrait Settings, puis son éditeur. Chez CA, campaign_character_arts.portrait reste vide.
  4. Les compétences : character_skill_node_sets (colonne agent_subtype_key), character_skill_node_set_items (set, item), character_skill_nodes (tier = colonne de l'arbre, indent = ligne), character_skills puis character_skill_level_to_effects_junctions, character_skill_node_links pour les flèches.
  5. faction_agent_permitted_subtypes (la faction, general, le sous-type) et names (de nouveaux id pour le prénom et le nom). Pour la bataille personnalisée : units_custom_battle_permissions avec general_unit = 1, general_portrait et general_uniform.
Palier A : la base de donnéesagent_subtypesclé : keyassociated_unit_override → main_unitsrecruitment_category = legendary_lordsauto_generate décoché : un personnage uniquecampaign_character_art_setsclé : art_set_idagent_subtype → agent_subtypescampaign_character_artsclé : iduniform → agent_uniformsagent_uniformsclé : uniform_namefilename, battle_filename → variantsui/portraits/portholes/portrait_settings*.binles réglages des portraits, par art setcharacter_skill_node_setsclé : keyagent_subtype_key → agent_subtypescharacter_skill_node_set_itemsclé : set + itemitem → character_skill_nodescharacter_skill_nodesclé : keytier : la colonne (sous 48) ; indent : la lignecharacter_skill_key → character_skillscharacter_skillsses effets :character_skill_level_to_effects_junctionsfaction_agent_permitted_subtypesclé : faction + agent + subtypeagent = generalla faction peut l'avoirnamesclé : idde nouveaux id pour le prénom et le nom ; leurs textes :names_name_<id>
Palier A : les tables du seigneur en arbre, de son sous-type à son apparence, son portrait, son arbre de compétences, sa faction et son nom.
TableÀ mettreCléLiens
agent_subtypesle sous-typekeyassociated_unit_override → main_units
campaign_character_art_setsl'art setart_set_idagent_subtype → agent_subtypes
campaign_character_artsl'apparence, par niveauiduniform → agent_uniforms
agent_uniformsles modèles de la carte et de la batailleuniform_namefilename, battle_filename → variants
character_skill_node_setsl'arbre de compétenceskeyagent_subtype_key → agent_subtypes
character_skill_node_set_itemsles nœuds de l'arbreset + item→ character_skill_nodes
character_skill_nodesla place d'une compétencekeycharacter_skill_key → character_skills
frontend_faction_leadersla fiche de l'écran de sélectionkey (libre)agent_subtype_record, faction
start_pos_starting_general_optionsle lien du personnage à sa ficheidgeneral → start_pos_characters.ID
L'arbre de compétences : une grilletier→ la colonne01234indentla ligne ↓012Ce nœud : tier = 2, indent = 1les flèches :character_skill_node_linksl'arbre du seigneur :character_skill_node_set_itemstier : sous 48 (wiki) ; au-delà, le nœud ne marche pas
Dans character_skill_nodes, tier donne la colonne d'un nœud et indent sa ligne (schéma de l'Assembly Kit) ; tier reste sous 48 (wiki). Les flèches viennent de character_skill_node_links.

Les textes du seigneur§

Le minimum viable du seigneur§

agent_subtypes, l'unité de bataille, l'art set, les arts, l'uniforme et la variante, faction_agent_permitted_subtypes, names, les textes, et un appel de script.

Palier B : le faire apparaître par script§

Sans startpos, un script peut ajouter le seigneur à une faction qui existe déjà. Ce squelette suit les signatures des scripts de CA, à tester :

-- squelette à tester : un seigneur dans la réserve d'une faction existante
cm:add_first_tick_callback(function()
  if cm:is_new_game() then
    cm:spawn_character_to_pool("wh_main_brt_bordeleaux", "names_name_<id>", "names_name_<id>",
      "", "", 30, true, "general", "<sous-type>", true, "<art set>")
  end
end)
Un appel, pièce par piècecm:spawn_character_to_pool(1"wh_main_brt_bordeleaux",La faction (elle existe)2"names_name_<id>",Le prénom (names)3"names_name_<id>",Le nom (names)4"",Le clan : vide5"",L'autre nom : inutilisé, vide630,L'âge7true,Masculin8"general",Le type d'agent9"<sous-type>",Votre sous-type10true,Immortel11"<art set>"Son art set)?À tester : squelette non éprouvé dans Warhammer III.cm:is_new_game() : l'appel n'a lieu qu'au début d'unepartie neuve
L'appel du palier B, argument par argument, dans l'ordre des scripts de CA : la faction, le prénom et le nom (des clés names_name_<id>), le clan, l'autre nom, l'âge, masculin, le type, le sous-type, immortel, l'art set. À tester.

Palier C : le choisir à l'écran « Nouvelle campagne »§

  1. start_pos_characters : le personnage (voir la procédure 2).
  2. start_pos_starting_general_options : general (le personnage) → frontend_faction_leader (sa fiche), plus precedence et exclude_other_options, obligatoires aussi. Sans cette table, aucun seigneur n'est choisissable.
  3. Une fiche frontend_faction_leaders, à la clé libre : character_image (portrait de 85 × 115, relevé sur ceux de CA au patch 8.1), uniform (scène .csc), video, loading_screen_image, agent_subtype_record, faction. Le schéma du kit (relu à la 9.0) en exige d'autres : voiceover, difficulty, show_full_intro_option, localised_description, frontend_description, startpos_map, override_force_location_x et _y : recopiez une fiche de CA et changez ce qui est à vous.
  4. start_pos_factions.playable = 1, puis le startpos régénéré.
Palier C : l'écran de sélectionstart_pos_factionsclé : IDplayable = 1start_pos_charactersclé : IDle personnage : voir la procédure 2start_pos_starting_general_optionsclé : idsans cette table, aucun seigneur n'est choisissablefrontend_faction_leadersclé : key (libre)startpos_map = defaultagent_subtype_record, factioncharacter_image (85 × 115)loading_screen_imageoverride_force_location_x/yune fraction de la carte ; −1 = par défautfactionsa factiongeneralle personnagefrontend_faction_leadersa fichePuis un startpos régénéré : seul ce palier en exige un.
Palier C : start_pos_starting_general_options relie le personnage du startpos à sa fiche frontend_faction_leaders (startpos_map = default), puis le startpos se régénère.

Les pièges du seigneur§

Le pointeur de l'écran de sélectionla carte de campagne, en hex0↔ largeur↕ hauteurxyoverride_force_location_x = x / largeuroverride_force_location_y = y / hauteurchez CA, Eltharion : 0,398 et 0,420−1 : la position par défaut ; un seigneur en garnison,sans réglage, reste dans le coin de l'onglet Carte.
override_force_location_x et _y placent le pointeur d'un seigneur sur la carte de l'écran de sélection : sa position en hex, divisée par la largeur de la carte pour x et par sa hauteur pour y (mesuré sur ce que grave le jeu ; la description du schéma de CA inverse les deux) ; −1 garde la position par défaut.

Vérifier que le seigneur marche§

  1. Diagnostics : ni art set ni variante non déclarés, aucune référence invalide.
  2. Palier A : en bataille personnalisée, il se choisit comme général de sa faction, avec son portrait et son uniforme.
  3. Palier B : dans une partie neuve de la faction, il figure parmi les seigneurs à recruter, ou à la tête de son armée. Sinon, lisez le journal des scripts : un fichier script/enable_console_logging non vide dans un pack chargé fait écrire au jeu des script_log_*.txt.
  4. Palier C : à l'écran « Nouvelle campagne », sa fiche paraît avec son portrait et sa description, son pointeur est à sa place sur l'onglet Carte, et la partie commence avec lui.

Exemple complet : le Duc écarlate, de sa faction à sa victoire§

Les trois procédures, appliquées à un vrai seigneur : le Duc écarlate, rendu jouable sur notre carte de la Saison de la Révélation le 23 septembre 2026, puis doté de mécaniques à lui avec la mise à jour 9.0. Le lore, le récit et le statut de chaque mécanique sont dans l'article du Duc ; ici, la technique, brique par brique : tables et colonnes, startpos, gestes dans RPFM, vérifications et pièges. Tout ce qui suit existe dans notre pack ; les chiffres sont des choix de conception, à régler en jeu.

Un seigneur jouablefactions · wh_main_vmp_mousillonune faction de CA : rien à créerbasestart_pos_factionsplayable = 1 · is_major = 1faction_potential · cai_personality_groupstartposstart_pos_characterssubtype = wh_dlc05_vmp_red_dukeministerial_position = faction_leaderle Duc, en garnison à Mousillonstartposstart_pos_starting_general_optionsgeneral → start_pos_charactersfrontend_faction_leader → sa fichestartposfrontend_faction_leaderscopie de la fiche de Mannfredcharacter_image · video · voiceover ·uniform (.csc)override_force_location_x/ybasestart_pos_land_unitsses armées de départstartposcampaign_to_agent_subtypescampaign_type = <votre campagne>agent_subtype = wh_dlc05_vmp_red_dukebasefaction_agent_permitted_subtypesses héros de la 9.0, permisbasemissionssaison_chronique_duc_1 … _5objectifs et récompenses : mission_managerscriptincidents · dilemmas9 annonces, 2 dilemmeslancés par le scriptscripteffect_bundles7 paquets : nom, icône, cibleles effets : le scriptscriptscript/campaign/<campagne>/*.luaduché perdu, faveur, impôt, traque, victoirescripttext/db/<mod>.loc<table>_<colonne>_<clé>
Ce qui fait le Duc écarlate jouable, rattaché à sa faction. Étiquette startpos : la table entre dans la position de départ, qu'il faut régénérer ; base : une ligne de table suffit ; script : la ligne donne un nom, une image, un texte, et le Lua décide quand et combien.

Sept briques, dans l'ordre où on les pose : la faction, le seigneur et sa fiche, ses unités, sa chronique, ses évènements, ses mécaniques, sa victoire. Pour chacune : ses tables et les colonnes qui comptent, ce qu'elle demande au startpos, le geste dans RPFM, la vérification, les pièges.

1. La faction : Mousillon, rendue jouable§

Le Duc mène Mousillon (wh_main_vmp_mousillon), une faction de CA, mineure aux Empires Immortels : la table factions a déjà sa ligne, rien à créer. Tout se joue dans les tables de départ (pour une faction neuve, c'est la procédure 2).

TableCe qui compteStartpos
start_pos_factionsplayable = 1, is_major = 1 ; faction_potential (ce que l'IA reçoit en aide) et cai_personality_group (chez nous, partis des valeurs des Empires)oui
start_pos_diplomacyles guerres et traités de départoui

2. Le seigneur légendaire et sa fiche§

Le Duc existe déjà dans la base de CA : son sous-type (wh_dlc05_vmp_red_duke), son unité, ses apparences et, à la 9.0, son trait inné et deux compétences uniques. Le palier A de la procédure 3 est donc fait ; restent ses liens avec la campagne et le palier C.

TableCe qui compteStartpos
campaign_to_agent_subtypescampaign_type = votre campagne, agent_subtype = son sous-type : CA déclare ainsi chaque seigneur légendaire des Empires (son schéma cite, par exemple, les formes du Changelin)non
start_pos_charactersle Duc : Type = general, subtype, ministerial_position = faction_leader, Name et Surname ; en garnison à Mousillonoui
start_pos_starting_general_optionsgeneral → le personnage, frontend_faction_leader → sa fiche, plus precedence et exclude_other_optionsoui
frontend_faction_leaderssa fiche : CA n'en a pas pour le Duc, qui n'est pas jouable aux Empires ; copie de celle de Mannfred, avec son portrait (character_image), sa vidéo (video), son doublage (voiceover), agent_subtype_record, faction, et une scène à nous (uniform, faite sur celle de Vlad) ; prelude_battle et loading_screen_intro_video vidésrégénéré chez nous
faction_agent_permitted_subtypesses trois héros de la 9.0 (Walach Harkon, Krell, Dieter Helsnicht) : les lignes de CA de wh_main_vmp_vampire_counts, recopiées sous Mousillonnon
La fiche de sélection du Duc écarlate dans RPFM
Dans RPFM : notre pack ouvert, l'arborescence dépliée jusqu'à db → frontend_faction_leaders_tables, et la table affichée à droite. Une ligne par seigneur jouable ; celle du Duc écarlate est sélectionnée. La colonne Uniform désigne la scène 3D de l'écran de sélection.

3. Ses unités, en bref§

Rien de neuf : ses troupes sont celles des Comtes Vampires de CA. Trois choses seulement le concernent : start_pos_land_units (ses armées de départ, startpos), faction_to_mercenary_set_junctions (ses régiments de renom ; le schéma du kit la marque pour le startpos) et les récompenses de sa chronique, qui donnent des unités par le script. Pour une unité à vous : la procédure 1.

4. Sa chronique : des missions à lui§

Cinq étapes : « Le Crac de Sang », « Le Sang d'Aquitanie », « Éteindre le phare », « Le Palais scellé », « La Croisade du Graal ». La première : tenir Derrevin Libre en 25 tours, pour 1 000 pièces d'or, une unité et un objet. La finale pose une armée bretonnienne à un lieu du lore, qui attend le Duc. Statut : première étape en essai ; les suivantes, testées hors jeu.

TableCe qui compteStartpos
missionsune ligne par étape : key, mission_type (le type de l'objectif principal, par exemple CONTROL_N_REGIONS_INCLUDING), ui_image, event_category = Military, sticky_by_default = 1, can_be_manually_cancelled = 0, generate = 0 ; copiée d'une mission narrative de CAnon
text/db/<mod>.locmissions_localised_title_<clé>, missions_localised_description_<clé> ; pour un objectif scripté, mission_text_text_<clé>non

Les objectifs et les récompenses ne sont pas dans la table : le script les pose, avec le mission_manager de CA. La première étape, en abrégé :

-- première étape de la chronique (abrégée)
local mm = mission_manager:new("wh_main_vmp_mousillon", "saison_chronique_duc_1");
mm:set_mission_issuer("CLAN_ELDERS");
mm:add_new_objective("CONTROL_N_REGIONS_INCLUDING");
mm:add_condition("total 1");
mm:add_condition("region wh_dlc05_aquitaine_derrevin_libre");
mm:add_payload("money 1000");
mm:set_turn_limit(25);
mm:trigger();
La chronique du Duc dans la table missions
La table missions de notre pack, filtrée sur « duc » (le champ de filtre en bas de la table) : les cinq missions de la chronique, chacune avec son type (contrôler des régions, vaincre des armées, bâtir…) et son titre.

5. Ses évènements : incidents et dilemmes§

Neuf incidents annoncent au joueur ce qui arrive au Duc (le tombeau de Galand, un domaine d'Aquitanie repris ou perdu, la faveur gagnée ou perdue, le décret de Richemont, un serment brisé…) ; deux dilemmes le font choisir : « L'impôt du sang » (lever l'impôt ou épargner les vilains) et « Le serment du sang » (lier un seigneur bretonnien par le sang, ou l'anéantir).

Le chemin d'un dilemmeRegionFactionChangeEventune région bretonnienne tombe au Duc joué : le scriptdécide de proposer le dilemme.1Les tables du dilemmeune ligne dans chacune, à votre clé ; deux choix, FIRST etSECOND ; option VAR_CHANCE à 0 : le jeu ne le tire jamaisseul.dilemmascdir_events_dilemma_choice_detailscdir_events_dilemma_option_junctions2Le script bâtit le dilemmeles charges de chaque choix : du Sang, un paquet d'effetssur la région.db = cm:create_dilemma_builder( "saison_duc_impot_du_sang")db:add_choice_payload("FIRST", pb)db:add_target("default", region)cm:launch_custom_dilemma_from_builder(db, duc)3La fenêtre paraîttitre, texte, image et boutons viennent des .loc et de laligne de dilemmas.4DilemmaChoiceMadeEventcontext:choice() : 0 pour FIRST, 1 pour SECOND ; le scriptfait le reste (cadavres, traque).Tables neuves dans un pack joué : un essai de démarraged'abord ; une table de trop a déjà fermé le jeu sansmessage.5Un incident : incidents etcdir_events_incident_option_junctions (GEN_TARGET_NONE,VAR_CHANCE 100), puis cm:trigger_incident(faction, clé,true). Sans charge : l'effet reste au script.
L'impôt du sang, du Duc écarlate : les tables donnent le texte, l'image et les deux choix ; le script décide quand le proposer, ce que coûte chaque choix et ce qui suit. Un incident suit le même chemin, plus court.
TableCe qui compteStartpos
incidentskey, localised_title, localised_description, ui_image, override_icon, generate = 0 ; copiée d'un incident de CA sans ciblenon
cdir_events_incident_option_junctionsdeux lignes : GEN_TARGET_NONE, et VAR_CHANCE = 100non
dilemmasles mêmes colonnes qu'incidents ; copiée d'un dilemme de CAnon
cdir_events_dilemma_choice_detailsune ligne par choix : dilemma_key, choice_key (FIRST, SECOND), localised_choice_label, localised_choice_titlenon
cdir_events_dilemma_option_junctionsGEN_TARGET_MODEL, et VAR_CHANCE = 0 : le jeu ne le tire jamais seul, le script le lancenon
Les incidents du Duc dans la table incidents
La table incidents : les annonces du Duc (le tombeau de Galand, un domaine repris ou perdu, la faveur gagnée ou perdue, la traque…), chacune avec son image (UI Image) et son icône ; Generate décoché, le script les déclenche.
Les deux dilemmes du Duc dans la table dilemmas
La table dilemmas : l'impôt du sang et le serment du sang. La description est le texte que le joueur lit avant de choisir ; les choix eux-mêmes vivent dans cdir_events_dilemma_choice_details.
Un dilemme que seul le script lance
La table cdir_events_dilemma_option_junctions : pour chaque dilemme, une cible (GEN_TARGET_MODEL) et VAR_CHANCE à 0. Le jeu ne le tire jamais au hasard : c'est le script qui le lance, au bon moment.

6. Ses mécaniques : paquets d'effets, ressources, scripts§

Les mécaniques du Duc tiennent en trois choses : des paquets d'effets à ses clés, les ressources des vampires de CA, et des scripts Lua. La règle qui en découle : la table donne ce qui s'affiche (nom, icône, cible, image, texte), le script décide quand et combien.

Une mécanique en trois tempsLe déclencheur, en LuaRegionFactionChangeEvent sur Château d'Épée, Derrevin Libreou Gien : le script compte les domaines d'Aquitanie du Duc,de 0 à 3.core:add_listener("mon_mod_duche", "RegionFactionChangeEvent", …)1Le paquet d'effetsla ligne de effect_bundles donne le nom, l'icône et lacible ; le script y met des effets de CA.b = cm:create_new_custom_effect_bundle( "saison_duc_depossede")b:add_effect( "wh_main_effect_force_stat_leadership", "faction_to_force_own", -4)cm:apply_custom_effect_bundle_to_faction( b, faction)Sans la ligne de effect_bundles dans le pack,create_new_custom_effect_bundle rend nil : rien n'estposé, sans erreur.2Le texteeffect_bundles_localised_title_saison_duc_depossede : « Ducdépossédé » ; un incident à votre clé annonce chaquechangement.En jeu : le paquet paraît dans les effets de lafaction, avec son nom et son icône.3
Le duché perdu du Duc écarlate : un écouteur Lua compte ses domaines, un paquet d'effets à sa clé reçoit des effets de CA, et ses textes le nomment. La table ne porte que le nom, l'icône et la cible ; les chiffres sont dans le script.
MécaniqueDéclencheurCe qu'elle fait
Le Baiser d'Abhorashle premier chargementle rituel de lignée des Dragons de sang de CA, accompli une fois (cm:perform_ritual)
Le duché perduRegionFactionChangeEvent sur ses trois domaines d'Aquitanieun paquet selon les domaines tenus : « Duc dépossédé » (aucun : commandement −4, ordre public −2), reconquête (un : commandement −2), rien (deux), « Le Duc restauré » (les trois : commandement +6, revenus +10 %, reconstitution +10 %)
La faveur d'AbhorashBattleCompleted, CharacterWithdrewFromBattleun paquet sur l'armée du Duc, en trois degrés (attaque et commandement +6, +8, +10) ; perdu s'il recule ou s'il perd, usé après 5 tours sans bataille
L'impôt du sangRegionFactionChangeEvent (une région bretonnienne prise)un dilemme : du Sang (+300) et des cadavres, ou de l'ordre public ; la traque avance ou recule
Le serment du sangFactionBeginTurnPhaseNormalun dilemme : un seigneur bretonnien réduit à une seule terre devient son vassal (deux au plus, trois duché restauré)
La traque de RichemontFactionBeginTurnPhaseNormaldès le tour 8, tous les 10 tours tant qu'il tient un domaine d'Aquitanie : une armée de Chevaliers de la Quête, de 10 à 18 unités selon le tour
Le tombeau de GalandFactionBeginTurnPhaseNormalune armée du Duc qui commence son tour au Pré de Ceren perd 15 % de ses effectifs
Le défi (codé, pas encore vu en jeu)FactionBeginTurnPhaseNormal, puis MissionSucceeded et MissionFaileddès le tour 6, un seigneur bretonnien en guerre et proche de lui le défie : une mission de 8 tours, sa chute (ELIMINATE_CHARACTER_IN_BATTLE) et une victoire du Duc en personne (objectif SCRIPTED) ; relevé : 1 500 or et du Sang (+150) ; dérobé : la faveur d'Abhorash brisée, chaque vassal peut rompre son serment (25 %)

Le défi est prévu et codé, mais pas encore vu en jeu : la priorité va d'abord à une version jouable. Il ne restera que s'il se montre utile en partie ; ses chiffres (délai, distance, récompenses) sont des choix de conception, à régler en jeu.

Les paquets d'effets du Duc dans la table effect_bundles
La table effect_bundles : les paquets du Duc (clés saison_duc_…), avec la description que le joueur lit. La table dit ce qui s'affiche ; le script décide quand le poser et quels effets il porte.
Le dilemme de l'impôt du sang, construit par le script
Le script du Duc (saison_duc.lua), ouvert dans RPFM : la fonction qui construit le dilemme de l'impôt du sang. Elle crée le dilemme par sa clé de table, prépare pour chaque choix un paquet d'effets et une charge de Sang, puis le lance pour le Duc. La table donne les textes ; le script, le moment et les effets.

7. Sa victoire§

CA ne donne pas de liste de victoire au Duc écarlate. La sienne suit le format de la 9.0 : une victoire courte et une longue, récompensées sans finir la partie ; seule la domination (27 de nos 57 colonies, la proportion des Empires) la termine. Statut : en essai.

Aucune table neuve, aucun startpos : le moteur de victoire de CA (victory_objectives_config.lua) est chargé depuis son dossier, jamais recopié, et sa liste des Empires remplacée par la nôtre, écrite avec ses propres générateurs d'objectifs. La courte :

-- la victoire courte du Duc écarlate
short = {
  objectives = {
    generate_CONTROL_N_PROVINCES_INCLUDING_objective({"wh_dlc05_aquitaine"}, 1),
    generate_SCRIPTED_MISSION_objective("saison_victoire_duc_tombeau",
      "mission_text_text_saison_victoire_duc_tombeau"),
    generate_PERFORM_RITUAL_BY_CATEGORY_objective("VAMPIRE_PROVINCE", 5,
      "mission_text_text_wh3_dlc29_vmp_use_shyish_actions")
  },
  payloads = {effect_bundle = "wh3_dlc29_bundle_ie_victory_objective_vmp_lair_builder"}
}

Récapitulatif : startpos ou pas§

Le Duc écarlate : startpos ou pas ?Il faut le startposFaction jouable et majeurestart_pos_factionsLe Duc, chef de faction engarnisonstart_pos_charactersLe lien à sa fiche desélectionstart_pos_starting_general_optionsSes armées de départstart_pos_land_unitsGuerres et traités de départstart_pos_diplomacyRégiments de renomfaction_to_mercenary_set_junctionsBase ou script, sansstartposSeigneur déclaré pour lacampagnecampaign_to_agent_subtypesHéros permisfaction_agent_permitted_subtypesChroniquemissionsAnnonces et choixincidentsdilemmasMécaniqueseffect_bundlesDuché, faveur, impôt, traque,victoire : scripts LuaSa fiche (frontend_faction_leaders) n'a pas l'indicateurdu startpos ; chez nous, le startpos est quand mêmerégénéré après chaque changement de fiche.
Colonne de gauche : les tables dont le schéma de l'Assembly Kit marque un champ requires_startpos_reprocess ; elles ne comptent qu'une fois le startpos régénéré. Colonne de droite : une reconstruction du pack suffit.

Dans RPFM, les deux familles ne vont pas au même endroit : les tables start_pos_* dans le pack qui sert à générer le startpos (retirées du mod publié), le reste dans le mod lui-même. Tables neuves dans un pack joué : un essai de démarrage avant toute annonce. La génération : section suivante, et le guide des outils.

Ce qui exige un nouveau startpos§

Startpos ou script ?Empires Immortels et Royaumes du Chaos : passez par Mixer ;un seul startpos par campagne.Il faut le startposFactions jouables, ou quiapparaissent en cours departieTypes d'agents d'une cultureEmplacements de monumentsPotentiel des factionsNon-agression et accèsmilitaireUn identifiant (CQI) fixepour le chef : pour unebataille de quêteNoms proposés au recrutementScript ou baseRégiments de renomcm:add_unit_to_faction_mercenary_poolRégion, chef, armée, objets :Campaign Custom Startscm:create_force_with_generalcm:transfer_region_to_factionPointeur de l'écran desélectionoverride_force_location_x/yArbre de technologies : nœudsà colonne faction, plus unscriptFonctions d'une faction,horde ou non (feature forest)cm:add_or_remove_faction_featuresEn base seule : unités, sous-types, apparences,compétences, textes, la table factions.
Le startpos enregistre le tour 0 : ce qu'il contient ne change que s'il est régénéré, et un mod le remplace en entier. D'après la page Startpos du wiki : à gauche, ce qui l'exige ; à droite, ce qu'un script ou la base font sans lui.

Le startpos est la sauvegarde du tour 0 : ce qu'il enregistre ne change que si on le régénère. Le schéma de l'Assembly Kit marque d'un indicateur, requires_startpos_reprocess, les colonnes qui y entrent : lisez-le dans TWaD_<table>.xml. Au patch 8.1, 42 tables en portent un :

Unités, sous-types, apparences, compétences, textes et table factions se modifient en base de données seule. Trois voies produisent un startpos : Build Startpos de RPFM, l'action Process start pos de BOB, ou un user.script.txt écrit à la main. Chez nous, seule l'écriture à la main a marché : notre génération lit deux packs, et Build Startpos n'en charge qu'un (le guide des outils). La consigne de RPFM 5.0.6 range pourtant Warhammer 3 parmi les jeux où Build Startpos marche : pour un mod d'un seul pack, essayez-le d'abord.

Build Startpos, dans RPFM§

Clic droit sur la racine du pack → Build Startpos fait générer le startpos par le jeu lui-même (dans la palette, Ctrl+Shift+P : « Build Startpos »).

Build StartposLes tables de départ dans le packà créer, ou à importer de l'Assembly Kit par le panneauDependencies.start_pos_*campaigns1Le pack ouvert depuis le dossier data du jeuSave Pack As… dans data, ou PackFile → Open From Data ;sinon RPFM refuse.<jeu>\data\<mod>.pack2Clic droit sur la racine → Build Startposchoisir la campagne ; Process HLP and SPD data : pour unecarte neuve seulement.Avec cette case, durée très variable : RPFM compte de 10 à 30minutes, tw-modding bien plus d'une heure pour une grande carte.3Bouton Build Startpos : le jeu se lance, génère, serefermeSteam ouvert ; Play dans le lanceur si besoin.RPFM a d'abord écrit votre user.script.txt (l'ancien, gardé en.bak) ; la troisième ligne, seulement avec Process HLP and SPDdata :mod <mod>.pack;process_campaign_startpos <campagne>;process_campaign_ai_map_data;quit_after_campaign_processing;4Ne fermez pas RPFM ici.Hit this when the game is closedRPFM range startpos.esf (et les fichiers hlp et spd) dansle pack et remet votre user.script.txt.campaigns/<campagne>/startpos.esf5Ctrl+S, puis une campagne neuvele pack est déjà dans data.Avant de publier : retirez du pack les tables start_pos_*.6
Build Startpos fait générer le startpos par le jeu lui-même, à partir des tables de départ du pack ouvert depuis data. Ne fermez pas RPFM avant le clic de l'étape 5 : il range startpos.esf dans le pack et remet votre user.script.txt, sans quoi le jeu se refermerait à chaque lancement.
  1. Mettez dans le pack les tables start_pos_* et campaigns : créez-les, ou importez-les de l'Assembly Kit par le panneau Dependencies. La consigne affichée par RPFM réclame aussi db/victory_objectives.txt, mais pas pour Warhammer III (code de RPFM ; journal des changements, version 4.3.11).
  2. Le pack ouvert doit être enregistré dans le dossier data du jeu (Save Pack As…, ou PackFile → Open From Data) : sinon RPFM refuse.
  3. Clic droit sur la racine du pack → Build Startpos ; choisissez la campagne (la liste vient de votre table campaigns : une campagne dont la ligne campaigns n'est que dans le kit n'y figure pas). Ne cochez Process HLP and SPD data (les données de carte de l'IA, hlp_data.esf et spd_data.esf) que pour une carte neuve ; RPFM crée lui-même le dossier <jeu>\data\campaign_maps\<carte>\ où le jeu les écrit (à la main, créez-le avant la génération, sinon ni hlp ni spd). Durée très variable : de 16 à 22 s chez nous (400 × 440 et 560 × 905 hex, génération par un user.script.txt écrit à la main, qui lance le même traitement) ; le tutoriel de carte de campagne de tw-modding compte moins d'une minute pour spd, environ cinq minutes pour hlp sur une carte moyenne et bien plus d'une heure sur une grande ; RPFM compte de 10 à 30 minutes.
  4. Cliquez Build Startpos : RPFM écrit dans user.script.txt la ligne mod du pack ouvert et process_campaign_startpos <campagne> <sous-départ>; (ce second argument reste vide pour Warhammer III), puis le jeu se lance par Steam (cliquez Play dans le lanceur si besoin), génère et se referme tout seul. Ne fermez pas RPFM entre-temps.
  5. Une fois le jeu refermé, cliquez Hit this when the game is closed : RPFM range campaigns/<campagne>/startpos.esf (et, si l'option était cochée, les fichiers hlp et spd) dans le pack, et remet votre user.script.txt comme avant ; il laisse à côté une copie, user.script.txt.bak.
  6. Enregistrez le pack (Ctrl+S), puis lancez une campagne neuve.

Une précision : on écrit les tables start_pos_* dans le kit (Dave) ou dans RPFM, mais le jeu ne lit pas les XML du kit ; pour la génération, elles doivent donc être dans un pack chargé (pour Build Startpos, le pack même qu'il génère). Une fois le startpos produit, retirez-les du pack publié : elles ne servent plus. Chez nous, le jeu valide à chaque lancement les tables start_pos_* d'un pack de mod, et %APPDATA%\The Creative Assembly\Warhammer3\crash_report\bad_mods_report.txt nomme alors l'enregistrement fautif.

RPFM pour une IA : le serveur MCP§

Depuis sa version 5, RPFM a un serveur, rpfm_server.exe. Il parle MCP (Model Context Protocol), la prise standard des assistants IA : une IA branchée dessus ouvre les packs, lit et écrit les tables, cherche partout et lance les diagnostics, dans sa propre session, séparée de la fenêtre de RPFM.

  1. Si la fenêtre de RPFM est ouverte, son serveur tourne déjà : elle le lance elle-même. Sinon, lancez rpfm_server.exe sans argument (il n'a pas d'option --help : il démarre aussitôt). Il écoute sur 127.0.0.1:45127 et s'arrête quand la dernière session est fermée (une connexion WebSocket coupée garde sa session cinq minutes ; depuis la 5.1.0, une session MCP inactive cinq minutes est fermée).
  2. Branchez votre assistant sur http://127.0.0.1:45127/mcp (Streamable HTTP). Avec Claude Code : claude mcp add --transport http rpfm http://127.0.0.1:45127/mcp. Tout client MCP compatible Streamable HTTP convient.
  3. Demandez-lui de lire d'abord la ressource « Initialization guide » du serveur : elle décrit l'ordre des appels (choisir le jeu, vérifier le schéma, ouvrir le pack).
Une IA branchée sur RPFMUne session par connexionl'IA ne voit pas vos packsouverts.La fenêtre de RPFMvos packs ouvertsrpfm_server127.0.0.1:45127L'assistantvotre IA/ws/mcpStreamable HTTPPour le startposDemander à l'humain avant de lancer le jeu.build_starpos« Success » = jeu lancéattendre que le jeu se refermebuild_starpos_postrange startpos.esf, remet user.script.txtsave_packfilepour abandonner : build_starpos_cleanup
La fenêtre de RPFM lance elle-même rpfm_server ; l'assistant s'y branche par /mcp et reçoit sa propre session : il ne voit pas les packs ouverts dans la fenêtre. Pour le startpos, build_starpos ne fait que lancer le jeu ; build_starpos_post range le fichier.
set_game_selected   (warhammer_3, rebuild_dependencies: true)
→ is_schema_loaded            (sinon update_schemas)
→ open_packfiles              (rend le pack_key)
→ open_pack_info              (l'arbre du pack)
→ decode_packed_file          (ex. db/land_units_tables/<fichier>)
→ fields_processed            (la forme des lignes)
→ save_packed_file_from_view
→ diagnostics_check
→ save_packfile

Pour une IA qui lit cette page§

Pour une IA qui aide à modder Total War: Warhammer III avec RPFM, l'essentiel en faits vérifiables, relevés sur RPFM 5.0.6 et le patch 8.1 du jeu (septembre 2026), relus pour la mise à jour 9.0, puis corrigés le 5 octobre 2026 (RPFM 5.1.0 et 5.1.1, jeu en 9.0.2) : à revérifier après une mise à jour (schémas, cache des dépendances ; et, si l'Assembly Kit sert aussi, les lignes ajoutées à raw_data\db, que Steam réécrit).

Sources et liens§

Questions fréquentes

Quelle version de RPFM utiliser pour Warhammer III ?

La dernière. Ce guide a été écrit sur la 5.0.6 (sortie le 1er août 2026), dont il suit les menus ; depuis sont sorties la 5.1.0 (28 septembre) et la 5.1.1 (4 octobre), qui corrigent la fuite de mémoire des sessions MCP et l'ordre des clés de twad_key_deletes depuis la 9.0. Le manuel en ligne décrit la 5.1, parfois avec d'autres libellés que la fenêtre : la palette (Ctrl+Shift+P) retrouve l'action par son nom.

Mon mod fait planter le jeu au lancement : que vérifier ?

Les diagnostics de RPFM (Check PackFile). Une référence invalide est l'une des premières causes de plantage au lancement, et un champ obligatoire vide peut faire planter le jeu, souvent sans message d'erreur.

Faut-il un nouveau startpos pour ajouter une unité ?

Non. Seules les armées et garnisons de départ et les réserves de mercenaires l'exigent, et un script peut s'en charger (cm:create_force_with_general, cm:add_unit_to_faction_mercenary_pool).

Peut-on ajouter une faction sans toucher au startpos ?

Non : tout ce qui la fait exister passe par le startpos, dont chaque campagne n'a qu'un exemplaire, qu'un mod remplace en entier. Votre mod sera donc incompatible avec tout autre mod de startpos de cette campagne. Pour les Empires Immortels et les Royaumes du Chaos, demandez plutôt l'ajout de votre faction à Mixer, le mod de startpos de la plupart des joueurs, puis faites le reste par script.

Pourquoi mon unité n'apparaît-elle pas en bataille personnalisée ?

Il lui faut main_units, land_units, unit_variants, sa carte (PNG de 60 × 130), son nom en .loc et une ligne units_custom_battle_permissions pour la faction de bataille, avec general_unit à 0.

Comment rendre jouable un seigneur légendaire de CA qui ne l'est pas ?

Comme le Duc écarlate : sa faction jouable et majeure (start_pos_factions), le personnage dans start_pos_characters, une fiche frontend_faction_leaders (copie d'une fiche voisine) reliée par start_pos_starting_general_options, son sous-type déclaré pour la campagne (campaign_to_agent_subtypes), ses héros permis (faction_agent_permitted_subtypes), puis un startpos régénéré. Ses mécaniques viennent ensuite : missions, incidents, dilemmes et paquets d'effets à vos clés, menés par des scripts Lua.

Comment rendre un seigneur choisissable à l'écran de nouvelle campagne ?

Le personnage dans start_pos_characters, une ligne start_pos_starting_general_options qui le relie à une fiche frontend_faction_leaders (startpos_map à default), start_pos_factions.playable à 1, puis un startpos régénéré.

Mes textes remplacent ceux du jeu dans toutes les langues : pourquoi ?

Le jeu charge les .loc d'un mod quelle que soit la langue du joueur. N'ajoutez que des clés neuves, et faites un pack par langue.

Comment brancher une IA sur RPFM ?

Si la fenêtre de RPFM est ouverte, son serveur tourne déjà ; sinon, lancez rpfm_server.exe (RPFM 5). Ajoutez ensuite le serveur MCP http://127.0.0.1:45127/mcp à votre assistant ; avec Claude Code : claude mcp add --transport http rpfm http://127.0.0.1:45127/mcp.

Mon mod n'apparaît pas dans le lanceur : pourquoi ?

Vérifiez qu'il est installé dans le dossier data du jeu et qu'il est de type Mod : clic droit sur la racine du pack, Change PackFile Type, Mod. Dans le même sous-menu, la case Index Includes Timestamp doit être décochée : selon RPFM, un pack qui l'a cochée n'apparaît pas dans le lanceur officiel.

Ma modification d'une unité du jeu ne change rien : pourquoi ?

Votre fichier de table ne passe sans doute pas devant celui du jeu (data__). Le choix sûr : commencez le nom de votre fichier par @ ou !, gardez la clé de la ligne du jeu, puis réinstallez le pack.

Des tables sont signalées Outdated après une mise à jour du jeu : que faire ?

Mettez à jour les schémas (About, Check Updates), puis le cache (Game Selected, Generate Dependencies Cache). Ensuite, clic droit sur chaque table signalée, Update Table, et relisez les colonnes neuves : RPFM y met des valeurs par défaut.

Comment retirer une ligne du jeu ?

Avec la table twad_key_deletes (Warhammer III, depuis le patch 6.3), jamais en recopiant la table du jeu : créez une fois twad_key_deletes_tables dans votre pack, sélectionnez les lignes dans la table du jeu, puis clic droit, Add Selection to Key Deletes. Ne retirez pas une ligne encore citée par une autre table : le jeu planterait. Depuis la 9.0, RPFM 5.0.6 écrit à l'envers la clé de land_units_to_unit_abilites_junctions : prenez la 5.1.0 ou plus, ou écrivez-la à la main, et vérifiez en jeu.

Le jeu se ferme dès son lancement : pourquoi ?

Une ligne quit_after_campaign_processing; est restée dans user.script.txt (%APPDATA%\The Creative Assembly\Warhammer3\scripts) : une génération de startpos a été interrompue avant sa fin. Retirez la ligne ou remettez le fichier d'avant. Avec Build Startpos, cliquez toujours Hit this when the game is closed, qui le remet. S'il se ferme en quelques secondes sans rapport ni mp_log : une table *_ownership_content_pack_junctions pour une clé à vous ? Retirez-la ; sinon, retirez une table à la fois sur une copie du pack.

Ce guide en texte brut (Markdown), pour les IA et la lecture hors ligne

Ce guide est communautaire

Une erreur, un piège vécu, une astuce ou un outil plus récent : dites-le, et chaque correction sera vérifiée, puis ajoutée avec sa source.

↑ Sommaire