Atlas de Bretonnie

Journal de l'atelier · · 8 min de lecture

Les 9 murs d'un portage de carte vers Warhammer III

Porter une carte de Warhammer I dans Warhammer III, c'est surtout se cogner à des murs. En quatre jours, j'en ai compté neuf gros. Pour chacun : ce qu'on voyait, ce qui se passait vraiment, comment le franchir, et ce que j'en retiens.

Une côte de notre carte vue de haut, en marches d'escalier, avec une bande d'eau pâle le long du rivage
Une côte de notre carte le 24 septembre, en marches d'escalier, bordée d'une bande d'eau pâle : l'eau et les côtes ont été l'un de ces murs.

Comment lire ces fiches

Chaque mur suit le schéma de notre journal des erreurs : le symptôme, la cause, la solution, puis la leçon, dans un encadré. Les causes ont été trouvées par Claude, l'assistant IA d'Anthropic, souvent en lisant un rapport de plantage. Les symptômes, je les ai le plus souvent vus en jeu, une capture de Warhammer I à côté.

Où frappent les neuf mursCompiler le terrainBOB change le projet en fichiers du jeu2BOB ne fait rien, sans le direGénérer le startposle jeu fige l'état de départ1le startpos impossibleCharger la campagnefactions, villes, IA3Athel Loren sans emplacements de ville4l'IA sans carte, le pack qui passe devantJouer le premier tourjusqu'à la première fin de tour5le plantage de fin de tour9la nouvelle partie qui se croit une sauvegardeRegarder la carteen jeu, à côté de Warhammer I6« je ne reconnais pas la map »7des objets qui volent partout8la mer sans eauLe jeu plante : le rapport de plantage dit où chercher.Rien ne plante : un témoin, ou Warhammer I à côté, montre l'écart.
Les neuf murs, rangés selon le moment où ils frappent, du terrain à l'image en jeu. En rouge, ceux qui font planter le jeu ; en brun, ceux qui ne disent rien.

Les termes techniques sont expliqués au passage. Pour la méthode complète, dans l'ordre, voyez le tutoriel.

Mur 1 : le startpos impossible

Le startpos est le fichier qui fige l'état de départ d'une campagne : factions, personnages, villes, diplomatie. Sans lui, pas de partie. C'est le jeu lui-même qui le fabrique, à partir des données qu'on lui donne.

  • Symptôme : le 21 septembre au matin, la génération du startpos plante à chaque essai.
  • Cause : deux défauts de nos données, l'un derrière l'autre. Trois de nos ports n'avaient pas la forme de ceux de CA. Et la minicarte déclarée n'existait pas : on l'avait corrigée dans le pack, que chaque construction effaçait.
  • Solution : exporter une carte de CA et regarder ses villes portuaires : un disque de 19 hex, 16 sur la terre et 3 côté mer, en port. Puis corriger la source, les tables du kit, et faire vérifier par la construction du pack que chaque fichier déclaré existe. Le premier startpos est sorti le 21 à 12 h 08.
Ville portuaire : 16 + 3 hex11Port : 3 hex, 2 en mer, 1 plage22Principal : 16 hex de terre33L'étendue couvre les 19 hex
Le modèle de CA, lu sur ses cartes : un disque parfait de 19 hex, dont le centre devient la position de la ville ; 16 hex de terre en emplacement principal, et 3 hex consécutifs du bord, côté mer, en port (trait bleu). Trois de nos ports ne suivaient pas ce modèle.

Mur 2 : BOB qui ne fait rien, sans le dire

BOB est le compilateur de l'Assembly Kit : il transforme le projet de terrain en fichiers que le jeu lit.

  • Symptôme : BOB ne lance que 6 actions au lieu d'une douzaine. Ni relief, ni textures, et aucune erreur. On a perdu une heure à essayer des fichiers au hasard.
  • Cause : une limite de l'outil. Pour une carte que la base du jeu (celle des packs de CA) ne connaît pas, BOB ne lance que ces 6 actions, sans message ; l'ajouter à la base du kit ou à un pack de mod n'y change rien.
  • La bonne voie : d'abord un témoin, pour mettre nos fichiers hors de cause : le projet de ChaosRobie, copié sous un autre nom, échouait pareil. Ensuite la communauté : le Discord de CAIME, tw-modding. Nous ne connaissons pas de voie officielle pour lever cette limite, et nos guides excluent de décortiquer un outil de CA ou de le contourner.
