Atlas de Bretonnie

Journal de l'atelier · · 12 min de lecture

Rendre jouable le Duc écarlate : du lore aux tables du jeu

Dans la mini-campagne de Warhammer I, seuls Orion et Durthu étaient jouables. Dans notre portage, le Duc écarlate l'est depuis le 23 septembre, et la refonte des vampires de la 9.0 nous a permis de lui donner des mécaniques à lui. Voici lesquelles, où elles en sont, et la technique : tables, Lua, textes, pack et essais.

Une forêt sombre et bleutée où avancent des guerriers morts-vivants en armure ; à droite, une créature livide à l'œil rouge.
Les Comtes Vampires, d'où vient le Duc écarlate. Illustration tirée du jeu (Creative Assembly, Games Workshop).

Le point de départ : un duc sans son duché

Le Duc écarlate, the Red Duke en anglais, vient du lore de Games Workshop. Ancien duc d'Aquitanie devenu vampire, il fut vaincu à la première bataille du Pré de Ceren et emmuré dans une tour de marbre ; libéré, il revint pour la seconde, où le tombeau de son fils Galand le mit en fuite.

Sources : le livre d'armée Vampire Counts (7e édition), le roman The Red Duke de C. L. Werner, Circle of Blood et Knights of the Grail.

Le Duc écarlate, en armure rouge, debout sur des ruines qui dominent une vallée et une rivière.
« Le Crac de Sang », l'illustration de la première mission de sa chronique : le Duc sur les ruines qui dominent son ancien duché. Une des images d'évènement de notre mod, au format du jeu (800 × 450).

D'après les données de départ de Warhammer I, il est déjà dans la Saison, chef de Mousillon, une faction de l'IA en guerre contre Bastogne ; on ne pouvait pas le jouer. Or, dans le lore, son pays est l'Aquitanie : Mousillon est le choix de CA, qui ne rend pas cette faction jouable.

Jouable le 23 septembre, repensé avec la 9.0

Le 23 septembre à 5 h 15, j'ai demandé quatre seigneurs de plus à l'écran de sélection, dont le Duc ; à 5 h 47, ils y étaient. Sa fiche de sélection est une copie de celle de Mannfred, colonnes remplacées. Sa scène est à lui, faite sur celle de Vlad (épée et bouclier, comme le Duc), avec le modèle du Duc à la place.

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.

Jouable ne veut pas dire captivant. Le jour même, j'ai demandé qu'une session de Claude s'en charge après la 9.0, pour « que le Duc rouge s'intègre bien dans tout ça, avec ses propres mécaniques, ses propres quêtes, ses propres objectifs ». Méthode : le lore sourcé d'abord, les propositions ensuite, et je choisis.

Il part de Mousillon avec Château Rachard, Martel et Yremy, en guerre contre Bastogne et, depuis le 24 septembre, contre l'Aquitanie : Richemont d'Aquitanie a ordonné qu'on le traque dans toute la Bretonnie, un ordre toujours valable (The Red Duke ; Knights of the Grail).

Avec Bastogne, la paix est bloquée quinze tours puis rouverte, comme entre Kemmler et Parravon : l'IA signait la paix vers le tour 6 et ne se battait plus (codé mais pas encore vu en jeu).

Depuis la 9.0, il a la refonte des Comtes Vampires : repaires, lignées, cadavres et Décrets de sang. Son premier repaire est à Derrevin Libre, dans son ancien duché, au pied des ruines du Crac de Sang (lieu du roman, placé sur notre carte par le projet).

Ses technologies sont celles des seigneurs vampires de CA, avec des seuils en cadavres divisés par deux, notre carte étant bien plus petite que les Empires Immortels. Et le Baiser d'Abhorash (The Red Duke) : sa faction commence avec un niveau de la lignée des Dragons de Sang.

