Utiliser des mods
Où se trouve le dossier mods
Ouvrez Mods depuis le menu principal. Le chemin est écrit en haut de l'écran, avec un bouton à côté qui ouvre le dossier dans votre gestionnaire de fichiers.
Il se trouve à côté de vos sauvegardes, et c'est le même dossier, que vous installiez le mod de quelqu'un d'autre ou que vous écriviez le vôtre. Rien n'est lu pendant que le jeu est en cours d'exécution, donc peu importe si le jeu est ouvert pendant que vous déplacez des fichiers.
Installer un mod
A est un dossier avec mod.json en haut. La plupart des téléchargements se trouvent dans ce dossier dans un zip.
| 1. Extrayez-le | Pour que le dossier contenant mod.json se trouve directement dans le dossier mods. Un zip extrait vers northern_reach/northern_reach/mod.json est un niveau trop profond et le jeu ne le verra pas. |
| 2. Redémarrez le jeu | Les paquets sont lus au démarrage. Il n'y a pas d'installation à chaud. |
| 3. Allumez-le | Ouvrez Mod et utilisez le commutateur. Un dossier copié est trouvé et laissé désactivé : rien ne se charge simplement en apparaissant dans un dossier. |
| 4. Redémarrez à nouveau | La ligne indique Actif — redémarrer pour charger jusqu'à ce que vous le fassiez. Ensuite, il est indiqué Chargé. |
Un mod dans lequel vous copiez reste désactivé jusqu'à ce que vous le disiez. Le jeu rejette les exécutables sans aucun doute, mais un paquet de données peut toujours modifier les prix, les articles et les personnes d'une manière que vous n'avez pas demandée, et un qui apparaît tout seul dans un jeu déjà en cours est un problème que personne ne veut diagnostiquer. Alors le jeu demande. C'est un redémarrage supplémentaire la première fois, et plus jamais pour ce package.
Il n'y a pas de lanceur, il n'y a pas de fichier d'ordre de chargement à modifier et il n'y a rien à enregistrer. L'ordre de chargement est un numéro à l'intérieur de chaque package, choisi par son auteur.
Commencez une nouvelle partie pour un package qui ajoute des personnes, des lieux ou des quêtes. Une sauvegarde déjà en cours conserve le monde avec lequel elle a été créée. Les packages qui ne changent que les nombres, les images ou les couleurs sont visibles dans une partie déjà commencée. Les fichiers audio et de police sont validés, mais aucune surface de package en cours d'exécution ne les consomme encore.
Est-il chargé ?
Mod, dans le menu principal. Chaque package trouvé tient sur une seule ligne, avec un statut en un mot : chargé, désactivé, invalide, en conflit, nécessite un autre mod, ignoré.
Un mod peut également s'arrêter, et il indique pourquoi. Le commutateur que vous mettez s'applique au package sur lequel vous l'avez mis, pas à son nom dans le dossier. Les identifiants de mod sont choisis par les auteurs et il n'y a rien pour les coordonner, donc deux mods sans rapport appelés northern_reach sont un accident ordinaire - et sans cela, le second hériterait du commutateur du premier. Si le mod sous un identifiant n'est pas celui que vous aviez activé, la ligne le dit : ce n'est pas le mod que vous avez activé. La mise à jour d'un mod en place préserve votre switch ; supprimez-le et copiez-en un autre n°
Si vous êtes l'auteur d'un mod et que vous voyez cette ligne sur votre package, vous avez une collision d'identifiant avec le mod de quelqu'un d'autre. Choisissez un identifiant moins évident.
Deux de ces mots concernent un redémarrage que vous devez, et non le package. Actif — redémarrer pour charger signifie que vous l'avez activé et que personne ne l'a encore lu ; Désactivé — redémarrer pour télécharger signifie le contraire, et son contenu reste dans le jeu jusqu'à ce que vous redémarriez. Ce sont des mots volontairement séparés : un écran qui indique "Chargé" au moment où vous actionnez un interrupteur vous enverrait chercher dans le monde quelque chose qui n'est pas encore là.
Lorsque l'état n'est pas "chargé", la ligne ci-dessous vous indique pourquoi, dans la langue dans laquelle vous jouez et sans identifiants vous n'avez pas écrit : quel fichier le jeu refuse de s'exécuter, quel paquet lui manque, quelle version il veut. Ci-dessous, ce qu'a fait le contenu du colis : combien d'entrées ont été entrées, combien ont été rejetées. Afficher les détails ouvre le reste, c'est-à-dire les identifiants et la règle exacte que chaque enregistrement rejeté a enfreint.
| Sur l'écran | Dans le rapport | Qu'est-ce que ça veut dire |
|---|---|---|
| Chargé | active | Chargeable, aucun obstacle. |
| Invalide | invalid | Le manifeste apporte un script verrouillé ou des fichiers exécutables. |
| Nécessite un autre mod | skipped_missing_dependency | A la dépendance déclarée est absente ou désactivée. |
| Nécessite un autre mod | skipped_incompatible_dependency | A la dépendance déclarée est hors de son range. |
| Ignoré | incompatible | Le mod cible une version de jeu plus récente. |
| Dans conflit | conflict | Deux mods chargeables pointent vers le même identifiant d'écrasement (restent chargeable ; load_order gagne, les deux signalé). |
| Désactivé | disabled | Vous l'avez éteint ou vous ne l'avez jamais allumé. Les packages sont libres de choisir : en mettre un dans le dossier l'installe et ne l'active pas. |
| Actif — redémarrer pour charger | — | Vous l'avez activé et personne ne l'a encore lu. Son contenu n'est pas dans le jeu jusqu'à ce que vous redémarriez. |
| Désactivé — redémarrez pour télécharger | — | Vous l'avez éteint et il est toujours chargé. Son contenu reste dans le jeu jusqu'à ce que vous redémarriez. |
Deux lignes partagent volontairement un mot : Nécessite un autre mod C'est le même problème pour un joueur, que le package dont il a besoin soit manquant ou la mauvaise version, et la ligne ci-dessous indique laquelle. Et lorsque deux paquets revendiquent le même enregistrement, celui avec le load_order le plus élevé écrit en dernier et gagne – mais une prise de contrôle que personne n'a déclarée est une erreur, pas une note. Les deux lignes sont signalées, et la ligne du perdant nomme le gagnant, et le gagnant est toujours calculé au lieu d'être laissé au hasard : un rejet ne doit pas nécessairement être un tirage au sort. Quand deux mods veulent la même chose explique comment en déclarer un volontairement.
« Chargé » ne signifie pas que vous pouvez encore le voir dans le monde. Pour cela, lisez les décomptes sous la ligne, et Maintenant, trouvez-le dans le jeu indique où chaque type de chose apparaît.
Les décomptes s'additionnent toujours. La lecture est appliquée, davantage rejetée, davantage remplacée par un autre mod, davantage en attente selon ses propres conditions — et les deux derniers sont nommés au lieu de rester un trou. Un enregistrement écrit en dernier par un autre paquet n'est pas rejeté, car il n'y a rien de mal à cela, et il n'est même pas appliqué, car ce n'est pas ce que le jeu a conservé. C'est la différence entre lire une ligne et passer une soirée à chercher un bug dans un fichier qui n'en a pas. Afficher les détails indique quel enregistrement et quel package le contient actuellement.
Un nombre se trouve à côté de cette somme au lieu d'être à l'intérieur : des fichiers que personne n'a lus. Un fichier dont la famille n'est pas dans content_types n'a jamais été ouvert, il n'y a donc aucun enregistrement à compter et il n'y a aucun moyen de savoir combien il y en a. Il s'agit d'un décompte de fichiers, pas d'enregistrements, et c'est exactement pourquoi il ne peut pas s'agir d'un sixième terme : la somme commence à partir de lecture, et ceux-ci n'ont jamais été lus.
Avant de demander de l'aide à quelqu'un
Ouvrez Mod et appuyez sur Copier le rapport. Collez tout dans votre message, puis dites ce à quoi vous vous attendiez.
Texte simple, prêt pour un forum, un message Discord ou un rapport de bug : la version sur laquelle vous vous trouvez, le dossier mods, chaque package avec sa version, son ordre de chargement et son statut, la raison de chaque rejet, le nombre de comptes pour chaque type de contenu et quel package a remporté chaque conflit.
the report the Mods screen copies
Bonemark mod report
game build: 0.0.0-dev
mods folder: C:/Users/you/AppData/Roaming/Godot/app_userdata/Bonemark/mods
packages: 2 found, 1 loaded
PACKAGES
northern_reach v0.1.0 order 100 active
goods: 12 read, 12 applied, 0 rejected
winter_roads unreadable manifest
- game_version must not be empty
CONTENT (1 families: 12 read, 12 applied, 0 rejected)
goods: 12 read, 12 applied, 0 rejectedNeuf fois sur dix, la réponse est dans le bloc et personne n'est obligé de vous poser une seule question en premier. Il ne lit rien en dehors du dossier mods, ne change rien et ne contient aucune information personnelle.
Il est en anglais même lorsque vous jouez dans une autre langue. C'est intentionnel : la personne qui vous aide ne peut pas lire le vôtre, et tous les faits qu'il contient (identifiants, versions, comptes) sont toujours les mêmes dans toutes les langues.
Supprimez-en un
Supprimez son dossier et redémarrez. La désinstallation est là.
Rien de vous n'est supprimé avec. Une sauvegarde conserve les identifiants qu'elle ne peut plus résoudre, les marque et renvoie des éléments si le package est réinstallé. Une session qui ne comprend pas une sauvegarde ne l'écrase même pas : le fichier original reste exactement tel qu'il était, et c'est la différence entre un après-midi perdu et une partie perdue. Saves est le rapport complet.
Si le jeu ne fonctionne plus après avoir installé quelque chose, la sortie n'a pas besoin du jeu. Ouvrez le dossier mods et supprimez la dernière chose que vous avez ajoutée. Les packages ne peuvent être lus qu'à partir de ce dossier, donc un dossier qui n'existe pas est un package qui ne peut pas être chargé, et le prochain démarrage est le même qu'avant. Vous n'avez pas besoin d'un menu fonctionnel, d'une console ou d'un démarrage pour ce faire.
Même le jeu essaie tout seul — Si le jeu ne démarre pas c'est un nombre limité de tentatives, puis un retour sans aucun paquet chargé — mais c'est la ceinture, et déplacer le dossier est les bretelles.
Commencer ici
Ce que vous pouvez construire aujourd'hui
Maintenant, sans demander à personne : les marchandises et les marchands qui les vendent, les objets, les personnes et leurs positions, les bâtiments et leurs services, les lieux de la carte, les conversations, les scènes, les plans de quête, les cartes dessinées dans Tiled, les images et les couleurs, ainsi que tous leurs textes en sept langues. Les fichiers audio et de police sont vérifiés et lus, mais leurs surfaces de package ne sont pas encore consommées ; le tableau de statut le dit au lieu de les appeler prêts. Toutes les familles constituent la liste mesurée, et leur statut vient du build plutôt que d'une promesse.
Pas encore, et Ce que vous ne pouvez pas encore faire explique chaque cas : la famille quests, l'audio de package, les polices de package, les conversions totales empaquetées et un package qui serait une fonctionnalité plutôt que du contenu.
Jamais, en raison du choix du projet : code. Pas de scripts, pas de scènes, pas de fichiers de ressources, rien pour exécuter le jeu. C'est ce qui permet de télécharger en toute sécurité le mod d'un étranger, et ce n'est pas une phase que traverse le projet. Ce qu'un mod ne peut jamais faire.
Temps jusqu'à la première chose que vous pouvez voir dans le jeu : Une dizaine de minutes, principalement consacrées à la recherche du dossier. Un mod en dix minutes est complet et l'épée à la fin est réelle.
Ce que vous ne pouvez pas encore faire et pourquoi
Écrit ici, près du début, plutôt que laissé à découvrir en quittant la page. Voici ce que le build valide sans le placer actuellement sur une surface de package destinée au joueur, ainsi que ce qui n'est pas du contenu de package.
| Quoi | Pourquoi pas | Ça va changer |
|---|---|---|
La famille quests | Il est reconnu et vérifié et il n'y a aucun mappeur d'exécution derrière lui, donc un package qui le cible contourne toutes les vérifications et n'installe rien. Au lieu de cela, écrivez [Vos quêtes] (#quêtes-de-votre-propre) : quest_plans est une famille vivante et c'est celle que le jeu lit réellement. | Oui, lorsque le mappeur est public |
| Audio de package | Les descripteurs et fichiers audio sont validés et lus, mais aucune surface en cours d'exécution ne consomme encore un signal audio de package ; un mod peut donc fournir un son qui reste silencieux. | Oui |
| Polices de package | Les descripteurs de polices et la couverture des langues sont validés, mais aucun thème en cours d'exécution ne consomme encore une police de package. | Oui |
| Une conversion totale emballée | La build comprend le manifeste et apporte le luminaire avec Ashen Reach. Ce qui manque, c'est le flux de travail packagé pour les créateurs, et non le mécanisme. Une conversion totale. | Oui |
| Un package qui est une fonctionnalité | Décidé dans son intégralité et aucune famille ne le propose, donc aucune affiche ne peut le demander. [Chaque famille] (#chaque-famille) le répertorie parmi les éléments qui n'ont pas encore de dossier. | Oui |
| Quoi qu'il arrive | Un niveau de script ne viendra pas. Le manifeste contient un type de package qui expédie le comportement, la seule chose qui pourrait autoriser son exécution le rejette, il n'y a pas de bac à sable derrière lui et un package qui le déclare est rejeté aujourd'hui. Ce qu'un mod ne peut jamais faire. | Non |
Une mécanique que le jeu n'a jamais eu est la quatrième rangée avec un autre chapeau. Une épée qui frappe plus fort est un nombre et c'est le vôtre ; une arme qui tire un faisceau a besoin des règles du faisceau, et les règles sont du code que quelqu'un écrit et teste.
Qu'est-ce qu'un mod
Un dossier de fichiers texte. Vous n'écrivez pas de code. Vous écrivez des listes de choses que vous voulez dans le jeu, et le jeu les lit au démarrage.
| Mot | Qu'est-ce que ça veut dire |
|---|---|
| Emballer | Votre mod. Un dossier avec votre nom dessus. |
| Manifeste | mod.json, en haut de ce dossier. Qui vous êtes, ce que vous apportez. |
| Enregistrer | Une chose que vous ajoutez. Une épée est un record. |
| Famille | Une sorte de chose. Les épées, les casques et le pain sont tous des items. Chaque famille a son propre dossier. |
| Identifiant | your_package:the_thing — par exemple northern_reach:frost_blade. |
La seule règle dont découle tout le reste : vous pouvez ajouter et modifier des données. Vous ne pouvez pas faire en sorte que le jeu exécute du code. C'est ce qui rend le téléchargement d'un mod sûr : le pire qu'un mod étranger puisse faire est de vous lancer une épée idiote.
34 familles prêtes à l'emploi, dont items, buildings, pois, npc_definitions, vendor_inventories, quest_plans, caravans et perks. Toutes les familles forment le tableau complet avec ce que chacune permet ; Les familles, une par une donne pour chacune ses champs et un enregistrement à copier.
Choisissez votre chemin
Voici la table des matières de l'intégralité du guide — où chaque sujet est abordé, que vous le construisiez aujourd'hui ou non. En haut de la partie 3 se trouve un deuxième index, plus court : il s'agit des six didacticiels, dans l'ordre où ils s'appuient les uns sur les autres. Si vous êtes ici pour faire quelque chose et non pour chercher quelque chose, allez-y directement.
| Tu veux | Aller à |
|---|---|
| Construire quelque chose du début à la fin | Commencez par ce que vous voulez faire — les six tutoriels, un seul package |
| Avoir un fichier téléchargé en dix minutes | Un mod en dix minutes |
| Rechercher des champs pour une famille et un exemple | [Les familles, une à une](#les-familles-une à une) |
| Voir tout ce que vous êtes autorisé à faire | Chaque famille |
| Changer quelque chose que le jeu apporte déjà | Changer ce que le jeu a déjà |
| Ajoutez votre propre art, son, lettrage ou couleur | Images, son, lettrage, couleur |
| Dessiner un lieu en Tiled | Vos cartes |
| Écrire une mission | Vos quêtes |
| Comprendre pourquoi rien n'est apparu | [Rien ne s'est affiché](#rien-s'est affiché) |
| Recherchez un code d'erreur | Chaque code de diagnostic |
| Sachez ce qu'un mod ne peut jamais faire | Ce qu'un mod ne peut jamais faire |
| Ne cassez pas la sauvegarde de quelqu'un | Enregistre |
| Mettez-le là où les gens peuvent l'emporter | Partagez-le |
Ou pour ce qui vous passe par la tête. Ces conseils sont organisés dans l'ordre dans lequel le travail se déroule (manifeste, puis validation, puis contenu, puis rapport), ordre que choisirait une personne connaissant déjà le système. Ceux qui ne le savent pas pensent Je veux ajouter un commerçant, et cherchent le mot commerçant :
| Vous ajoutez | Les familles qui le font | Où ils sont écrits |
|---|---|---|
| Commerce et biens | goods, vendor_inventories, caravans, recipes | Les choses, le commerce et les chiffres derrière un combat |
| Choses qu'un joueur apporte avec lui | items, combat_balance | Les choses, le commerce et les chiffres derrière un combat |
| Personnes | npc_definitions, mercenary_templates, noble_houses, relationships, perks, enemy_archetypes, enemy_variants, group_archetypes | [Les gens, les maisons et ce qu'ils peuvent faire](#familles-personnes-maisons-et-ce-qu'ils-peuvent-faire) |
| Lieux et bâtiments | buildings, pois, maps, world_generation | [Le monde et les lieux qui s'y trouvent](#familles-le-monde-et-les-lieux-qui-s'y trouvent) |
| Mots qu'un joueur lit | locales, dialogue, scenes, lore, mr_lines, quest_plans, quest_metadata, progress | Histoire, quêtes et mots qu'un joueur lit |
| À quoi ça ressemble et comment ça sonne | images, audio, fonts, themes, effects, presentation_bindings, screens | [À quoi tout cela ressemble et sonne](#familles-à quoi tout-ressemble-et-sonne) |
| Commandes et difficultés | input_bindings, settings, adaptive | Ce que le joueur contrôle et ce qui le regarde |
De quoi avez-vous besoin
| Le jeu | Nécessaire | Pas de Godot, pas de compilateur, pas d'étapes de construction. |
| Un éditeur de texte qui comprend JSON | Nécessaire | VS Code, Sublime, Notepad++ – tous gratuits. Le Bloc-notes Windows fonctionne et ne vous aidera pas. |
| Un éditeur de pixel art | Juste pour votre art | Aseprite (~20 €), ou gratuit : LibreSprite, Piskel, Krita, GIMP. |
| Un éditeur audio | Pour le son uniquement your | Audace. Effets courts à partir de rien : sfxr, ChipTone. |
| Carrelage | Uniquement pour vos cartes | Gratuit. Exporter vers .tmj. |
Un éditeur qui colore JSON vous montre une virgule manquante pendant que vous le regardez encore, au lieu que le jeu vous dise plus tard que le fichier était illisible.
Python et la console sont facultatifs. Le jeu suffit : placez le package, redémarrez et ouvrez Mods, qui indique chaque enregistrement refusé et pourquoi. Le checkout destiné aux auteurs est public. Ceux qui veulent itérer plus vite ou automatiser la publication peuvent cloner le checkout public de Bonemark et exécuter les outils hors ligne dans Outils hors ligne ; les joueurs qui installent un package publié n'ont besoin ni de Python ni de Godot. Ce même checkout public contient le validateur et les déclarations du runtime, les deux sections décrivent donc une seule chaîne d'outils. Les outils utilisent les mêmes déclarations que le jeu — les schémas d'enregistrement et la limite de sécurité ont chacun une source unique — et donnent donc une réponse plus tôt, jamais différente. Une console de débogage aide à inspecter un package chargé, mais elle n'est pas nécessaire pour en écrire un.
Créer one
Commencez par ce que vous voulez faire
Tout ce qui se trouve en dessous de cette ligne est classé dans l'ordre dans lequel le travail se déroule : affiche, puis dossiers, puis familles, puis rapports. C'est le bon ordre pour chercher quelque chose et le mauvais pour commencer, car personne ne commence par un manifeste. Cela commence par Je veux un marchand.
Ensuite : choisissez la phrase qui ressemble à ce que vous essayez de faire.
| Tu veux | Aller à | Combien cela prend |
|---|---|---|
| Ajouter quelque chose à acheter et à vendre | [Une marchandise à vendre](#un bien à vendre) | 15 minutes |
| Ajouter quelque chose qu'un joueur porte avec lui | [Un objet à transporter](#un objet à transporter) | 10 minutes, après cela ci-dessus |
| Ajouter une personne qui le vend | Un commerçant qui le garde | 30 minutes |
| Ajouter une porte dans une colonie | Le service du bâtiment | 20 minutes |
| Ajouter un emplacement sur la carte du monde | Un lieu sur la map | 20 minutes |
| Changer quelque chose que le jeu a déjà | Changer ce qui est déjà là | 15 minutes |
| Dessiner une carte, écrire une quête, apporter art | Vos cartes, Vos quêtes, Images, son, lettrage, couleur | plus longues, et toutes les trois sont des familles vive |
Apportez le Famille quests, une conversion totale packagée ou un package qui est une fonctionnalité | Pas encore. [Ce que vous ne pouvez pas encore faire et pourquoi](#ce que vous ne pouvez pas encore faire et pourquoi) donne la raison de chacun et indique lesquels changeront. | — |
| Ajouter une règle que le jeu n'a jamais eu | Rien ici ne le fait et rien ne le fera. Ce qu'un mod ne peut jamais faire explique pourquoi, en un seul paragraphe. | — |
Les six tutoriels forment un seul paquet, construit pièce par pièce : une bougie en cire d'abeille, le paquet qu'un joueur emporte avec lui, le cirier qui le vend, la porte de sa boutique, la fosse derrière la tannerie d'où vient le suif, et enfin une modification de la bougie que le jeu possédait déjà. Faites-les dans l'ordre et obtenez un mod que quelqu'un pourrait télécharger. Mettez-en un au milieu et cela fonctionnera tout seul.
Où sont les numéros de jeu
Chaque tutoriel ici évalue une nouvelle chose en la comparant à quelque chose que le jeu vend déjà, car un nombre sans rien à côté est une supposition, et une supposition dans une économie qui fait du commerce entre les villes ne reste pas là où vous la mettez.
Vous ne pouvez pas ouvrir les fichiers du jeu. Ses enregistrements sont des actifs Godot à l'intérieur de la version emballée — un format différent de celui du JSON que vous écrivez, avec category = 1 où votre fichier indique "MANUFACTURED". Il n'y a pas de dossier à partir duquel copier, et en décompresser un n'est pas un flux de travail que quiconque doit documenter.
Vous n'en avez pas besoin. Le catalogue publie le contenu du jeu, généré à partir de ces mêmes enregistrements à chaque construction : 270 objets avec leur catégorie, leur poids, leur valeur de pièce et la taille de leur pile, 49 armes, 42 pièces d'armure, 37 emplacements. C'est la référence à laquelle ce guide est ancré, il ne peut s'écarter du jeu, et le nom du terrain est imprimé à côté de chaque ligne.
Une douzaine de valeurs à connaître avant de mettre un prix sur quelque chose :
| Le jeu se vend déjà | Pièces | ET |
|---|---|---|
| Argile, pierre, roseaux | 1 | le sol. Évidé ou coupé, aucun travail à l'intérieur |
| Blé, bois | 2 | |
| Bougie | 3 | un soir de lumière |
| Laine, poisson, raisin | 4 | |
| Pain | 6 | la nourriture d'une journée |
| Sel, miel, corde | 8 | |
| Tissu (pièce) | 10 | tissé à partir de 2 laines et 1 roseau |
| Fer raffiné, poisson salé | 12 | |
| Poivre noir | 14 | une importation, et vous pouvez le sentir |
| Cuir, fromage | 15 | |
| Vin | 25 | |
| Armes à une main | 50–300 | le groupe, pas une seule valeur |
| Armes à deux mains | 150–600 | |
| Plaque lourde | 500–1500 | le plafond de toute l’économie |
Si votre nouveau produit coûte plus cher qu'une armure de plaques, quelque chose s'est mal passé et le jeu ne vous le dira pas - il deviendra silencieusement la cargaison la plus rentable au monde et chaque caravane la transportera.
Une marchandise à vendre
Vous aurez une marchandise que l'économie sait évaluer, liée à la bougie que le jeu vend déjà, prête à être détenue par un commerçant.
Capture d'écran : Pas encore prise. Cet espace reste vide jusqu'à ce qu'il y en ait un réel : un dessin de ce à quoi il pourrait ressembler serait la seule chose sur la page qui ne soit pas réelle.
Lisez d'abord : [Qu'est-ce qu'un mod](#qu'est-ce qu'un mod-est) · Un mod en dix minutes · Noms et identifiants
Copier depuis : le dossier appelé chandlery, qui se trouve déjà dans votre dossier mods. Le jeu le met là au premier démarrage, éteint, et c'est le résultat final de ces six tutoriels : chaque enregistrement ci-dessous est là. C'est également le package que la ligne de test du référentiel fait tourner contre le chargeur, il n'y a donc aucun enregistrement ici que le jeu rejetterait. Allumez-le pour le voir fonctionner, ou copiez le dossier, renommez-le et personnalisez-le.
Où vont les fichiers :
where the files go
mods
└ chandlery
├ mod.json
└ content
└ economy
└ goods
└ goods.jsonPartez de la bougie que le jeu possède déjà. Elle s'appelle candle, elle coûte 3, elle pèse 0,5, c'est MANUFACTURED et PRESERVED, et elle est fabriquée par l'apothicaire. Le vôtre est le même objet fait d'une meilleure cire, alors gardez toutes ces réponses et changez-en deux.
D'abord mod.json:
mod.json
{
"id": "chandlery",
"name": "The Chandlery",
"version": "0.1.0",
"game_version": "0.0.0-dev",
"dependencies": [],
"load_order": 100,
"content_types": ["goods"],
"overrides": [],
"canon_safe": true
}Ensuite content/economy/goods/goods.json:
a goods record
[
{
"id": "chandlery:beeswax_candle",
"display_name": "Beeswax Candle",
"category": "MANUFACTURED",
"decay_tier": "PRESERVED",
"base_price": 9,
"weight": 0.4,
"production_class": "chandler",
"daily_consumption_class": "household",
"tags": ["light", "household"]
}
]| Champ | Pourquoi cela value |
|---|---|
id | Le nom de votre package, deux points, puis votre mot. Tout ce qui ne contient pas votre espace de noms devant est rejeté, vous ne pouvez donc pas prendre l'identifiant de quelqu'un d'autre par accident. |
display_name | Ce qu'un joueur lit. Pas d'article — « Bougie en cire d'abeille », jamais « Une bougie en cire d'abeille » : l'article est donné par la phrase qui l'entoure, et quel article dépend de la langue. Mots qu'un joueur lit. |
category | MANUFACTURED, parce que quelqu'un le fait. Les cinq sont les matières premières, les artefacts, les consommables, les munitions et l'équipement, et celui que vous choisissez décide quels bâtiments de production et caravanes sont affectés. |
decay_tier | PRESERVED — 90 jours, comme la bougie du jeu. La cire est conservée ; il n'est pas conservé éternellement. PERISHABLE dure 7 jours et ETERNAL ne pourrit jamais. |
base_price | 9. La bougie simple dans le jeu vaut 3 et un pot de miel vaut 8. La cire d'abeille provient des mêmes ruches que le miel et brûle sans odeur de graisse fondue, elle se trouve donc juste au-dessus du miel et est environ trois fois plus bonne qu'une bougie de suif. Ce n'est pas une importation : le poivre noir a 14 ans et a traversé une mer. |
weight | 0,4, un peu en dessous du 0,5 de la simple bougie. Le poids est ce qu'une caravane peut transporter, donc un produit qui ne pèse rien et se vend cher est un bug que vous écrivez volontairement. |
production_class | Quel métier exerce-t-elle ? chandler est celui utilisé par le package de référence. |
daily_consumption_class | Qui le consomme. household signifie que les villes en consomment constamment, et c'est ce qui permet à un commerçant de s'approvisionner. |
tags | Des mots libres. D'autres enregistrements et vos fichiers ultérieurs peuvent y être recherchés. |
Terminé — trouvez-le maintenant dans le jeu. Redémarrez, ouvrez Mod et la ligne en dessous de la vôtre indique 1 entry added. C'est tout ce qu'une marchandise fait par elle-même : elle a un prix, elle est commercialisable et elle ne se trouve sur le comptoir de personne, car personne ne l'a encore. Ce n’est pas un échec et c’est ce qui déroute tout le monde une fois. Continuez avec Un commerçant qui le détient.
Si non affiché : Rien n'est affiché a les six raisons dans l'ordre. Le plus courant est de loin content_types : une famille manquante sur cette ligne signifie que le dossier n'est jamais ouvert, quel que soit son contenu. Ensuite, [Avant de demander de l'aide à quelqu'un](#avant-de-demander-de-l'aide à quelqu'un), qui est un seul bouton.
Un objet à transporter
Vous aurez la chose qu'un joueur collectionne, empile dans son sac à dos et revend, couplée aux biens que vous venez de a écrit.
Capture d'écran : pas encore prise.
Lire en premier : Un bien à vendre · Noms et identifiants
Copier depuis : chandlery/content/inventory/items/items.json dans votre dossier mods.
Où vont les fichiers :
where the files go
mods
└ chandlery
├ mod.json
└ content
├ economy
│ └ goods
│ └ goods.json
└ inventory
└ items
└ items.jsonUn bien et un objet, ce sont les deux moitiés de la même chose. La marchandise est le point de vue de l'économie : ce qu'une ville produit, ce qu'une caravane transporte, combien elle vaut. L'objet est le point de vue du joueur : ce qui rentre dans le sac à dos, ce qui est empilé, ce qui est exposé dans un magasin. Le blé est une marchandise et aucun objet, car personne ne transporte un sac de blé. Les bougies ont les deux.
Ajoutez "items" à content_types dans mod.json, puis écrivez content/inventory/items/items.json:
a items record
[
{
"id": "chandlery:beeswax_candle_bundle",
"display_name": "Bundle of Beeswax Candles",
"category": "MATERIAL",
"rarity": "COMMON",
"weight": 0.4,
"max_stack": 20,
"base_value": 10,
"sellable": true,
"tags": ["light", "household"]
}
]| Champ | Pourquoi cela value |
|---|---|
id | Un identifiant qui lui est propre, pas celui de la marchandise. Ce sont des enregistrements différents dans différentes familles et rien ne les oblige à correspondre : les faire correspondre est votre travail, et la ligne marchande ci-dessous est l'endroit où la correspondance se produit. |
category | MATERIAL, qui est ce qu'est la bougie du jeu. Pas CONSUMABLE : vous ne mangez rien. |
rarity | COMMON. La rareté est ce que lisent les tables de butin et les magasins lorsqu'ils lancent les dés ; une chose courante arrive. |
weight | 0.4, comme les marchandises. Lorsque les deux ne sont pas d'accord, le sac à dos du joueur et la caravane ne sont pas d'accord sur le même article. |
max_stack | 20, comme le pain et comme le paquet de référence. Vingt est la pile ordinaire du jeu pour les petites choses que vous transportez sur vous ; 1 est pour quelque chose d'unique. |
base_value | 10 contre le 9 des marchandises. Un lot comporte une petite prime par rapport au prix de gros : le lot de suif de référence est de 4 contre un produit de 3, et il s'agit de la même forme un cran au-dessus. |
sellable | Vrai, sinon un marchand ne peut pas le racheter. |
Terminé — trouvez-le maintenant dans le jeu. Un objet qui personne ne livre est chargé et accessible à partir de rien. Dans une version de débogage, item chandlery:beeswax_candle_bundle en met un immédiatement dans votre sac à dos, et c'est la preuve la plus rapide qu'il est chargé - mais cette commande n'existe pas dans le jeu que les gens téléchargent, c'est donc un raccourci pour vous et jamais la réponse pour un joueur. La vraie réponse est le tutoriel suivant.
S'il n'apparaît pas : [Rien n'est apparu](#rien-est apparu), alors [Avant de demander de l'aide à quelqu'un](#avant-de-demander-de-l'aide-à-personne).
Un commerçant qui le garde
Vous aurez une femme avec un nom affiché à Old Seat avec un comptoir, des fournitures réapprovisionnées tous les deux jours et vos bougies sur le comptoir.
Capture d'écran : pas encore prise.
À lire en premier : Un objet à transporter · Trouvez-le maintenant dans le jeu
Copier depuis : chandlery/content/narrative/npcs/npcs.json et chandlery/content/world/vendor_inventories/vendors.json.
Où vont les fichiers :
where the files go
mods
└ chandlery
├ mod.json
└ content
├ economy
│ └ goods
├ inventory
│ └ items
├ narrative
│ └ npcs
│ └ npcs.json
└ world
└ vendor_inventories
└ vendors.jsonC'est celui où deux familles doivent s'entendre. La personne porte l'identifiant de la banque, la banque porte l'identifiant de la personne et chaque ligne de la banque porte l'identifiant d'un objet. Trois identifiants, et chacun doit être écrit exactement comme vous l'avez écrit dans l'autre fichier. C'est l'erreur qui coûte une soirée, et l'écran Mods la nomme : une ligne pointant vers un identifiant que personne ne fournit est répertoriée comme nécessite un autre mod qui n'est pas installé.
Ajoutez "npc_definitions" et "vendor_inventories" à content_types.
a npc_definitions record
[
{
"id": "chandlery:hesta",
"display_name": "Hesta the Chandler",
"title": "Candle Seller",
"short_bio": "She renders fat behind the tannery and sells what burns longest.",
"voice_tone": "brisk",
"faction": "NONE",
"role": "NONE",
"settlement_id": "old_seat",
"is_vendor": true,
"vendor_inventory_id": "chandlery:candle_stall",
"price_multiplier": 1.0,
"personality_tags": ["brisk", "practical"],
"offers_quest_ids": []
}
]a vendor_inventories record
[
{
"id": "chandlery:candle_stall",
"display_name": "Chandler's Stall",
"npc_id": "chandlery:hesta",
"global_price_multiplier": 1.0,
"buyback_rate": 0.35,
"entries": [
{
"item_id": "chandlery:beeswax_candle_bundle",
"kind": "misc",
"daily_stock": 6,
"price_multiplier": 1.0,
"restock_days": 2,
"min_standing": 0
}
]
}
]| Champ | Pourquoi cela value |
|---|---|
settlement_id | Utilisez un identifiant de colonie créé par les auteurs. Les identifiants de colonie sont créés par les auteurs et stables : Durnwall, Thorngate, Valdmere, Grentham et les douze villages peuvent tous être nommés. La seed change le terrain et les biomes autour d'eux, la pénurie de l'année et l'organisation politique, pas l'identifiant. |
is_vendor + vendor_inventory_id | Ensemble, ils transforment une personne en boutique. L’un sans l’autre est une personne qui ne peut pas vendre ou un comptoir dont personne ne s’occupe. |
price_multiplier | 1.0 — demande combien valent les choses. Au-dessus de 1 se trouve un endroit qui sait que vous n’avez aucune option ; les marchands du jeu sont à 1.0 s'il n'y a aucune raison sur la carte. |
buyback_rate | 0,35 : Payez environ un tiers de la valeur de ce que vous lui vendez. C'est le numéro que les joueurs entendent le plus et c'est celui qu'utilise le revendeur du pack de référence. |
daily_stock | 6. Combien il en a lorsque la banque se réapprovisionne. Six est le chiffre de référence pour un objet domestique bon marché ; l'un concerne quelque chose qu'une ville voit deux fois par an. |
restock_days | 2, donc il se réapprovisionne tous les deux jours — et pas le jour où vous installez le mod. C'est pourquoi un nouveau marchand semble vide au premier abord. Dans une version de débogage, day avance d'un jour. |
min_standing | 0 : Tout le monde peut acheter. Au-dessus de zéro se trouvent les stocks qu’elle conserve pour les personnes qu’elle aime. |
kind | Sur quel type de comptoir se trouve-t-il – misc pour un article pour la maison. Les autres sont weapon, armor, shield, consumable et ammo. |
Terminé – trouvez-le maintenant dans le jeu. Redémarrez, voyagez vers Old Seat, trouvez Hesta, ouvrez l'écran de trading. Si la banque est vide, c'est qu'elle n'a pas encore été réapprovisionnée : c'est restock_days, pas un bug. La chaîne peut être brisée de trois manières et toutes les trois sont sur l'écran du Mod : les marchandises que personne ne détient, le compteur qui pointe vers un identifiant d'article qui n'existe pas, la personne qui pointe vers un identifiant de compteur qui n'existe pas.
Elle peut aussi parler. Un dialogue_graph dont speaker est son identifiant lui donne des plaisanteries lorsqu'un joueur clique dessus, et votre package n'a pas besoin de redéfinir quoi que ce soit que le jeu a déjà pour les obtenir - voir [Vos conversations] (#conversations-of-your-own). Un fichier locales vous donne tout cela en sept langues.
Si rien ne s'affiche : vérifiez d'abord les trois identifiants les uns par rapport aux autres, puis Rien ne s'est affiché, puis [Avant de demander de l'aide à quelqu'un](#avant de demander de l'aide à quelqu'un).
La desserte d'un immeuble
Vous aurez une porte dans une colonie avec votre étiquette et votre couleur dessus, qui s'ouvre sur un intérieur que le jeu possède déjà.
Capture d'écran : pas encore prise.
À lire en premier : Un marchand qui le garde · [Ce qu'un mod ne peut jamais faire](#ce qu'un mod-peut-ne-jamais-faire)
Copier depuis : chandlery/content/world/buildings/buildings.json.
Où vont les fichiers :
where the files go
mods
└ chandlery
└ content
└ world
└ buildings
└ buildings.jsonVous recombinez, pas construisez. Un enregistrement buildings ajoute un nouveau service avec une étiquette, une couleur de port et un rôle de routine, et peut réutiliser une extension que le jeu possède déjà en la nommant. Impossible d'apporter une prolongation. Une extension est une scène, une scène est du code, et un paquet nommant un chemin res:// ou un .tscn est rejeté avant même que cet enregistrement ne soit lu. Ce n'est pas un trou qui attend d'être comblé : c'est la ligne qui permet d'installer en toute sécurité le mod d'un étranger.
a buildings record
[
{
"id": "chandlery:chandlery",
"label": "Chandlery",
"role": "merchant",
"color": { "r": 0.44, "g": 0.38, "b": 0.24 },
"interior_service": "shop"
}
]| Champ | Pourquoi cela value |
|---|---|
label | Les mots sur la porte. Si vous l'omettez, le jeu met en majuscule votre identifiant et il se lit comme un identifiant. |
role | Que font les gens à l'intérieur toute la journée ? merchant met la routine d'un commerçant derrière la porte. Le rôle est le vocabulaire du jeu, pas le vôtre : un étranger charge et agit comme si de rien n'était. |
color | Cire d'abeille marron, 0.44 / 0.38 / 0.24. Chaque canal va de 0 à 1 et une chaîne hexadécimale HTML fonctionne également. Choisissez quelque chose qui correspond à la taille à laquelle une porte est dessinée — [Art That Fits] (#art-that-fits). |
interior_service | shop — l'intérieur que le jeu conçoit déjà pour un magasin. Le truc est là : vous obtenez une vraie chambre meublée sans en apporter une. |
Terminé – trouvez-le maintenant dans le jeu. Redémarrez et entrez dans une colonie qui a votre service. Un enregistrement sans settlement est chargé et placé nulle part, ce qui est identique à un enregistrement raté : l'écran Mod dira 1 entry added et vous ne trouverez rien. Lisez la ligne avant de chercher la porte.
Si elle n'apparaît pas : [Rien n'apparaît](#rien-est apparu) · [Avant de demander de l'aide à quelqu'un](#avant-de-demander-de-l'aide-à-personne).
Un endroit sur la carte
Vous aurez un point sur la carte du monde qu'un joueur peut rencontrer, avec sa propre description et son effet sur l'humeur de l'entreprise.
Capture d'écran : pas encore prise.
Lire en premier : Le service de construction · Maintenant, trouvez-le dans le jeu
Copier depuis : chandlery/content/world/pois/pois.json.
Où vont les fichiers :
where the files go
mods
└ chandlery
└ content
└ world
└ pois
└ pois.jsonLes coordonnées sont absolues et le monde est généré autour de lieux créés par les auteurs. La carte mesure 61 440 × 34 560 pixels du monde et Old Seat se trouve exactement au centre, (30720, 17280), dans chaque partie. Les villes et villages créés par les auteurs gardent leurs noms et leurs positions. La seed change le terrain et les biomes autour d'eux, la pénurie de l'année, l'organisation politique et les routes qui valent la peine d'être prises. Un point reste donc un emplacement réel et stable ; ce qui se trouve à côté change à chaque partie. Deux façons honnêtes de l'utiliser : ancrer un point près d'une colonie créée par les auteurs, pour qu'un joueur le traverse ; ou choisir le vide, car une fosse de rendu que personne n'a visitée depuis des années est censée être nulle part en particulier.
a pois record
[
{
"id": "chandlery:tallow_pit",
"kind": "RUINS",
"display_name": "The Tallow Pit",
"description": "A rendering pit behind the tannery. The smell reaches the road.",
"world_position": { "x": 5400.0, "y": 3000.0 },
"discovery_radius": 2.0,
"one_time_loot": false,
"morale_modifier": -1,
"awareness_modifier": 0.0
}
]| Champ | Pourquoi cela value |
|---|---|
kind | RUINS — ce que dessine la carte et ce que le jeu pense qu'il s'agit. |
world_position | (5400, 3000), à l'extrême nord-ouest du centre : vide délibéré, deuxième des deux utilisations honnêtes ci-dessus. Déplacez-le à quelques milliers de pixels de (30 720, 17 280) et il devient un endroit que les joueurs trouvent réellement. |
discovery_radius | 2.0. À quelle distance la fête doit-elle passer. Assez grand pour le retrouver au bord d'une route, assez petit pour ne pas l'annoncer d'un bout à l'autre d'une province. |
morale_modifier | −1. C'est un gouffre de graisse fondue. Le nombre est volontairement petit : un lieu est un lieu, pas un événement, et −1 est une humeur, pas une punition. |
awareness_modifier | 0,0 — n'aide pas à voir. Laissez un nombre à zéro au lieu de supprimer le champ, alors que zéro est une décision. |
one_time_loot | Faux : il n'y a rien à prendre, donc rien à prendre une seule fois. |
Terminé – trouvez-le maintenant dans le jeu. Allez-y. Il n'y a pas de commande de téléportation, que ce soit dans une version de débogage ou à l'extérieur, alors choisissez les coordonnées aussi loin que vous êtes prêt à marcher pendant que vous essayez.
S'il n'apparaît pas : Vous n'avez probablement plus de discovery_radius, ou l'emplacement est quelque part où la graine de match a placé un océan. [Rien ne s'est présenté](#rien-s'est présenté).
Changer ce qui est déjà là
Vous aurez modifié un enregistrement apporté par le jeu — et vous l'aurez déclaré, afin que le changement soit visible par le joueur et tous les autres mods.
Capture d'écran : pas encore prise.
À lire en premier : Changer ce que le jeu a déjà · Quand deux mods veulent la même chose
Copier depuis : chandlery/content/economy/goods/goods.json, qui ajoute un enregistrement et corrige celui du jeu dans le même fichier.
Où vont les fichiers : Nulle part nouveau. Une modification apportée à quelque chose que le jeu possède déjà se trouve dans le même dossier familial dans lequel se trouvent vos enregistrements - le fichier indique quel enregistrement il vise et ce qu'il lui fait.
where the files go
mods
└ chandlery
├ mod.json the change is declared here
└ content
└ economy
└ goods
└ goods.json your record and the patch, in one fileDeux règles avant le fichier. Une modification apportée à l'enregistrement de quelqu'un d'autre doit être nommée dans overrides à l'intérieur de mod.json — un enregistrement qui atterrit sur un identifiant que vous n'avez pas déclaré est rejeté, donc rien ne peut réécrire secrètement quelque chose que le joueur n'a pas accepté. Et patch, qui modifie un champ et laisse le reste tranquille, nécessite "manifest_version": 2.
mod.json
{
"id": "chandlery",
"name": "The Chandlery",
"version": "0.1.0",
"game_version": "0.0.0-dev",
"manifest_version": 2,
"load_order": 100,
"content_types": ["goods", "items", "npc_definitions", "vendor_inventories", "buildings", "pois"],
"overrides": ["candle"],
"canon_safe": true
}a goods record
[
{
"op": "patch",
"id": "candle",
"changes": [
{ "op": "set", "field": "base_price", "value": 4 },
{ "op": "append_unique", "field": "tags", "value": "chandlery_touched" }
]
}
]| Choix | Pourquoi |
|---|---|
patch, pas replace | replace n'hérite de rien : il faudrait réécrire le poids de la bougie, son degré de dégradation, l'objet connecté et la classe de production, et le jour où le jeu donnerait un nouveau champ aux bougies, votre exemplaire serait la seule bougie au monde sans celui-ci. |
| 3 → 4 | Une pièce de monnaie, et la raison en est le mod lui-même : votre ville est une ville qui fait fondre la cire correctement, donc la bougie ordinaire ici vaut un peu plus. Passer de 3 à 30 ne changerait pas une bougie, ce serait un changement de priorité de chargement de chaque caravane. |
append_unique à tags | La seule chose que deux mods peuvent faire sans conflit. S'ils mettent tous les deux en file d'attente le même label, ce n'est pas un conflit et cela ne le double pas. |
| Nommer un champ, jamais un poste | tags.0 est rejeté. La troisième étiquette d'aujourd'hui est la deuxième après le chargement du colis de quelqu'un d'autre. |
Terminé — trouvez-le maintenant dans le jeu. L'écran Mod nomme l'enregistrement que vous avez acquis. L'écran de l'autre auteur fait la même chose, s'il y en a un : lorsque deux paquets écrivent le même identifiant, la ligne du perdant indique désormais remplacé : bougie — 'chandlery' l'écrit en dernier, au lieu d'afficher silencieusement une entrée de moins que celle qu'il a écrite. Celui qui a le load_order le plus élevé écrit en dernier et gagne.
Gagner n'est pas la même chose qu'avoir la permission. Deux paquets prenant un enregistrement sans que l'un ou l'autre nomme l'autre dans supersedes sont signalés comme undeclared_collision et la composition n'est pas correcte : le validateur hors ligne dit la même chose et rejette :
typed into the debug console
ERROR: conflict on goods:candle: ['early', 'late'] each supply the whole record
and none declares the others under `supersedes`Le gagnant est toujours calculé, car un rejet ne doit pas nécessairement être un tirage au sort, mais deux auteurs qui le souhaitaient tous deux doivent le dire. Quand deux mods veulent la même chose est cette conversation.
Si elle n'apparaît pas : la cause habituelle est overrides — l'identifiant doit être dans cette liste, écrit exactement, sinon l'enregistrement est rejeté au lieu d'être appliqué. Quand deux mods veulent la même chose · [Rien ne s'est affiché](#rien-s'est montré).
Un mod en dix minutes
1. Créez un dossier dans votre dossier mods, avec le nom en minuscules et traits de soulignement : northern_reach. Tout se passe là-dedans.
2. Écrivez mod.json en haut :
mod.json
{
"id": "northern_reach",
"name": "The Northern Reach",
"version": "0.1.0",
"game_version": "0.0.0-dev",
"dependencies": [],
"load_order": 100,
"content_types": ["items"],
"overrides": [],
"canon_safe": true
}id doit correspondre au nom du dossier. content_types répertorie les familles que vous apportez — une famille manquante sur cette ligne n'est jamais lue, peu importe ce qu'il y a dans le dossier.
3. Créez les dossiers content/inventory/items et placez-y blades.json:
a items record
[
{
"id": "northern_reach:frost_blade",
"display_name_key": "northern_reach.item.frost_blade.name",
"display_name": "Frost Blade",
"category": "weapon",
"base_value": 240,
"weight": 3
}
]. Les crochets sont une liste : ajoutez autant d'épées que vous le souhaitez, séparées par des virgules. Chaque fichier .json d'un dossier familial est lu, alors divisez-les comme bon vous semble.
240 n'est pas un nombre choisi pour impressionner. Les armes à une main dans ce jeu vont de 50 à 300, donc une lame de givre à 240 est une épée coûteuse et non une épée légendaire, et un joueur peut se le permettre à peu près autant qu'il pourrait se permettre les bonnes lames que le forgeron vend déjà. Où sont les numéros du jeu est le tableau à consulter avant de choisir un numéro ; un prix sans rien à côté est une hypothèse, et dans une économie qui fait du commerce entre les villes, une hypothèse ne reste pas là où vous la mettez.
4. Lancez le jeu et ouvrez Mods depuis le menu principal. Votre package obtient exactement un statut, et Est-ce qu'il s'est chargé ? a les six.
5. Lisez la ligne ci-dessous pour découvrir ce qui a été lu, appliqué et rejeté, avec la raison de chaque rejet. Afficher les détails a l'id.
6. Votre épée est dans le jeu. Tout ce qui vient après est à peu près pareil.
Trouvez-le maintenant dans le jeu
Le rapport indique applied. Cela veut dire que le disque est chargé, et ce n'est pas la même chose que de pouvoir marcher devant. C'est ici que chaque guide s'arrête et chaque auteur commence à deviner.
| Qu'avez-vous ajouté | Où est-ce que ça coche | Le piège |
|---|---|---|
goods | Sur un commerçant, dès que une ligne de vendor_inventories le demande. Une marchandise que personne ne conserve est chargée, tarifée, commercialisable quel que soit le nom que vous lui donnez, et sur aucun comptoir nulle part. | Ajouter la marchandise représente la moitié du travail. L'autre moitié est la ligne. |
vendor_inventories | Le commerçant nommé dans npc_id. Chaque ligne comporte son propre daily_stock et son propre restock_days, donc une ligne avec restock_days: 2 se réapprovisionne tous les deux jours et non le jour où vous l'avez ajoutée. | Utilisez day dans la console pour sauter un jour au lieu d'attendre. it. |
items | Partout, quelque chose vous en offre : une ligne marchande, une table de butin, une récompense de quête. Un objet qui n'accorde rien existe et ne peut être atteint qu'avec item <id> dans la console. | item northern_reach:frost_blade le met immédiatement dans votre sac à dos et c'est le moyen le plus rapide de voir qu'il est chargé. |
npc_definitions | Le règlement indiqué dans settlement_id, à l'endroit indiqué par location_morning / location_afternoon / location_evening. | Lisez le paragraphe ci-dessous sur settlement_id avant d'en écrire un. |
buildings | Le règlement indiqué en settlement, dessiné avec le role et le color que vous lui avez donné. interior_service est ce qu'un joueur trouve lorsqu'il entre. | Un bâtiment sans settlement est chargé et placé nulle part. |
pois | Sur la carte du monde à world_position, découvrable par discovery_radius. | Lisez le paragraphe sur les coordonnées ci-dessous. C'est ce dont tout le monde se soucie. |
settlement_id désigne un lieu créé par les auteurs. Les identifiants de colonie sont créés par les auteurs et stables : Durnwall, Thorngate, Valdmere, Grentham et les douze villages peuvent tous être nommés. La seed change le terrain et les biomes autour d'eux, la pénurie de l'année et l'organisation politique, pas l'identifiant. Si vous voulez qu'une personne soit certainement rencontrée, utilisez n'importe quel identifiant de colonie créé par les auteurs et gardez son nom dans les données de langue de votre package.
Les coordonnées sont absolues et le monde est généré autour de lieux créés par les auteurs. La carte mesure 61 440 × 34 560 pixels du monde et Old Seat se trouve exactement au centre, (30720, 17280), dans chaque partie. Les villes et villages créés par les auteurs gardent leurs noms et leurs positions. La seed change le terrain et les biomes autour d'eux, la pénurie de l'année, l'organisation politique et les routes qui valent la peine d'être prises. Ainsi, une world_position de (6000, 2200) reste un point réel et stable dans le nord-ouest lointain de la carte, tandis que ce qui se trouve à proximité change à chaque partie : route, forêt ou plein milieu de nulle part. Deux façons de l'utiliser honnêtement :
- Toujours au centre.Un point d'intérêt situé à quelques milliers de pixels (30720, 17280) se trouve à proximité du vieux siège dans chaque jeu, c'est donc un endroit qu'un joueur trouvera.
- Vous voulez dire le vide. Une ruine par laquelle personne n'est passé depuis cent ans doit être quelque part. Les coordonnées absolues sont exactement bonnes pour cela, et la graine décidera quels voisins elle aura.
Les commandes de console qui font gagner le plus de temps. day [n] et hour [n] avancent le temps, et c'est ainsi que vous voyez un approvisionnement sans en faire l'expérience. item <id> [count] et gold <amount> mettent les choses entre vos mains. flag, quest_start et faction_rep déplacent l'état qu'une condition peut attendre. Il n'y a pas de commande de téléportation : pour vous rendre à un endroit, voyagez-y.
mod.json, champ par champ
| Champ | Ce qu'il fait |
|---|---|
id | Dans l'exemple ci-dessus. Le nom de votre colis. Il doit correspondre exactement au dossier et correspond au mot précédant les deux points dans chaque identifiant que vous écrivez. |
name | Dans l'exemple ci-dessus. Ce qu'un joueur voit. Les majuscules et les espaces conviennent ici. |
version | Dans l'exemple ci-dessus. Vous le choisissez. Augmentez-le chaque fois que vous modifiez quelque chose. |
game_version | Dans l'exemple ci-dessus. La version pour laquelle vous avez fait cela. |
content_types | Dans l'exemple ci-dessus. Les familles que vous amenez. Une famille absente de cette liste n'est jamais lue, quel que soit le contenu du dossier. |
dependencies | Dans l'exemple ci-dessus. Les packages dont vous avez besoin. Un nom ou un objet avec optional: true. |
load_order | Dans l'exemple ci-dessus. Qui commence en premier lorsque deux paquets touchent la même chose. Le plus bas se charge en premier. |
overrides | Dans l'exemple ci-dessus. Les identifiants du jeu de base que vous avez l'intention de modifier. Un identifiant, ou un file.json:id quand on parle de la copie qui fait un fichier précis. |
canon_safe | Dans l'exemple ci-dessus. Si votre mod s'inscrit dans l'histoire du jeu. C'est vous qui dites aux joueurs, pas le jeu qui décide. |
roots | Un dossier familial, lorsque vous le souhaitez ailleurs que par défaut dans Familles, une par une. Restez à l’intérieur de votre colis. |
manifest_version | Quelle forme de manifeste écrivez-vous ? Les opérations Modifier ce que le jeu a déjà nécessitent le 2. Cette version lit jusqu'à 2. |
type | De quel type de package il s'agit. La quatrième valeur est celle qui envoie un comportement au lieu de données, et la seule chose dans cette version qui dit oui à l'exécution du comportement dit non, donc un paquet qui le déclare est rejeté. Il est sur la liste parce que la forme est décidée, non pas parce que la porte est ouverte ; Ce qu'un mod ne peut jamais faire est la lecture honnête. L'un des content, overhaul, total_conversion, feature_extension. |
capabilities | Ce qu'un paquet demanderait à l'hôte, si le niveau supérieur s'ouvrait un jour. Un champ inconnu ici ne se ferme pas, plutôt que d'être ignoré. |
trust_tier | Non fiable, c'est ce qu'est et reste un mod téléchargé par un joueur. C'est un invité qui nomme l'autre ; rien d'un paquet écrit ici n'en fait la promotion. L'un des paquets untrusted, trusted. |
supersedes | Les paquets que cela a l'intention de remplacer. Un champ ainsi revendiqué cesse d'être signalé comme une collision. Ici aussi, un champ inconnu ne se ferme pas. |
fallback_policy | Sur quoi un paquet s'appuie-t-il lorsqu'il manque quelque chose qu'il remplace. L'un des vanilla, none. |
campaign | Campagne appartenant à une conversion. |
campaign_package | Déclare que ce package est une campagne, avec son propre identifiant, son nom et sa version. Un pack le transportant n'est lu que pendant que sa campagne est en cours, et un joueur le choisit dans l'écran Mods avant une nouvelle partie. Une conversion totale.La dépendance |
A peut être un objet au lieu d'un nom : {"id": "some_mod", "version": "", "optional": true}.
Une valeur qui nomme un autre package est une référence cross-mod, et la référence doit être une dépendance déclarée. Si cette dépendance est facultative, attribuez au champ un fallback, sinon l'enregistrement est ignoré lorsque la dépendance est absente :
a goods record
[
{
"op": "add",
"id": "northern_reach:alloy",
"display_name": "Alloy",
"linked_item_id": "absent_helper:ore",
"fallback": { "linked_item_id": "iron_ore" }
}
]Où va chaque fichier
where the files go
northern_reach/
mod.json the label
content/assets/images/
images.json your art
content/inventory/items/
blades.json your first record
content/narrative/quest_plans/
the_long_winter.json your questNoms et identifiant
Un identifiant est constitué de lettres minuscules, de chiffres et de traits de soulignement, et rien d'autre. frost_blade, pas Frost Blade, pas frost-blade et pas frost.blade. Il ne comporte même pas son propre séparateur, car un séparateur à l'intérieur d'un identifiant est le dossier qui s'infiltre dans le nom : déplacez le fichier et l'identifiant ne correspond plus au disque. Les : ci-dessus sont la seule exception, et les deux moitiés suivent la règle.
La partie avant les deux points est l'identifiant de votre package. C'est ainsi que deux mods peuvent tous deux ajouter une Frost Blade sans entrer en collision.
Mots qu'un joueur lit
Le texte écrit dans un enregistrement est un texte en une seule langue. Au lieu de cela, il pointe vers une clé :
a locale CSV
northern_reach.item.frost_blade.name
northern_reach.item.frost_blade.descriptionLes clés sont en minuscules, reliées par des points, avec l'espace de noms comme identifiant. Introduire des mots dans la famille locales — un .csv sous content/locale avec une colonne key et une colonne de langue. Les familles, une par une a la forme exacte.
Écrivez également le simple display_name à côté de la clé. Un enregistrement qui ne contient qu'une seule phrase doit être réécrit à la main le jour où vous le traduisez, et il y en aura alors quatre cents.
Les deux façons de se tromper échouent de manières très différentes, et une seule des deux vous l'indique. Une clé qui ne répond à rien apparaît comme la clé elle-même - northern_reach.item.frost_blade.name, sur l'écran, délibérément laide pour que quelqu'un la répare, et comptée comme un trou. Un enregistrement contenant uniquement du texte et aucune clé n'apparaît jamais : il fonctionne, dans votre langue, pour chaque joueur et dans toutes les langues. Rien n'est rejeté et rien ne manque, donc rien ne le signale, et un joueur lisant en portugais lit silencieusement votre italien. Vous trouvez la première erreur. Le second trouve vos lecteurs.
Traduire un mod et être traduit
Le jeu sort en sept langues, donc un paquet avec l'anglais intégré dans les archives se lit en anglais pour les six septièmes de ceux qui l'installent. C'est ce qu'il en coûte pour l'éviter, c'est-à-dire presque rien si vous le faites le premier jour et une réécriture si vous le faites le quatre centième.
Les langues qui sont là
Sept, et ce tableau est lu à partir de la construction plutôt que manuscrit ici, donc une langue qui arrive ou qui part le déplace sur le même jour :
| Écrivez ceci | Langue | En-tête de colonne | |
|---|---|---|---|
en | Anglais | en | la langue source |
it | italien | it | |
fr | Français | fr | |
de | Allemand | de | |
es | Espagnol | es | |
pt-BR | Portugais (Brésil) | pt_BR | |
zh-Hans | 简体中文 | zh_Hans |
Deux des codes ont une deuxième orthographe en circulation - pt-BR est celui qu'ils utilisent dans une vitrine numérique et cette page, pt_BR est celle à laquelle le moteur se conforme - et dans un en-tête de colonne, les deux sont accepté. Écrivez celui que vous avez copié.
Portant des mots dans plusieurs langues
A CSV sous content/locale, avec key en premier et une colonne par langue :
a locale CSV
key,en,it,de
northern_reach:GOOD_FROST_SALT,Frost Salt,Sale di Brina,Frostsalz
northern_reach:ITEM_FROST_BLADE_NAME,Frost Blade,Lama di Brina,Frostklinge| Règle | Pourquoi |
|---|---|
| Chaque clé tient dans votre espace de texte noms | northern_reach:GOOD_FROST_SALT, avec les mêmes deux-points que ceux utilisés par les identifiants. Une clé extraite de là est rejetée à moins que overrides ne la déclare — sinon deux paquets écrivant tous deux GOOD_GRAIN seraient résolus par l'ordre de chargement, silencieusement. |
| Une colonne nommant une langue que le jeu ne propose pas est rejetée | Non ignoré. Une colonne que le chargeur lâchait silencieusement ne donnerait rien et vous le découvririez auprès d'un joueur. |
| Une cellule vide n'est pas une réponse | Elle est ignorée au lieu d'être mémorisée, donc une langue que vous n'avez pas encore atteinte passe à l'étape suivante au lieu de rester vide à l'écran. |
| Jamais les deux | Un enregistrement portant un champ _key et une chaîne verbatim pour la même chose est rejeté. La clé est la promesse ; la chaîne est ce que la clé a remplacé. |
Lorsqu'une clé n'a pas de réponse dans la langue du joueur, le jeu descend une échelle fixe : la langue du joueur, puis la langue dans laquelle votre package prétend avoir été écrit, puis le catalogue du jeu, puis la clé elle-même. La dernière étape est volontairement moche : une clé non résolue doit avoir une mauvaise apparence pour que quelqu'un puisse la réparer. Une conversion totale ignore le catalogue du jeu, car Old Seat faisant surface dans un monde se déroulant sur un autre continent n'est pas un petit oubli de traduction, c'est le jeu de base qui transparaît.
Écrire un texte pouvant être traduit
- Aucune phrase construite en morceaux. L'ordre des mots n'est pas le même dans toutes les langues, donc un nom assemblé lors de l'exécution à partir d'une colonne d'adjectifs et d'une colonne de noms produit Oro Cervo en italien. Une entrée écrite pour chaque langue, complète.
- Le nom d'une personne n'est jamais traduit ni fléchi. Aldric est Aldric dans toutes les langues. Ce qui signifie aussi qu'une touche ne doit pas mettre un nom en position oblique —
"of {name}","{name}'s"— car de nombreuses langues déclinent les noms propres et le jeu ne le fait pas. - Il n'y a pas de limite de caractères, et ce n'est pas la même chose que de n'avoir aucune limite. Aucun champ ne compte les caractères ; ce qui finit par être de l'espace à l'écran. L'allemand est environ un tiers plus long que l'anglais et est la langue la plus utilisée ; le chinois est beaucoup plus petit et ne le fait presque jamais. Si vous essayez une seule traduction, essayez l’allemand et attribuez à une étiquette la formulation la plus courte qui soit encore correcte.
Quelqu'un qui traduit votre colis
Ajoute une colonne et vous renvoie le fichier. Le flux de travail est là, et c'est pourquoi le format est CSV au lieu de quelque chose de plus convivial pour un programmeur : un traducteur peut l'ouvrir dans une feuille de calcul, et ses outils le lisent déjà.
Deux choses font la différence entre un package traduit et un autre non. Gardez les clés stables — une clé renommée est une traduction perdue, et le traducteur le découvre lorsqu'un joueur le découvre. Et dites à quoi sert une ligne : une clé appelée NR_MSG_01 obtient une supposition, tandis que northern_reach:VENDOR_HERB_GREETING reçoit le message d'accueil d'un vendeur d'herbes.
Si c'est vous qui traduisez le paquet de quelqu'un d'autre, les mêmes règles vous lient : les colonnes sont les langues que porte le jeu, les clés sont ses clés et non les vôtres, et un nom reste un nom.
Changer ce que le jeu a déjà
| Tu veux | Opération | De quoi avez-vous besoin |
|---|---|---|
| Ajouter quelque chose de nouveau | add | Votre propre identifiant avec votre propre espace de noms. Rien d'autre. |
| Réécrivez l'un des records du jeu | replace | L'identifiant de l'enregistrement répertorié dans overrides. Un dossier complet : il n'hérite de rien. |
| Changez un champ et laissez le reste tranquille | patch | overrides, plus "manifest_version": 2 dans mod.json. |
| Retrait d'un enregistrement | remove | overrides, et une famille qui l'accepte. Voir Retirer quelque chose. |
part of mod.json
"overrides": ["iron_sword"]overrides est une promesse. Un enregistrement qui atterrit sur un identifiant que vous n'avez pas déclaré est rejeté, vous ne pouvez donc jamais modifier silencieusement quelque chose qu'un joueur ne connaissait pas. rien.
a goods record
[
{
"op": "patch",
"id": "iron_ore",
"changes": [
{ "op": "set", "field": "base_price", "value": 14 }
]
}
]| Opération | Ce qu'il fait | Requires | Reject |
|---|---|---|---|
add | Fournissez un nouvel enregistrement complet sous votre espace de noms. | id avec un espace de noms | un identifiant qui existe déjà, que ce soit depuis le jeu de base ou un autre mod |
replace | Fournir un enregistrement complet pour un identifiant qui existe déjà, après l'avoir déclaré. | écraser déclaré, enregistrement complet | un identifiant absent du registre et un identifiant que le manifeste ne répertorie pas sous overrides |
patch | Modifiez les champs nommés d’un enregistrement existant et laissez le reste tranquille. | remplacement déclaré, modifications | un identifiant absent du registre, un champ que la famille n'autorise pas, et toute forme de modification en dehors de patch_operations |
remove | Retirez un document existant et laissez une pierre tombale à sa place. | dérogation déclarée, famille amovible | un identifiant absent du registre et toute famille non marquée comme amovible ci-dessous |
Un patch nomme ses modifications une par une :
- set — Écrit
valuedansfield, tout ce qui s'y trouvait auparavant. Il s'écrit avecfieldetvalue. - unset — Supprime
fieldde l'enregistrement afin que le lecteur voie la valeur par défaut de la famille. Il est écrit avecfield. - append_unique — Ajoute
valueà la liste dansfieldsi ce n'est pas déjà fait. Il s'écrit avecfieldetvalue. - remove_value — Supprime chaque occurrence de
valuede la liste dansfield. Il s'écrit avecfieldetvalue.
- Nommez un champ par chemin, jamais par emplacement.
tags.0est rejeté. La troisième étiquette d'aujourd'hui est la deuxième après avoir chargé le mod de quelqu'un d'autre. - Un chemin peut contenir jusqu'à quatre noms minuscules joints par des points. Tout ce qui contient un opérateur est rejeté.
append_uniqueest celui que deux mods peuvent partager. S'ils ajoutent tous les deux la même étiquette, ce n'est pas un conflit et ce n'est pas le cas. doubles.
Seulement parfois, l'enregistrement
A peut indiquer quand cela vaut la peine. Ajoutez un when à côté du op, dans un package avec "manifest_version": 2:
a presentation_bindings record
{
"op": "add",
"id": "my_mod:snowy_cloak",
"subject": "wool_cloak",
"kind": "item",
"slot": "icon",
"cue": "my_mod:cloak_snowy",
"when": { "season": { "is": "winter" } }
}Il n'y a aucun opérateur et rien à calculer. Tout ce qu'une condition peut dire se trouve dans ces deux tableaux.
| Ask de | Décisé | Essais | Valeurs |
|---|---|---|---|
packages | au chargement | all_of, none_of | identifiants de mod téléchargés à côté du vôtre |
campaign | au chargement | is, any_of, not_any_of | la campagne à partir de laquelle le match a commencé |
locale | au chargement | is, any_of, not_any_of | la langue dans laquelle vous jouez |
season | en jouant | is, any_of, not_any_of | spring, summer, autumn, winter |
weather | en jouant | is, any_of, not_any_of | une idée de la météo pendant laquelle le jeu s'est déroulé |
day_phase | en jouant | is, any_of, not_any_of | dawn, day, dusk, night |
day | en jouant | at_least, at_most | combien de jours a duré le match |
| Procès | Prend | Vrai quand |
|---|---|---|
is | un nom | la réponse est exactement ça |
any_of | une liste | la réponse est une de celles-là |
not_any_of | une liste | la réponse est aucune de celles-là |
at_least | un numéro | la réponse est celle-là ou plus |
at_most | un numéro | la réponse est celle-là ou inférieure |
all_of | une liste | ils sont tous là |
none_of | une liste | il n'y a personne |
Maximum quatre sujets dans un when, deux essais par sujet. Deux tests sur le même sujet forment un intervalle : { "day": { "at_least": 10, "at_most": 30 } }.
Quelle famille prend quoi. Chaque famille prend les trois décidées à charger. Seuls presentation_bindings et effects prennent les quatre qui bougent en jouant, car seuls ces deux-là sont reconstruits lorsque le monde change. La nomination de season ailleurs est rejetée et le message indique les sujets que cette famille prend réellement.
La raison en est les sauvetages. Un enregistrement qui décide d'un objet, d'une personne ou d'une mission doit être le même enregistrement lors du prochain chargement, et une condition qui bouge est exactement ce qui l'empêche de le faire.
Un aspect saisonnier va sur le lien, pas sur l'image. Apportez l'image une seule fois, puis deux enregistrements presentation_bindings pour elle : un avec un when, un sans. images, audio et fonts rejettent un when sans discussion.
La retenue n'est pas rejetée. Une condition non satisfaite détient son record et le rapport de charge l'indique nommément :
what the game prints back
WITHHELD my_mod:snowy_cloak from my_mod: season is winter, and it is springUn package avec cinquante enregistrements, les travailleurs saisonniers sont retenus pendant les trois quarts à tout moment. C'est le package qui fonctionne.
Si chaque association de présentation conditionnelle est refusée, le rapport montre toujours la famille telle que déclarée et imprime bound=0 avec chaque ligne WITHHELD ; ne signale pas à tort que l'emballage n'a pas de surface de présentation. Si aucune liaison inconditionnelle ne fournit le même emplacement, elle imprime également NO_APPLICABLE kind/subject/slot avec la condition sans réponse, ce qui signifie « rien ne s'applique dans cet état du monde », et non « l'enregistrement n'était pas valide ». Testez la condition dans la voie de l'hôte ou de l'exécution avec l'état mondial correspondant avant de supposer que l'association a été rejetée.
Deux versions de la même chose. Apporte deux enregistrements add avec le même identifiant et des conditions différentes. Celui dont l'état tient est celui qui charge. Si les deux sont valables, le second est rejeté en tant que doublon – c'est ainsi que les conditions qui se chevauchent sont signalées au lieu d'être résolues par l'ordre des fichiers.
Supprimer quelque chose
remove signifie discontinué, et non hors d'existence. Le record continue de se résoudre et de se marquer : rien de nouveau n'est plus proposé, conservé en stock, fabriqué ou généré par lui, et tout ce qu'un joueur possède déjà et qui le nomme continue de lire exactement ce qu'il a toujours lu.
| Famille | remove | Ce qui se produit |
|---|---|---|
goods | Oui | Retiré. Il résout toujours l'identification, contrairement à ce que propose le jeu. |
vendor_inventories | Oui | Annulé. La ligne est supprimée. |
| tout le reste | Non | Rejeté, avec raison. |
a goods record
{ "op": "remove", "id": "iron_ore" }vendor_inventories est la seule famille qui supprime l'enregistrement, et uniquement parce que les règles de sauvegarde indiquent déjà que personne ne pointe vers cette ligne.
Un remove ne peut pas transporter un when. Un retrait qu'un sauvetage pourrait nommer doit être décidé, sinon une ça se résout un soir et pas le lendemain.
Une suppression est permanente pour une composition. Un patch, replace ou un deuxième remove ciblant l'ID retiré est rejeté, même si un rappel de marchandises permet de résoudre l'ancien enregistrement grâce à sa suppression permanente. Cela empêche le rapport de sauvegarde d'indiquer « retraité » alors qu'un package ultérieur fait en sorte que l'enregistrement se comporte à nouveau comme fourni. Ajoutez un nouvel ID d'espace de noms lorsque vous avez besoin d'un nouvel enregistrement ; Ne comptez pas sur la suppression suivie d'une résurrection silencieuse.
Quand deux mods veulent la même chose
Ils chargent tous les deux. Chaque changement est composé avant que quoi que ce soit ne soit construit, donc le jeu voit les deux.
| Quels affrontements | Ce qui se produit |
|---|---|
| Différents champs d'un même enregistrement | Les deux s’appliquent. Rien n'est perdu. |
| Le même champ simple | Gagne le load_order plus tard, et un conflit non déclaré est une erreur : undeclared_collision, et la composition n'est pas correcte. |
| Deux packages qui fournissent l'intégralité du dossier | Le même. Le gagnant est décidé sur load_order et le plan refuse toujours jusqu'à ce que quelqu'un le déclare. |
La même liste, avec append_unique / remove_value | Aucun conflit. Les deux disent ce que la liste devrait contenir, et non ce qu’elle devrait être. |
| Un package retire un enregistrement, un autre le modifie ou le remplace | Le retrait reste valable. L'opération suivante est refusée, quel que soit l'ordre de chargement. |
| Deux packages qui abordent le même sujet | L'ordre de chargement l'emporte plus tard, le perdant est nommé dans le rapport. |
| Un package qui habille le contenu d'un autre package | Refused. |
Gagner et obtenir la permission sont deux questions différentes, et c'est ce qui est surprenant. Le jeu calcule toujours quel paquet il écrit en dernier – le laisser au hasard ferait même un tirage au sort un rejet – et signale toujours la paire comme une collision que personne n'a déclarée. Le validateur hors ligne rejette la même paire sans discussion, vous vous informez donc avant un joueur.
supersedes dans votre manifeste est votre façon de dire que vous l'avez fait exprès. Nommez l'identifiant de l'autre paquet et le conflit devient declared_replacement : enregistré, avec raison, et non plus une erreur.
Donnez à votre package un load_order qui lui est propre. Deux packages partageant un numéro ne sont pas rejetés, puis le gagnant ne sort plus de l'ordre alphabétique de l'identifiant du mod : un ordre qu'aucun des auteurs n'a choisi et qu'aucun joueur ne peut lire à l'écran.
Images, sons, écritures, couleurs
Apporter un fichier et l'utiliser sont deux étapes distinctes et vous avez besoin des deux. Un fichier vers lequel rien ne pointe est lu, vérifié, mesuré et jamais affiché.
| Type | Déposer | Installé | Qu'est-ce que ça veut dire |
|---|---|---|---|
image | .png, .webp | Oui | Le fichier est lu et la texture est construite. |
audio | .ogg, .wav | Non | Les descripteurs sont validés, l'en-tête est lu et la durée délimitée, et rien ne sonne : aucune famille de contenu ne transporte d'audio et la fonctionnalité audio ne demande à aucun catalogue un paquet son. Apportez le son quand la famille existera ; aujourd'hui, il serait mesuré et silencieux. |
font | .ttf, .otf | Non | Les descripteurs sont validés et la couverture linguistique vérifiée, et aucun thème ne résout un caractère de package. L'interface construit ses polices à partir du thème qu'elle apporte, de sorte qu'une police fournie par un package serait vérifiée et ne serait définie sur rien. |
Apportez le dossier
Chaque famille de ressources est un descripteur de fichier ainsi que les fichiers qu'il nomme. Le descripteur doit être nommé comme sa famille : images.json, audio.json, fonts.json.
where the files go
content/assets/images/
images.json
river_guard.png| Famille | Dossier | Accepter | Champs obligatoires |
|---|---|---|---|
images | content/assets/images | .png, .webp | id, file, format |
audio | content/assets/audio | .ogg, .wav (non compressé) | id, file, codec, role |
fonts | content/assets/fonts | .ttf, .otf | id, file, format, sizes, covers, fallback_font |
themes | content/assets/themes | jetons de couleur | id, tokens |
effects | content/assets/effects | modèles hôtes | id, template |
a images record
[
{
"id": "northern_reach:river_guard",
"file": "river_guard.png",
"format": "png"
}
]Trois règles qui mordent :
- L'en-tête est vérifié avant que quoi que ce soit ne le décode.
formatest ce que est le fichier, pas ce que prétend l'extension. - Un nom de
filequi contient..ou~, ou qui commence par/,\,res://ouuser://, est rejeté sur le nom. - Un identifiant qui ne se résout pas reçoit un espace réservé et un avertissement, jamais de silence.
Pariez dessus
Sur un enregistrement que vous transportez, avec un champ qui reprend votre identifiant d'image :
| Famille | Champ | Qu'est-ce que c'est |
|---|---|---|
items | icon_id | L'icône sur un objet que vous portez. |
npc_definitions | portrait_id | Le portrait d'un PNJ avec un nom. |
perks | icon | L'icône d'un privilège. |
Sur tout, y compris le contenu du jeu de base, avec un enregistrement presentation_bindings nommant le sujet, son type et son emplacement :
a presentation_bindings record
[
{
"id": "northern_reach:iron_sword_icon",
"subject": "iron_sword",
"kind": "item",
"slot": "icon",
"cue": "northern_reach:river_guard",
"alternative_key": "northern_reach_iron_sword_icon_alt"
}
]| Machines à sous | Tu portes | Où il apparaît | alternative_key | Dessiné |
|---|---|---|---|---|
portrait | image | Le cadre du dialogue, pour l'identifiant du locuteur. | obligatoire | Oui |
sprite | image | Un jeton de troupe, un terrain de carte du monde ou un bâtiment dans une colonie. | — | Oui |
icon | image | Cellules d'inventaire, pour n'importe quel objet – le vôtre ou celui du jeu. | obligatoire | Oui |
banner | image | Les couleurs de la maison sur sa page de journal. | — | Oui |
voice | audio | Il retentit lorsque la ligne du haut-parleur apparaît. | obligatoire | pas encore |
use_sound | audio | Sonne lorsqu'un élément est utilisé et que son utilisation a pris effet. | — | pas encore |
ambience | audio | Il circule pendant que le joueur se tient sur ce terrain. | — | pas encore |
theme | theme | Laquelle de vos palettes porte l'interface. | — | Oui |
font | font | Lequel de vos personnages porte l'interface. | — | pas encore |
effect | effect | Météo et lumière sur le terrain auquel il est lié. | — | Oui |
alternative_key est obligatoire là où un slot porte une information : c'est la clé de langue qui dit la même chose à un joueur qui ne peut pas recevoir l'image.
Son
role est une limite, pas une étiquette : chacun a sa propre durée maximale, son propre plafond sur le nombre de joueurs jouant ensemble et le curseur qu'un joueur recherche.
| Rôle | Pour | Curseur |
|---|---|---|
music | Chansons | Musique |
ambience | Pièces, heure, lieux | Environnement |
sfx | Effets courts | Effets |
voice | Blagues parlées | Effets |
Un WAV compressé est rejeté : son décodage nécessite un analyseur, et c'est précisément cet analyseur que vous évitez.
Écrits
covers nomme les langues pour lesquelles votre police contient des glyphes, et la version refuse de l'installer pour les autres. Un caractère manquant une langue n'échoue pas : dessinez des petits carrés, et l'écran se lit comme une traduction à moitié terminée, avec le bon texte et le défaut de la police.
fallback_font est obligatoire : nommez un autre identifiant de police de votre choix ou une famille de système (Segoe UI, Noto Sans). sizes est la base sur laquelle le cache de glyphes est calculé.
Un seul caractère, jamais une collection — un .ttc en contient plusieurs et celui qui arrive dépend d'un index que le descripteur ne peut pas porter. Polices gratuites avec une large couverture : Google Fonts, Font Squirrel. Vérifiez que la licence vous permet de redistribuer le fichier - votre package le contient.
Couleur
Des jetons, jamais une scène, un script ou un chemin de ressource. Les noms sont ceux du jeu : bg_deep, bg_mid, bg_button, bg_hover, border, border_hi, text, text_dim, accent, gold. Un nom que cette version ne connaît pas est mentionné dans le journal au lieu de rester là, semblant être appliqué.
a themes record
[
{
"id": "northern_reach:dusk",
"tokens": {
"bg_deep": { "kind": "colour", "value": "#12131a" },
"text": { "kind": "colour", "value": "#e8e2d0" },
"border": { "kind": "colour", "value": "#7f6ab0" }
},
"contrast_pairs": [
{ "text": "#e8e2d0", "background": "#12131a" }
]
}
]contrast_pairs sont vérifiés à un ratio de 4,5 et en dessous, le thème est rejeté. Le WebAIM Meter vous indique le ratio d'une paire avant de la porter.
Éteignez le package et l'interface reprend ses couleurs et ses écritures.
Un art qui fait du bien
Le build vérifie qu'une image est une image. Cela n'a rien à dire quant à savoir si cela semble correct, et dans un monde dessiné en gris, une épée brillante, joyeuse et haute résolution n'arrête pas de se tromper en passant tous les examens minutieux. C'est ce que l'on sait aujourd'hui.
| Le registre | Du pixel art, gris et pas très héroïque. Terne, usé, taché par le temps. Une palette adaptée à un après-midi pluvieux dans une ville qui a connu une mauvaise année. |
| Tuiles | 16 pixels, pour tout ce qui est dessiné à l'intérieur d'une carte. [Vos cartes] (#maps-of-your-own). |
| Formats et limites | .png ou .webp, jusqu'à 8 192 par côté, jusqu'à 8 Mo, contrôlés par en-tête avant quelque chose decode. |
| Couleur de l'interface | Les dix jetons de themes et un ratio contrast_pairs de 4,5 en dessous duquel le thème est rejeté. |
Le guide de style complet n'est pas encore publié. Ce que cela apportera : la palette elle-même, les dimensions à dans lequel chaque type de chose est dessiné, et des exemples côte à côte de ce qui se trouve à l'intérieur du monde et de ce qui en sort. Cela vaut la peine d'attendre au lieu de deviner, car la panne qu'il évite n'est pas un fichier rejeté : c'est un package qui s'installe parfaitement et fait ressembler le jeu à deux jeux.
Tant qu'elle n'existe pas, la méthode fiable est celle qui ne nécessite aucun document : placez votre image à côté de celle du jeu et regardez-les ensemble.
Cartes your
Dessinez dans Tiled, exporte vers .tmj, et indexez-le vers content/world/maps/maps.json.
a maps record
[
{
"id": "northern_reach:river_bend",
"file": "river_bend.tmj",
"name_key": "NORTHERN_REACH_RIVER_BEND",
"world_origin": [4096, 2560],
"region_id": "northern_reach:lowlands"
}
]| Règle | Qu'est-ce que ça veut dire |
|---|---|
| Le kit | Carreaux de 16 pixels, orthogonaux, en bas à droite, terminés. |
| Les niveaux sont des rôles, pas des noms | ground, collision et walkable sont obligatoires. Un niveau appelé collisions est rejeté plutôt qu'ignoré. |
| La géométrie se déclare | La zone de collision et la zone de marche sont des objets que vous dessinez, jamais déduits de l'apparence des tuiles. |
| Chaque nom d'objet a son propre espace de noms | northern_reach:towpath, et non towpath. |
world_origin | Où se trouve votre coin supérieur gauche, en pixels du monde. C'est indiqué, car un fichier cartographique n'a aucune idée de l'endroit où il se trouve dans un monde. |
| Une carte indique où, jamais quoi | Un objet poi sur la couche bindings nomme un point d'intérêt que vous avez apporté en tant qu'enregistrement ; l'arrangement le déplace là où vous l'avez dessiné. |
| Tout ou rien | Une mise en page rejetée ne place rien du tout. |
| Aucun chemin | Une propriété appelée path, scene, script, resource ou template est rejetée pour le nom, quel que soit le nom. contain. |
Un lien nommant le contenu d'un autre package - ou du jeu de base - entraîne le rejet de l'intégralité de la mise en page. modding_map_report nomme la disposition et la règle qui l'a rejetée.
Vosmissions
Une mission est un ensemble d'enregistrements qui n'ont de sens qu'ensemble, dans content/narrative/quest_plans.
| Type | Qu'est-ce que c'est |
|---|---|
arc | L'histoire. Répertorie les missions qu'il contient. |
quest | La tâche : qui la donne, comment s'appelle-t-elle, combien paie-t-il. |
objective | Une chose que le joueur doit faire. |
ending | Comment se termine l'arc. |
a quest_plans record
[
{
"kind": "arc",
"id": "northern_reach:the_long_winter",
"stages": ["northern_reach:bring_the_grain"]
},
{
"kind": "quest",
"id": "northern_reach:bring_the_grain",
"name_key": "northern_reach.quest.bring_the_grain.name",
"giver": "northern_reach:the_reeve",
"in_arc": "northern_reach:the_long_winter",
"objectives": ["northern_reach:gather_grain"],
"rewards": [
{ "grant": "receive_coin", "coin": 250 }
]
},
{
"kind": "objective",
"id": "northern_reach:gather_grain",
"quest": "northern_reach:bring_the_grain",
"goal": "collect_item",
"target": "northern_reach:winter_grain",
"count": 40
},
{
"kind": "ending",
"id": "northern_reach:the_barns_are_full",
"arc": "northern_reach:the_long_winter",
"requires": ["northern_reach:bring_the_grain"]
}
]| Objectif | Regardé aujourd'hui |
|---|---|
collect_item | oui, tu portes assez de quelque chose |
defeat_unit | oui, tu as assez tué quelque chose |
earn_coin | oui, tu as assez d'argent |
reach_place | oui, vous avez visité une colonie |
survive_days | oui, suffisamment de jours se sont écoulés |
speak_to, deliver_item, defend_place, escort_unit, learn_lore | non — rejeté nommément au lieu d'accepté, puis jamais terminé |
| Récompense | Livré aujourd'hui |
|---|---|
give_item, receive_coin | Oui |
change_relation | oui, quand le sujet est le joueur |
| les cinq autres | refusé à haute voix |
- Un plan, c'est tout ou rien. Un mauvais enregistrement et aucun n'est installé : l'alternative est un arc qui s'arrête à mi-chemin avec le joueur tenant l'épée et non le titre.
- Une récompense est un
grant, jamais unkind.kindindique de quel enregistrement il s'agit. Une récompense écrite aveckindse lit très bien et est rejetée.
Vérifiez le vôtre avec modding_quest_plan_report.
Vos conversations
Une conversation, c'est trois types d'enregistrements dans content/narrative/dialogue : le dialogue_graph qui la nomme et dit sur quelle barre elle s'ouvre, les barres dialogue_node qui sont les lignes, et les choix dialogue_option qui se trouvent au-dessus.
Votre ligne est votre ligne, et rien ne la réécrit. Ce qu'un modèle local peut faire, c'est répondre à une question que le joueur écrit au personnage, en restant à l'intérieur de ce que dit votre ligne - et quand il ne peut pas rester à l'intérieur, il dit qu'il ne sait pas. C'est le joueur qui décide si cette surface existe ; avec le modèle éteint, le personnage prononce votre phrase et s'arrête. La traduction de votre blague provient des fichiers de langue, comme tout ce que vous écrivez.
Le graphique nomme un speaker et le déclencheur est là. Chaque personnage du jeu demande à cette famille quelles conversations se trouvent au-dessus d'eux lorsqu'on clique dessus, afin que vous puissiez donner quelque chose à dire au forgeron sans redéfinir le forgeron.
a dialogue record
[
{
"kind": "dialogue_graph",
"id": "northern_reach:gate_toll",
"entry": "northern_reach:gate_open",
"speaker": "gate_warden",
"name_key": "TALK_PACK_GATE"
},
{
"kind": "dialogue_node",
"id": "northern_reach:gate_open",
"graph": "northern_reach:gate_toll",
"voice": "line",
"speaker": "gate_warden",
"line_key": "TALK_PACK_GATE_OPEN"
}
]Vous écrivez la conversation, jamais les mots : chaque blague est une clé de langue, donc le même paquet peut être lu dans toutes les langues dont dispose le joueur. Un paquet contenant de la prose est rejeté dans le fichier au lieu d'être affiché à l'écran.
Une blague et un choix peuvent véhiculer chacune des conditions, et un choix peut véhiculer des commandes. Une condition décide si la chose est montrée au joueur ; un ordre, c'est ce qui arrive lorsqu'il le prend.
| Vérifier | Prend | Il demande | Répondu aujourd'hui |
|---|---|---|---|
companion_present | companion | Ce camarade est là pour l'entendre. | Oui |
faction_stance | faction, stance | Une faction est l'endroit où l'option attend. | oui, pour hostile — toute autre valeur est rejetée avant la première barre |
has_coin | coin | Le joueur peut allow. | Oui |
has_item | item, count | Le joueur le porte avec lui. | Oui |
has_knowledge | lore | C'est ce qu'on a dit au joueur. | Oui |
has_trait | trait | Le joueur a été construit comme ça. | Oui |
lacks_knowledge | lore | Le joueur n’en a pas encore été informé. | Oui |
quest_state | quest, state | Une mission est l'endroit où l'option l'attend. | Oui |
relation_at_least | subject, target, regard | Un côté pense au moins cela de l'autre. | Oui |
season | season | Nous sommes dans celui du année. | Oui |
time_of_day | phase | Nous sommes dans cette partie du day. | Oui |
| Commande | Prend | Fait | Exécuté aujourd'hui |
|---|---|---|---|
change_relation | subject, target, delta | Modifiez une réputation dans les limites des règles de relations publiées par l'hôte. | Oui |
give_item | item, count | Livrer quelque chose. | Oui |
grant_knowledge | lore | Dit quelque chose au joueur. | Oui |
open_shop | vendor | Affiche les fournitures d'un marchand à l'écran. | Oui |
pay_coin | coin | Le joueur paie. | Oui |
receive_coin | coin | Le joueur est payé. | Oui |
recruit_companion | companion | Ajoutez quelqu'un au groupe lorsque les règles de recrutement de l'hôte l'autorisent. | Oui |
set_quest_state | quest, state | Amener une mission dans un état que son dossier lui permet. | oui, pour active et failed — toute autre valeur est rejetée avant la première mesure |
start_combat | encounter | Clôture la conversation. | Oui |
take_item | item, count | Cela enlève quelque chose. | Oui |
travel_to | destination | Déplacez l'entreprise. | Oui |
- Une conversation nommant quelque chose que cette version ne peut pas faire ne s'ouvre jamais. Pas le choix qui l'utilise : la conversation entière, avant sa première ligne. Une discussion qui s'arrête à la troisième option a déjà pris les pièces du joueur.
- Rien ne bouge plus qu'il n'y en a. Demandez d'abord avec
has_coinouhas_item; un paquet qui l'oublie ne peut pas mettre le joueur à moins quarante pièces, car personne n'a accepté de dette et aucun écran ne l'explique. - Chaque blague a besoin d'une issue. Une blague à laquelle un joueur peut accéder et ne peut pas s'éloigner est rejetée lors du chargement du graphique.
Vérifiez le vôtre avec modding_dialogue_report.
Vos scènes
Une scène est le seul type de contenu qui enlève le contrôle au joueur, c'est donc aussi le seul avec une règle de fin. Les scènes vivent dans content/narrative/scenes et chacune nomme un where, l'endroit où elle est jouée. Entrez dans cet endroit et la scène commence.
a scenes record
[
{
"id": "northern_reach:the_morning_after",
"where": "northern_reach:waystation",
"beats": [
{ "beat": "fade_in", "seconds": 1.5 },
{ "beat": "lock_player" },
{ "beat": "say", "actor": "gate_warden", "line_key": "SCENE_PACK_GREETING" },
{ "beat": "wait", "seconds": 1.0 },
{ "beat": "unlock_player" }
]
}
]| Blague | Prend | Fois | Joué aujourd'hui |
|---|---|---|---|
ask_name | prompt_key | la scène l'attend | Oui |
end | — | la scène continue | Oui |
fade_in | seconds | la scène l'attend | Oui |
fade_out | seconds | la scène l'attend | Oui |
lock_player | — | la scène continue | Oui |
narrate | line_key, seconds | la scène l'attend | Oui |
play_cue | cue | la scène continue | Oui |
remove_actor | actor | la scène continue | Oui |
say | actor, line_key | la scène l'attend | Oui |
show_exit | — | la scène continue | Oui |
start_dialogue | graph | la scène l'attend | Oui |
unlock_player | — | la scène continue | Oui |
wait | seconds | la scène l'attend | Oui |
walk_to | actor, anchor | la scène l'attend | Oui |
- Une scène qui supprime des contrôles doit les restituer. Une séquence qui se termine sans
unlock_playerest rejetée, car l'alternative est d'amener une pièce dont le joueur ne peut sortir qu'en fermant le jeu. - Les lignes vont dans l'ordre et une ligne de blocage est attendue. C'est ce qui fait d'une scène une scène au lieu d'une liste de choses qui se produisent en même temps.
Vérifiez le vôtre avec modding_scene_report.
Vos captures d'écran
La disposition d'un écran vous indique quelles sections se trouvent dans quel panneau d'écran le jeu possède déjà et dans quel ordre. Il présente les pièces que cette construction dessine ; il ne peut pas en ajouter, car une section que personne n'a écrite n'a rien à dessiner.
Les dispositions résident dans content/ui/screens. Les familles, une à une comporte des champs et une fiche à copier.
Vérifiez le vôtre avec modding_screen_report.
Rien n'est apparu
Lisez d'abord l'état sur l'écran Mod. Presque tous les États évoquent ouvertement le problème, tout comme l’erreur la plus courante de toutes : celle qui figurait autrefois en tête de cette liste.
La famille absente de content_types. Vous écrivez goods.json, vous oubliez "goods" dans la liste des manifestes, et le dossier n'est jamais ouvert : rien n'est rejeté, car rien n'a été lu. Le paquet se charge vide. Maintenant, l'écran vous indique quel fichier il a parcouru et ce qu'il faut ajouter :
what the game prints back
content/economy/goods/goods.json was not read — add "goods" to content_types in mod.jsonLe validateur hors ligne imprime la même phrase, les deux ne peuvent donc pas être en désaccord. Seulement si la ligne indique chargé et ne nomme aucun fichier non lu, parcourez cette liste. Cela dépend de la fréquence à laquelle chacun est coupable.
| # | Symptôme | Ce que dit le validateur |
|---|---|---|
| 1 | Le chemin du dossier est erroné | WARN: declared goods root missing: …/content/economy/goods. Un avertissement, pas une erreur : le package passe quand même, et c'est pourquoi --strict avant la publication est le conseil dont il s'agit. Familles, une par une contient le dossier exact pour chaque famille. |
| 2 | L'identifiant n'a pas de deux-points | ERROR: add needs an id under your own namespace. frost_blade est rejeté ; northern_reach:frost_blade est accepté. |
| 3 | Le JSON est cassé | ERROR: invalid json goods.json: Expecting ',' delimiter: line 6 column 5. Une virgule manquante rend le fichier entier illisible et la ligne vous est indiquée. |
| 4 | Le fichier est dans le mauvais package | Le même message que le n. 2. Un identifiant avec l'espace de noms de quelqu'un d'autre ne vous appartient pas, et la vérification ne peut pas le distinguer d'une faute de frappe : elle sait seulement que le préfixe n'est pas votre identifiant de package. |
| 5 | Il manque un champ obligatoire | Le rapport le nomme — pour les champs dont une famille a réellement besoin, qui sont moins nombreux que vous ne l'imaginez. Il est apparu, et c'est faux est le cas où rien n'est signalé du tout. |
Les rapports ne vous laissent jamais deviner. Un enregistrement rejeté est nommé, ce qui ne va pas et généralement avec un code — voir [Chaque code de diagnostic] (#every-diagnostic-code).
Il est apparu, et c'est faux
Le cas le plus difficile, car rien n’est signalé du tout. Deux choses passent tout examen minutieux et vous donnent quand même un disque que vous n'avez pas écrit.
Un champ que vous avez omis n'est pas une erreur : c'est une valeur par défaut. Le schéma de chaque famille vous indique les champs sans lesquels un enregistrement ne peut pas être installé, et pour presque toutes les familles, cette liste est courte. goods en nécessite exactement un : id. Omettez base_price et il vaut 1. Omettez weight et il vaut 1,0. Omettez category et le produit est une matière première. Rien ne vous alerte, car il n'y a rien de mal : vous avez demandé un bien et vous l'avez obtenu.
Même une valeur qui ne fait pas partie des choix est une valeur par défaut. Le lecteur met toutes les majuscules avant la recherche, donc manufactured et MANUFACTURED ont la même valeur et la majuscule n'est jamais le problème : ne commencez pas à réécrire les fichiers pour cela. Le problème est MANUFACTURED_GOODS : il n'est pas membre, il devient donc RAW_MATERIAL. SLOW pour un decay_tier devient ETERNAL. Le dossier s'installe, l'écran indique appliqué, et votre bougie a le prix et la périssabilité de quelque chose d'autre.
Rien dans le jeu ne dit cela, car il n'y a rien à dire : le champ est déclaré comme une chaîne, et une chaîne mal orthographiée reste une chaîne. Le validateur est le seul endroit où vous pouvez le prendre, et maintenant il le prend :
typed into the debug console
$ python tools/quality/validate_mod_data.py --root mods/northern_reach
WARN: northern_reach:goods:goods.json#1: category is "MANUFACTURED_GOODS",
which is not one of RAW_MATERIAL, MANUFACTURED, CONSUMABLE, AMMUNITION,
EQUIPMENT. It loads as RAW_MATERIAL.
ERROR=0 WARN=1Un avertissement et non une erreur, car l'enregistrement se charge réellement et le rejeter maintenant endommagerait les packages qui fonctionnent déjà. --strict le transforme en erreur et c'est la seule raison pour laquelle vous exécutez --strict avant de publier.
Un champ que vous avez omis reste silencieux, et cela ne peut pas être pris : omettre category et écrire RAW_MATERIAL sont la même requête. Ainsi, les tables de champs dans Les familles, une par une marquent Obligatoire et donnent la colonne de valeurs comme la forme vérifiée par le chargeur. Lorsqu'un enregistrement se charge et se comporte comme autre chose, comparez d'abord vos champs à cette table : ce que vous recherchez est un champ que vous n'avez pas écrit ou un mot que le chargeur n'a pas reconnu.
Référence
Chaque famille
Un dossier et un rapport par famille. La colonne d'état est mesurée en fonction de la version, ce n'est donc jamais une promesse que le jeu ne tient pas. Ce que c'est n'est que la ligne d'ouverture, de sorte que le tableau reste quelque chose que vous pouvez parcourir avec votre œil ; la description complète de chaque famille, avec ses champs et une fiche à copier, est son entrée dans Les familles, une à une.
| Famille | État | Dossier dans votre colis | Commande de rapport | Qu'est-ce que c'est |
|---|---|---|---|---|
adaptive | Prêt à l'emploi | content/player/adaptive | modding_adaptive_report | Des profils qui regardent le déroulement d’un match et suggèrent une approche différente. |
audio | Validé, rien ne le consomme encore | content/assets/audio | modding_audio_report | Les sons qu'un package transporte, nommés par identifiant : musique, ambiance, effets et voix, chacun pointant vers un fichier dans son propre dossier et déclarant le rôle qui le délimite. |
buildings | Prêt à l'emploi | content/world/buildings | modding_building_report | Définitions des bâtiments et services de l'agglomération : label, couleur, rôle et intérieur réutilisé. |
caravans | Prêt à l'emploi | content/logistics/caravans | modding_caravan_report | Routes commerciales parcourues par une caravane : d'où elle part, où elle va, ce qu'elle apporte, dans quelle mesure elle est escortée et à quelle vitesse elle va. |
combat_balance | Prêt à l'emploi | content/combat/balance | modding_combat_balance_report | Valeurs d'équilibre de combat limitées qui ajustent les paramètres du solveur existants sans ajouter de règles, d'opérations ou de mécanismes. |
dialogue | Prêt à l'emploi | content/narrative/dialogue | modding_dialogue_report | Les conversations comme enregistrements : le graphique, ses blagues et les choix qui y sont associés ci-dessus. |
effects | Prêt à l'emploi | content/assets/effects | modding_effect_report | Météo, poussière, étincelles et lumières, composés à partir des modèles fournis par l'hôte disposition. |
enemy_archetypes | Prêt à l'emploi | content/threat/enemy_archetypes | modding_enemy_archetype_report | Types d'ennemis connus du niveau stratégique : rang, quelles variantes ils déploient, où ils campent, quelle est la taille du garnison et à quelle fréquence ils attaquent. |
enemy_variants | Prêt à l'emploi | content/combat/enemy_variants | modding_enemy_variant_report | Blocs de statistiques pour un type de corps ennemi sur le terrain : classe, rang, les cinq attributs et les identifiants de l'arme, du coup de main et du bouclier qu'elle porte. |
fonts | Validé, rien ne le consomme encore | content/assets/fonts | modding_font_report | Polices de caractères contenues dans un package, nommées par identifiant : le fichier, la taille à laquelle elles sont dessinées et les langues dont elles portent les glyphes. |
goods | Prêt à l'emploi | content/economy/goods | modding_goods_report | Biens commercialisables et leurs propriétés économiques. |
group_archetypes | Prêt à l'emploi | content/strategic/group_archetypes | modding_group_archetype_report | Paramètres de stratégie ajustables pour un groupe vivant sur la carte du monde : rayon d'alerte, préférence de cible, nombre de membres, seuils de ravitaillement et de retrait. |
images | Prêt à l'emploi | content/assets/images | modding_image_report | Images qu'apporte un package, nommées par identifiant : icônes, portraits et feuilles de sprites, chacun pointant vers un fichier dans son propre dossier. |
input_bindings | Prêt à l'emploi | content/input | modding_input_report | Actions propres d'un package, avec la clé qu'ils souhaitent. |
items | Prêt à l'emploi | content/inventory/items | modding_items_report | Articles d'inventaire, y compris les armes et les armures. |
locales | Prêt à l'emploi | content/locale | modding_locale_report | Les mots qu'un joueur lit, au format CSV avec une colonne par langue : les clés propres du package, et celles du jeu où le package déclare l'écrasement. |
lore | Prêt à l'emploi | content/narrative/lore | modding_lore_report | Entrées du Codex : lieux, personnes, événements, coutumes et choses dont le monde parle stories. |
maps | Prêt à l'emploi | content/world/maps | modding_map_report | Dispositions qu'un package dessine dans Tiled, nommées par id : le fichier, où il se trouve dans le monde et la clé de langue par laquelle il est connu. |
mercenary_templates | Prêt à l'emploi | content/character/mercenaries | modding_mercenary_report | Modèles de mercenaires à embaucher : nom, classe, origine, santé et les initiales du moral, le coût d'embauche et le jour de leur première apparition. |
mr_lines | Prêt à l'emploi | content/medieval_realism/structured | modding_mr_lines_report | Lignes structurées de réalisme médiéval, acheminées par identifiant de fichier et de ligne au lieu d'un champ d'identifiant dans le JSON. |
noble_houses | Prêt à l'emploi | content/politics/noble_houses | modding_noble_house_report | Données initiales d'une maison noble : le seigneur, l'héritier, quelles colonies répondent à la maison et qui compte comme un rival ou un allié. |
npc_definitions | Prêt à l'emploi | content/narrative/npcs | modding_npc_report | Définitions des PNJ avec un nom. |
perks | Prêt à l'emploi | content/character/perks | modding_perk_report | Privilèges déclaratifs : déclencheurs et effets, sans aucun gestionnaire écrit en code. |
pois | Prêt à l'emploi | content/world/pois | modding_poi_report | Points d'intérêt placés par coordonnées sur la carte du monde manuscrite. |
presentation_bindings | Prêt à l'emploi | content/presentation/bindings | - | Quelle ressource du package remplit quel emplacement sur quel sujet : l'icône sur un objet, le sprite sur une unité ou une tuile, la bannière sur une faction, aussi bien pour le contenu du package que pour celui du jeu de base. |
progress | Prêt à l'emploi | content/player/progress | - | Dossiers de progression des joueurs : objectifs, profils de difficulté sécurisés et profils de match dans le cadre des règles de l'hôte. |
quest_metadata | Prêt à l'emploi | content/narrative/quest_metadata | modding_quest_metadata_report | Enregistrements de métadonnées de quête, indexés par quest_id au lieu de id. |
quest_plans | Prêt à l'emploi | content/narrative/quest_plans | modding_quest_plan_report | Plans de mission en tant qu'enregistrements : les arcs, les missions, les objectifs et les fins qu'un package écrit et à partir desquels le jeu construit ses propres missions. |
quests | Vérifié, pas encore installé | content/narrative/quests | - | Actifs de mission manuscrits, chargés par itinéraire au lieu d'être interprétés comme des enregistrements. |
recipes | Prêt à l'emploi | content/economy/recipes | - | Recettes artisanales : ce qui est consommé, ce qui en sort, où cela est fabriqué, combien cela coûte et quelle est la probabilité que cela se détériore. |
relationships | Prêt à l'emploi | content/companion/relationships | - | Modèles d'accompagnement, politiques relationnelles limitées, conditions de recrutement et liens declaratives. |
scenes | Prêt à l'emploi | content/narrative/scenes | modding_scene_report | Scènes mises en scène : la pièce, qui s'y trouve et les blagues qui s'y déroulent order. |
screens | Prêt à l'emploi | content/ui/screens | modding_screen_report | Dispositions d'écran : quelles sections se trouvent dans quel panneau d'un écran que le jeu possède déjà et dans lesquelles commande. |
settings | Prêt à l'emploi | content/settings | modding_settings_report | Options qu'un joueur peut modifier, déclarées plutôt que tirées. |
themes | Prêt à l'emploi | content/assets/themes | modding_theme_report | Palettes d'interface sous forme de jetons : couleurs, tailles et espacements nommés, avec des paires dont le contraste doit être capable de lire. |
vendor_inventories | Prêt à l'emploi | content/world/vendor_inventories | modding_vendor_inventory_report | Tableaux d'approvisionnement des marchands. |
world_generation | Prêt à l'emploi | content/world/generation | - | Profils de génération constitués uniquement de données : choix pondérés de biome et de localisation, propriété de l'hôte. |
- Hors de la boîte — sous forme publiée, le jeu installe vos enregistrements, il y a un exemple, et vos identifiants survivent à une sauvegarde et un rechargement.
- Validé, rien ne le consomme encore — le chargeur lit et vérifie la famille, mais aucune surface de package destinée au joueur ne la consomme. Les packages audio et de police sont dans ce niveau : un rapport propre ne fait pas apparaître un signal silencieux ni une police inutilisée dans le jeu.
- Vérifié, pas encore installé — le jeu reconnaît la famille et vérifie votre fichier, et rien ne le met dans un jeu en cours. Un package qui le cible passe toutes les vérifications et ne charge rien. C'est volontairement sur la page : l'alternative est que quelqu'un y passe une soirée sans jamais découvrir qu'il n'a rien fait de mal.
Décidé au complet, sans aucune famille pour l'emmener, donc aucune affiche ne peut lui demander :
| Ce serait | Où Should | Qu'est-ce que c'est |
|---|---|---|
feature_extension | aucun dossier pour l'instant | Un package qui est une fonctionnalité plutôt qu'un contenu. Ce qu'un mod ne peut jamais faire est la lecture honnête de ceci. |
Ce ne sont pas des ordures. Ce qu'un mod ne peut jamais faire, c'est cette liste.
Les familles, une par une
Chaque famille que la build connaît, ce qu'elle accepte et un enregistrement que vous pouvez copier.
- Les champs obligatoires sont ceux sans lesquels un enregistrement ne peut pas être install.
- La colonne des valeurs est la forme que le chargeur vérifie, pas un indice.
- Lorsqu'une famille le dit, un champ que la table ne nomme pas est rejeté avec l'enregistrement dans lequel il se trouve. Une faute de frappe dans le nom d'un champ est un enregistrement qui ne se charge pas et le rapport familial l'indique par son nom.
Chaque entrée indique également ce qui arrive à une sauvegarde le jour où un joueur vous le dit. désinstaller :
| Réponse | À quoi sert la sauvegarde |
|---|---|
preserve_inert_reference | L'identifiant reste, ne résout rien et est signalé. Celui que le joueur possédait a toujours un nom. |
substitute_placeholder | Un remplacement stable appartenant au moteur répond, donc le monde se charge quand même, et l'identifiant d'origine est ensuite conservé. |
drop_optional_presentation | Le la référence est supprimée car rien n’en dépend. Seule une famille de présentation peut le déclarer. |
Il n'y a rien d'écrit à la main ici. Les champs proviennent du schéma publié de chaque famille. Chaque exemple est l'un des packages que la matrice de test du framework lance contre le chargeur, remis sous l'espace de noms northern_reach et revérifié par rapport à son modèle lorsqu'il entre dans cette page : un exemple que le jeu rejetterait entraînerait l'échec de la construction.
Le monde et les lieux qu'il contient
5 familles : buildings, caravans, maps, pois, world_generation.
buildings
Définitions des bâtiments et services de l'agglomération : label, couleur, rôle et intérieur réutilisé.
- Statut Prêt à l'emploi
- Voyagé en Le service d'un building
- Dossier
content/world/buildings - Enregistrements acheminés pour le champ
id - Rapport
modding_building_report - Si un joueur vous désinstalle
substitute_placeholder. Une colonie avec un trou où il y avait un service est injouable ; un bâtiment visiblement manquant est lu et récupéré.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
role | Oui | chaîne |
color | - | n'importe qui |
description_key | - | chaîne |
interior | - | texte, id |
interior_service | - | texte, id |
label | - | chaîne |
label_key | - | chaîne |
map_binding | - | texte, id |
services | - | liste |
settlement | - | texte, id |
tier | - | entier de 0 à 5 |
Dans un fichier appelé buildings.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a buildings record, under content/world/buildings
[
{
"id": "northern_reach:guildhall",
"label": "Guild Hall",
"role": "reeve",
"color": {
"r": 0.4,
"g": 0.34,
"b": 0.26
},
"interior_service": "moot_hall"
}
]caravans
Routes commerciales parcourues par une caravane : d'où elle part, où elle va, ce qu'elle apporte, dans quelle mesure elle est escortée et à quelle vitesse elle va.
- Statut Prêt à l'emploi
- Dossier
content/logistics/caravans - Enregistrements acheminés pour le champ
id - Rapport
modding_caravan_report - Si un joueur vous désinstalle
preserve_inert_reference. Une route dont le paquet a disparu conserve son nom et ne transporte rien. Remplacer une destination enverrait les biens d'un joueur vers un endroit qu'il n'a jamais accepté.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
origin_settlement_id | Oui | chaîne |
destination_settlement_id | Oui | chaîne |
cargo_type | - | chaîne |
cargo_value | - | entier, 0 ou plus |
daily_progress | - | nombre de 0,01 à 1.0 |
display_name | - | chaîne |
group_archetype_id | - | chaîne |
guard_strength | - | none, light, medium, heavy |
initial_spawn_offset_days | - | entier de 0 à 30 |
Dans un fichier appelé caravans.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a caravans record, under content/logistics/caravans
[
{
"id": "northern_reach:salt_road_run",
"display_name": "Salt Road Run",
"origin_settlement_id": "valdmere",
"destination_settlement_id": "old_seat",
"cargo_type": "salt",
"cargo_value": 240,
"guard_strength": "light",
"daily_progress": 0.08,
"initial_spawn_offset_days": 3
}
]maps
Arrangements qu'un package dessine dans Tiled, nommés par id : le fichier, où il se trouve dans le monde, et la clé de langue par laquelle il est connu. L'index est l'enregistrement ; l'arrangement à côté est lu comme des données et jamais comme une ressource, normalisé sous forme canonique, vérifié par rapport au kit publié et assemblé avant que quoi que ce soit ne soit placé. Une disposition rejetée ne place rien du tout, car la moitié de la carte est une région dans laquelle le joueur entre sans aucun moyen de savoir quelle moitié est arrivée.
- Statut Prêt à l'emploi
- Dossier
content/world/maps - Enregistrements acheminés pour le champ
id - Rapport
modding_map_report - Si un joueur vous désinstalle
drop_optional_presentation. Aucun sauvetage ne nomme une disposition. Une sauvegarde nomme le point d'intérêt qu'une mise en page a déplacé, et cet enregistrement conserve ses coordonnées, de sorte qu'une carte retirée coûte la mise en page et non le contenu. L’abandonner est ce qui amène le monde à revenir à ce que disent ses archives, au lieu de maintenir une position que personne ne défend plus.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
file | Oui | texte, fixed shape |
name_key | Oui | chaîne |
world_origin | Oui | liste d'entiers de -1 000 000 à 1 000 000 |
region_id | - | chaîne |
sha256 | - | texte, fixed shape |
Dans un fichier appelé maps.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a maps record, under content/world/maps
[
{
"id": "northern_reach:river_bend",
"file": "river_bend.tmj",
"name_key": "MAP_RIVER_BEND",
"world_origin": [
4096,
2560
],
"region_id": "northern_reach:lowlands"
}
]pois
Points d'intérêt placés par coordonnées sur la carte du monde manuscrite.
- Statut Prêt à l'emploi
- Chemin vers Un lieu sur la carte
- Dossier
content/world/pois - Enregistrements acheminés pour le champ
id - Rapport
modding_poi_report - Si un lecteur vous désinstalle
preserve_inert_reference. Un lieu découvert reste découvert. Les missions et l'historique des voyages pointent vers l'id.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
display_name | Oui | chaîne |
awareness_modifier | - | number -1 à 1 |
description | - | chaîne |
discovery_radius | - | number 1 à 10 |
kind | - | integer ou string |
linked_quest_id | - | chaîne |
morale_modifier | - | entier de -10 à 10 |
narrative_significance_key | - | chaîne |
one_time_loot | - | booléen |
world_position | - | n'importe qui |
Dans un fichier appelé pois.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a pois record, under content/world/pois
[
{
"id": "northern_reach:drowned_mile",
"kind": "RUINS",
"display_name": "The Drowned Mile",
"description": "A stretch of road the river took back. The milestones still stand, chest deep.",
"world_position": {
"x": 0.0,
"y": 0.0
},
"discovery_radius": 3.0,
"one_time_loot": true,
"morale_modifier": -1,
"awareness_modifier": 0.05,
"narrative_significance_key": "POI_DROWNED_MILE_LORE"
}
]world_generation
Profils de génération constitués uniquement de données : choix pondérés de biome et de localisation, propriété de l'hôte.
- Statut Prêt à l'emploi
- Dossier
content/world/generation - Enregistrements acheminés pour le champ
id - Rapport aucun des siens ;
modding_preflight_reports'en charge - Si un joueur vous désinstalle
preserve_inert_reference. Une sauvegarde enregistre l'identifiant du profil choisi. Si son paquet est manquant, conserver et signaler cet identifiant est plus sûr que de reconstruire silencieusement le jeu avec la carte du jeu de base.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | n'importe qui |
id | Oui | texte, id |
stream | Oui | texte, id |
tables | Oui | objet |
description_key | - | chaîne |
name_key | - | chaîne |
Dans un fichier appelé profiles.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a world_generation record, under content/world/generation
[
{
"kind": "generation_profile",
"id": "northern_reach:ashen_reach",
"stream": "northern_reach:world_stream",
"tables": {
"biomes": [
{
"id": "plains",
"weight": 60
},
{
"id": "forest",
"weight": 30
},
{
"id": "hills",
"weight": 10
}
],
"settlements": [
{
"id": "northern_reach:hamlet",
"weight": 100
}
],
"buildings": [
{
"id": "northern_reach:longhouse",
"weight": 100
}
],
"pois": [
{
"id": "northern_reach:standing_stone",
"weight": 100
}
]
}
}
]Les gens, les familles et ce qu'ils peuvent faire
8 familles : enemy_archetypes, enemy_variants, group_archetypes, mercenary_templates, noble_houses, npc_definitions, perks, relationships.
enemy_archetypes
Types d'ennemis connus du niveau stratégique : rang, quelles variantes ils déploient, où ils campent, quelle est la taille du garnison et à quelle fréquence ils attaquent.
- Statut Prêt à l'emploi
- Dossier
content/threat/enemy_archetypes - Enregistrements acheminés pour le champ
id - Rapport
modding_enemy_archetype_report - Si un joueur vous désinstalle
preserve_inert_reference. Un camp indique encore ce qui l'a établi. Remplacer modifierait silencieusement ce qui assiège une colonie ; nommer l'absence que nous lisons.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
aggression | - | nombre de 0 à 1 |
behavior_profile_mix | - | liste de chaînes |
camp_count | - | entier de 0 à 12 |
camp_glyph | - | chaîne |
corruption_chance | - | nombre de 0 à 1 |
description | - | chaîne |
display_name | - | chaîne |
encounter_id | - | chaîne |
garrison_max | - | entier de 1 à 60 |
garrison_min | - | entier de 1 à 60 |
preferred_camp_biomes | - | liste de chaînes |
raid_cooldown_days | - | entier de 0 à 30 |
sortie_size_max | - | entier de 1 à 30 |
sortie_size_min | - | entier de 1 à 30 |
target_preferences | - | liste de chaînes |
tier | - | entier de 1 à 5 |
variant_ids | - | liste de chaînes |
variant_weights | - | liste |
Dans un fichier appelé enemy_archetypes.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a enemy_archetypes record, under content/threat/enemy_archetypes
[
{
"id": "northern_reach:salt_reavers",
"display_name": "Salt Reavers",
"description": "Coastal raiders who winter inland and burn what they cannot carry.",
"tier": 2,
"corruption_chance": 0.1,
"preferred_camp_biomes": [
"marsh",
"coast"
],
"camp_count": 3,
"garrison_min": 8,
"garrison_max": 16,
"aggression": 0.4,
"raid_cooldown_days": 5,
"sortie_size_min": 4,
"sortie_size_max": 9,
"target_preferences": [
"caravan",
"settlement"
],
"camp_glyph": "tent"
}
]enemy_variants
Blocs de statistiques pour un type de corps ennemi sur le terrain : classe, rang, les cinq attributs et les identifiants de l'arme, du coup de main et du bouclier qu'elle porte.
- Statut Prêt à l'emploi
- Dossier
content/combat/enemy_variants - Enregistrements acheminés pour le champ
id - Rapport
modding_enemy_variant_report - Si un joueur vous désinstalle
substitute_placeholder. Un corps déjà sur le terrain sans bloc de statistiques ne peut pas être combattu. Un remplacement stable possédé par le moteur permet de résoudre la bataille et l'identité d'origine est préservée.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
archetype_id | Oui | chaîne |
agility | - | nombre de 0 à 12 |
ai_behavior | - | chaîne |
aim | - | nombre de 0 à 12 |
constitution | - | nombre de 0 à 12 |
display_name | - | chaîne |
main_weapon_id | - | chaîne |
off_weapon_id | - | chaîne |
shield_id | - | chaîne |
special_ability_description | - | chaîne |
special_ability_name | - | chaîne |
strength | - | nombre de 0 à 12 |
tier | - | entier de 1 à 4 |
variant_class | - | soldier, archer, berserker, ranger, finisher |
will | - | nombre de 0 à 12 |
Dans un fichier appelé enemy_variants.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a enemy_variants record, under content/combat/enemy_variants
[
{
"id": "northern_reach:salt_reaver_archer",
"archetype_id": "northern_reach:salt_reavers",
"display_name": "Salt Reaver Archer",
"variant_class": "archer",
"tier": 2,
"strength": 3.0,
"agility": 5.0,
"constitution": 3.5,
"aim": 6.0,
"will": 2.5,
"main_weapon_id": "short_bow",
"ai_behavior": "keeps distance and gives ground rather than trade blows"
}
]group_archetypes
Paramètres de stratégie ajustables pour un groupe vivant sur la carte du monde : rayon d'alerte, préférence de cible, nombre de membres, seuils de ravitaillement et de retrait.
- Statut Prêt à l'emploi
- Dossier
content/strategic/group_archetypes - Enregistrements acheminés pour le champ
id - Rapport
modding_group_archetype_report - Si un joueur vous désinstalle
substitute_placeholder. Le renseignement stratégique doit lire un seuil quelque part. Il répond à une valeur par défaut possédée par le moteur, qui est la même sur laquelle s'appuie déjà cette famille.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
aggression | - | chaîne |
alarm_radius_px | - | nombre de 0 à 2000 |
behavior_profile_mix | - | liste de chaînes |
captain_archetype_id | - | chaîne |
display_name | - | chaîne |
faction_id | - | chaîne |
kind | - | none, caravan, patrol, army, lair, camp, … |
max_members | - | entier de 1 à 60 |
member_archetype_mix | - | liste de chaînes |
min_members | - | entier de 1 à 60 |
night_aggression_multiplier | - | nombre de 0,25 à 4 |
provisions_max | - | entier de 0 à 99 |
retreat_hp_pct | - | nombre de 0 à 1 |
target_preference | - | chaîne |
Dans un fichier appelé group_archetypes.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a group_archetypes record, under content/strategic/group_archetypes
[
{
"id": "northern_reach:pilgrim_column",
"display_name": "Pilgrim Column",
"kind": "nomad",
"faction_id": "",
"target_preference": "wandering",
"aggression": "avoid_player",
"alarm_radius_px": 300.0,
"night_aggression_multiplier": 0.5,
"min_members": 6,
"max_members": 14,
"behavior_profile_mix": [
"coward",
"balanced"
],
"provisions_max": 6,
"retreat_hp_pct": 0.6
}
]mercenary_templates
Modèles de mercenaires à embaucher : nom, classe, origine, santé et les initiales du moral, le coût d'embauche et le jour de leur première apparition.
- Statut Prêt à l'emploi
- Dossier
content/character/mercenaries - Enregistrements acheminés pour le champ
id - Rapport
modding_mercenary_report - Si un joueur vous désinstalle
preserve_inert_reference. Les mercenaires déjà engagés vivent dans le cadre du sauvetage en tant qu'unité ; seule la liste des tavernes perd son modèle. L'identifiant reste nommé, donc l'origine de l'organique peut toujours être lue.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
display_name | Oui | chaîne |
available_from_day | - | entier de 0 à 999 |
background | - | chaîne |
class_id | - | chaîne |
hire_cost | - | entier de 0 à 9999 |
hp_max | - | Intero de 1 a 999 |
morale_start | - | intero de 1 a 100 |
Dans un fichier appelé mercenaries.json, ou avec tout autre nom .json ti Placez-vous dans la carte :
a mercenary_templates record, under content/character/mercenaries
[
{
"id": "northern_reach:ditchwater_sapper",
"display_name": "Ditchwater Sapper",
"class_id": "skirmisher",
"background": "Dug siege trenches for whoever was paying, and stopped asking which side it was.",
"hp_max": 24,
"morale_start": 70,
"hire_cost": 180,
"available_from_day": 6
}
]noble_houses
Données initiales d'une maison noble : le seigneur, l'héritier, quelles colonies répondent à la maison et qui compte comme un rival ou un allié.
- Statut Prêt à l'emploi
- Carte
content/politics/noble_houses - Enregistrements acheminés pour le champ
id - Résumé
modding_noble_house_report - Vous avez un lecteur à désinstaller
preserve_inert_reference. L'estime d'un joueur pour une maison est enregistrée sur son identifiant. Remplacez un écriture sans dire ni à l'époque du chi.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
alignment | - | pro_crown, pragmatic, isolationist, hostile, neutral, opportunist, … |
ally_house_ids | - | n'importe qui |
apex_ambition | - | n'importe qui |
apex_claim_legitimacy | - | n'importe qui |
captain_initial_opinion | - | entier de 0 à 100 |
captain_initial_stance | - | hostile, suspicious, neutral, willing, allied |
castle_id | - | chaîne |
corruption_risk | - | low, moderate, high, critical, unknown |
current_lord_id | - | chaîne |
designer_hooks | - | chaîne |
display_name | - | chaîne |
display_name_key | - | chaîne |
family_npc_ids | - | n'importe qui |
heir_id | - | chaîne |
house_power_base | - | n'importe qui |
is_defunct | - | booléen |
is_minor | - | booléen |
lord_state | - | healthy, ailing, corrupted, missing, dead, none |
lore_summary | - | chaîne |
predecessor_house_id | - | chaîne |
rival_house_ids | - | n'importe qui |
secret_flags | - | n'importe qui |
settlement_ids | - | n'importe qui |
steward_npc_id | - | chaîne |
strength | - | dominant, stable, reduced, weakened, vacant, extinct |
Dans un fichier appelé noble_houses.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a noble_houses record, under content/politics/noble_houses
[
{
"id": "northern_reach:house_tidewatch",
"display_name_key": "VALID_NOBLE_HOUSE_MOD_HOUSE_TIDEWATCH",
"display_name": "House Tidewatch",
"strength": "reduced",
"alignment": "isolationist",
"corruption_risk": "moderate",
"is_minor": true,
"lord_state": "ailing",
"captain_initial_stance": "suspicious",
"captain_initial_opinion": 35,
"apex_ambition": 20,
"apex_claim_legitimacy": 15,
"house_power_base": 25,
"lore_summary": "Kept the coast road open for two hundred years and was paid in salt for it."
}
]npc_definitions
Définitions des PNJ avec un nom.
- Statut Prêt à l'emploi
- Chemin d'accès Un commerçant qui le conserve
- Dossier
content/narrative/npcs - Enregistrements acheminés pour le champ
id - Rapport
modding_npc_report - Si un lecteur vous désinstalle
preserve_inert_reference. Une personne avec un nom dont le monde se souvient n'est pas la même chose qu'une personne qui n'a jamais existé, et les rapports pointent vers l'id.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
display_name | Oui | chaîne |
faction | - | string ou entier |
flag_keys | - | liste de chaînes |
is_vendor | - | booléen |
kill_reputation_delta | - | entier de -100 à 100 |
location_afternoon | - | texte, id |
location_evening | - | texte, id |
location_morning | - | texte, id |
lore_only | - | booléen |
need_quest_ids | - | liste de chaînes |
offers_quest_ids | - | liste de chaînes |
personal_need | - | chaîne |
personality_tags | - | liste de chaînes |
portrait_id | - | texte, id |
price_multiplier | - | nombre de 0,1 à 10 |
role | - | string ou entier |
settlement_id | - | texte, id |
short_bio | - | chaîne |
starts_hidden | - | booléen |
title | - | chaîne |
vendor_inventory_id | - | texte, id |
voice_tone | - | chaîne |
Dans un fichier appelé npcs.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a npc_definitions record, under content/narrative/npcs
[
{
"id": "northern_reach:wandering_herbalist",
"display_name": "Wandering Herbalist",
"title": "Travelling Healer",
"role": "NONE",
"settlement_id": "old_seat",
"is_vendor": true,
"vendor_inventory_id": "northern_reach:herb_stall",
"personality_tags": [
"gentle",
"secretive"
]
}
]perks
Privilèges déclaratifs : déclencheurs et effets, sans aucun gestionnaire écrit en code.
- Statut Prêt à l'emploi
- Dossier
content/character/perks - Enregistrements acheminés pour le champ
id - Rapport
modding_perk_report - Si un joueur vous désinstalle
preserve_inert_reference. Un personnage garde ce qu'il a gagné. La suppression d'une fonctionnalité réécrit silencieusement un bâtiment sur lequel le joueur a passé une partie.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
skill | Oui | texte, fixed shape |
name_key | Oui | chaîne |
kind | Oui | road, junction, lateral, capstone |
col | Oui | entier de 0 à 4 |
row | Oui | entier de 1 à 7 |
level | Oui | entier de 1 à 300 |
description_key | - | chaîne |
icon | - | texte, id |
parents | - | liste de chaînes |
side | - | L, R |
Dans un fichier appelé perks.json, ou quel que soit le nom .json que vous aimez dans ce dossier :
a perks record, under content/character/perks
[
{
"id": "northern_reach:stoneskin",
"skill": "armour",
"name_key": "PERK_STONESKIN",
"description_key": "PERK_STONESKIN_DESC",
"kind": "lateral",
"side": "L",
"col": 0,
"row": 7,
"level": 100,
"parents": [],
"icon": "northern_reach:stoneskin_icon"
}
]relationships
Modèles d'accompagnement, politiques relationnelles limitées, conditions de recrutement et liens declaratives.
- Statut Prêt à l'emploi
- Dossier
content/companion/relationships - Enregistrements acheminés pour le champ
id - Rapport aucun des siens ;
modding_preflight_reports'en charge - Si un lecteur vous désinstalle
preserve_inert_reference. La graine de relation d'un compagnon reste attachée à son identifiant, donc la suppression d'un package ne peut pas effacer silencieusement la confiance, les rancunes ou l'historique d'abandon.
Champs. Cette famille contient plus d'un type d'enregistrement, et chaque type est vérifié par rapport à sa propre liste. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
A enregistrement avec kind: bond:
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
kind | Oui | bond |
relation | Oui | chaîne |
subject | Oui | chaîne |
target | Oui | chaîne |
initial_regard | Oui | entier de -100 à 100 |
policy | Oui | chaîne |
description_key | - | chaîne |
name_key | - | chaîne |
note_key | - | chaîne |
Un enregistrement avec kind: companion_template :
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
kind | Oui | companion_template |
unit | Oui | chaîne |
recruit | Oui | chaîne |
loyalty | Oui | chaîne |
description_key | - | chaîne |
leave_below | - | entier de -100 à 100 |
name_key | - | chaîne |
starting_regard | - | entier de -100 à 100 |
Un enregistrement avec kind: recruit_terms :
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
kind | Oui | recruit_terms |
means | Oui | chaîne |
cost | - | entier de 0 à 1 000 000 |
description_key | - | chaîne |
name_key | - | chaîne |
requires_bond | - | chaîne |
Un enregistrement avec kind: relationship_policy :
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
kind | Oui | relationship_policy |
relation_kinds | Oui | liste de chaînes |
bounds | Oui | objet |
bands | Oui | liste d'objets |
decay_per_day | - | entier de 0 à 20 |
description_key | - | chaîne |
max_change_per_event | - | entier de 1 à 50 |
name_key | - | chaîne |
Dans un fichier appelé relationships.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a relationships record, under content/companion/relationships
[
{
"id": "northern_reach:marsh_policy",
"kind": "relationship_policy",
"relation_kinds": [
"comrade",
"feud",
"sworn"
],
"bounds": {
"floor": -100,
"ceiling": 100
},
"bands": [
{
"name": "hostile",
"from": -100,
"to": -61
},
{
"name": "cold",
"from": -60,
"to": -31
},
{
"name": "wary",
"from": -30,
"to": -11
},
{
"name": "neutral",
"from": -10,
"to": 10
},
{
"name": "warm",
"from": 11,
"to": 40
},
{
"name": "trusted",
"from": 41,
"to": 70
},
{
"name": "devoted",
"from": 71,
"to": 100
}
],
"max_change_per_event": 12,
"decay_per_day": 1
},
{
"id": "northern_reach:hire_terms",
"kind": "recruit_terms",
"means": "hire",
"cost": 240
},
{
"id": "northern_reach:marsh_companion",
"kind": "companion_template",
"unit": "northern_reach:marsh_unit",
"recruit": "northern_reach:hire_terms",
"loyalty": "northern_reach:marsh_policy",
"starting_regard": 8,
"leave_below": -60
}
]Les choses, le commerce et les chiffres derrière un affrontement
5 familles : combat_balance, goods, items, recipes, vendor_inventories.
combat_balance
Valeurs d'équilibre de combat limitées qui ajustent les paramètres du solveur existants sans ajouter de règles, d'opérations ou de mécanismes.
- Statut Prêt à l'emploi
- Dossier
content/combat/balance - Enregistrements acheminés pour le champ
id - Rapport
modding_combat_balance_report - Si un joueur vous désinstalle
substitute_placeholder. Le solde est une donnée de définition détenue par l'hôte, et non l'inventaire du joueur. Lorsque son package est absent, l'équilibrage canonique et stable répond, et le chargement ultérieur n'apporte pas de deuxième façon de sauvegarder les ajustements.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
values | Oui | objet |
Dans un fichier appelé balance.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a combat_balance record, under content/combat/balance
[
{
"id": "northern_reach:coastal_balance",
"values": {
"zone_penalty_head": 22,
"crit_damage_mult": 1.75,
"friendly_fire_redirect_chance": 0.2
}
}
]goods
Biens commercialisables et leurs propriétés économiques.
- Statut Prêt à l'emploi
- A voyagé en Un bien à vendre
- Dossier
content/economy/goods - Enregistrements acheminés pour le champ
id - Rapport
modding_goods_report - Si un joueur vous désinstalle
preserve_inert_reference. Une escorte qui nomme un produit que personne ne fournit est honnête. La remplacer changerait silencieusement ce qu’un joueur possède.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
base_price | - | entier de 0 à 1 000 000 |
category | - | string ou entier |
daily_consumption_class | - | chaîne |
decay_tier | - | string ou entier |
display_name | - | chaîne |
display_name_key | - | chaîne |
linked_item_id | - | chaîne |
production_class | - | chaîne |
tags | - | liste de chaînes |
weight | - | nombre de 0 à 10000 |
Dans un fichier appelé goods.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a goods record, under content/economy/goods
[
{
"id": "northern_reach:spiced_wine",
"display_name": "Spiced Wine",
"category": "consumable",
"decay_tier": "preserved",
"base_price": 12,
"weight": 0.5,
"tags": [
"luxury",
"drink"
]
}
]items
Articles d'inventaire, y compris les armes et les armures.
- Statut Prêt à l'emploi
- Cheminé dans Un élément à transporter
- Dossier
content/inventory/items - Enregistrements acheminés pour le champ
id - Rapport
modding_items_report - Si un joueur vous désinstalle
preserve_inert_reference. Le référentiel continue de nommer ce qu'il contient, et c'est la seule raison pour laquelle la réinstallation le leur rend.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
base_value | - | entier, 0 ou plus |
category | - | string ou entier |
condition | - | nombre de 0 à 1 |
description_key | - | chaîne |
display_name | - | chaîne |
display_name_key | - | chaîne |
icon_id | - | texte, id |
max_stack | - | entier, 1 ou plus |
quality_tier | - | entier, 0 ou plus |
rarity | - | string ou entier |
sellable | - | booléen |
tags | - | liste de chaînes |
weight | - | nombre, 0 ou plus |
Dans un fichier appelé items.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a items record, under content/inventory/items
[
{
"id": "northern_reach:spiced_wine_bottle",
"display_name": "Bottle of Spiced Wine",
"category": "CONSUMABLE",
"rarity": "UNCOMMON",
"weight": 0.5,
"max_stack": 10,
"base_value": 14,
"sellable": true,
"tags": [
"drink",
"luxury"
]
}
]recipes
Recettes artisanales : ce qui est consommé, ce qui en sort, où cela est fabriqué, combien cela coûte et quelle est la probabilité que cela se détériore.
- Statut Prêt à l'emploi
- Dossier
content/economy/recipes - Enregistrements acheminés pour le champ
id - Rapport aucun des siens ;
modding_preflight_reports'en charge - Si un joueur vous désinstalle
preserve_inert_reference. Rien dans une sauvegarde ne nomme une recette : une sauvegarde nomme l'objet qu'un processus a produit, et la famille de cet objet en est responsable. Ce qu'une recette retirée laisse derrière elle, c'est une station qui n'offre plus quelque chose, qui est signalée plutôt que corrigée, car inventer une recette de remplacement mettrait dans la main du joueur un objet qu'aucun paquet ne fournit.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
inputs | Oui | objet |
craft_tax_rate | - | nombre de 0,0 à 1,0 |
description_key | - | chaîne |
display_name_key | - | chaîne |
enhancer_policy | - | none, consumed, preserved, damaged, transformed |
failure_policy | - | none, lose_fuel, lose_catalyst, lose_all, damaged_output |
gold_cost | - | entier de 0 à 9999 |
legality | - | legal, licensed, suspicious, forbidden, black_market |
optional_enhancer | - | chaîne |
output_count | - | entier de 1 à 99 |
output_good_id | - | chaîne |
output_item_id | - | chaîne |
quality_policy | - | fixed, material_inputs, crafter_skill, enhancer, materials_and_crafter |
recipe_kind | - | normal, equipment, special, enhancement |
requires_perk_id | - | chaîne |
requires_service | - | chaîne |
station_fee | - | entier de 0 à 9999 |
success_chance | - | nombre de 0,0 à 1,0 |
time_cost_minutes | - | entier de 1 à 60 |
tools_required | - | liste de chaînes |
Dans un fichier appelé recipes.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a recipes record, under content/economy/recipes
[
{
"id": "northern_reach:salt_cured_ration",
"display_name_key": "VALID_RECIPE_MOD_SALT_CURED_RATION",
"recipe_kind": "normal",
"inputs": {
"salt": 1,
"dried_meat": 2
},
"output_item_id": "northern_reach:salt_cured_ration",
"output_count": 3,
"requires_service": "kitchen",
"gold_cost": 4,
"time_cost_minutes": 20,
"success_chance": 0.95,
"failure_policy": "lose_fuel",
"quality_policy": "material_inputs",
"legality": "legal"
}
]vendor_inventories
Tableaux d'approvisionnement des marchands.
- Statut Prêt à l'emploi
- Chemin d'accès Un commerçant qui le conserve
- Dossier
content/world/vendor_inventories - Enregistrements acheminés pour le champ
id - Rapport
modding_vendor_inventory_report - Si un joueur vous désinstalle
drop_optional_presentation. Les stocks sont régénérés. Un commerçant avec une étagère vide est un état lisible et la ligne ne pointe vers rien d'autre.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
display_name | Oui | chaîne |
entries | Oui | liste d'objets |
buyback_rate | - | nombre de 0 à 1 |
description | - | chaîne |
global_price_multiplier | - | nombre, 0 ou plus |
npc_id | - | chaîne |
Dans un fichier appelé vendors.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a vendor_inventories record, under content/world/vendor_inventories
[
{
"id": "northern_reach:herb_stall",
"display_name": "Herbalist's Stall",
"npc_id": "northern_reach:wandering_herbalist",
"global_price_multiplier": 1.0,
"buyback_rate": 0.4,
"entries": [
{
"item_id": "northern_reach:spiced_wine_bottle",
"kind": "consumable",
"daily_stock": 3,
"price_multiplier": 1.1,
"restock_days": 2,
"min_standing": 0
}
]
}
]Histoire, missions et mots qu'un joueur lit
9 familles : dialogue, locales, lore, mr_lines, progress, quest_metadata, quest_plans, quests, scenes.
dialogue
Les conversations comme enregistrements : le graphique, ses blagues et les choix qui s'y trouvent. Trois types partagent la famille et kind indique lequel. Un package écrit la conversation, jamais les mots – chaque frappe est une clé de langage – et chaque condition et chaque conséquence est une vérification ou une commande que cette construction exécute déjà.
- Statut Prêt à l'emploi
- Dossier
content/narrative/dialogue - Enregistrements acheminés pour le champ
id - Rapport
modding_dialogue_report - Si un joueur vous désinstalle
preserve_inert_reference. Une sauvegarde enregistre ce qu'une conversation a fait – une mission qui a changé, un objet qui a changé de mains, une vérité apprise – jamais la conversation elle-même, qui se termine au moment où vous écrivez quelque chose. Lorsque le forfait disparaît, les conséquences subsistent car ils n'ont jamais fait partie de la conversation et la conversation n'est tout simplement plus proposée. Le remplacer reviendrait à mettre dans la bouche d'un personnage des mots que son auteur n'a jamais écrits.
Champs. Cette famille contient plus d'un type d'enregistrement, et chaque type est vérifié par rapport à sa propre liste. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
Un enregistrement avec kind: dialogue_graph :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | dialogue_graph |
id | Oui | chaîne |
entry | Oui | chaîne |
description_key | - | texte, fixed shape |
name_key | - | texte, fixed shape |
speaker | - | chaîne |
Un enregistrement avec kind: dialogue_node :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | dialogue_node |
id | Oui | chaîne |
graph | Oui | n'importe qui |
voice | Oui | line |
speaker | Oui | chaîne |
line_key | Oui | n'importe qui |
conditions | - | n'importe qui |
description_key | - | n'importe qui |
name_key | - | n'importe qui |
reveals | - | n'importe qui |
Un enregistrement avec kind: dialogue_node :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | dialogue_node |
id | Oui | chaîne |
graph | Oui | n'importe qui |
voice | Oui | narration |
line_key | Oui | n'importe qui |
conditions | - | n'importe qui |
description_key | - | n'importe qui |
name_key | - | n'importe qui |
reveals | - | n'importe qui |
Un enregistrement avec kind: dialogue_node :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | dialogue_node |
id | Oui | chaîne |
graph | Oui | n'importe qui |
voice | Oui | end |
conditions | - | n'importe qui |
description_key | - | n'importe qui |
line_key | - | n'importe qui |
name_key | - | n'importe qui |
reveals | - | n'importe qui |
Un enregistrement avec kind: dialogue_option :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | dialogue_option |
id | Oui | chaîne |
node | Oui | chaîne |
label_key | Oui | texte, fixed shape |
goto | Oui | chaîne |
commands | - | liste de tout ce qui |
conditions | - | liste de tout ce qui |
description_key | - | texte, fixed shape |
name_key | - | texte, fixed shape |
Dans un fichier appelé gate_toll.json, ou quel que soit le nom .json que vous aimez dans ce dossier :
a dialogue record, under content/narrative/dialogue
[
{
"kind": "dialogue_graph",
"id": "northern_reach:gate_toll",
"entry": "northern_reach:gate_open",
"speaker": "gate_warden",
"name_key": "TALK_PACK_GATE_TOLL_NAME",
"description_key": "TALK_PACK_GATE_TOLL_DESC"
},
{
"kind": "dialogue_node",
"id": "northern_reach:gate_open",
"graph": "northern_reach:gate_toll",
"voice": "line",
"speaker": "gate_warden",
"line_key": "TALK_PACK_GATE_OPEN"
},
{
"kind": "dialogue_option",
"id": "northern_reach:opt_pay_the_toll",
"node": "northern_reach:gate_open",
"label_key": "TALK_PACK_OPT_PAY",
"goto": "northern_reach:gate_paid",
"commands": [
{
"step": "pay_coin",
"coin": 25
},
{
"step": "change_relation",
"subject": "player",
"target": "gate_warden",
"delta": 4
}
]
}
]Le luminaire contient 12 enregistrements ; 3 sont affichés.
locales
Les mots qu'un joueur lit, au format CSV avec une colonne par langue : les clés propres du package, et celles du jeu où le package déclare l'écrasement.
- Statut Prêt à l'emploi
- Dossier
content/locale - Rapport
modding_locale_report - Si un lecteur vous désinstalle
preserve_inert_reference. Une sauvegarde nomme le disque, jamais les mots qui le disent, donc un paquet retiré entre deux sessions coûte une traduction et rien. La clé est conservée et apparaît, ce qui se lit comme une traduction manquante plutôt que comme un contenu manquant.
Colonnes. Une colonne que cette table ne nomme pas est rejetée avec l'enregistrement.
| Colonne | Nécessaire | Valeurs |
|---|---|---|
key | Oui | texte, id |
en | - | chaîne |
Dans un fichier appelé words.csv. Le nom du fichier correspond à la moitié de l'adresse et l'identifiant de la ligne à l'autre moitié, donc deux fichiers peuvent contenir le même identifiant de ligne sans entrer en collision :
a locales file
key,en,it
word_pack:GOOD_FROST_SALT,Frost Salt,Sale di Brinalore
Entrée du code : lieux, personnes, événements, coutumes et choses dont un monde raconte des histoires. Une entrée chargée n'est pas une entrée connue.
- Statut Prêt à l'emploi
- Dossier
content/narrative/lore - Enregistrements acheminés pour le champ
id - Rapport
modding_lore_report - Si un joueur vous désinstalle
preserve_inert_reference. Une entrée du Codex qu'un joueur a lue est quelque chose qu'il a vu. Le retirer efface une partie de ce qu'il sait sur un monde dans lequel il a passé du temps, et les quêtes et autres entrées pointent vers l'identité.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
category | Oui | place, person, event, custom, thing |
title_key | Oui | chaîne |
body_key | Oui | chaîne |
chronology_index | - | entier |
citation_key | - | chaîne |
content_warnings | - | liste de chaînes |
era | - | chaîne |
relates_to | - | liste de chaînes |
requires | - | liste de chaînes |
reveals | - | liste de chaînes |
Dans un fichier appelé lore.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a lore record, under content/narrative/lore
[
{
"id": "northern_reach:the_drowned_causeway",
"category": "place",
"title_key": "STORY_PACK_DROWNED_CAUSEWAY_TITLE",
"body_key": "STORY_PACK_DROWNED_CAUSEWAY_BODY",
"era": "before_the_mark",
"citation_key": "STORY_PACK_CAUSEWAY_CITATION"
},
{
"id": "northern_reach:the_tide_watch",
"category": "custom",
"title_key": "STORY_PACK_TIDE_WATCH_TITLE",
"body_key": "STORY_PACK_TIDE_WATCH_BODY",
"relates_to": [
"northern_reach:the_drowned_causeway"
]
}
]mr_lines
Lignes structurées de réalisme médiéval, acheminées par identifiant de fichier et de ligne au lieu d'un champ d'identifiant dans le JSON.
- Statut Prêt à l'emploi
- Dossier
content/medieval_realism/structured - Rapport
modding_mr_lines_report - Si un joueur vous désinstalle
drop_optional_presentation. Une blague de couleurs à laquelle rien ne fait référence. Le supprimer ne coûte rien et le conserver afficherait une chaîne vide.
Colonnes. Une colonne que cette table ne nomme pas est autorisée et doit être une valeur simple au lieu d'une liste ou d'un objet.
| Colonne | Nécessaire | Valeurs |
|---|---|---|
line_id | Oui | texte, id |
mechanical_hint | - | chaîne |
public_label | - | chaîne |
public_line | - | chaîne |
public_summary_line | - | chaîne |
speaker | - | chaîne |
tone | - | chaîne |
voice | - | chaîne |
Chaque enregistrement nécessite au moins un des éléments public_line, public_label et public_summary_line.
Ces noms sont rejetés sans conteste, quel que soit leur contenu : unsafe_example, unsafe_reason, audit_note, expected_block_reason, script, scene, resource_path. Certaines sont les colonnes de vérification avec lesquelles écrivent ceux qui jouent au jeu et les autres sont les noms en forme de code que What a mod can never do rejette partout. Un enregistrement en contenant un est rejeté au lieu d'être nettoyé en silence.
Dans un fichier appelé MR_L03_TAVERN_INN_LINES.csv. Le nom de fichier est la moitié de l'adresse et l'identifiant de ligne est l'autre moitié, donc deux fichiers peuvent contenir le même identifiant de ligne sans entrer en collision :
a mr_lines file
line_id,tavern_state,speaker_role,tone,public_line,mechanical_hint
northern_reach:tavern_extra_01,evening_rush,innkeeper,welcoming,"Warm bread and a clean cup if you've the coin for it, friend.",food_onlyprogress
Dossiers de progression des joueurs : objectifs, profils de difficulté sécurisés et profils de match dans le cadre des règles de l'hôte.
- Statut Prêt à l'emploi
- Dossier
content/player/progress - Enregistrements acheminés pour le champ
id - Rapport aucun des siens ;
modding_preflight_reports'en charge - Si un lecteur vous désinstalle
preserve_inert_reference. Les succès gagnés et les profils de match choisis restent nommés lorsque leur package est absent ; les retirer silencieusement réécrirait l'histoire du joueur ou le contrat du match.
Champs. Cette famille contient plus d'un type d'enregistrement, et chaque type est vérifié par rapport à sa propre liste. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
Un enregistrement avec kind: achievement:
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
kind | Oui | achievement |
name_key | Oui | chaîne |
description_key | Oui | chaîne |
condition | Oui | liste d'objets |
campaign | - | chaîne |
hidden | - | booléen |
icon | - | banner, blade, coin, crown, hand, road, … |
A enregistrement avec kind: difficulty_profile:
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
kind | Oui | difficulty_profile |
name_key | Oui | chaîne |
modifiers | Oui | objet |
campaign | - | chaîne |
description_key | - | chaîne |
permadeath | - | booléen |
Un enregistrement avec kind: run_profile :
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
kind | Oui | run_profile |
name_key | Oui | chaîne |
difficulty | Oui | chaîne |
campaign | - | chaîne |
description_key | - | chaîne |
seed_stream | - | chaîne |
starting_origin | - | chaîne |
Dans un fichier appelé progress.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a progress record, under content/player/progress
[
{
"id": "northern_reach:hard_tide",
"kind": "difficulty_profile",
"name_key": "DIFF_HARD_TIDE",
"description_key": "DIFF_HARD_TIDE_DESC",
"modifiers": {
"enemy_strength_percent": 140,
"coin_gain_percent": 80
},
"permadeath": true
},
{
"id": "northern_reach:tide_run",
"kind": "run_profile",
"name_key": "RUN_TIDE",
"description_key": "RUN_TIDE_DESC",
"difficulty": "northern_reach:hard_tide",
"seed_stream": "tide"
},
{
"id": "northern_reach:held_tide",
"kind": "achievement",
"name_key": "ACH_HELD_TIDE",
"description_key": "ACH_HELD_TIDE_DESC",
"condition": [
{
"when": "days_survived",
"count": 30
}
],
"icon": "tower"
}
]quest_metadata
Enregistrements de métadonnées de quête, indexés par quest_id au lieu de id.
- Statut Prêt à l'emploi
- Dossier
content/narrative/quest_metadata - Enregistrements acheminés pour le champ
quest_id - Rapport
modding_quest_metadata_report - Si un joueur vous désinstalle
preserve_inert_reference. Il décrit des missions qui pourraient elles-mêmes déjà être réduites à une pierre tombale ; le retirer les laisserait sans description plutôt qu'absents.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
quest_id | Oui | texte, id |
arc_id | - | texte, id |
choice_valence | - | chaîne |
consequence_hooks | - | liste de chaînes |
difficulty_band | - | chaîne |
faction_context | - | chaîne |
failure_consequence | - | chaîne |
moral_pressure | - | chaîne |
notification_policy | - | chaîne |
novelty_tags | - | liste de chaînes |
player_model_tags | - | liste de chaînes |
quest_role | - | chaîne |
replay_suppression_key | - | chaîne |
reward_intent | - | chaîne |
story_turn_role | - | chaîne |
urgency_band | - | chaîne |
world_reason | - | chaîne |
Dans un fichier appelé quests.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a quest_metadata record, under content/narrative/quest_metadata
[
{
"quest_id": "northern_reach:tavern_errand",
"world_reason": "settlement_shortage",
"quest_role": "recovery",
"difficulty_band": "standard",
"urgency_band": "soon"
}
]quest_plans
Plans de mission en tant qu'enregistrements : les arcs, les missions, les objectifs et les fins qu'un package écrit et à partir desquels le jeu construit ses propres missions. La forme d'enregistrement d'une mission, à côté des ressources manuscrites plutôt qu'à leur place.
- Statut Prêt à l'emploi
- Dossier
content/narrative/quest_plans - Enregistrements acheminés pour le champ
id - Rapport
modding_quest_plan_report - Si un joueur vous désinstalle
preserve_inert_reference. Un plan construit les mêmes missions que celles du jeu, donc un plan à la retraite laisse le même trou que laisserait l'écriture manuscrite. La progression est la seule chose qu'un joueur ne peut pas reconstruire : une mission non résolue est signalée et n'est jamais terminée ni silencieusement annulée.
Champs. Cette famille contient plus d'un type d'enregistrement, et chaque type est vérifié par rapport à sa propre liste. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
Un enregistrement avec kind: arc :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | n'importe qui |
id | Oui | texte, id |
stages | Oui | liste |
description_key | - | texte, fixed shape |
name_key | - | texte, fixed shape |
Un enregistrement avec kind: ending :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | n'importe qui |
id | Oui | texte, id |
arc | Oui | chaîne |
requires | Oui | liste |
description_key | - | texte, fixed shape |
epilogue_key | - | texte, fixed shape |
name_key | - | texte, fixed shape |
Un enregistrement avec kind: objective :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | n'importe qui |
id | Oui | texte, id |
quest | Oui | chaîne |
goal | Oui | collect_item, defeat_unit, defend_place, deliver_item, earn_coin, escort_unit, … |
count | - | Intero de 1 a 999 |
description_key | - | texte, fixed shape |
name_key | - | texte, fixed shape |
optional_step | - | booléen |
target | - | chaîne |
Un enregistrement avec kind: quest :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | n'importe qui |
id | Oui | texte, id |
name_key | Oui | texte, fixed shape |
giver | Oui | chaîne |
objectives | Oui | liste |
deadline_days | - | entier de 1 à 3650 |
description_key | - | texte, fixed shape |
forfeits | - | liste de tout ce qui |
in_arc | - | chaîne |
rewards | - | liste de tout ce qui |
Dans un fichier appelé the_long_winter.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a quest_plans record, under content/narrative/quest_plans
[
{
"kind": "arc",
"id": "northern_reach:the_long_winter",
"name_key": "northern_reach.arc.the_long_winter.name",
"stages": [
"northern_reach:bring_the_grain"
]
},
{
"kind": "quest",
"id": "northern_reach:bring_the_grain",
"name_key": "northern_reach.quest.bring_the_grain.name",
"description_key": "northern_reach.quest.bring_the_grain.description",
"giver": "northern_reach:the_reeve",
"in_arc": "northern_reach:the_long_winter",
"objectives": [
"northern_reach:gather_grain",
"northern_reach:pay_the_toll"
],
"deadline_days": 30,
"rewards": [
{
"grant": "receive_coin",
"coin": 250
},
{
"grant": "give_item",
"item": "northern_reach:reeves_seal",
"count": 1
}
]
},
{
"kind": "objective",
"id": "northern_reach:gather_grain",
"quest": "northern_reach:bring_the_grain",
"goal": "collect_item",
"target": "northern_reach:winter_grain",
"count": 40,
"name_key": "northern_reach.objective.gather_grain.name"
}
]Le luminaire contient 5 enregistrements ; 3 sont présentés.
quests
Actifs de mission manuscrits, chargés par itinéraire au lieu d'être interprétés comme des enregistrements. Un package qui veut sa propre mission écrit quest_plans.
- Statut Vérifié, pas encore installé
- Dossier
content/narrative/quests - Rapport aucun des siens ;
modding_preflight_reports'en charge - Si un joueur vous désinstalle
preserve_inert_reference. Le progrès est la seule chose qu’un joueur ne peut pas reconstruire. Une mission non résolue est signalée et jamais terminée ou silencieusement annulée.
Cette famille est chargée par chemin plutôt que lue comme un enregistrement, et un package ne peut pas contenir le fichier qu'il souhaite ; voir Ce qu'un mod ne peut jamais faire. Écrivez plutôt quest_plans.
scenes
Des scènes mises en scène : la pièce, qui s'y trouve et les répliques qui se déroulent dans l'ordre. C'est le seul contenu qui enlève le contrôle au joueur, c'est pourquoi une séquence qui n'arrive jamais à end est rejetée plutôt que lue. Les blagues et les accessoires sont des noms tirés de listes publiées ; aucune scène Godot, aucun actif et aucun script ne sont chargés ici.
- Statut Prêt à l'emploi
- Dossier
content/narrative/scenes - Enregistrements acheminés pour le champ
id - Rapport
modding_scene_report - Si un joueur vous désinstalle
preserve_inert_reference. Une sauvegarde enregistre ce qu'une scène a fait – un nom choisi, une mission déplacée, une porte ouverte – jamais le fait qu'elle a été regardée. Il se joue et se termine en une seule session, donc un forfait qui quitte coûte la scène et n'est jamais une conséquence de l'avoir vu. Le remplacer mettrait en scène quelque chose que l’auteur n’a jamais écrit sous le nom de quelque chose qu’il a écrit.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
beats | Oui | liste de tout ce qui |
cast | - | liste de tout ce qui |
name_key | - | n'importe qui |
stage | - | objet |
where | - | chaîne |
Dans un fichier appelé scenes.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a scenes record, under content/narrative/scenes
[
{
"id": "northern_reach:tollhouse_wake",
"name_key": "STAGE_PACK_TOLLHOUSE_WAKE",
"stage": {
"room": [
880,
600
],
"light": "candle",
"props": [
{
"prop": "bed",
"at": "bedside"
},
{
"prop": "storage",
"at": "east",
"label_key": "STAGE_PACK_BELONGINGS"
},
{
"prop": "light_marker",
"at": "north",
"light": "candle"
},
{
"prop": "walkway",
"at": "bedside",
"to": "door"
}
]
},
"cast": [
{
"actor": "northern_reach:tollkeeper",
"name_key": "STAGE_PACK_TOLLKEEPER",
"sprite": "default",
"at": "bedside"
}
],
"beats": [
{
"beat": "lock_player"
},
{
"beat": "fade_in",
"seconds": 2.0
},
{
"beat": "say",
"actor": "northern_reach:tollkeeper",
"line_key": "STAGE_PACK_WAKE_1"
},
{
"beat": "wait",
"seconds": 0.8
},
{
"beat": "say",
"actor": "northern_reach:tollkeeper",
"line_key": "STAGE_PACK_WAKE_2"
},
{
"beat": "play_cue",
"cue": "northern_reach:door_latch"
},
{
"beat": "walk_to",
"actor": "northern_reach:tollkeeper",
"anchor": "door"
},
{
"beat": "remove_actor",
"actor": "northern_reach:tollkeeper"
},
{
"beat": "show_exit"
},
{
"beat": "unlock_player"
},
{
"beat": "end"
}
]
}
]Comment tu vois et entends tout
7 familles : audio, effects, fonts, images, presentation_bindings, screens, themes.
audio
Les sons qu'un package transporte, nommés par identifiant : musique, ambiance, effets et voix, chacun pointant vers un fichier dans son propre dossier et déclarant le rôle qui le délimite.
- Statut Validé, rien ne le consomme encore
- Dossier
content/assets/audio - Enregistrements acheminés pour le champ
id - Rapport
modding_audio_report - Si un joueur vous désinstalle
preserve_inert_reference. Une sauvegarde nomme le sujet et jamais le son au-dessus, donc un forfait retiré entre deux séances coûte une ambiance et pas une chose. La référence est conservée et rapportée : le silence sans rien dire pourquoi est justement l’état que cette famille existe pour éviter.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
file | Oui | texte, fixed shape |
codec | Oui | ogg, wav |
role | Oui | music, ambience, sfx, voice |
duration_seconds | - | nombre, 0 ou plus |
sha256 | - | texte, fixed shape |
subtitle_key | - | chaîne |
Dans le fichier audio.json, qui est le seul fichier à travers lequel ce dossier est lu :
a audio record, under content/assets/audio
[
{
"id": "northern_reach:hearth_hum",
"file": "hearth_hum.wav",
"codec": "wav",
"role": "ambience",
"duration_seconds": 0.25,
"sha256": "23fc92432963f74bd638f38ea9d7ddb475853f022810bdc8b344269bf43d5830"
}
]effects
Météo, poussière, étincelles et lumières, composés à partir des modèles que l'hébergeur met à disposition. Un package nomme un modèle et définit les paramètres dans les plages déclarées ; il n'y a aucun champ, nulle part, qui contient un shader, une scène ou un script - et c'est ce qui permet au package d'un étranger de demander du feu sans pouvoir demander un programme.
- Statut Prêt à l'emploi
- Dossier
content/assets/effects - Enregistrements acheminés pour le champ
id - Rapport
modding_effect_report - Si un joueur vous désinstalle
preserve_inert_reference. Rien dans une sauvegarde ne nomme un effet. L'air revient à ce que le jeu de base dessine lorsque le pack part, ce qui coûte un aspect et rien ne possède un joueur.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
template | Oui | dust_drift, lightning_flash, rain_sheet, smoke_column, snow_drift, spark_burst, … |
parameters | - | objet |
priority | - | entier de 0 à 100 |
Dans un fichier appelé effects.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a effects record, under content/assets/effects
[
{
"id": "northern_reach:moor_drift",
"template": "dust_drift",
"parameters": {
"amount": 64,
"lifetime": 6,
"scale": 2,
"wind": 4,
"colour": "#c8bfa8"
},
"priority": 40
}
]fonts
Les polices de caractères qu'un paquet contient, nommées par identifiant : le fichier, la taille dans laquelle ils sont dessinés et les langues dont ils portent les glyphes. La couverture prétend être exposée, car un caractère manquant des glyphes d'une langue n'échoue pas : il dessine de petits carrés et l'écran se lit comme une traduction laissée à moitié terminée.
- Statut Validé, rien ne le consomme encore
- Dossier
content/assets/fonts - Enregistrements acheminés pour le champ
id - Rapport
modding_font_report - Si un lecteur vous désinstalle
preserve_inert_reference. Rien dans une sauvegarde ne nomme un personnage. L'interface revient à la police de la boîte à outils lorsque le package quitte, qui est la seule qu'aucun auteur n'a dû choisir.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
file | Oui | texte, fixed shape |
format | Oui | ttf, otf |
sizes | Oui | liste d'entiers de 8 à 96 |
covers | Oui | liste |
fallback_font | Oui | chaîne |
glyphs | - | liste |
oversampling | - | entier de 1 à 4 |
sha256 | - | texte, fixed shape |
Dans le fichier fonts.json, qui est le seul fichier à travers lequel ce dossier est lu :
a fonts record, under content/assets/fonts
[
{
"id": "northern_reach:plain",
"file": "plain.ttf",
"format": "ttf",
"sizes": [
12,
16,
24
],
"oversampling": 1,
"covers": [
"en"
],
"fallback_font": "Segoe UI",
"sha256": "613b1d24f9f8b0365a94f01214155af8e87ca72aa6633befd5e0ee05b3dc4122"
}
]images
Images qu'apporte un package, nommées par identifiant : icônes, portraits et feuilles de sprites, chacun pointant vers un fichier dans son propre dossier.
- Statut Prêt à l'emploi
- Dossier
content/assets/images - Enregistrements acheminés pour le champ
id - Rapport
modding_image_report - Si un joueur vous désinstalle
preserve_inert_reference. Une sauvegarde nomme des objets et des personnes, jamais une image de l'un d'eux, donc une image qui cesse de se résoudre coûte un dessin et non une chose. La référence est préservée et signalée : la remplacer par une illustration provenant d'un autre package montrerait au joueur quelque chose qu'aucun auteur n'a choisi, et supprimer l'identifiant silencieusement ferait ressembler l'icône manquante à un défaut de conception.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
file | Oui | texte, fixed shape |
format | Oui | png, webp |
frame_columns | - | entier de 1 à 256 |
frame_rows | - | entier de 1 à 256 |
sha256 | - | texte, fixed shape |
Dans le fichier images.json, qui est le seul fichier à travers lequel ce dossier est lu :
a images record, under content/assets/images
[
{
"id": "northern_reach:salt_pouch",
"file": "salt_pouch.png",
"format": "png"
}
]presentation_bindings
Quelle ressource du package remplit quel emplacement sur quel sujet : l'icône sur un objet, le sprite sur une unité ou une tuile, la bannière sur une faction, aussi bien pour le contenu du package que pour celui du jeu de base.
- Statut Prêt à l'emploi
- Dossier
content/presentation/bindings - Enregistrements acheminés pour le champ
id - Rapport aucun des siens ;
modding_preflight_reports'en charge - Si un joueur vous désinstalle
preserve_inert_reference. Une sauvegarde nomme le sujet – l’objet, la personne, la pièce – et jamais quelle image l’habille, donc un lien qui cesse de se résoudre coûte un dessin et non une chose. La référence est conservée et rapportée : le sujet renvoie à l'art que possédait déjà la construction, seule réponse qu'aucun auteur n'a eu à choisir.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
subject | Oui | texte, id |
kind | Oui | building, faction, interface, item, region, tile, … |
slot | Oui | ambience, banner, effect, font, icon, portrait, … |
cue | Oui | texte, id |
alternative_key | - | chaîne |
Dans un fichier appelé bindings.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a presentation_bindings record, under content/presentation/bindings
[
{
"op": "add",
"id": "northern_reach:cloak_icon",
"subject": "wool_cloak",
"kind": "item",
"slot": "icon",
"cue": "northern_reach:cloak_plain",
"alternative_key": "item_wool_cloak_icon_alt"
},
{
"op": "add",
"id": "northern_reach:cloak_icon_winter",
"subject": "wool_cloak",
"kind": "item",
"slot": "icon",
"cue": "northern_reach:cloak_snowy",
"alternative_key": "item_wool_cloak_icon_alt",
"when": {
"season": {
"is": "winter"
}
}
}
]screens
Dispositions d'écran : quelles sections correspondent à quel panneau d'écran le jeu possède déjà et dans quel ordre. Il comporte des éléments que cette version dessine et ne peut pas en ajouter : un nouvel écran aurait besoin de widgets, de sources de données et de gestionnaires de clics, qui constituent ensemble un langage de programmation.
- Statut Prêt à l'emploi
- Dossier
content/ui/screens - Enregistrements acheminés pour le champ
id - Rapport
modding_screen_report - Si un joueur vous désinstalle
preserve_inert_reference. Rien dans un sauvetage ne nomme une disposition. Il décide de la manière dont une page est dessinée pendant le chargement du pack, et la page revient à la mise en page que cette version prend avec elle lorsqu'elle part : cela coûte un skin et rien ne possède un joueur.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
screen | Oui | character_sheet |
panels | Oui | objet |
Dans un fichier appelé screens.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a screens record, under content/ui/screens
[
{
"id": "northern_reach:character_sheet",
"screen": "character_sheet",
"panels": {
"header": [
"header"
],
"left": [
"vitals",
"combat"
],
"middle": [
"attributes",
"skills"
],
"right": [
"service",
"weight",
"background"
]
}
}
]themes
Palettes d'interface sous forme de jetons : couleurs, tailles et espacements nommés, avec des paires dont le contraste doit être capable de lire. Jamais une scène, un script ou un chemin de ressource.
- Statut Prêt à l'emploi
- Dossier
content/assets/themes - Enregistrements acheminés pour le champ
id - Rapport
modding_theme_report - Si un joueur vous désinstalle
preserve_inert_reference. Rien dans une sauvegarde ne nomme un thème. L'interface revient aux couleurs de la boîte à outils lorsque le package quitte, ce qui est la seule palette qu'un auteur a dû choisir.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
id | Oui | texte, id |
tokens | Oui | objet |
contrast_pairs | - | liste d'objets |
Dans un fichier appelé themes.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a themes record, under content/assets/themes
[
{
"id": "northern_reach:dusk",
"tokens": {
"bg_deep": {
"kind": "colour",
"value": "#12131a"
},
"bg_panel": {
"kind": "colour",
"value": "#1b1c26"
},
"bg_panel_hi": {
"kind": "colour",
"value": "#262838"
},
"text": {
"kind": "colour",
"value": "#e8e2d0"
},
"text_bright": {
"kind": "colour",
"value": "#f4efe2"
},
"text_mute": {
"kind": "colour",
"value": "#6f6a80"
},
"border": {
"kind": "colour",
"value": "#7f6ab0"
},
"border_dark": {
"kind": "colour",
"value": "#14151c"
},
"border_soft": {
"kind": "colour",
"value": "#4a4560"
},
"danger": {
"kind": "colour",
"value": "#d4564b"
},
"success": {
"kind": "colour",
"value": "#7fc46a"
},
"warning": {
"kind": "colour",
"value": "#e0b13c"
},
"accent_player": {
"kind": "colour",
"value": "#6f97e8"
},
"accent_enemy": {
"kind": "colour",
"value": "#c94a4a"
}
},
"contrast_pairs": [
{
"text": "#e8e2d0",
"background": "#12131a"
},
{
"text": "#f4efe2",
"background": "#1b1c26"
},
{
"text": "#e8e2d0",
"background": "#262838"
}
]
}
]Qu'est-ce que le joueur contrôle et qu'observe-t-il
3 familles : adaptive, input_bindings, settings.
adaptive
Des profils qui regardent le déroulement d’un match et suggèrent une approche différente. Le résultat est un conseil et jamais un changement : un profil qui pourrait agir serait la seule chose qu'apporte un package capable de modifier un jeu sans que le joueur ou l'invité ne le demande, et dans un diff il ressemblerait exactement à une table d'ajustements. Les entrées sont une liste publiée d'agrégats de jeu, chacun représentant un nombre ou une moyenne que le jeu détient déjà sur lui-même.
- Statut Prêt à l'emploi
- Dossier
content/player/adaptive - Enregistrements acheminés pour le champ
id - Rapport
modding_adaptive_report - Si un joueur vous désinstalle
drop_optional_presentation. Aucune sauvegarde ne nomme un profil. Ce qu'un profil a touché, c'est un multiplicateur recalculé par les mutateurs actifs à chaque fois qu'ils changent, donc un paquet retiré cesse d'être consulté et le jeu revient exactement à ce que le joueur avait choisi. Rien n'est conservé, donc il n'y a rien à préserver.
Champs. Cette famille contient plus d'un type d'enregistrement, et chaque type est vérifié par rapport à sa propre liste. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
A enregistrement avec kind: adaptive_profile :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | n'importe qui |
id | Oui | texte, id |
name_key | Oui | texte, fixed shape |
policy | Oui | enemy_composition, event_cadence, hint_frequency, pace_economy, pace_encounters, weather_variety |
reads | Oui | liste |
fallback_policy | Oui | enemy_composition, event_cadence, hint_frequency, pace_economy, pace_encounters, weather_variety |
confidence_floor_percent | - | intero de 1 a 100 |
description_key | - | texte, fixed shape |
sample_days | - | entier de 1 à 365 |
A enregistrement avec kind: threshold_set :
| Champ | Nécessaire | Valeurs |
|---|---|---|
kind | Oui | n'importe qui |
id | Oui | texte, id |
profile | Oui | texte, id |
thresholds | Oui | liste d'objets |
description_key | - | texte, fixed shape |
name_key | - | texte, fixed shape |
Dans un fichier appelé adaptive.json, ou sous un autre nom .json que vous aimez dans ce dossier :
a adaptive record, under content/player/adaptive
[
{
"kind": "adaptive_profile",
"id": "northern_reach:hard_roads",
"name_key": "ADAPTIVE_HARD_ROADS",
"description_key": "ADAPTIVE_HARD_ROADS_BODY",
"policy": "pace_encounters",
"reads": [
"battles_won_ratio",
"days_survived",
"party_size"
],
"fallback_policy": "event_cadence",
"confidence_floor_percent": 60,
"sample_days": 14
},
{
"kind": "threshold_set",
"id": "northern_reach:hard_roads_lines",
"profile": "northern_reach:hard_roads",
"name_key": "ADAPTIVE_HARD_ROADS_LINES",
"thresholds": [
{
"signal": "battles_won_ratio",
"above": 80,
"advise": "raise"
},
{
"signal": "battles_won_ratio",
"below": 35,
"advise": "lower"
},
{
"signal": "party_size",
"below": 3,
"advise": "lower"
},
{
"signal": "days_survived",
"above": 60,
"advise": "hold"
}
]
}
]input_bindings
Actions spécifiques à un package, avec la clé qu'ils souhaitent. Le joueur décide : une suggestion qui aboutit sur une combinaison qu'il avait déjà assignée est perdante, et l'action se déroule sans bouton, car un bouton qui fait autre chose en silence est pire qu'un bouton qui ne fait rien.
- Statut Prêt à l'emploi
- Dossier
content/input - Enregistrements acheminés pour le champ
action_id - Rapport
modding_input_report - Si un joueur vous désinstalle
preserve_inert_reference. La réaffectation d'un joueur reste stockée sous l'identifiant de l'action, donc la réinstallation du package trouve le bouton où vous l'avez placé. L'action elle-même est supprimée de la carte des commandes lorsque le package quitte, de sorte que l'écran d'affectation ne répertorie jamais quelque chose qui ne répond à rien.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
action_id | Oui | texte, id |
label_key | Oui | chaîne |
context | Oui | exploration, combat, menu, global |
suggested_keyboard | Oui | chaîne |
suggested_controller | - | chaîne |
Dans un fichier appelé bindings.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a input_bindings record, under content/input
[
{
"action_id": "northern_reach:call_scout",
"label_key": "KEY_PACK_CALL_SCOUT",
"context": "exploration",
"suggested_keyboard": "f9"
}
]settings
Options qu'un joueur peut modifier, déclarées plutôt que tirées. Un package indique quelle est l'option, quelles valeurs elle peut avoir et où se trouve la valeur ; le contrôle est construit par l'invité. Rien de ce qui traverse cette frontière n'est un contrôle ou un script, et c'est la seule raison pour laquelle un menu de paramètres peut afficher les options d'un étranger sans exécuter son code.
- Statut Prêt à l'emploi
- Dossier
content/settings - Enregistrements acheminés pour le champ
key - Rapport
modding_settings_report - Si un joueur vous désinstalle
preserve_inert_reference. Une valeur stockée reste sous sa clé, donc la réinstallation du paquet retrouve le choix du joueur là où il l'a laissé. Ce que laisse le paquet, c'est une ligne de profil que personne ne lit : cela ne coûte rien et préserve le choix que le joueur a fait.
Champs. Un champ que cette table ne nomme pas est rejeté avec l'enregistrement.
| Champ | Nécessaire | Valeurs |
|---|---|---|
key | Oui | texte, id |
type | Oui | bool, int, float, string, enum |
default | Oui | n'importe qui |
scope | Oui | installation, campaign, presentation |
label_key | Oui | chaîne |
help_key | - | chaîne |
max_length | - | entier de 1 à 4096 |
maximum | - | nombre |
migrates_from | - | texte, id |
minimum | - | nombre |
options | - | liste de chaînes |
requires_restart | - | booléen |
secret | - | booléen |
Dans un fichier appelé settings.json, ou quel que soit le nom .json que vous souhaitez dans ce dossier :
a settings record, under content/settings
[
{
"key": "northern_reach:patrol_density",
"type": "int",
"default": 3,
"minimum": 1,
"maximum": 9,
"scope": "campaign",
"label_key": "OPTION_PACK_PATROL_DENSITY",
"help_key": "OPTION_PACK_PATROL_DENSITY_HELP"
},
{
"key": "northern_reach:show_road_names",
"type": "bool",
"default": true,
"scope": "presentation",
"label_key": "OPTION_PACK_SHOW_ROAD_NAMES"
}
]Raccourcis de la console
Il s'agit d'un raccourci, pas d'une étape. Tout ce qui suit a sa place sur l'écran Mods, où passe la route normale et où regardera toute personne ayant téléchargé votre package. La console est plus rapide lorsque vous itérez et elle est déjà ouverte, et elle n'existe que dans une version de débogage : une copie publiée du jeu n'a pas de console, donc rien dont un auteur de package a besoin ne peut vivre ici seul.
| Commande | Même chose sur l'écran Mod |
|---|---|
modding_open_folder | le chemin en haut et le bouton à côté |
modding_manifest_report | la colonne d'état et la ligne en dessous de chaque ligne |
modding_<family>_report | les décomptes sous chaque colis, et Afficher les détails |
modding_preflight_report | Vérifier la compatibilité |
modding_roots_report, modding_safety_report | Copiez le rapport |
modding_reload | Aucun bouton sur l'écran. Redémarrer le jeu fait la même chose et c'est le seul moyen d'avoir une version publiée ; cela vous évite d'avoir à redémarrer pendant l'itération. C'est la seule ligne ici qui est pratique plutôt qu'un raccourci vers quelque chose que l'écran fait déjà. |
Commencez à modding_manifest_report : le jeu voit-il votre package et dans quel état ? — puis modding_preflight_report pour un verdict unique sur tout ce qui est installé. Puis le rapport de chaque famille.
modding_reload relit vos fichiers sans redémarrer. Modifiez, faites Alt-Tab, saisissez la commande et regardez. Il reconstruit ce que rien ne retient — bindings, effets et images — et nomme chaque famille laissée de côté, car une partie est debout sur les enregistrements qu'une sauvegarde peut nommer :
what the game prints back
HELD BY THE RUN items: edited files are read on the next loadmodding_reload all lit à nouveau tout et concerne un écran de démarrage sans jeu en cours. modding_condition_report affiche ce que le jeu peut maintenant répondre pour un when, et ce qu'il ne peut pas répondre.
| Commande | Qu'est-ce que ça te dit |
|---|---|
modding_roots_report | Racines et empreintes des mods de données |
modding_manifest_report | États du module (actif/invalide/ignoré/en conflit) |
modding_fingerprint_report | Empreintes déterministes des sauvegardes (save_wired=no) |
modding_safety_report | Posture sécurisée (mods de comportement désactivés, fichiers verrouillés) |
modding_preflight_report | Verdict VERT/ROUGE sur tous les mods actifs |
modding_packaging_report | Détection PCK/ZIP niveau 2 (désactivée par défaut) |
modding_campaign_report | Modding_campaign_report [id] - campagnes installées en lecture seule ; avec une pièce d'identité, tu y vas |
modding_condition_report | Que publie le monde pour des conditions record |
modding_reload | Modding_reload [all] - relire les paquets ; all uniquement s'il n'y a pas de partie en cours |
modding_binding_report | Liens de soumission : liés/rejetés/ignorés |
modding_open_folder | Crée (si nécessaire) et ouvre le dossier mods de l'utilisateur |
Outils hors ligne
Ces outils sont destinés aux auteurs et à l'automatisation des publications. Ils sont fournis dans le checkout public de Bonemark ; les joueurs qui installent un mod publié n'ont besoin ni de Python ni de Godot. Si vous écrivez un mod, clonez la version correspondante depuis github.com/tallowgames/Bonemark, gardez votre package de travail hors du dossier mods du joueur et exécutez les commandes ci-dessous depuis ce checkout. Le jeu reste l'autorité finale du runtime.
Python 3.10 ou version ultérieure ; Godot pour la voie d'exécution uniquement. Conservez votre package en dehors du dossier mods du lecteur et essayez-en une copie.
a command line
python tools/modding/new_mod.py --list
python tools/modding/new_mod.py --id my_mod --family goods --family itemsIl écrit un package qui passe la validation avant même que vous ayez écrit quoi que ce soit : un mod.json précompilé, un dossier de travail pour chaque famille que vous avez demandée et un README avec les deux commandes suivantes. Les enregistrements proviennent d'appareils que la construction vérifie déjà pour ces familles, donc un démarreur qui cesse de fonctionner provoque la même vérification qui provoque l'échec de l'appareil, plutôt que de pourrir à l'intérieur d'un modèle. Il refuse d'écrire dans un dossier appelé mods.
a command line
python tools/quality/validate_mod_data.py --root "<mod-root>"
python tools/quality/validate_mod_data.py --strict --root "<mod-root>"Vérifiez mod.json, les dossiers familiaux, les identifiants, les schémas, les références, les limites et les charges utiles bloquées. --strict transforme les avertissements en échecs.
Comparez la surface de modding avec la version
Lorsque le jeu change, comparez l'instantané de surface archivé avant de mettre à jour un package. Il contient un résumé ainsi que des champs et des opérations pour chaque famille publique, de sorte que le résultat indique quelle famille a changé et pourquoi :
a command line
python tools/quality/modding_surface_contract.py --json
python tools/quality/modding_surface_contract.py --before "<previous-build>/game/games/bonemark/modding/data/mod_surface_contract.json" --jsonLa différence est unchanged, additive ou breaking. Les raisons de l'échec sont explicites : field_removed, required_added, type_changed, default_changed, constraint_changed, operation_removed et root_changed, format_changed, id_field_changed, catalogue_changed, family_removed et contract_major_changed_without_new_id. Nom de modification compatible field_added, required_removed, operation_added ou family_added. La commande sans --before vérifie également la ligne de base stockée. Si la surface actuelle a bougé, l'audit échoue jusqu'à ce qu'un responsable examine les résumés avant/après exacts dans tools/quality/modding_surface_contract_changes.json ; une modification radicale doit également enregistrer chaque raison, la décision, la note de migration et le réviseur. La promotion d'un instantané intentionnellement révisé est explicite :
a command line
python tools/quality/modding_surface_contract.py --write-baselineIl s'agit d'une vérification du responsable/de la version ; les auteurs de mods n'ont besoin que de la comparaison --before, et les joueurs qui installent un package publié n'ont pas besoin de l'exécuter.
a command line
python tools/modding/mod_test_host.py --root "<mod-root>" --repo-root "<framework-root>" --jsonLit le manifeste, les dépendances, la compatibilité et l'ordre de chargement sans lancer Godot et sans exécuter quoi que ce soit de votre package.
N'ouvre jamais un fichier de contenu. C'est la division du travail : l'hôte répond ces paquets seront chargés ensemble, le validateur répond cet enregistrement est correct - mais cela signifie qu'un paquet que le validateur rejette peut toujours être composé proprement ici. Mesurés sur quatorze paquets délibérément brisés, les deux sont en désaccord sur chaque rejet : l'hôte met en scène les quatorze paquets refused vides, dont un portant scripts/payload.sh que seul le validateur trouve. La numérotation n'est pas la même chose qu'une installation sécurisée. Faites les deux avant de publier. Répétez --root lorsque l'ensemble de test est divisé en dossiers ; l'hôte compose ensuite l'ensemble complet dans un plan déterministe.
a command line
python tools/modding/mod_test_matrix.py --repo-root "<framework-root>" --root "<mod-root>" --godot "<godot-exe>" --require-runtime --report "mod_test_matrix.json"Il exécute le validateur, l'hôte de test, le montage de chaque famille prêt à l'emploi et la voie d'exécution Godot. Supprimez --require-runtime si vous n'avez pas Godot ; le rapport indiquera alors que le test d'exécution a été ignoré et non réussi.
Pour un ensemble composite, répétez l'option :
a command line
python tools/modding/mod_test_matrix.py --repo-root "<framework-root>" --root "<mod-a>" --root "<mod-b>" --godot "<godot-exe>" --require-runtimeLe rapport conserve un résultat par racine et ajoute composed_set pour l'ensemble complet. Ce bloc est l'endroit où les conflits de packages, les ID en double et les erreurs de dépendance sont démontrés. Un emballage propre ne constitue pas à lui seul une preuve que l’ensemble sera chargé ensemble. Le rapport inclut également surface_contract, la version actuelle du contrat familial et le résumé d'audit, de sorte qu'une matrice ne peut pas être verte tant que l'instantané de compatibilité du référentiel est obsolète. Avec --require-runtime, lisez runtime.reachability.loaded_families et runtime.reachability.reachable_families. Le premier indique que les enregistrements composés ont été chargés ; la seconde n’est peuplée que lorsqu’un véritable chemin destiné aux acteurs de l’enquête Godot les a consumés. runtime.reachability.observations conserve le package, la famille, l'ID d'enregistrement, le chemin et le statut pour chaque ligne, tandis que unreachable répertorie les lignes chargées qui n'ont pas encore de chemin. Une famille peut être validée et mise en scène tout en étant absente de reachable_families : "chargée" n'est pas la même chose que "un joueur peut l'atteindre".
Chaque commande ci-dessus est vérifiée par rapport aux outils eux-mêmes au fur et à mesure de la création de cette page : le script doit exister et chaque option doit être acceptée.
Chaque code de diagnostic
Ne lisez pas cette liste dans l'ordre. C'est ici pour qu'un code que vous rencontrez dans un rapport soit une question avec une réponse — un petit mot en minuscule comme asset_missing. Collez-en un dans le champ de recherche en haut de cette page.
Certains codes appartiennent à des mécanismes qu'un paquet ne peut pas encore atteindre. Je suis là pareil : un code qu'on ne peut pas déclencher coûte une ligne qu'on ne lira jamais, et un code manquant coûte une soirée.
| Code | Qu'est-ce qui l'a causé | Ce qu'il faut faire |
|---|---|---|
adaptive_brings_a_model | Un paquet essayant de charger quelque chose ou d'aller quelque part. | Supprimez le chemin ou l'adresse et choisissez une stratégie publiée par son nom. Aucun fichier que vous avez apporté n'est téléchargé ici. |
adaptive_fell_back | Un profil qui n'a pas atteint son plancher et qui a utilisé la politique qu'il a indiquée. | Rien à corriger, à moins qu'il ne s'arrête jamais. Le profil n'avait pas suffisamment de signaux parmi ceux qu'il lit, il a donc utilisé la politique qu'il a déclarée comme solution de secours. |
adaptive_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
adaptive_over_budget | Un package sur un plafond indiqué. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
adaptive_text_not_key | Une phrase pour laquelle une clé de catalogue est nécessaire. | Déplacez la phrase vers votre catalogue de langues et placez sa clé dans le champ. Un champ se terminant par _key contient une clé ; une phrase là-dedans met votre paquet dans une seule langue pour toujours. |
adaptive_unknown_step | Une politique, un signal ou une direction que cette version n'a pas. | Le nom n'est pas dans la liste publiée pour cette table. Choisissez-en un qui est là - la liste est courte car chaque entrée est quelque chose que cette version fait déjà. |
adaptive_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
assembly_dangling_reference | Un escalier, une porte ou une entrée nomme quelque chose que cette carte ne contient pas. | Ajoutez l'objet nommé à cette carte ou corrigez l'identifiant. Un escalier dont le palier n'est pas sur la carte est un étage dans lequel le joueur peut entrer et ne peut pas sortir, et un bâtiment dont l'entrée n'est pas un passage est une porte dessinée sur un mur. Les deux extrémités doivent être dans le même fichier. |
assembly_leaked | Le démontage a libéré moins de nœuds que l'assemblage n'en a nécessité. | Rien à corriger dans votre package, et rien dans un package ne peut en être la cause. Le désassemblage a libéré moins de nœuds que l'assemblage n'en a pris, donc quelque chose retient une partie de la carte précédente - écrivez-la avec la carte qui l'a produite. C'est considéré comme un souvenir qui grandit à chaque fois que vous entrez dans le même lieu. |
assembly_missing_aspect | Une partie obligatoire de la mise en page n'a rien produit, vous ne pouvez donc pas tenir sur la carte. | Ajoutez la pièce manquante sur son calque et exportez à nouveau. Le message indique lequel : les rectangles praticables vont sur la couche praticable, les collisionneurs en cas de collision et la couche de tuiles de terrain doit couvrir la carte. Une carte sans rien praticable est un endroit dans lequel le joueur peut entrer et ne pas se déplacer, elle est donc rejetée au lieu d'être publiée. |
assembly_over_budget | La forme assemblée dépasse le toit déclaré. | Supprimez une partie de ce que comptait le message ou divisez la carte. Le toit est mesuré sur ce qui a été assemblé et non sur la taille du fichier, donc compresser les couches ne change rien : le nombre dans le message est ce que la machine aurait dû contenir. |
assembly_refused | Rien n’a été construit, car construire la moitié d’une carte est pire que n’en construire aucune. | Corrigez tous les autres messages de cette exécution et exportez à nouveau. Rien n'a été construit exprès : la moitié de la carte est une pièce dans laquelle vous entrez sans murs, et il n'y aurait aucun moyen de savoir quelle moitié l'a créée. |
assembly_unreachable_affordance | Une ancre est l'endroit où rien n'est déclaré accessible à pied, donc personne ne peut atteindre ce qu'elle offre. | Dessinez un rectangle accessible à pied qui touche l'ancre nommée par le message, sur le même plan. Une ancre est la chose elle-même et l'acteur se tient à côté d'elle, donc un comptoir situé dans une zone accessible à pied est un comptoir que le joueur traverse, et un comptoir sans rien autour est un service que personne ne peut atteindre. Vérifiez d'abord la propriété de l'étage : un point d'ancrage à l'étage n'est pas desservi par la pièce du dessous. |
asset_invalid | Un descripteur existe et cette build le rejette. Le verdict indique quelle règle. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
asset_kind_mismatch | L'appelant a demandé un type et le descripteur en indique un autre. Le résoudre de toute façon fournirait une texture à quelque chose qui attend un son. | Lié une ressource du type que prend l'emplacement. Personne ne dessine le portrait d'une région, donc le lien ne sera jamais établi et rien ne dira pourquoi. |
asset_missing | Le package est installé et ne déclare aucun descripteur sous cet identifiant. | L'identifiant de ressource ne résout rien dans la composition. Apportez le fichier ou pointez le lien vers celui que votre package contient réellement. |
asset_package_missing | Aucun package installé ne répond à l'espace de noms que l'identifiant nomme. | Le package qui a fourni cette ressource n’est pas installé. Réinstallez-le ou liez l'emplacement à quelque chose d'un package installé. |
audio_cue_refused | Un son ou une liste de lecture que cette version n'enregistre pas. | Lisez la règle nommée à côté du code et recodez-la pour vous y conformer. Les causes habituelles sont un format que nous ne décodons pas et une durée au-delà du plafond déclaré. |
audio_placeholder_used | Un son rejeté ou manquant a été résolu dans le substitut réservé, et l'appelant a été averti. | Rien à réparer, si vous le souhaitiez. Le son manquait, donc le remplacement de son type a été joué et le remplacement a été signalé au lieu d'être laissé silencieux. |
audio_refused | A son cette version ne joue pas. Le verdict indique quelle règle. | Le fichier audio lui-même a été rejeté avant que quoi que ce soit ne soit lu. Recodez-le dans un format déclaré dans la taille déclarée et conservez le taux d'échantillonnage parmi ceux de la liste publiée. |
audio_stream_overran | Un flux qui a dépassé la durée déclarée par son descripteur, arrêté à la limite. | Le flux est plus long que son emplacement ne le permet. Raccourcissez-le, ou déplacez-le vers un slot dont le budget le couvre : un flux qui dépasse est un flux que le mixeur doit couper à mi-mot. |
binding_invalid | Une connexion que cette version n’établit pas. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
binding_missing_alternative | Une information qu'un joueur ne peut pas recevoir, sans que rien d'autre ne la porte. | Un portrait et une icône nécessitent une clé de description, et une ligne parlée nécessite une clé de sous-titre. Ajoutez l'alternative : c'est la seule règle d'accessibilité qu'un joueur entend directement. |
binding_over_budget | Soumettre un colis au-delà de ce que permet l'un des totaux. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
binding_placeholder_used | Un son que personne ne propose, résolu dans le substitut de son type. | Rien à réparer, si vous le vouliez. Le lien se transforme en substitut au type de ressource de son emplacement, et le rapport indique quel emplacement, afin que vous puissiez distinguer une décision d'un oubli. |
boot_attempt_recorded | Une tentative a été écrite avant le début de la composition. | Rien à réparer. Le démarrage a été mis par écrit avant sa tentative, et c'est ce qui permet au prochain démarrage de savoir que quelque chose s'est mal passé. |
boot_last_known_good_offered | Au lieu de cela, un profil créé dans le passé est proposé. | La composition qui a échoué n’est pas celle qui a fonctionné, donc la dernière qui a fonctionné a été proposée. Récupérez-le, puis réinstallez les packages un par un pour trouver celui qui a tout cassé. |
boot_marker_unwritable | La tentative n'a pas été enregistrée. Le jeu se lance avec la récupération désactivée pour cette session et le dit. | Le signet de démarrage n'a pas pu être écrit, donc la prochaine fois, vous ne pourrez pas distinguer un crash d'une sortie propre. Vérifiez que le dossier de données du jeu est accessible en écriture ; Il ne s'agit pas de votre colis. |
boot_package_rejected | Un paquet a été rejeté lors de la récupération. L'identifiant est enregistré, jamais le chemin. | Ce package a empêché le lancement du jeu et a été laissé de côté. Le rapport nomme le refus ; réparez-le et réinstallez-le, ou laissez-le de côté. |
boot_retry_offered | En dessous de la limite ; le même profil est réessayé. | Acceptez la nouvelle tentative. Si le deuxième démarrage échoue également, le problème est la composition et non le timing, et la prochaine offre sera en mode sans échec. |
boot_safe_mode_offered | La limite est épuisée ; le jeu propose de démarrer sans aucun package. | Acceptez le mode sans échec, puis supprimez les packages un par un jusqu'à ce qu'il démarre. Votre sauvegarde n'est pas touchée - le mode sans échec la lit et n'y écrit jamais. |
budget_aggregate_exceeded | L'ensemble installé a dépassé la limite partagée. Le package nommé est celui qui l'a transmis, dans l'ordre de chargement. | Supprimez quelque chose de la composition. Ce sont tous les paquets réunis qui dépassent le plafond, pas le vôtre seul, et le rapport imprime le total à côté du plafond. |
budget_degraded | Une taille a été réduite plutôt que rejetée et porte le nom sur lequel elle est repliée. | Rien à corriger, sauf si vous vouliez le contraire. La composition est restée dans les limites de son budget, renonçant à la qualité et non au contenu : rien ne manque, quelque chose est plus petit. |
budget_package_exceeded | Un paquet a dépassé sa limite de taille. | Lisez la taille mentionnée dans le rapport et coupez ce qu'elle mesure. Imprimez la quantité utilisée par votre package à côté de la quantité qu'un package est autorisé à utiliser. |
budget_soft_warning | Au-delà du seuil mou, chargé quand même, signalé à ceux qui créent. | Rien à corriger pour l'instant. Vous êtes suffisamment proche d'un plafond pour qu'un autre pack le dépasse, et il est utile de le savoir avant que quelqu'un d'autre ne le dépasse. |
budget_unknown_dimension | Il y a eu un rapport de consommation sur une taille que cette version ne déclare pas, c'est-à-dire quelqu'un écrivant sur une surface qui n'existe pas. | Le budget mentionne quelque chose que cette construction ne mesure pas. Choisissez une taille dans la liste publiée – une taille que nous ne mesurons pas ne sera jamais appliquée. |
budget_unknown_profile | Un profil que cette build ne déclare pas. Le profil le plus sévère est appliqué au lieu du profil plus large. | Choisissez un profil budgétaire dans la liste publiée. Les profils sont choisis au lieu d'être décrits, donc celui que nous ne publions pas est celui que personne ne voudrait appliquer. |
campaign_hardcoded_identity | Un consommateur a écrit l'identifiant de la campagne de base au lieu de demander quelle campagne est sélectionnée. | Quelque chose s'est passé et a pris l'identifiant de la campagne de base, le texte ou la scène par nom au lieu de demander la campagne sélectionnée. Résolvez ce problème dans le contexte de la campagne, sinon une conversion recevra la réponse de ce monde au lieu de la sienne. |
campaign_invalid | L’instruction n’est pas celle que cette version sélectionnerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
campaign_not_found | Une campagne a été sélectionnée pour l'identifiant et aucune déclaration ne répond à cet identifiant. | L'identifiant de campagne nommé n'est pas installé. Vérifiez comment vous l'avez écrit, ou installez le package qui le fournit : ici il ne s'appuie pas sur la campagne de base. |
character_carries_handler | Données publiques nommant un symbole privé. | Supprimez le champ qui nomme une méthode ou un rappel. La publication d'un symbole interne en fait un contrat public, et le changement de nom qui le rompt est signalé par les joueurs comme étant la rupture du jeu. |
character_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
character_origin_missing | Un personnage dont l'origine n'est fournie par personne, chargé de repli. | Réinstallez le package qui a écrit cette source. Le personnage s'est chargé de la solution de secours réservée et l'identité qu'il a perdue voyage avec lui, donc la réinstallation le remet exactement tel qu'il était. |
character_tree_unenterable | Une boucle ou un nœud inaccessible dans un arbre de progression. | Vérifiez si le rapport indique cycle ou orphelin et reconnectez cette partie de l'arborescence. Il ne s'agit pas non plus d'une erreur lors du jeu - l'option n'est tout simplement jamais proposée et le fichier semble correct. |
character_unknown_property | Une propriété qui ne signifierait rien pour aucun système. | Utilisez une propriété de cette version. En accepter un qui n'en a pas mettrait dans la sauvegarde un champ qui ne signifierait rien pour aucun système et ne pourrait être expliqué à personne pour toujours. |
combat_carries_formula | Un package qui tente de fournir l'arithmétique d'un conflit. | Supprimez le champ. Le niveau 1 concerne les données : ce qui s'exécute appartient au jeu et les nouvelles fonctionnalités proviennent d'un fournisseur de confiance. |
combat_effect_expired | Un état enregistré dont l'étalonnage a disparu, terminé au chargement. | Le package qui a calibré cet état n'est plus installé, donc l'état est terminé au lieu d'être appliqué avec des nombres que personne n'a. Réinstallez-le pour le conserver. |
combat_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
combat_over_budget | Un package sur un plafond indiqué. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
combat_phase_unreachable | A phase écrite et jamais atteint. | Deux phases partagent un seuil, donc l'une des deux ne démarrerait jamais. Donnez-leur différentes valeurs de santé restantes. |
combat_unknown_operation | Une opération ou un paramètre que le solveur ne possède pas. | Choisissez l'opération dans la liste publiée et donnez-lui uniquement ses paramètres. Un coup de pouce qui porte une valeur est une ligne mal lue, pas un coup de pouce plus fort. |
combat_unknown_status | A indique que cette version n'est pas publiée. | Calibrez un état que cette version publie au lieu d’en inventer un. Un état créé se trouve sur un lecteur derrière une icône vide et rien ne peut l'enlever. |
combat_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
conversion_external_reference | Une adresse ou un chemin qui sort du paquet. | Une conversion qu'il a soulignée hors de son propre paquet. Apportez avec vous ce à quoi vous faites référence, sinon le monde part à la pêche à celui que vous n'avez pas écrit. |
conversion_fallback_allowed | Une conversion qui n'a pas nié le repli sur le jeu de base, ni dans le manifeste ni dans la campagne. | Rien à corriger. Cette famille peut tomber dans le jeu de base, et la ligne indique pourquoi il ne s'agit pas d'une fuite. |
conversion_family_unclassified | Une famille de contenu existe et ce catalogue ne la classe pas. | Déclare la famille comme appartenant à la campagne ou au moteur. Une famille non classée est une famille sur laquelle le test d'évasion du jeu de base ne peut pas du tout raisonner. |
conversion_missing_file | Un fichier que l'appareil déclare et qu'il n'a pas. | Un fichier obligatoire dont la conversion déclarée n'est pas dans le package. Apportez-le : une conversion à laquelle il manque une partie d’elle-même démarre et ne peut plus continuer. |
conversion_partial_atomic_family | Une famille atomique n'a été que partiellement fournie. Rejeté au lieu de publié avec la couture visible. | Amenez toute la famille ou ne les amenez pas du tout. Une demi-liste de quêtes est un monde qui fait référence à des quêtes que personne n'a écrites. |
conversion_required_family_missing | Une famille appartenant à la campagne que la conversion était censée fournir est absente. | Amenez la famille. Le catalogue indique lesquels sont requis pour une conversion, et sans eux, le monde est le jeu de base avec le nouvel art. |
conversion_unclaimed_family | Une famille pour laquelle le package fournit des fichiers et que la campagne ne revendique pas. | Réclamez la famille dans un package, ou déclarez-la retardée avec une raison. Laissée non réclamée, rien ne dit si son absence était intentionnelle. |
conversion_unknown_family | La campagne a déclaré une famille que cette build ne connaît pas. | Nommez une famille à partir du catalogue de types de contenu. Les familles s'y déclarent avant que quiconque puisse en fournir un. |
conversion_vanilla_leak | Un identifiant qui n'appartient ni à la conversion ni à l'espace de noms réservé du moteur. | Remplacez l'identifiant, le texte ou la scène que nomme le rapport. Cette conversion annule la solution de repli, donc l'alternative est pour le joueur de voir ce monde à l'intérieur de cet autre. |
dialogue_carries_expression | Un package qui essaie d'exécuter quelque chose ou d'écrire des mots sur place. | Supprimez le champ. Le niveau 1 concerne les données : ce qui s'exécute appartient au jeu et les nouvelles fonctionnalités proviennent d'un fournisseur de confiance. |
dialogue_dead_end | Une conversation dont un joueur ne peut pas sortir. | Avoir une option pointant de ce nœud vers un chemin qui arrive à son terme. Un cycle suffit ; une boucle sans issue est une conversation à laquelle le joueur ne peut pas sortir. |
dialogue_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
dialogue_orphan_node | Un nœud que rien ne peut atteindre. | Rien ne va à ce nœud, donc aucun joueur ne le lira. Demandez-lui de parier contre une option ou radiez-le. |
dialogue_over_budget | Un package sur un plafond indiqué. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
dialogue_text_not_key | Une phrase pour laquelle une clé de catalogue est nécessaire. | Déplacez la phrase vers votre catalogue de langues et placez sa clé dans le champ. Un champ se terminant par _key contient une clé ; une phrase là-dedans met votre paquet dans une seule langue pour toujours. |
dialogue_unguarded_reveal | Un secret sans rien d’avance. | Mettez au moins une condition sur le nœud. Une liste de conditions vide compte pour aucune : le secret ira à celui qui ouvre la conversation. |
dialogue_unknown_step | Un contrôle ou une commande que cette version ne fait pas ha. | Le nom n'est pas dans la liste publiée pour cette table. Choisissez-en un qui est là - la liste est courte car chaque entrée est quelque chose que cette version fait déjà. |
dialogue_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
distribution_hash_mismatch | Les fichiers sur le disque ne correspondent pas à ce que décrit l'enregistrement. | Le package sur le disque n'est pas celui qui a été publié. Téléchargez-le à nouveau : une incompatibilité est un transfert qui a mal tourné ou un fichier modifié par quelqu'un d'autre. |
distribution_invalid | L'enregistrement n'est pas celui que cette version accepterait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
distribution_offline | La provenance a été vérifié par rapport à ce qui a été enregistré lors de l'installation. | Vérifiez la connexion, puis réessayez. Les packages déjà installés continuent de fonctionner ; de nouveaux ne peuvent pas survenir avant le retour du service. |
distribution_reported | Quelqu'un l'a signalé. Le joueur est averti et décide. | Lisez le rapport et décidez. Le package fonctionne de la même manière : le rapport existe pour que la décision soit prise devant lui et non à sa place. |
distribution_revoked | Le colis est mis en quarantaine ou retiré. Il ne s'installe pas. | Retirez le paquet. Il a été retiré après publication et n'est pas téléchargé ; si vous l'avez rédigé, l'avis de révocation indique pourquoi. |
distribution_update_deferred | Une nouvelle version est disponible et une campagne est en cours sur l'ancienne. | Redémarrez pour prendre la mise à jour. L'échange d'un package dans un jeu en cours est la façon dont une sauvegarde commence à nommer des choses que personne ne fournit. |
economy_expression_refused | Un domaine qui apporterait quelque chose à évaluer. | Une entrée de prix essayait d'apporter quelque chose de précieux. Choisissez une courbe par son nom parmi les quatre que cette version implémente : un prix qui peut être exécuté est la limite de niveau 1 atteinte par l'économie. |
economy_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
economy_out_of_bounds | Un nombre en dehors de la plage indiquée. | Renvoie le nombre dans la plage déclarée. Chaque champ numérique ici en a un, et un champ sans plage déclarée est rejeté plutôt que laissé passer. |
economy_overridden | Un package remplace un record déclaré par un autre package ou le jeu de base. | Rien à réparer. Cet enregistrement a été pris par un autre package, et le rapport indique lequel, afin que vous puissiez décider si telle était l'intention. |
economy_unresolved_reference | Une recette ou un réservoir qui nomme un contenu que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
effect_carries_source | Un descripteur qui nomme un shader, une scène ou un code. | Supprimez le champ qui nomme un shader, un script ou une scène. Les effets sont composés à partir des primitives du moteur ; fournir la source, c'est fournir un programme. |
effect_degraded | Un effet réduit pour s'adapter à l'intérieur du cadre, nommé pour que la réduction ne soit pas un mystère. | Rien à réparer, sauf si vous vouliez le contraire. L'effet est passé à une qualité inférieure pour rester dans le budget cadre : il est toujours là, et il est plus petit. |
effect_dropped | Un effet qui n'était tout simplement pas là. | Vérifiez la taille indiquée dans la déclaration budgétaire, puis réduisez-la. Le cadre manquait d'espace et cet effet n'était pas du tout dessiné. |
effect_refused | Un effet que cette version ne compose pas. Le verdict dit quelle règle. | Lisez le paramètre nommé dans le rapport et signalez-le dans la plage imprimée à côté. L'effet a été rejeté avant que quoi que ce soit ne l'attire. |
extension_forbidden_field | Le manifeste contient un champ qu'aucune extension ne peut contenir, tel que le chemin d'accès à un script, un résolveur ou une importation privée. | Supprimez le champ. Le chemin d'accès à un script, un solveur, une importation privée ou une modification des paramètres du projet va au-delà du contrat dans l'invité, et une extension qui en a besoin demande une capacité au lieu de déclarer une capacité : déclarez la capacité sous requires. |
extension_foreign_namespace | L'espace de noms d'état déclaré n'est pas l'identifiant de package de l'extension, donc son état ne serait pas attribuable une fois qu'il aurait disparu. | Renommez state_namespace avec l'identifiant de package de l'extension. Le statut écrit ailleurs ne peut être attribué ou supprimé une fois le colis parti, et le client conserve son nom. |
extension_missing_field | Il manque un champ que l'invité doit installer, prendre une impression, revenir en arrière ou supprimer l'extension. | Ajoutez le champ au manifeste d’extension. Chacun d'eux est quelque chose dont l'invité a besoin avant de pouvoir commander l'extension, la mettre dans l'empreinte de la composition, revenir en arrière ou la supprimer à nouveau : une affiche manquante décrit une fonctionnalité que l'invité pourrait installer et ne jamais supprimer. |
extension_teardown_incomplete | La suppression de l'extension a rendu moins que ce qu'elle avait nécessité, ce qui la fait perdre lors de la prochaine installation au lieu de maintenant. | Renvoyez tout ce que l'extension a pris avant de déclarer un démontage complet et mettez à jour takes si le vrai nombre a changé. Renvoyer less n'échoue plus maintenant : il perd lors de la prochaine installation, et installer la même extension deux fois en une seule session est ordinaire. |
extension_unbounded | Il manque ou non un chiffre à un budget déclaré, donc rien ne pourra jamais le dépasser. | Écrivez un numéro pour chaque budget nommé dans le contrat. Un budget omis ou rédigé sous forme de phrase se lit comme indiqué et ne se compare à rien, de sorte que la prolongation ne peut jamais le dépasser. |
extension_unknown_capability | L'extension nécessite ou fournit une fonctionnalité que cette version ne publie pas. | Comparez les identifiants de compétences avec ceux publiés par cette version, et supprimez ou renommez ceux qui ne correspondent pas. Refuser avant l'installation est intentionnel : une extension qui découvrirait une capacité manquante en tournant la découvrirait devant un joueur. |
extension_would_add_autoload | Le manifeste ajouterait une variable globale. Rejeté quel que soit le niveau de confiance, car un package qui pourrait en ajouter un annulerait le retrait sur lequel cette version est construite. | Supprimez le nom de chargement automatique, singleton ou de base du manifeste. Aucun niveau de confiance ne l'accorde : toute la migration sur laquelle repose cette version consiste à retirer des variables globales, donc une extension qui pourrait en ajouter une l'annulerait de l'extérieur. Placez l'état sous l'espace de noms de l'extension et atteignez l'invité via les fonctionnalités qu'il publie. |
font_locale_fallback | Un glyphe que le personnage choisi ne porte pas, tiré du repli et rapporté. | La police que vous avez fournie ne comporte aucun glyphe pour cette langue, la solution de secours l'a donc dessinée. Apportez une police qui couvre la langue, sinon le texte est en petits carrés. |
font_refused | Un caractère que cette version n'utilise pas. Le verdict indique quelle règle. | Le fichier de police a été rejeté. Vérifiez que le format est l'un de ceux que nous téléchargeons et que le fichier ne contient aucun programme. |
image_bomb_refused | Un en-tête réclamant plus que le budget de décodage, rejeté avant qu'aucun décodeur ne le voie. | L'image se décompresse en bien plus que ce que la taille du fichier suggère. Réexportez-la à sa vraie taille : elle est rejetée avant d'être décodée, car le décoder est le mal. |
image_frame_grid | Une feuille dont la grille déclarée ne la divise pas exactement. | Les cadres de la feuille de sprite ne divisent pas exactement ses dimensions. Corrigez la grille, sinon chaque image après la première est dessinée décalée du reste. |
image_hash_mismatch | Octets modifiés après validation du descripteur. | L'image n'est pas celle déclarée. Réexporter ou redéclarer : une incompatibilité signifie que le fichier et le manifeste ne sont pas d'accord sur ce qui a été porté. |
image_placeholder_used | Une image rejetée ou manquante a été résolue dans le remplacement réservé et l'appelant a été informé. | Rien à réparer, si vous le vouliez. L'image manquait et le remplacement de son type a été dessiné, le remplacement étant marqué plutôt que laissé vide. |
image_refused | Une image que cette build ne décode pas. Le verdict dit quelle règle. | Réexportez-le dans la taille, le format et le budget indiqués dans le rapport. L'image a été rejetée avant que quoi que ce soit ne la dessine. |
inference_cancelled | Une exécution a dépassé son budget de latence et a été arrêtée. L'heuristique a répondu, l'appelant n'a donc pas eu à attendre. | Réduisez le modèle ou augmentez max_latency_usec si le budget était vraiment trop serré. L'exécution a dépassé son budget et a été arrêtée, et l'heuristique a répondu au lieu de laisser l'appelant attendre : une image passée à attendre est une image que le joueur a regardée. |
inference_digest_mismatch | Les octets du motif ne sont pas ceux enregistrés, ce qui en fait un motif différent et non plus ancien. | Mettez à jour le résumé déclaré vers le SHA-256 du modèle que vous portez, ou portez le modèle nommé par le résumé. Des octets différents signifient qu'il s'agit d'un modèle différent et il n'y a pas d'autre moyen de faire la différence. |
inference_forbidden_field | La déclaration comporte un environnement d'exécution, un script, un point de terminaison, une télémétrie ou une revendication d'autorité. | Supprimez le champ. L'adaptateur appartient au moteur, donc un package fournit les poids et jamais le code qui les exécute ; un point final placerait le modèle dans un endroit où il pourrait être modifié après examen, et la télémétrie rapporterait ce qu'un joueur a demandé. Apportez les poids et laissez le moteur le faire. |
inference_load_refused | L'instruction est correcte et cette version n'apporte aucun adaptateur d'inférence dans lequel la charger, donc l'heuristique déterministe a répondu. | Rien à corriger dans votre colis. Cette version ne contient aucun adaptateur d'inférence, donc aucun modèle de quelque format que ce soit n'est chargé et l'heuristique déterministe répond. La déclaration est de toute façon validée, donc un modèle porté aujourd'hui est un modèle qu'un adaptateur pourrait charger sans modification. |
inference_missing_field | Il manque dans une déclaration de modèle quelque chose dont l'adaptateur a besoin avant de dépenser quoi que ce soit pour une exécution. | Ajoutez le champ à la déclaration du modèle. Chacun est quelque chose dont l'adaptateur a besoin avant de dépenser quoi que ce soit pour une exécution : le résumé est l'identité du modèle, les modèles sont ce que vous lui fournissez et ce qu'il acceptera en retour, et les plates-formes sont celles où il est autorisé à être testé. |
inference_output_rejected | La réponse du modèle ne correspondait pas au modèle de sortie énoncé et a été rejetée plutôt qu'interprétée avec indulgence. | Comparez ce que le modèle renvoie avec le modèle de sortie déclaré. Une réponse presque juste est rejetée plutôt qu’interprétée avec indulgence, car une proposition qui passe sous une mauvaise forme est une proposition que chaque contrôle ultérieur considère comme valide. |
inference_unbounded | Il manque ou non un nombre à une limite indiquée, donc rien ne peut jamais la dépasser. | Écrivez un numéro pour chaque limite nommée dans le contrat. Une limite omise ou écrite en mots se lit comme indiqué et n'est comparée à rien, donc l'exécution qui ne va pas est celle que personne n'a mesurée. |
inference_unknown_format | Le format du modèle n'est pas celui implémenté par l'adaptateur moteur. | Réexporte le modèle dans l'un des formats implémentés par l'adaptateur de moteur. Un format qui n’est pas implémenté n’est pas un chemin plus lent : ce n’est rien du tout. |
inference_wrong_platform | Le modèle ne déclare pas cette plate-forme, donc l'heuristique déterministe a répondu à la place. | Rien à réparer, si on le souhaite. Le modèle ne déclare pas cette plate-forme, donc l'heuristique déterministe a répondu ici ; ajoutez la plate-forme à la déclaration uniquement lorsque le modèle y a été réellement construit et testé. |
input_binding_conflict | La clé suggérée a déjà été attribuée. L'affectation existante l'a conservé et le pourboire a été enregistré plutôt que appliqué. | Rien à réparer dans votre colis, et rien à retirer. Le bouton était déjà attribué, donc l'affectation du joueur l'a conservé et votre action est proposée sans bouton dans l'écran d'affectation. Choisissez une valeur par défaut moins encombrée si vous souhaitez qu'elle reste lors de l'installation. |
input_binding_orphaned | Une réaffectation appartient à une action qu'aucun package installé ne déclare. Conservé au lieu d'être supprimé, sa réinstallation le retrouve là où le joueur l'a laissé. | Rien à réparer. La réaffectation appartient à une action qu'aucun package installé ne déclare et est conservée plutôt que supprimée, donc la réinstallation du package retrouve le bouton là où le joueur l'a laissé. |
input_core_action | Un package nommé ou a tenté de remplacer l'une des actions de l'hôte. | Renommez l'action. Les actions de jeu appartiennent à l'hôte, et un package ne peut ni en déclarer une ni la remplacer ; prendre pause joue à un jeu dont vous ne pouvez pas sortir. Déclarez votre action à côté et laissez le joueur attribuer les deux. |
input_forbidden_field | La déclaration comporte une lecture directe de l'appareil, un auditeur, une prise de feu ou une mission que le joueur ne peut pas modifier. | Supprimez le champ. Déclarer une action est toute l'interface : lire directement un appareil, installer un écouteur, prendre feu ou forcer une mission, tout cela enlève une décision au joueur et est invisible sur chaque écran qu'il pourrait vérifier. |
input_foreign_namespace | L'identifiant de l'action ne rentre pas dans l'espace de noms du package qui le déclare. | Renommez l’ID d’action en espace de noms de votre package. La réaffectation de joueur nous est attachée, donc un identifiant qui appartient à quelqu'un d'autre est une réaffectation qui change de maître lorsqu'un des deux packages est supprimé. |
input_keyboard_unreachable | L'action n'a pas d'affectation au clavier, donc un joueur sans contrôleur ne peut pas l'atteindre. | Écrivez une affectation de clavier à côté de l’affectation du contrôleur. Une assignation avec un pad uniquement est inaccessible pour un joueur sans pad, dans un jeu qui pourrait autrement être joué sans, et pour lui, elle échoue silencieusement. |
input_missing_field | Il manque quelque chose dont l'écran d'affectation ou la réaffectation a besoin dans une instruction d'action. | Ajoutez le champ à la déclaration d'action. Chacun est quelque chose dont un écran a besoin : la touche d'étiquette est ce que la liste d'affectation affiche à la place de votre identifiant interne, et le contexte est ce qui indique au jeu quand l'action est active au lieu de la déclencher pendant que quelqu'un tape le nom d'une sauvegarde. |
input_reserved_chord | Un package a demandé une combinaison appartenant au système ou à la fenêtre. | Choisissez une autre clé. Fermer la fenêtre, quitter le jeu et la clé de plate-forme appartiennent au système d'exploitation, et un package qui en contenait une pourrait empêcher quelqu'un de quitter. |
input_unknown_context | Le contexte déclaré n'est pas celui que cette version publie, donc personne ne sait quand l'action est active. | Choisissez l'un des contextes publiés. Personne ne sait quand un titre est actif dans un contexte non publié, donc soit il ne se déclencherait jamais, soit il se déclencherait toujours, et ce n'est pas non plus ce que vous vouliez dire. |
lore_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
lore_player_state_in_definition | Un champ décrivant un joueur trouvé dans une définition. | Supprimez le champ. Un enregistrement de connaissances est une définition et ce que le joueur sait est le suivant : charger des connaissances ne confère jamais de connaissances, donc un champ qui prétend le faire serait un champ que personne ne lit. |
lore_replaced | Un package a remplacé une entrée existante, en préservant son identifiant et ses liens. | Rien à réparer. Un autre paquet a remplacé cette entrée et a conservé son identifiant, donc tout ce qui la pointait pointe toujours vers quelque chose. |
lore_unresolved_reference | Un identifiant dans Related_to, révèle ou exige que personne ne le fournisse. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
lore_verbatim_text | Texte porté à la place d'une clé de catalogue, il apparaîtrait donc dans une seule langue. | Un champ se terminant par _key contient une phrase. Déplacez-le vers votre catalogue de langues : contournez toutes les autres vérifications ici et transférez votre savoir dans une seule langue. |
map_bad_layer_data | Une couche qui ne couvre pas la carte à laquelle elle appartient. | Réexportez la couche non compressée, sans blocs et sans lignes courtes. Le sous-ensemble que nous acceptons est le sous-ensemble que nous savons contrôler. |
map_carries_path | Une carte qui nomme quelque chose à charger ou à exécuter. | Supprimez le champ qui pointe vers un fichier. Une carte nomme ses tuiles du kit ; un chemin est la façon dont un paquet sort de lui-même. |
map_duplicate_anchor | Deux objets revendiquant le même identifiant. | Deux ancres partagent un nom, donc celui auquel une chose s'attache dépend de l'ordre de lecture. Renommez-en une. |
map_invalid | La carte n'est pas celle que cette version assemblerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
map_kit_mismatch | Une carte dessinée sur un kit que cette version ne possède pas. | La carte a été écrite sur un kit différent de celui publié par cette version. Réexportez-le contre le kit actuel : les rôles et les classes ont bougé. |
map_layer_missing | Un niveau obligatoire est manquant ou mal conçu. | Ajoutez le niveau que nécessite le contrat. Le fichier de projet du kit les répertorie, et il manque une carte qui se charge avec un trou. |
map_normalization_failed | La carte n'a produit aucune forme canonique. | Supprimez la construction que le rapport nomme, puis exportez à nouveau. Sans forme canonique, vous ne pouvez pas prouver que le moteur d'exécution et le validateur hors ligne sont d'accord sur cette carte. |
map_outside_package | Un jeu de tuiles ou un modèle provenant de l'extérieur du package. | La carte pointe vers quelque chose en dehors de son propre package. Apportez-le, sinon la carte dépend de ce qui est installé. |
map_over_budget | Une carte normalisée au-delà d'une limite déclarée. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
map_unresolved_reference | Un identifiant nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
map_unsupported_subset | Quelque chose dans le fichier est en dehors du sous-ensemble du format. | Le fichier utilise une fonction Tiled à partir du sous-ensemble que cette construction lit : calques réduits, calques d'images, groupes, blocs ou polygones. Réexporter sans. |
pack_claims_host_surface | Un chargement automatique, une action de saisie ou un paramètre de projet. | Écraser le contenu au lieu du fichier. Les packages ajoutent et remplacent du contenu ; les surfaces dont le jeu lui-même a besoin pour démarrer n'en font pas partie. |
pack_collision | A affirme qu'un autre package possède déjà. | Abandonnez le fichier dans l'un des deux packages. Le rapport les nomme tous les deux, et le laisser ainsi gagnerait l’ordre de rassemblement. |
pack_mount_failed | Il n'a pas monté le moteur ; l'ensemble précédent reste valable. | Le colis n'a pas pu être assemblé du tout. Vérifiez que l'archive est intacte et dans un format lu par cette version. |
pack_replaces_vanilla | Une affirmation que le jeu de base a. | Écrasez le contenu au lieu du fichier ou demandez une fonctionnalité de remplacement fiable. Remplacer un fichier de jeu de base n'est pas quelque chose qu'un paquet de données fait. |
pack_restart_required | L’ensemble changerait, et le changement ne peut pas prendre effet dans ce processus. | Le changement ne peut pas être appliqué à un jeu en cours. Redémarrer : l'échange de contenu monté en cours de partie laisse la moitié du jeu lire les anciens fichiers. |
progress_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
progress_origin_lost | Un exploit mérité dont le paquet a disparu, conservé et nommé. | Rien à réparer. Le package qui l'a déclaré a disparu et celui que le joueur avait gagné demeure ; l'identifiant est là donc il sait ce qui le ramènerait. |
progress_over_budget | Un package sur un plafond indiqué. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
progress_reaches_outside | Un paquet essayant de faire quelque chose, ou de parler au nom de la plateforme. | Supprimez le champ. Le fait qu'un jalon atteigne la plate-forme est dérivé de son espace de noms et n'est jamais quelque chose qu'un enregistrement indique. |
progress_reserved_namespace | Un package revendiquant un espace de noms qui n'est pas le sien. | Utilisez l'espace de noms de votre package. Ceux réservés sont les nôtres, et on croirait un jalon qui ressemblait à la plate-forme. |
progress_text_not_key | Une phrase pour laquelle une clé de catalogue est nécessaire. | Déplacez la phrase vers votre catalogue de langues et placez sa clé dans le champ. Un champ se terminant par _key contient une clé ; une phrase là-dedans met votre paquet dans une seule langue pour toujours. |
progress_unknown_step | A condition ou modificateur que cette version ne fait pas ha. | Le nom n'est pas dans la liste publiée pour cette table. Choisissez-en un qui est là - la liste est courte car chaque entrée est quelque chose que cette version fait déjà. |
progress_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
provider_forbidden_capability | Un package demandait une fonctionnalité qu'aucun niveau n'accorde, comme un système de fichiers, un réseau ou un processus. | Retirez la capacité. Aucun niveau n'accorde le système de fichiers, le réseau, le processus ou l'espace de noms d'un autre package, et aucune révision ou signature ne change cela : ce qu'une build fait avec le système de fichiers n'est pas une propriété que quiconque peut contrôler en le lisant. Utilisez propose_intent pour transmettre une proposition au propriétaire canonique et write_own_namespace pour l'état qui doit survivre. |
provider_native_extension_refused | Une extension native a été trouvée. Il a la pleine autorité sur le processus avant toute décision politique, il est donc rejeté pour sa propre raison et non comme un échec de contrôle de confiance. | Supprimez l'extension du package. Le moteur charge une GDExtension avec une autorité totale sur le processus avant l'exécution de toute partie de cette politique. Elle est donc rejetée pour ce qu'elle est et non pour celui qui l'a signée, et la ratification au niveau du fournisseur ne modifiera pas cette réponse. |
provider_tier_inactive | La couche des fournisseurs de comportement n'est pas ratifiée dans cette version, donc aucun exécutable n'a été chargé. | Rien à corriger dans votre colis. Cette version n'a pas ratifié la couche Behaviour Vendors, donc un script, une scène packagée ou une extension native est rejeté, quel que soit celui qui l'a signé. Apportez le mécanisme sous forme d'enregistrements déclaratifs si l'une des familles publiées peut le transporter, et lisez les notes de version de la version qui ratifie le niveau avant d'écrire un fournisseur contre celui-ci. |
provider_unknown_capability | Un package a demandé une fonctionnalité que cette version ne publie pas. | Supprimez la capacité du manifeste ou remplacez-la par celle publiée par cette version. La liste est volontairement courte : une autorisation que personne ne publie est une autorisation sur laquelle l’hôte ne peut pas raisonner, elle est donc rejetée plutôt qu’ignorée. |
Le package provider_unknown_load_kind | A offrait quelque chose que cette version ne classe pas. Rejeté plutôt que traité comme des données, car se tromper ici revient à se tromper dans le sens de son exécution. | Comparez ce que le package proposé avec les quatre types que cette version classe : des données déclaratives, une scène packagée, un script ou une extension native. Tout le reste est rejeté plutôt que deviné, car deviner ici revient à deviner dans le sens de son exécution. |
provider_untrusted | Le package est dans un état confiant qui ne charge rien, qui est l'état dans lequel chaque package commence. | Rien à corriger dans votre package, et rien qu'un package puisse réparez-le vous-même. La confiance est attachée aux octets exacts et c'est le joueur qui la donne, installez donc le package depuis une source de son choix et laissez-le confirmer ; un résumé révoqué ne revient pas fiable pour être détecté à nouveau. |
provider_user_trust_required | Le niveau le permettrait et pas une seule personne n'a encore dit oui à ce contenu exact. | Amenez le joueur à la liste des mods et laissez-le confirmer ce package. Le niveau le permettrait, et personne n'a encore dit oui à ce contenu précis, qui est la seule étape qu'une signature ne remplace volontairement pas. |
quest_already_applied | Une commande qui avait déjà été exécutée. | Rien à réparer. La commande avait déjà été exécutée et n'a pas été répétée, et c'est ce qui empêche un rechargement de payer deux fois une récompense. |
quest_carries_expression | Un paquet qui essaie de faire quelque chose, ou de garder la réponse « une fois » pour lui-même. | Supprimez le champ. Le niveau 1 concerne les données : ce qui s'exécute appartient au jeu et les nouvelles fonctionnalités proviennent d'un fournisseur de confiance. |
quest_ending_unreachable | Une fin que personne ne peut atteindre. | La fin nécessite une mission que son arc ne contient pas. Ajoutez la mission aux étapes de l'arc, ou demandez-en une qui s'y trouve. |
quest_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
quest_nothing_applied | Un plan qui rejetait quelque chose, donc rien n’était exécuté. | Quelque chose dans l'ensemble a été rejeté, donc rien n'a été appliqué. Indiquez tout refus dans le rapport : un arc à moitié appliqué est un état que personne ne peut décrire. |
quest_over_budget | Un package sur un plafond indiqué. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
quest_text_not_key | Une phrase pour laquelle une clé de catalogue est nécessaire. | Déplacez la phrase vers votre catalogue de langues et placez sa clé dans le champ. Un champ se terminant par _key contient une clé ; une phrase là-dedans met votre paquet dans une seule langue pour toujours. |
quest_unfinishable | Une mission que personne ne peut accomplir. | Donnez à la mission au moins un objectif non optionnel, sinon elle est terminée dès son acceptation. |
quest_unknown_step | Un objectif ou une concession que cette construction n’a pas. | Le nom n'est pas dans la liste publiée pour cette table. Choisissez-en un qui est là - la liste est courte car chaque entrée est quelque chose que cette version fait déjà. |
quest_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
relationship_band_gap | Un intervalle avec une valeur qu'aucun nom de bande. | Couvrez toute la gamme de votre police, du sol au toit, sans trous ni chevauchements, en utilisant uniquement les noms de gamme publiés. Une valeur dans un trou est une valeur qu'aucun écran ne peut nommer. |
relationship_carries_behaviour_code | Un package qui tente de fournir ce qui est exécuté lorsqu'un rapport est modifié. | Supprimez le champ. Le niveau 1 concerne les données : ce qui s'exécute appartient au jeu et les nouvelles fonctionnalités proviennent d'un fournisseur de confiance. |
relationship_declares_live_state | Un paquet qui tente de dire où en est actuellement une relation. | Déclarez plutôt la valeur initiale. La situation actuelle d’une relation est une question de temps d’exécution, et c’est le joueur qui l’a déplacée. |
relationship_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
relationship_leave_unreachable | Un compagnon qui ne peut jamais partir, ou qui part immédiatement. | Déplacez le seuil d’abandon dans la plage de stratégie. Au sol, vous ne pouvez jamais perdre votre partenaire ; il monte sur le toit le premier soir. |
relationship_origin_lost | Le paquet qui déclarait une obligation a disparu et la valeur évoluée demeure. | Rien à réparer. Le package qui l'a déclaré a disparu et celui que le joueur avait gagné demeure ; l'identifiant est là donc il sait ce qui le ramènerait. |
relationship_pair_collision | Un couple bien rangé déclaré à deux reprises, reparti sans aucun lien. | Deux enregistrements revendiquent la même paire ordonnée. Supprimez-en un : conserver les deux ferait gagner le pack chargé en premier. |
relationship_unknown_relation | Un type de relation ou de parcours de recrutement que ce build n'a pas. | Choisissez une relation dans la liste publiée. Celui que cette version n'a pas serait réduit à néant et l'histoire que vous avez écrite ne se produirait pas. |
relationship_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
resolution_cache_invalidated | Articles abandonnés car leur fournisseur n'est plus actif. | Rien à réparer. La composition a changé, donc la résolution des identifiants a été recalculée au lieu d'être réutilisée. |
resolution_missing | Personne ne fournit l'identifiant et il n'y a rien sur quoi s'appuyer. | Réinstallez le package qui a fourni l'identifiant ou corrigez l'identifiant. Le journal le conserve afin que vous puissiez comprendre laquelle des deux choses s'est produite. |
resolution_over_budget | A package ou processus sur un budget indiqué. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
resolution_refused | A demande que cette version ne ago. | Lisez la règle selon laquelle le rapport nomme et modifiez l'identifiant en quelque chose que l'endroit accepte. |
resolution_restart_required | Un changement de profil dont les anciens octets ne peuvent pas être téléchargés. | Celui qui résout cet identifiant est remplacé par un afin qu'un en cours d'exécution le jeu ne peut pas suivre. Redémarrez pour l'obtenir. |
resolution_tombstoned | Un identifiant connu qu'un package a supprimé. | Réinstallez le package pour ramener la pierre tombale au vrai contenu. L'identifiant est résolu en sa pierre tombale au lieu de rien, c'est exactement pourquoi la réinstallation rend le joueur à ses affaires. |
save_campaign_absent | La campagne sous laquelle la sauvegarde a été effectuée n'est pas installée. | Installez la campagne sous laquelle la sauvegarde a été effectuée. La sauvegarde n'est pas ouverte contre une autre, car ce serait silencieusement un autre monde. |
save_composition_matches | Rien de ce que la sauvegarde avait enregistré n'a bougé. | Rien à corriger. Les packages avec lesquels cette sauvegarde a été effectuée sont les packages installés. |
save_content_absent | Content que les noms de sauvegarde ne sont pas installés. Signalé, non fatal. | Réinstallez les packages répertoriés dans le rapport. Les identifiants restent dans la sauvegarde, donc celui qui n'a plus de réponse en a un. |
save_orphan_state_carried | State sans aucun propriétaire installé, a continué sans être exécuté. | Réinstallez le package pour que cet état ait à nouveau un sens. Il a été conservé plutôt que supprimé, précisément pour que cela fonctionne. |
save_provider_contract_moved | Une capacité sur laquelle s’appuyait le sauvetage répond désormais à un contrat différent. | Vérifiez si le rapport indique migré, ignoré ou rejeté. La version du contrat d'un fournisseur a changé entre la sauvegarde et maintenant, et ce sont les trois réponses. |
save_write_beside_original | La session a écrit un nouveau fichier et a laissé l'original seul. | Rien à réparer. La sauvegarde récupérée a été écrite à côté de l'original plutôt qu'en haut - le mode sans échec n'écrase jamais le fichier qu'il n'a pas réussi à ouvrir. |
selection_campaign_missing | La campagne demandée n'est pas installée et rien n'a été composé à sa place. | Installez le package qui fournit l'identifiant de campagne dans le message ou démarrez une autre campagne. L'identifiant est ce qui a été demandé, écrit comme il a été demandé, alors comparez-le à l'identifiant dans le fichier Campaign.json du package. Rien n'a été chargé à sa place : démarrer le jeu de base vous donnerait un monde différent sous le nom que vous avez écrit. |
selection_made | Une campagne a été sélectionnée, avec la raison pour laquelle elle l'a été. | Rien à réparer. C'est la ligne qui dit de quel monde il s'agit et pourquoi il a été choisi, et elle vaut la peine d'être lue lorsque le monde n'est pas celui auquel vous vous attendiez : la raison vous dit s'il a été demandé, relancé ou le seul installé. |
selection_safe_mode | Des paquets ont été laissés de côté, soit après un échec de démarrage, soit parce que le joueur l'avait demandé. | Lisez la raison avant de changer quelque chose. player_asked signifie que vous l'avez choisi et qu'il n'y a rien de mal à cela. boot_failed signifie que la campagne n'a pas pu démarrer plusieurs fois : désactivez les mods les plus récemment installés, démarrez-les une fois et remettez-les un à la fois. En mode sans échec, aucun paquet n'est composé, donc une correspondance qui fonctionne ici indique que la faille est dans un paquet. |
selection_save_preserved | Une sauvegarde récupérée a été écrite à côté de l’original plutôt qu’au-dessus. | Rien à réparer et ne supprimez pas le deuxième fichier. Recovery a écrit son résultat à côté de votre sauvegarde plutôt qu'au-dessus, de sorte que le message nomme les deux chemins : l'original est celui sans le suffixe .recovered, et il est toujours exactement tel qu'il était. |
setting_invalid | La déclaration n’est pas celle que cette version tirerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
setting_migrated | Une valeur est arrivée sous une ancienne clé et a été portée vers la clé actuelle. | Rien à réparer. Le paramètre a changé pour prendre sa forme actuelle et l'ancienne valeur a été remplacée. |
setting_owner_missing | Une valeur stockée appartient à un package qui n'est pas installé. Préservé, non appliqué. | Nommez un propriétaire déclaré pour le paramètre. Celui que cette version n'a pas est un paramètre que personne ne lirait jamais. |
setting_restart_required | La valeur a changé et ne peut prendre effet qu'au prochain démarrage. | Redémarrez pour l'appliquer. Le paramètre ne peut pas changer pendant l'exécution du jeu. |
setting_secret_withheld | Un secret a été exclu d'une sauvegarde ou d'un journal. | Rien à corriger. Une valeur marquée comme secrète a été exclue du rapport, c'est pourquoi le rapport peut être collé dans un fil de discussion de bug. |
setting_value_refused | Une valeur en dehors de ce que la déclaration autorise. Au lieu de cela, la valeur par défaut répond. | Renvoyez la valeur dans la plage imprimée à côté ou choisissez-en une dans la liste publiée. Le rapport montre les deux. |
settlement_building_unresolved | Un bâtiment sauvé dont le paquet a disparu, nommé plutôt que remplacé. | Réinstallez le package mentionné dans le message pour récupérer le bâtiment, ou laissez-le tranquille : rien n'a été perdu. Le bâtiment est toujours dans la sauvegarde sous son identifiant et n'a délibérément pas été remplacé par le bâtiment le plus proche de cette construction, ce qui aurait mis les biens de quelqu'un d'autre dans une forge que vous n'avez jamais construite. |
settlement_carries_path | Un enregistrement qui nomme une scène, un scénario ou un lieu qui lui est propre. | Supprimez le champ et nommez un identifiant à la place. Un intérieur est l'identité d'un enregistrement intérieur, jamais le chemin d'une scène, et un bâtiment est placé en nommant un objet sur la carte plutôt qu'en portant ses propres coordonnées. Les champs de localisation sont rejetés pour cette deuxième raison : un enregistrement qui contient une coordonnée est un enregistrement qui peut finir on ne sait où lorsque sa carte n'est plus là. |
settlement_invalid | Un enregistrement de règlement que cette version ne charge pas. | Lisez le verdict à côté du code et corrigez l'enregistrement qu'il nomme. Les causes habituelles sont un champ obligatoire omis, un identifiant sans l'espace de noms de votre package devant et un champ qui appartient à l'un des cinq autres types d'enregistrement. |
settlement_loot_table_absent | Un conteneur dont la table de butin a disparu avec son paquet, il est donc vide plutôt que tiré d'un autre. | Réinstallez le package qui a fourni la table de butin si vous souhaitez que le conteneur se remplisse à nouveau. Il est vide plutôt que tiré d'une autre table, car tirer délivrerait les choses d'un autre monde sous le nom de celui-ci. |
settlement_over_budget | Plus de bâtiments ou de services qu'une colonie ne peut contenir. | Retirez une partie de ce que comptait le message ou divisez la colonie en deux. Le nombre et le plafond sont tous deux dans le message, la différence est donc le nombre de messages qui doivent sortir. |
settlement_text_not_key | Un champ affiché à l'écran qui contient une phrase au lieu d'une clé de catalogue. | Remplacez la phrase par une clé de catalogue et placez la phrase dans votre table de langues. Un nom écrit dans l'enregistrement ne peut pas être traduit et est affiché en anglais dans toutes les langues. |
settlement_unreachable_service | Un service offert à une ancre que la carte ne déclare pas. | Ajoutez l'ancre au niveau des ancres de la carte avec l'identifiant que le service nomme, ou renommez le service avec quelqu'un qui est présent. L'enregistrement et la carte sont chacun légitimes en soi, et le résultat est un compteur sur lequel personne ne peut se tenir. |
settlement_unresolved_reference | Un enregistrement qui nomme quelque chose que personne ne fournit. | Ajoutez l'enregistrement nommé à votre package ou corrigez l'identifiant. Le message nomme à la fois l'enregistrement vers lequel il pointe et l'identifiant vers lequel il pointe, puis le compare aux identifiants que vous avez déclarés. |
society_dimension_leak | Une dimension de l’identité en mène à une autre. | Supprimez le champ nommant l’autre dimension. Une culture n’a pas de champ de foi : la dérivation doit être impossible à écrire et pas simplement déconseillée, afin que rien ne puisse donner à une faction une foi que personne n’a écrite. |
society_heraldry_path | Un signe qui nomme un dossier au lieu d'une raison. | Un insigne héraldique nommé a. Nommez plutôt une raison : un panneau est choisi parmi ceux que conçoit ce bâtiment. |
society_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
society_mutation_in_definition | Une définition qui vous demande de faire quelque chose. | Supprimez le champ. Les adaptateurs de définition décrivent ; ils n'ont aucune autorité pour changer ce qu'ils décrivent. |
society_relationship_collision | La même paire commandée déclarée deux fois. | Une paire ordonnée a été déclarée deux fois, donc la paire n'a pas de position. Supprimez-en un - conserver les deux ferait dépendre le monde du dernier package chargé. |
society_relationship_one_sided | Une position dont personne n’a déclaré le contraire ; le contraire est la valeur par défaut. | Rien à réparer, si vous le vouliez. Une seule direction de cette paire est déclarée, et l'opposée non déclarée est la direction par défaut : une faction ne sachant pas qu'elle a un ennemi est une prémisse, et cette ligne est ici pour être une prémisse choisie. |
society_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
state_namespace_ignored | Le package ne lit plus cet état. | Déclarez l'espace de noms ou supprimez l'état. Il s'agissait d'une mesure que personne ne revendique et qui a été laissée de côté plutôt que appliquée. |
state_namespace_malformed | Un espace de noms dans la sauvegarde n'est pas un nom que cette version accepterait. | Écrivez un espace de noms qui identifie sans ambiguïté un package. Tout ce qui est dans un sauvetage est suspendu en dessous, donc une forme que nous ne savons pas comment résoudre est que personne ne peut alors réclamer. |
state_namespace_orphaned | Aucun package installé n'a cet état et n'a été avancé. | Réinstallez le package pour restaurer son état. L'espace de noms appartient à un espace qui a disparu et l'état a été conservé plutôt que supprimé. |
state_namespace_rejected | Le package a rejeté son état enregistré pour cette session. | Le package a tenté d'écrire hors de l'espace de noms qu'il possède. Écrivez le vôtre : l'état d'un autre package ne vous appartient pas. |
state_namespace_reserved | Un package a revendiqué un espace de noms qui appartient à l'invité. | L'espace de noms est l'un de ceux de l'invité. Obtenez celui de votre package. |
state_schema_future | A été écrit par une version de package plus récente que cette version. | Mettez à jour le package. L'état enregistré a été écrit par une version plus récente que celle installée, et nous ne pensons pas ramener un état. |
state_schema_migrated | Etat le plus ancien de la construction, remis au colis pour report. | Rien à réparer. Un état plus ancien a été amené à sa forme actuelle par la migration du package lui-même. |
state_schema_too_old | Etat plus ancien que le sol que le colis prétend pouvoir lire. | Voyez quelle réponse le rapport indique que le package a choisi. L'état est plus ancien que la forme la plus ancienne à partir de laquelle le paquet migre, il décide donc quoi en faire. |
state_write_outside_namespace | L'écrivain s'est adressé à un espace de noms qui n'est pas le sien. | Écrivez dans votre espace de noms. Un package changeant l'état d'un autre est la façon dont une sauvegarde cesse d'appartenir à quelqu'un. |
strategic_carries_policy | Un package qui tente de fournir la règle elle-même. | Supprimez le champ. Le niveau 1 concerne les données : ce qui s'exécute appartient au jeu et les nouvelles fonctionnalités proviennent d'un fournisseur de confiance. |
strategic_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
strategic_over_budget | Un package sur un plafond indiqué. | Le rapport imprime ce qui a été mesuré ainsi que ce qui a été autorisé. Divisez l'enregistrement ou supprimez les entrées au-delà de la ligne : le plafond est ce qu'un écran ou un lecteur peut contenir, pas une suggestion. |
strategic_text_not_key | Une phrase pour laquelle une clé de catalogue est nécessaire. | Déplacez la phrase vers votre catalogue de langues et placez sa clé dans le champ. Un champ se terminant par _key contient une clé ; une phrase là-dedans met votre paquet dans une seule langue pour toujours. |
strategic_unknown_term | Une considération, une intention ou une classe que ce build n'a pas. | Le mot ne figure pas dans la liste publiée pour ce champ. Choisissez-en un qui existe : sous un mot que nous n'avons pas, rien ne répondrait. |
strategic_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
strategic_weightless | Un planificateur qui déciderait toujours de la même manière. | Donnez à au moins une considération un poids différent de zéro. Les poids tous à zéro donnent le même score à chaque option et choisissent toujours la première par ordre alphabétique. |
theme_carries_executable | Thème qui nomme une scène, un script ou un chemin d'accès à un élément. | Supprimez le champ. Un thème décrit la façon dont vous voyez les choses ; un script à l'intérieur d'un thème est un programme qui s'exécute derrière chaque écran. |
theme_contrast_too_low | Une paire de couleurs en dessous du rapport de contraste minimum. | Déplacez le premier plan ou l'arrière-plan jusqu'à ce que le rapport dépasse le minimum imprimé à côté. C'est la seule règle de thème qu'un joueur entend directement. |
theme_refused | Un thème que cette version n'enregistre pas. | Lisez la propriété que le rapport nomme et entrez-la dans celle qui permet. |
tombstone_blocks_campaign | La famille déclarée sans laquelle la campagne ne se chargera pas. | Cette famille est un transporteur et son package a disparu, donc la campagne ne démarre pas. Réinstallez-le : partir sans lui signifierait qu'il manquerait au monde quelque chose dont on fait référence partout. |
tombstone_placeholder_substituted | Un substitut appartenant au moteur répond à sa place. | Réinstallez le package pour récupérer le contenu réel. Le rapport indique quel substitut a été utilisé entre-temps. |
tombstone_recorded | Un identifiant dont le paquet a disparu a été enregistré au lieu d'être supprimé. | Rien à réparer. Un paquet a disparu et ses identifiants sont laissés dans la sauvegarde, ce qui est la seule raison pour laquelle sa réinstallation redonne au joueur ses éléments. |
tombstone_reinstall_recovered | Le colis est revenu et la pierre tombale s'est à nouveau transformée en contenu réel. | Rien à réparer. Le package est de retour et ses pierres tombales se transforment à nouveau en contenu réel. |
tombstone_unresolved_reference | Quelque chose dans la sauvegarde indique toujours un identifiant réduit à une pierre tombale. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
unit_carries_behaviour_code | Un package qui essaie de fournir un certain comportement. | Supprimez le champ. Le niveau 1 concerne les données : ce qui s'exécute appartient au jeu et les nouvelles fonctionnalités proviennent d'un fournisseur de confiance. |
unit_incomplete_for_category | Une unité qui ne répond pas aux exigences de sa catégorie. | Ajoutez la pièce requise par la catégorie. Le tableau des catégories les répertorie : un compagnon a besoin d'équipement, une troupe a besoin de comportement et un chef ne s'appuie jamais sur un seul. |
unit_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
unit_unknown_behaviour | Un profil de comportement que cette version n'a pas. | Choisissez un profil de comportement dans la liste publiée. Celui que cette version n'a pas est rejeté plutôt que remplacé par un défaut, car un boss qui est tranquillement devenu un vagabond est un combat qui n'a pas lieu. |
unit_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
unit_visual_missing | Un aspect a été résolu dans son remplacement. | L'aspect que vous avez mentionné n'est pas fourni, donc un substitut de ce type a été utilisé. Apportez la ressource ou pointez vers une ressource qui existe. |
world_calendar_inconsistent | Un calendrier ou une fête qui ne peut pas avoir lieu. | Placez le couple mentionné dans le rapport. Les saisons, les mois et les jours fériés doivent correspondre, et celui qui ne concorde pas est un calendrier que le monde lit de deux manières. |
world_carries_clock_control | Un forfait qui fournit son propre temps. | Supprimez le champ. Un paquet déclare combien vaut une saison et ne peut pas faire bouger l'horloge : l'horloge canon n'a qu'un seul propriétaire. |
world_carries_randomness | Un package qui offre son propre caractère aléatoire. | Supprimez la graine et nommez plutôt un flux. La graine du match appartient à l'hôte et le flux en découle, donc un paquet transportant sa propre graine est un monde qui ignore le match dans lequel il se trouve. |
world_invalid | L'enregistrement n'est pas celui que cette version chargerait. | Lisez le verdict à côté du code. Nommez la règle que le record a enfreinte, et chacun est un champ à supprimer, un champ à ajouter ou un mot à modifier. |
world_unresolved_reference | Un enregistrement nommé que personne ne fournit. | L'identifiant nommé est celui que rien dans la composition ne fournit. Soit vous transportez l'enregistrement vers lequel il pointe, soit vous dépendez du package qui le transporte. |
Limites, sauvegardes, partage
Ce qu'un mod ne pourra jamais faire
Rejeté par le build, pas découragé.
| Pas de code | Scripts, extensions, exécutables, fichiers shell — n'importe où dans votre package. |
| Aucune scène ou fichier de ressources | Un enregistrement pointant vers un tel fichier est rejeté même si le fichier n'est pas là. |
| Pas d'assombrissement des fichiers de base | Un mod ajoute et modifie des enregistrements ; il ne peut pas remplacer les fichiers du jeu. |
| Pas de nouveauté | Un nouveau privilège oui, un nouveau type de privilège non. |
| Aucune commande, chargement automatique ou paramètre de projet | Pas accessible du tout. |
| Aucune annulation réelle | remove supprime un enregistrement de la circulation et le laisse résoluble. Seul vendor_inventories en enlève un. |
La liste exacte, pourquoi un refus le mentionne :
- Un fichier d'enregistrement peut faire 4 Mo, contenir 4 096 enregistrements et imbriquer 16 niveaux. Le plus grand catalogue fourni par le jeu en contient quelques centaines, donc un fichier qui déclenche l'une de ces limites est plutôt mal formé qu'ambitieux.
- Fichiers que votre package ne peut contenir du tout, nulle part :
.bat,.cmd,.dll,.dylib,.exe,.gd,.gdc,.gde,.gdextension,.ps1,.sh,.so,.vbs. Chacun d'eux est un comportement : un script, une bibliothèque native ou quelque chose que l'hôte exécuterait. - Extensions vers lesquelles un enregistrement ne peut pas pointer :
.bat,.cmd,.dll,.dylib,.exe,.gd,.gdc,.gde,.gdextension,.ps1,.res,.scn,.sh,.so,.tres,.tscn,.vbs. Il s'agit de la liste ci-dessus plus des scènes et des ressources, car un enregistrement en nommant une demande au jeu de la construire. - Clés rejetées quoi qu'elles contiennent :
resource_local_to_scene,resource_path,scene,scene_path,script. - Chemins rejetés partout où ils apparaissent : tout ce qui commence par
res://ouuser://. Un enregistrement dirige le contenu dans son propre paquet.
Size a également des plafonds, par paquet et pour chacun d'eux, et dépasser un n'est pas toujours un rejet :
- ok En dessous de la limite. Rien n'est signalé.
- warn Au-delà du seuil logiciel et chargé quand même. Ceux qui créent sont prévenus ; le lecteur n'est pas arrêté.
- degrade Dépassement de la limite d'une taille que l'hôte peut réduire au lieu de rejeter. Il porte le nom sur lequel il est basé, car un jeu qui se déroule différemment en silence est pire qu'un jeu qui dit pourquoi.
- reject Franchir la ligne sur une dimension qui n'a pas de version plus petite d'elle-même. Le package ne se charge pas et est nommé.
| Taille | Un package | Tous | S'il réussit |
|---|---|---|---|
records | 20 000 | 120 000 | reject |
decoded_image_bytes | 256 Mo | 1 Go | reject |
decoded_audio_bytes | 128 Mo | 512 Mo | reject |
map_cells | 4 194 304 | 8 388 608 | reject |
map_objects | 65 536 | 262 144 | reject |
effect_instances | 4 096 | 16 384 | degrade |
provider_frame_usec | 2 000 | 8 000 | degrade |
worker_tasks | 8 | 32 | reject |
queue_depth | 512 | 2 048 | degrade |
teardown_msec | 100 | 400 | warn |
Une refonte générale obtient le double de ces chiffres, et une conversion totale quadruple ces chiffres. Quatre fois, pas illimité : une limite qu'un package peut déclarer n'est pas une limite.
Seule la ligne de retrait se déplace. Une famille accepte un remove lorsqu'elle parvient à livrer l'enregistrement en cours de retrait au chargeur ; aujourd'hui, deux le font. Tout le reste sur cette table est permanent.
Aucune couche de script n'est à venir. Le manifeste contient un type de package qui transmet le comportement au lieu des données : la seule chose qui pourrait autoriser son exécution le rejette, il n'y a pas de bac à sable derrière lui et un package qui le déclare est rejeté aujourd'hui. Conception pour les données.
Lire « données » au sens large. Les chiffres sont des données. L’équilibrage est une donnée. Ce que fait une arme, combien coûte une blessure, combien se vend une marchandise, comment une faction pèse une décision : tout cela est à vous. Ce qui n'est pas des données, c'est une mécanique que le jeu n'a jamais eue : c'est du code que quelqu'un écrit et teste. Si votre idée en a besoin, c'est un jeu différent et non un mod.
Enregistre
Vos identifiants se retrouvent dans le fichier de sauvegarde du joueur. Un identifiant publié est une promesse.
| Règle | Pourquoi |
|---|---|
| Ne renommez jamais un identifiant | Tous les secours qui l'ont utilisé restent bloqués. Ajoutez-en un nouveau et laissez l’ancien tranquille. |
| La désinstallation ne supprime jamais les éléments d'un joueur | L'enregistrement conserve les identifiants qu'il ne peut pas résoudre et les signale, donc la réinstallation renvoie le coffre-fort. |
Augmentez version chaque fois que vous modifiez quelque chose | C'est la chose qu'un joueur peut voir. |
Chaque manière dont un ensemble de packages peut différer de celui sous lequel il a été enregistré a un nom, et chaque nom décide d'une chose : si la session peut écrire dans ce fichier.
| Verdict | Il peut écrire votre sauvegarde | Qu'est-ce que ça veut dire |
|---|---|---|
compatible | Oui | La composition correspond à celle au titre de laquelle l'épargne a été réalisée. |
degraded | Oui | Compris, avec certains contenus nommés absents. Le jeu continue et l'absence est signalée. |
incompatible | Non, le fichier est laissé seul | La session ne peut pas honorer ce que dit la sauvegarde. Le fichier d'origine est laissé seul. |
| Qu'est-ce qui est différent | Verdict | Qu'est-ce que ça veut dire |
|---|---|---|
identical_composition | compatible | Mêmes packages, mêmes versions, même composition. |
mod_added | compatible | A package dont le sauveteur n'a jamais eu connaissance. Rien de ce qu'il a enregistré n'a bougé. Le package |
mod_missing | degraded | A dont la sauvegarde nommée n'est pas installée. Ses identifiants sont toujours dans le fichier et y restent. Le package |
mod_upgraded_compatible | degraded | A a changé tout en restant dans la compatibilité qu'il revendique. Signalé, car un hachage modifié est une réponse modifiée même s'il s'agit d'une réponse légitime. |
provider_contract_incompatible | incompatible | Une capacité sur laquelle comptait le sauvetage répond à travers un fournisseur dont le contrat a déménagé. Avancer serait deviner ce que cela signifie. |
conversion_missing | incompatible | La campagne elle-même est absente. Chaque identifiant du fichier appartient à un monde qui n'est pas installé. |
safe_mode_disabled | degraded | La session a démarré avec les packages volontairement désactivés. La sauvegarde est lisible et son contenu modifié est absent par choix. |
orphan_state_preserved | degraded | L'état dont le paquet est parti passe intact. Conservé, jamais exécuté. |
Lisez deux fois la ligne incompatible : la sauvegarde originale est laissée seule. Un fichier écrasé par une session qui ne l'a pas compris est une partie perdue, et un joueur qui en perd une à cause d'un mod n'en installe pas une autre.
Chaque package chargé reçoit une empreinte : la même chose est exécutée pour la même manifeste et contenu, différents lorsque le fichier de contenu change. Le résumé de l'ensemble composite inclut également l'ID, la version, l'ordre de chargement et le résumé du contenu de chaque package, de sorte que les mêmes packages dans un ordre différent ne peuvent pas prétendre avoir la même composition. modding_fingerprint_report imprime ces valeurs et enregistre le schéma v56 enregistre la liste des empreintes digitales actives afin qu'un chargement ultérieur puisse vous alerter d'un package manquant ou modifié. Augmenter votre version est toujours nécessaire car c'est la valeur qu'un joueur peut voir et comparer avant l'installation.
Partagez-le
Compressez le dossier dans un zip. Le format de distribution est tout ici. Il n'y a pas de catalogue dans le jeu ; mettez-le sur Nexus Mods.
| Étape | Quoi |
|---|---|
| Vérifier | Le validateur propre, avec --strict, avant le téléchargement. |
| Fermeture éclair | Le dossier lui-même, donc l'archive contient my_mod/mod.json. |
| Version | Lift version dans mod.json à chaque chargement. |
| Exigences | Listez également votre dependencies sur le Nexus. |
| Dites | Quelles familles vous touchez et quels identifiants vous écrasez avec override. |
Ne changez jamais le id de votre package. C'est l'espace de noms qui porte chacun de vos identifiants, celui qu'un autre package nomme comme dépendance, et ce qu'un sauvetage met par écrit. Le renommer fait croire à chaque sauvegarde existante que votre package a été désinstallé et qu'un autre est apparu à côté. Au lieu de cela, modifiez le name.
affiché. Dites aux gens deux choses et vous économiserez plus d'appels à l'assistance qu'avec n'importe quel autre : le game_version sur lequel vous avez construit, et si vous avez mis canon_safe.
. La version à écrire aujourd'hui est 0.0.0-dev. C'est celui auquel cette version répond et c'est celui que tous les exemples sur cette page indiquent, et c'est un nombre unique au lieu d'une plage : quand le jeu sortira, il changera ici en premier.
Les archives ont des limites, décidées par l'en-tête plutôt qu'après l'extraction :
- Maximum 4 096 entrées, aucune ne dépassant 16 Mo et 128 Mo extraits au total.
- Un nom peut contenir 200 caractères et contenir 8 dossiers de profondeur.
- Rien ne peut prétendre s'étendre plus de 200 fois, ce qu'aucun contenu honnête n'atteint : le texte en compresse une quinzaine. Quelques kilo-octets extraits en gigaoctets sont l'attaque pour laquelle ce numéro existe.
- Une entrée qui n'est pas un simple fichier ou dossier est rejetée : lien symbolique, lien physique, périphérique, fifo, socket. Ce qui compte, c'est le lien symbolique, car son nom peut être tout à fait ordinaire et il est suivi d'écrire là où il pointe.
- Une archive au sein de votre archive est rejetée au lieu d'être mesurée (
.7z,.bz2,.gz,.pck,.rar,.tar,.xz,.zip). L'extérieur déclare jusqu'où ses voix s'étendent ; Je ne peux pas dire dans quelle mesure ceux d'un magasin interne s'étendent.
Aujourd'hui, il n'y a pas de magasin dans lequel publier, et voici la forme de ce qui sera là. La distribution est maintenant le zip et la page Nexus ci-dessus : rien de ce qui suit n'est un champ que vous remplissez pour un téléchargement que vous pouvez faire cette semaine. C'est ici parce que les champs sont déjà déclarés dans la construction, donc un itinéraire vers un magasin consiste à les relier plutôt qu'à les inventer, et parce qu'un package écrit aujourd'hui n'aura pas besoin d'être réécrit pour voyager de cette façon.
Un package voyageant dans un magasin transporte plus de choses que le dossier n'en contient :
| What porte | Champs |
|---|---|
| Qui est | stable_id, version |
| D'où ça vient | author, license, source_url, package_hash |
| Qu'en dit un magasin | content_rating, content_warnings, revocation_status |
| Comment il a été livré | store, store_id, subscription_id |
| État | Il installe | Qu'est-ce que ça veut dire |
|---|---|---|
none | Oui | Rien n'a été signalé. |
reported | Oui | Quelqu'un l'a signalé et rien n'a été décidé. Le joueur est averti et choisit. |
quarantined | Non | Tenu en attente d'une décision. Il ne s'installe pas et ce qui est déjà installé n'est pas supprimé. |
revoked | Non | Retired. Il ne s'installe pas et une copie installée est désactivée plutôt que supprimée, car les sauvegardes du joueur nomment toujours son contenu. |
Les deux états qui bloquent une installation ne suppriment toujours rien.
Ce qu'une nouvelle version peut faire à votre package
game_version n'est pas un ornement. Le jeu compare ce que vous avez construit avec ce qu'il est :
| Verdict | Ce que cela signifie pour vous |
|---|---|
supported | La version que vous avez nommée est celle-ci, ou assez proche. Rien à faire. |
older_build | Vous avez construit sur un jeu plus ancien. Ça charge quand même, et la surprise éventuelle viendrait de ce qui a bougé entre-temps. |
newer_build | Vous avez construit un jeu plus récent que celui que vous utilisez. Le package est nommé ainsi plutôt qu'à moitié chargé dans l'espoir que tout ce qu'il utilise existe déjà. |
unreadable | Le game_version que vous avez écrit n'est pas une version. Il s'agit toujours d'une faute de frappe. |
Ce que vous faites dépend de ce qui a été déplacé :
| Classe | Qu'est-ce que ça veut dire | Ce que le jeu vous doit |
|---|---|---|
| inchangé | Rien qu'un package puisse observer n'a déplacé. | aucun |
| additif | Quelque chose de nouveau existe et tout ce qui était là signifie toujours ce qu'il signifiait. | une augmentation plus faible |
| rupture | Un paquet écrit sur l'ancienne surface peut désormais être incorrect sans avoir été modifié. | une augmentation plus importante |
Un changement compte comme un abandon pour l'une des raisons suivantes : field_removed, default_changed, type_changed, constraint_changed, required_added, operation_removed, root_changed, format_changed, id_field_changed, catalogue_changed, family_removed, contract_major_changed_without_new_id. default_changed est celui qui semble additif et ne l'est pas. Un champ dont les mouvements par défaut réécrivent le comportement de chaque paquet qui ne l'a jamais mentionné et aucun de ses auteurs n'a rien changé. constraint_changed couvre les limites et les énumérations, tandis que les modifications de racine, de format, d'identifiant, d'autres métadonnées de catalogue et de suppression de famille modifient où et si un package peut être lu.
Un nom qui va disparaître est obsolète avant d'être supprimé et continue de fonctionner pendant au moins 2 versions mineures après la version qui l'a rendu obsolète.
La politique, en quatre phrases
Celui qui décide de consacrer ou non une centaine d’heures à un package ne se pose en réalité qu’une seule question : que leur arrive-t-il lorsque le jeu est mis à jour. Voici la réponse, avant d'avoir une liste à lire.
| Demande | Réponse |
|---|---|
| Mon colis va-t-il quand même se charger ? | Oui, à moins qu'une version ne soit répertoriée ci-dessous comme étant en rupture et qu'aucune version ne soit en rupture sans y apparaître au préalable. |
| Les sauvegardes des joueurs survivront-elles ? | Oui. Une session qui ne comprend pas une sauvegarde refuse d'y écrire au lieu de l'écraser, et une sauvegarde conserve les identifiants qu'elle ne peut pas résoudre au lieu de supprimer des éléments. Enregistre. |
| Quel est le délai de préavis que je reçois ? | Un nom est obsolète avant d'être supprimé et continue de fonctionner pendant au moins deux versions mineures après la version qui l'a rendu obsolète. |
| Comment le saurai-je ? | La ligne apparaît dans le tableau ci-dessous, avec ce qui a été déplacé et ce qui a changé, avant la version à laquelle elle appartient. |
Des versions qui cassent des packages
| Libérer | Date | Qu'est-ce qui casse | Ce qu'il faut faire |
|---|---|---|---|
| — | — | Toujours rien. Aucune version n'a cassé un paquet. | — |
Le tableau est vide et n'est pas un espace réservé. Il existe maintenant pour que la première ligne ait un endroit où atterrir et pour que la promesse ci-dessus soit écrite avant d'être testée plutôt qu'après. Une ligne ici nomme la version, le jour de sa sortie, la forme exacte sous laquelle elle a cessé d'être acceptée et la modification qui corrige un paquet – et non les « modifications diverses ».
Le travail entrant qui pourrait casser quelque chose est placé dans la même table, marqué comme arrivant, avant de sortir.
Si le jeu ne démarre pas
Un profil qui ne parvient pas à démarrer est réessayé un nombre limité de fois, puis le jeu propose un moyen de revenir en arrière au lieu d'essayer sans fin.
Un profil est réessayé 3 fois. Après cela, le jeu arrête de réessayer et propose l'une de ces tentatives à la place.
- retry En dessous de la limite de nouvelle tentative. Le même profil est réessayé.
- last_known_good Un profil qui a été lancé dans le passé est proposé. Rien n'est désinstallé.
- safe_mode Aucun package n'est chargé pour une session. Le profil reste intact et revient lorsque le joueur le demande.
Où il a échoué vous indique quoi regarder :
| Où il a échoué | A quoi tip |
|---|---|
discovery | Lisez ce qui est installé. Un échec ici est généralement un package mal formé. |
provider_start | Démarrez celui que la composition a sélectionné. Un échec désigne ici une compétence. |
first_scene | La première scène que le joueur verrait. Un échec ici est un contenu, pas un câblage. |
Rien de tout cela ne désinstalle votre package ni ne modifie vos fichiers. Le mode sans échec est une session sans package chargé et votre profil vous attend lorsque vous le demandez.
Une conversion totale
Il ne s'agit pas encore d'un chemin publié pour les créateurs. La version comprend le manifeste et apporte avec elle le luminaire Ashen Reach ; un workflow packagé et public n’est pas disponible. Traitez le luminaire comme un contrat d'ingénierie, et non comme une promesse que vous pouvez en publier un aujourd'hui.
Il est déclaré avec type: total_conversion. Ensuite, fallback_policy décide si une conversion à moitié installée affiche le contenu du jeu ou rien.
| Remplace | Impossible d'ajouter |
|---|---|
| Les lieux, les gens, la guerre, les mythes, la carte, les noms de tout. Vos royaumes, vos dieux, votre propre économie. | Un nouveau genre de chose. Une épée qui frappe plus fort est un nombre ; une arme qui tire un faisceau et qui a besoin des règles du faisceau est une fonctionnalité, et les fonctionnalités sont du code. |
Ce qui change et ce qui ne change pas
Presque rien ne change. Le dossier est le dossier, mod.json est mod.json, les familles sont les mêmes familles avec les mêmes champs, les identifiants sont espaceés de noms de la même manière, le validateur applique les mêmes règles et l'écran Mod signale les mêmes états. Chaque didacticiel de cette page est un didacticiel permettant de créer une partie d'une conversion. La distance entre un package qui ajoute un commerçant et un package qui représente un royaume entier est un montant record, pas une capacité différente.
Trois choses changent vraiment, et il vaut la peine de les connaître toutes les trois avant de commencer :
| Quoi | Comme |
|---|---|
| L'affiche | type: total_conversion, et à côté fallback_policy, qui est vanilla ou none et vaut vanilla si vous ne l'écrivez pas. vanilla signifie qu'une conversion à moitié installée montre le contenu du jeu là où le vôtre manque ; none signifie qu'il ne montre rien. |
| Budget | Quatre fois le profil ordinaire – et un profil, pas une exemption. Les mots du build lui-même : « Quatre fois, pas illimité : une limite qui peut être déclarée n'est pas une limite. » Si total_conversion supprimait les limites, cela deviendrait la ligne que chaque paquet écrit pour y échapper. |
| Les mots non traduits cessent de retomber sur ceux du jeu | Généralement, une clé manquante va jusqu'à player_locale, puis la langue par défaut de votre package, puis le catalogue du jeu, puis la clé elle-même. Lors d'une conversion totale, cette troisième étape est supprimée. Une clé que vous n'avez pas écrite est considérée comme la clé et est signalée. |
Cette troisième étape ressemble à une perte et c'est le contraire. Old Seat qui émerge dans un monde sans Old Seat n'est pas une traduction légèrement fausse : c'est le jeu de base qui transparaît de dessous ce que vous avez construit dessus. Supprimer le pas signifie qu'un trou dans vos mots est quelque chose dont on vous parle au lieu de quelque chose qu'un joueur trouve.
Où va-t-il
Cela vaut la peine de le dire clairement, car cela change ce qui mérite d'être appris.
Le moteur sous Bonemark a été construit pour gérer plus que Bonemark. Le cadre est constitué de données : les lieux, les personnes, l'économie, les mythes et les mots pour tout cela sont des enregistrements des mêmes types que ceux décrits sur cette page. C'est pourquoi le type de conversion complet existe dans le manifeste, et c'est pourquoi la construction apporte un deuxième paramètre en tant que paramètre plutôt que comme test d'une ligne de code.
La solution à long terme ne consiste donc pas à « ajouter une épée ». Le fait est que quiconque apprend ces familles apprend à construire un monde sur ce moteur, et la distance entre un package qui ajoute un marchand et un package qui représente un royaume entier est un montant record et non une compétence différente.
Steam Workshop est la direction à suivre pour fournir des packs aux joueurs, et c'est pourquoi Partagez-le décrit les champs d'un magasin qui ne propose toujours rien. S'abonner à un package au lieu d'en extraire un change la façon dont il arrive et rien sur la façon dont il est écrit : le même dossier, le même mod.json, les mêmes identifiants.
Pas de date, ni pour l'un ni pour l'autre, et pas de deuxième décor nommé : l'un existe comme un dispositif d'ingénierie, ce qui n'est pas la même chose qu'un dispositif annoncé. Ce qui est dit ici est une direction et ce qu'il en coûte pour être prêt : c'est-à-dire que la chose que vous apprenez aujourd'hui ne cessera pas d'être la chose lorsque la porte s'ouvrira.
Posséder un mod
Les mêmes conditions sur lesquelles chaque scène de modding s’est installée, car ce sont elles qui fonctionnent. Il n’y a rien d’inhabituel ici ni de gadget.
| Votre mod est à vous | Les disques que vous avez écrits, les images que vous avez dessinées, le son que vous avez produit. Ils restent à vous. Publier un mod ne donne à personne aucun droit sur votre travail. |
| Le contenu du jeu reste le jeu | Faites référence à ce que vous voulez : remplacez un identifiant, corrigez un champ, habillez un objet. Ne le sortez pas, ne le reconditionnez pas et n'en transportez pas de copies dans votre sac. Ceci est principalement réservé à vous : un package ne peut pas masquer les fichiers du jeu, la ligne est donc difficile à franchir par accident. |
| Le droit d'auteur n'évolue dans aucun sens | C'est le nom légal des deux lignes ci-dessus, et cela vaut la peine de le dire clairement car c'est ce que les gens tiennent pour acquis à l'envers. La publication d'un package ne donne pas votre travail au studio ; en installer un ne vous donne pas le jeu. Les droits d'auteur sur les disques que vous avez écrits et sur les œuvres d'art que vous avez réalisées vous appartiennent, et les disques, les illustrations, le son et les décors de Bonemark restent la propriété du studio. La conversion totale est un cas qui mérite d'être précisé : le remplacement du paramètre qu'un joueur voit n'accorde pas de licence pour le paramètre remplacé, et un package ne peut toujours pas contenir les fichiers du jeu. |
| Les mods sont gratuits | Aucune vente, pas de murs payants, pas d'accès anticipé payant, sur n'importe quel magasin ou plateforme. Et ils ne sont même pas à nous pour les vendre : la même règle lie le studio. |
| Les dons, c'est bien | Un pot de pourboires, un Patreon, une page de remerciement. Il s'agit de l'approbation d'une personne, pas d'un prix sur un mod, et toute scène sensée le permet. |
| Le travail de quelqu'un d'autre nécessite sa permission | Un personnage, un son, un sprite, un ensemble d'enregistrements provenant d'un autre package : demandez et citez l'auteur où un joueur peut le lire. |
| Traductions sont autorisés par défaut | Tout le monde peut traduire votre package et publier la traduction en vous citant. Dites-le sur votre page si vous préférez qu'on vous le demande en premier. |
| Réutiliser la demande en premier | Construisez sur le paquet de quelqu'un, continuez un paquet abandonné, prenez ses enregistrements et mettez-les dans le vôtre : demandez-lui. Le silence n'est pas un oui. |
Parce que la gratuité n'est pas négociable. Les mods payants ont été essayés à grande échelle et retirés à chaque fois : dès que l'argent est en jeu, les débats portent sur à qui appartient quelle idée plutôt que sur quoi construire ensuite, et la scène qu'il a partagée commence à maintenir les choses ensemble. Dans cet écosystème, tout le monde est au même niveau, y compris ceux qui ont créé le jeu.
Une chose que nous pouvons demander. Qu'un package soit supprimé, et uniquement pour des raisons précises : il contient des fichiers de jeu, usurpe l'identité de quelqu'un ou contient du matériel illégal là où il est hébergé. Non pas parce que nous ne sommes pas d'accord avec lui.
Décidé par le studio le 14/08/2026. Le texte ici est politique ; un avocat le lira avant l'ouverture publique du modding, et si cela change un mot, cette page change avec lui.
Où demander
Discord, et il n'est pas encore ouvert. C'est là que les questions de modding recevront une réponse, et l'invitation n'est écrite nulle part car il n'y a rien à quoi inviter qui que ce soit. La marque Discord sur la première page est terne pour la même raison ; le jour où elle s'allumera, c'est le jour où cette ligne portera l'adresse.
Dire "Discord" avant que l'adresse n'existe vaut plus que ne rien dire : il vous indique où chercher et vous dit de ne pas aller chasser dans un forum qui n'a jamais été ouvert.
Pendant ce temps, ce qui répond à presque toutes les questions sans que personne d'autre ne s'en mêle est Avant de demander de l'aide quelqu'un : Le bloc de contrôle en amont nomme la version, les packages, les états et la raison derrière chaque rejet, et presque tout ce à quoi une personne aurait répondu s'y trouve déjà.