Six actions seulement ?Combien d'actionsannonce bob.log ?plus de 6Pas la limite12 chez nous pour unpassage complet ; puiscomptez lesFailed to find tile debob_warnings.log6Faites un témoinun projet connu pourbon, copié sous unautre nom, puis passédans BOBEt le témoin ?plus de 6Votre projetest en cause :cherchez dans vosfichiers6 aussiLimite du kitvotre projet n'est pasen cause : demandez àla communauténe forcez pas l'outilLes 6 actions d'une carte inconnuele fichier Terry et cinq masques ; ni relief, nitextures, ni carte logique, ni brouillard ; et aucunmessage.
Six actions au lieu d'une douzaine, sans message : un témoin dit si c'est votre projet ou la limite du kit.

Mur 3 : Athel Loren sans emplacements de ville

  • Symptôme : le terrain est prêt, et mes deux essais du 21, en fin de journée, plantent dès le chargement de la campagne.
  • Cause : la veille, les 36 lignes qui donnent leurs emplacements aux 18 villes d'Athel Loren avaient été écartées, sur une vérification fausse : « Warhammer III n'en déclare aucun pour ses régions elfes ». Or le jeu cherche l'emplacement principal de chaque ville. Notre première correction visait autre chose, et le plantage est revenu à l'identique.
  • Solution : les lignes rétablies à partir des modèles des Empires Immortels, et un contrôle neuf qui compare notre startpos à celui d'une campagne qui charge. Ce contrôle retrouve seul ce défaut.

Mur 4 : l'IA sans carte, et le pack qui passe devant

  • Symptôme : plantage au moment où le jeu règle le joueur humain. Pire, deux essais tournaient sur un ancien startpos, et on a cru la correction inefficace.
  • Cause : trois causes, l'une derrière l'autre. Le startpos était généré sans les données de carte de l'IA, les deux fichiers qui lui servent à trouver son chemin (hlp_data.esf et spd_data.esf). Une faction avait un groupe d'IA vide. Et le startpos rangé dans le pack passait devant la copie posée à côté.
  • Solution : générer avec l'option qui produit les données de l'IA, et les embarquer ; donner à chaque faction le groupe d'IA que CA lui donne dans les Empires Immortels, sinon celui de sa culture.
Quand ça casse,qu'est-ce qui manque ?Pendant la générationLe script_log s'arrête juste après « Loading Mods », sansvidage.→ start_pos_regions : rebel_faction_name etlong_description vides, pas de « PLACEHOLDER ».Au chargement de la campagnePlantage dès le début du chargement.→ Un emplacement primary par colonie(start_pos_region_slot_templates).Plantage au chargement.→ Pour chaque faction, un groupe d'IA qui contient unepersonnalité.Plantage au réglage du joueur (carte neuve).→ hlp_data.esf et spd_data.esf dans le pack.À l'écran de sélectionAucun seigneur à choisir.→ Les lignes destart_pos_starting_general_options.Au premier tourUn personnage dans le coin de la carte, en case (1, 1).→ Son lien dansstart_pos_character_to_settlements(personnage placé en (0, 0)).Ni introduction ni missions.→ Un startpos généré APRÈS les scripts (compteur desauvegarde à 1).D'abord : bad_mods_report.txt nomme la ligne refusée, uneà la fois, dans :%APPDATA%\The Creative Assembly\Warhammer3\crash_report\
Le moment où ça casse dit où chercher : chaque symptôme vécu sur notre chantier, et la ligne ou le fichier qui manquait.

Ce mur franchi, la campagne s'est enfin chargée.