Tout ce socle est en essai : codé et vu dans des essais automatiques courts (2 à 5 tours). Nouveau, codé mais pas encore vu en jeu : deux autres repaires, tirés au hasard, le Duc servi en premier.

Ses mécaniques, une par une

Les mécaniques du Duc tiennent en scripts Lua, paquets d'effets, dilemmes, incidents et missions. Leurs chiffres sont des choix de conception, à régler en jeu : aucune partie longue n'est jouée, l'équilibrage n'est pas mesuré.

Sa chronique et ses victoires

La chronique : cinq missions, du Crac de Sang à la Croisade du Graal, en passant par Albéric et le palais scellé de Mousillon. Première étape en essai ; les suivantes, testées hors jeu.

La chronique du Duccinq missions, dès le tour 2Le Crac de SangPrendre Derrevin Libre, en 25 tours. Récompense : 1 000 or,des Chevaliers de Sang et la lame qu'il portait jadis.1Le Sang d'AquitanieUne armée d'Aquitanie l'attend. Briser deux arméesbretonniennes et prendre Château d'Épée, en 35 tours.2 500 or, des Chevaliers de Sang.2Éteindre le pharePrendre Turris Vigilans et abattre Albéric en bataille, en40 tours. 3 000 or.3Le Palais scelléÉlever une de ses cités au plus haut rang, en 50 tours.3 000 or.4La Croisade du GraalLa finale : une croisade bretonnienne se rassemble à TurrisVigilans ; l'écraser. 6 000 or, deux Chevaliers de Sang, unTerreurgheist.5?Étape 1 : en essai. Étapes 2 à 5 : testées hors jeu. Une étape échouéepasse aussi à la suivante.
Sa chronique, du Crac de Sang à la Croisade du Graal : l'objectif, le délai et la récompense de chaque mission. Les objectifs et les récompenses sont posés par le script ; la table missions ne donne que le titre, le texte et l'image.

Les victoires : la courte, reprendre la province d'Aquitanie, y bâtir le Tombeau du Duc écarlate, à Gien, et utiliser cinq fois les Décrets de sang. La longue : dix Décrets de sang, deux seigneurs de lignée éveillés dans des repaires, l'Aquitanie et Quenelles détruites, le palais scellé de Mousillon rouvert et la finale de sa chronique.

Elles récompensent sans finir la partie : seule la domination (27 des 57 colonies) la termine. En essai.

Son duché et sa faveur

Le duché perdu : un paquet d'effets selon les domaines d'Aquitanie qu'il tient (Château d'Épée, Derrevin Libre, Gien), de « Duc dépossédé » sans aucun à « Le Duc restauré » avec les trois. Lore : il reprend son duché à ceux qu'il nomme usurpateurs (The Red Duke). En essai : le niveau « Duc dépossédé » s'applique dans les essais automatiques du 25 septembre ; la reconquête et le duché restauré ne sont pas encore vus.

La faveur d'Abhorash : la Bénédiction de la Dame de CA, retournée. Quand le Duc gagne une bataille qu'il mène, surtout une victoire héroïque, son armée gagne attaque et commandement, en trois degrés ; la faveur se perd s'il recule ou s'il est battu, et s'use sans bataille. Lore : le code d'honneur des Dragons de Sang (Vampire Counts, 6e édition). Codé mais pas encore vu en jeu.

Son duché, sa faveurLe duché perduChâteau d'Épée, Derrevin Libre, GienDuc dépossédécommandement −4, ordre public −2La reconquête de l'Aquitaniecommandement −2aucun paquetplus de malusLe Duc restaurécommandement +6, revenus +10 %, reconstitution +10 %toute sa faction, qu'il soit joué ou nonLa faveur d'Abhorashl'armée du Duc joué, quand il la mène3+10 attaque, +10 commandementune nouvelle victoire héroïque contre un seigneur ; un incidentl'annonce2+8 attaque, +8 commandementune victoire héroïque contre une armée menée par un seigneur1+6 attaque, +6 commandementune victoire qu'il mène : héroïque, à coup sûr ; décisive, 20 % ;serrée, 10 %Elle se perdToute, s'il recule, s'il est battu, au Pré de Ceren ou s'ilse dérobe à un défi.Un degré, après 5 tours sans bataille qu'il mène.Duché : en essai (« dépossédé » vu) ; faveur : codée, pas encore vue.
En haut, le duché perdu : un paquet d'effets sur toute sa faction selon les domaines d'Aquitanie qu'il tient. En bas, la faveur d'Abhorash : trois degrés sur l'armée qu'il mène, gagnés par la victoire, perdus par le recul.