ça fonctionne !!!! […] la carte ressemble à rien mais au moins ça charge

Charles, 21 septembre, 20 h 31

Mur 5 : le plantage de fin de tour que personne n'a vu

  • Symptôme : ma partie du 21 au soir s'arrête à la fin du premier tour. Je ne l'ai pas signalé ; Claude l'a trouvé le lendemain, un peu par hasard, dans les rapports de plantage.
  • Cause : une campagne a deux terrains. Le second, un terrain de bataille, sert dès la première bataille, même entre deux IA. Le nôtre n'avait jamais été livré.
  • Solution : fabriquer ce terrain de bataille à la manière de CA, le compiler avec BOB, et faire vérifier par la construction du pack que chaque fichier déclaré existe.
Une campagne, deux terrainsLa zone jouable de campagnecampaign_map_playable_areasterrain_folder = <dossier>Le terrain de campagneterrain/campaigns/<carte>/le relief, les tuiles et lesobjets de la carteLe terrain de batailleterrain/battles/<dossier>/une tile map de bataille ; cellede CA porte aussi des lieux debataille et des cartes decaptageSans ce terrain de bataille : plantage à la première batailleterrestre, même entre deux IA, donc souvent dès la première finde tour.
Une carte de campagne a deux terrains : le sien, et un terrain de bataille, que nomme la colonne terrain_folder de sa zone jouable de campagne.

Mur 6 : « je ne reconnais pas la map »

  • Symptôme : le 21 à 22 h 50, en jeu : « c'est un peu n'importe quoi », puis « je ne reconnais pas la map ».
  • Cause : des modèles de Warhammer III à la place de ceux de Warhammer I ; 5 277 décors du Chaos rendus visibles de tous par une règle fausse ; la neige de la clairière d'hiver effacée, prise pour un défaut. Tout avait été contrôlé par des chiffres, rien à l'image.
  • Solution : les fichiers de Warhammer I eux-mêmes, d'où le DLC Realm of The Wood Elves obligatoire pour jouer ; seul le décor naturel visible de tous ; la neige refaite à la manière de Warhammer III.
Warhammer I : Tal Eth Ayr et le Chêne des Âges, au début de la mini-campagneWarhammer I
Warhammer III : notre carte, Tal Eth Ayr, le Chêne des Âges et la Clairière Royale, l'armée d'OrionWarhammer III
La référence, et le résultat : Tal Eth Ayr et le Chêne des Âges dans Warhammer I (à gauche), puis notre carte dans Warhammer III le 25 septembre, avec la Clairière Royale et l'armée d'Orion. C'est à cette comparaison que passe désormais chaque visuel.

Mur 7 : des trucs qui volent partout

  • Symptôme : le 22 à 22 h 40, des objets flottent un peu partout. Les audits de Claude n'en trouvaient que 45.
  • Cause : un repère. Dans Warhammer III, les objets vivent dans l'espace des hex, alors que le relief est rangé en pixels carrés, sur une profondeur plus courte d'un facteur √3/2. Nos objets avaient été convertis à tort : tassés de 13 % vers le sud, ils flottaient ou s'enfonçaient. Les audits, faits dans le même repère faux, ne voyaient rien.
  • Solution : ne jamais convertir les positions des objets, et lire le relief à la ligne z × √3/2. Vérifié dans Terry à 23 h 23 : les pierres de lien étaient de retour dans le sol.
Deux repères, une seule carteObjets : espace des hex338,9Relief : pixels carrés293,5× √3/2profondeur, du nord au sudFaux : on convertitl'objeten l'airenfoncéeTassé de 13 % vers le sud, ilflotte ou s'enfonce. Lesaudits, dans le même repèrefaux, n'en voyaient que 45.Juste : l'objet nebouge pasposées sur le solSa position reste en espacedes hex ; c'est le reliefqu'on lit à la lignez × √3/2.Le contrôle : la caméra de Terry posée sur des points précis.Terre, ou mer ?
Schéma. Les objets vivent en espace des hex, le relief en pixels carrés, sur une profondeur plus courte d'un facteur √3/2. On ne convertit jamais la position d'un objet : on lit le relief au bon endroit.