Ce qui le traque

L'ordre de Richemont : l'Aquitanie lui fait la guerre, sans paix possible. S'il prend un domaine d'Aquitanie, des Chevaliers de la Quête arrivent trois tours plus tard ; puis, dès le tour 8, tous les dix tours tant qu'il en tient un, de 10 à 18 unités selon le tour. Codé mais pas encore vu en jeu.

La traque de Richemontle Duc joué, s'il tient un domaine d'Aquitanie10 unités14 unités18 unitésarmée :05101520253035tour?818286une armée de Chevaliers de la Quête, du Graal et d'autreschevaliers, avec des pèlerins : dès le tour 8, puis tousles 10 tours?le défi : dès le tour 6, un seigneur bretonnien proche ledéfie (codé, pas encore vu en jeu)Ce qui la déplaceIl prend un domaine d'Aquitanie→ les chevaliers arrivent 3 tours plus tardIl lève l'impôt du sang→ la prochaine traque avance de 3 toursIl épargne les vilains→ elle recule de 2 toursUne traque passe→ chaque vassal du sang peut rompre son serment (30 %)Avec l'Aquitanie, aucune paix possible.
La traque, sur une partie sans autre évènement : des Chevaliers de la Quête dès le tour 8, puis tous les 10 tours, en armées de plus en plus grandes. Ses choix la hâtent ou la retardent. Codé, pas encore vu en jeu ; chiffres à régler en jeu.

Le tombeau de Galand : chaque tour passé sur le Pré de Ceren, au pied de Gien (emplacement estimé, faute de source), ses unités perdent 15 % de leurs effectifs, et un incident illustré l'annonce. Codé mais pas encore vu en jeu.

Le Duc écarlate recule, un bras levé, devant la lumière d'une chapelle ; autour de lui, ses squelettes tombent en poussière.
L'illustration de l'incident « Le tombeau de Galand » : devant la chapelle du Graal, ses morts tombent en poussière ; au loin, sur la colline, la tour où il fut emmuré.

Le défi : dès le tour 6, un seigneur bretonnien proche le défie ; le Duc a huit tours pour le vaincre en personne, et se dérober brise sa faveur. Il est codé, pas encore vu en jeu : la priorité va d'abord à une version jouable. Il est prévu, et ne restera que s'il se montre utile en partie.

Ses choix et ses serviteurs

L'impôt et le serment du sang : deux dilemmes. À chaque région bretonnienne prise, lever l'impôt (du Sang et des cadavres, mais la traque se hâte) ou épargner les vilains. Un seigneur bretonnien réduit à une seule terre peut devenir son vassal par le sang, et lui verser chaque tour une dîme.

Garde-fous, pour un Duc « pas overcheaté » : deux vassaux au plus (trois, duché restauré), jamais l'Aquitanie, des serments qui peuvent se briser, de l'ordre public en moins par vassal. L'impôt vient du lore ; les vassaux en sont inspirés. Codé mais pas encore vu en jeu.

Objets et héros : ses deux objets de CA de la 9.0, « Armures de sang » et « Le joyau de la non-vie », en montant de rang ; trois héros légendaires permis, Walach Harkon, Dragon de Sang comme lui, Krell et Dieter Helsnicht. Codé mais pas encore vu en jeu.