Mur 8 : la mer sans eau

  • Symptôme : le 23 à 3 h 40 : « sur le côté de la mer il n'y a pas d'eau, que le fond de sable ». Ni mer, ni rivières, ni lacs.
  • Cause : pour adoucir la côte, la même surface avait été écrite dans les deux cartes de hauteur du terrain : height, le relief, et sea_height, le fond marin. Plus aucune profondeur : le jeu ne dessinait pas d'eau. Terry, lui, la montrait.
  • Solution : rendre à chaque carte son sens ; l'eau était de retour à 4 h 06. Le même jour, un fond relevé près des côtes a refait le coup. D'où la règle, codée depuis : comme sur les cartes de CA, sea_height reste sous 0 partout, même sous la terre.
Deux cartes de hauteurheight : le reliefsea_height : le fond marin0 : le niveau de l'eauNos deux cartes, la même surface0profondeur nullepas de mer, pas de rivières, pas de lacs :le fond de sable, à secChez CA : le fond sous 0, partout0l'eau se dessinele fond, même sous la terreTerry, lui, montrait l'eau : elle se juge en jeu.
Schéma, en coupe. Le jeu dessine l'eau au niveau 0, au-dessus du fond marin (sea_height). Écrire la même surface dans les deux cartes ne laisse aucune profondeur ; sur les cartes de CA, le fond reste sous 0 partout, même sous la terre.

Mur 9 : la nouvelle partie qui se croyait une sauvegarde

  • Symptôme : pas de cinématique, pas de « Comment jouer », pas de mission de victoire, et une caméra bizarre.
  • Cause : le startpos datait d'avant les scripts de campagne. Or son compteur de sauvegarde (__save_counter) ne passe à 1 que si les scripts tournent pendant la génération. Resté à 0, il faisait passer chaque nouvelle partie pour une sauvegarde. C'est la session de Claude chargée des scripts qui l'a trouvé.
  • Solution : régénérer le startpos après tout changement de scripts, et un contrôle automatique qui vérifie que le compteur vaut 1.
Le startpos est une photo22 sept., 23 h 40 : le startpos est généréLa photo du tour 0 est prise. Nos scripts de campagnen'existent pas encore.Son compteur de sauvegarde reste à 0.123 sept., 00 h 50 : les scripts arriventLe pack les contient ; la photo, elle, ne les a jamais vus.203 h 19 : l'essai de CharlesNi cinématique, ni « Comment jouer », ni mission devictoire. Le journal des scripts dit pourquoi :Loading value __save_counter [0]Chaque nouvelle partie passe pour une sauvegarde.3La correctionRégénérer le startpos avec le pack à jour, le copier dansle projet, reconstruire le pack.Le compteur vaut 1 : un contrôle automatique levérifie.4
Le startpos fige le tour 0 au moment où on le génère : tout ce qu'il doit connaître au premier tour, scripts compris, doit exister avant.

Ce que les neuf murs ont en commun

Relus ensemble, ces murs racontent quatre règles simples.

  • Comparer à ce qui marche (murs 1, 2, 3). Un témoin connu pour bon tranche plus vite que dix hypothèses.
  • Lire ce que le code cherchait (murs 3, 5). Un rapport de plantage dit quelle donnée manquait ; une différence entre deux fichiers n'est qu'une piste.
  • Juger à l'image, et en jeu (murs 6, 7, 8). Les chiffres étaient bons quand la carte était méconnaissable.
  • Respecter l'ordre des choses (murs 4, 9). Le startpos est une photo, le pack passe devant les copies, et chaque changement se teste seul.

Chacune de ces erreurs est consignée dans notre journal, avec la règle qui l'évite. J'explique comment on le tient dans Travailler avec une IA sur un gros mod. Et pour voir où tout cela nous mène, la carte de la Bretonnie entière vous attend.

Proposer une idéeVoir la carte