Technique 1 : des lots Python aux tables du jeu

Tout ce que le jeu lit dans sa base passe chez nous par des « lots » : des fonctions Python rejouables qui écrivent dans les tables XML de l'Assembly Kit, le kit officiel de CA. Elles recopient une ligne de CA sous nos clés, ou font une ligne neuve sur son modèle. Rien n'est réécrit, tout est sauvegardé avant écriture.

Du lot au jeuLe lot Pythonune fonction rejouable : elle recopie une ligne de CA sousune clé à nous, saison_duc_…donnees_campagne.pytables_gameplay.pyL'Assembly Kitle kit officiel de CA : ses tables en XML ; sauvegardeavant chaque écritureraw_data/dble modle départLes tables du modbuild_pack.py piloterpfm_server : nos lignes,dans l'ordre du schéma du jeueffect_bundlesdilemmasincidentsmissionsLes tables de départstart_pos_* : dans un pack àpart, jamais dans le modzz_startpos_db.packLe jeu génère le startposcompteur de sauvegarde à 1 ;structure comparée à laprécédentestartpos.esfLe pack du modles tables, le startpos, les scripts Lua, les textes, lesimagessaison_des_revelations.packL'essai en jeuune table neuve dans un pack joué : un essai de démarrageavant toute annonceUne table de trop a déjà fermé le jeu sans message.
Une ligne de table, du lot Python au jeu. Le lot écrit dans le kit ; puis deux chemins : les tables du mod partent dans le pack par RPFM, les tables de départ servent au jeu à générer le startpos, qui rejoint ensuite le pack.

Règle d'or : des clés à nous, jamais une table de CA remplacée, pour que les campagnes coexistent, mod actif. Le 23 septembre, deux tables de CA remplacées ont fait planter une infobulle. Tout ce qui est au Duc commence par saison_duc_. Ses lots :

  • 13 : faction_to_mercenary_set_junctions, ses régiments de renom.
  • 17 : armées de départ, trésor, second seigneur (tables start_pos_*).
  • 31 : les deux factions de soutien des vampires de la 9.0 et les héros uniques de notre campagne (campaign_to_agent_subtypes).
  • 33 : faction_agent_permitted_subtypes, qui permet Walach Harkon, Krell et Dieter Helsnicht à Mousillon ; sans ces lignes, les technologies qui les donnent ne donnaient rien au Duc joué.
  • 34 : effect_bundles, sept paquets d'effets à nos clés ; leurs effets, ceux de CA, sont posés par le script.
  • 35 : dilemmas et ses tables de choix et d'options.
  • 32 et 37 : incidents, les neuf annonces du Duc, sans cible ni charge : les effets restent au script.

Un second fichier dit au pack quelles lignes prendre (table du kit, table du jeu, colonne, préfixe) :

TABLES_LOT34 = [
    ('effect_bundles', 'effect_bundles_tables', 'key', 'saison_duc_'),
]

Technique 2 : RPFM et le pack

RPFM, le Rusted PackFile Manager de Frodo45127, est l'outil communautaire des packs ; depuis sa version 5, son serveur sans fenêtre, rpfm_server, expose ses fonctions à une IA.

Notre build_pack.py le pilote : il lit nos lignes dans le kit et les recopie dans l'ordre du schéma du jeu, qui fait foi (colonne absente : valeur vide ; colonne en trop : abandonnée). Piège : RPFM veut les lignes au format « traité », une couleur en une seule valeur.

Il vérifie aussi la syntaxe de chaque script Lua, car une erreur fait échouer tout le chargement de la campagne, et refuse tout fichier qui prendrait la place d'un fichier de Warhammer III.

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.

Technique 3 : les tables de départ et le startpos

Un seigneur devient jouable surtout dans le startpos, la position de départ. Pour le Duc : start_pos_factions (faction jouable et majeure), start_pos_characters, start_pos_starting_general_options (le lien avec sa fiche) et start_pos_land_units.

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.

Ces tables ne partent jamais dans le mod : un pack à part sert à la génération, et c'est le jeu qui fabrique le startpos. La recette :

  1. Le lot écrit dans le kit ; les tables de départ passent dans le pack de génération.
  2. Validation : aucune cellule à corriger ; pack reconstruit.
  3. Le jeu génère le startpos.
  4. Contrôles : compteur de sauvegarde à 1 (sinon chaque partie neuve se prend pour une sauvegarde), structure comparée à la précédente.
  5. Le startpos entre dans le pack ; puis l'essai.

Détails et pièges : le guide des outils. Le Duc, brique par brique dans RPFM : l'exemple complet du guide RPFM.

Technique 4 : les scripts Lua

Le Duc a son fichier, saison_duc.lua, chargé par required.lua. À chaque chargement, saison_start.lua démarre les systèmes vampires de la 9.0 dans l'ordre de CA, puis celui du Duc, dont le Baiser d'Abhorash emprunte le rituel des lignées. Le reste, ce sont des écouteurs d'évènements :

  • RegionFactionChangeEvent : un domaine d'Aquitanie change de main, ou une région bretonnienne tombe au Duc joué.
  • DilemmaChoiceMadeEvent : le choix d'un dilemme.
  • BattleCompleted et CharacterWithdrewFromBattle : la faveur, gagnée ou brisée.
  • FactionBeginTurnPhaseNormal : le tombeau, les vassaux, l'usure de la faveur, le défi, la traque.
  • MissionSucceeded et MissionFailed : le défi, relevé ou dérobé.
  • ScriptEventVampireLairAwakened, évènement de CA : les éveils de la victoire longue.

L'écouteur du tour, en version courte :

core:add_listener(
    "saison_duc_tour",
    "FactionBeginTurnPhaseNormal",
    function(context) return context:faction():name() == "wh_main_vmp_mousillon" end,
    function(context)
        local faction = context:faction();
        saison_sur("tombeau de Galand", tombeau_de_galand, faction);
        if faction:is_human() then
            saison_sur("vassaux du sang", tour_des_vassaux, faction);
            saison_sur("usure de la faveur", user_la_faveur, faction);
            saison_sur("defi", tour_du_defi, faction);
            -- puis la traque de Richemont, si son tour est venu
        end;
    end,
    true
);

Les données du Duc entrent dans les tables Lua de CA au chargement (saison_donnees_ca.lua). Pour les victoires, le moteur de CA est chargé depuis son dossier, jamais recopié, et sa liste des Empires remplacée par nos dix listes, écrites avec ses propres générateurs d'objectifs ; CA ne donne aucune liste au Duc.

Ce que la 9.0 a changé

  • L'ancien système des baisers de sang a disparu, et notre réglage avec lui.
  • FactionTurnStart n'arrivait à aucun écouteur de mod sur notre carte ; les nôtres sont passés sur FactionBeginTurnPhaseNormal. Cause trouvée et corrigée dans les essais automatiques, à confirmer en partie jouée : trois conditions d'écouteurs de CA, pour Mère Ostankya et Yuan Bo, lisaient des systèmes absents de notre carte, et leur erreur coupait l'évènement.
  • La technologie de CA qui confédère le Duc écarlate absorberait, recherchée par le Duc joué, sa propre faction : elle est verrouillée pour lui.
Un écouteur qui planteSans protectionFactionTurnStartÉcouteur de CA (MèreOstankya)erreur : un système absent denotre carteAutres écouteurs de CAjamais appeléNos écouteurs (le Duc…)jamais appeléProtégéFactionTurnStartÉcouteur de CA (MèreOstankya)erreur : un système absent denotre cartescript_log : « ecouteur [clé]en erreur sur <évènement> »Autres écouteurs de CANos écouteurs (le Duc…)La 9.0, sur notre carte : l'erreur de trois conditions de CAcoupait l'évènement pour tous. Nos débuts de tour passent parFactionBeginTurnPhaseNormal, et chaque écouteur est protégé.
À gauche, le jeu publié : l'erreur d'un écouteur de CA arrête l'évènement, et les suivants, les nôtres compris, ne sont jamais appelés. À droite, avec required.lua : l'erreur est nommée une fois au journal, et l'évènement continue.

En jeu publié, une erreur dans un écouteur arrête l'évènement pour tous, ceux de CA compris. Les nôtres sont protégés (saison_ecouteur, saison_sur) : l'erreur va au journal, et le reste du tour se joue.

Technique 5 : les textes, en français et en anglais

Nos textes vivent dans textes_gameplay.json, avec pour chaque clé son français et son anglais. Une clé de texte du jeu, c'est <table>_<colonne>_<clé de la ligne> : dilemmas_localised_title_saison_duc_impot_du_sang donne « L'impôt du sang » et « The Blood Tax ».

Un contrôle cherche d'abord les défauts. Le français va dans le pack principal, l'anglais dans un petit pack qui passe devant, sous le même chemin. Règle d'or : ne jamais écraser un texte du jeu, que Warhammer III chargerait quelle que soit la langue du joueur ; une clé qu'il connaît est retirée, il la fournit lui-même, à jour.

Les noms suivent les textes du jeu : dans la 9.0, le français de CA dit « Duc écarlate » dans 21 textes, dont son nom propre, contre 3 « Duc Rouge » ; nous avons corrigé 22 textes. Faute de réplique doublée pour lui, j'ai choisi pour son prologue un survol muet avec ses textes (codé mais pas encore vu en jeu).

Les essais : ce qu'ils voient, ce qu'ils ne voient pas

Tout pack qui ajoute une table passe un essai de démarrage. Puis viennent les parties automatiques : un pack d'essai à part lance la partie par l'interface, comme un joueur, et enchaîne les tours.

Leur limite : quand l'IA joue tout, la faction du joueur ne joue pas. Le duché perdu et le tombeau valent aussi pour le Duc de l'IA, mais la traque, la faveur, le défi et les dilemmes ne visent que le Duc joué. Pour l'essentiel, le Duc ne se voit donc qu'en jouant.

Ce que voient les essaisUn essai automatiquepeut le voirLe démarrage : erreurs etblocages, tour après tourLes systèmes vampires de la9.0, le Baiser d'AbhorashLe duché perdu et le tombeaude Galand : ils valent aussipour le Duc de l'IALes guerres entre factions del'IAL'IA joue toutes les factions :celle du joueur ne joue pas.Seulement en le jouantLes annonces illustrées(incidents)La faveur d'AbhorashL'impôt et le serment du sang(dilemmes)La traque de RichemontLe défiLa vraie épreuve : une partie, etonze points à observer.
À gauche, ce qu'un essai automatique peut montrer : il suffit que le jeu tourne. À droite, ce qui ne vise que le Duc joué : dans un essai où l'IA joue tout, sa faction ne joue pas.

Un essai du Duc, le 23 septembre, a montré qu'au tour 1 personne n'avait d'ennemi, d'où les guerres de départ. Une partie de 29 tours avec Drycha a vu Grom et le Duc de l'IA rayer Bordeleaux avant le tour 20 ; d'où, entre factions de l'IA, pas de guerre contre Bordeleaux avant le tour 15 (codé mais pas encore vu en jeu).

Pour la chronique, un banc d'essai fait tourner nos scripts dans un interpréteur Lua, avec une imitation de l'interface de CA : c'est le « testé hors jeu ». La vraie épreuve sera ma partie, avec onze points à observer.

Ensuite

Régler en jeu les délais et les forces de ces mécaniques. D'autres mécaniques sont en préparation.

La fiche du Duc et les mécaniques sont sur l'accueil ; la méthode du portage, dans le tutoriel.

Proposer une idéeVoir la carte