Ça avance bien ! Je prends mon temps car l’idée est de tout industrialiser pour générer chaque page HTML depuis un script et ne pas avoir à tout modifier à la main. J’ai quasiment tout terminé, il me reste le plus simple, à savoir convertir les pages de missions en fichier JSON (chatGPT m’a déjà fait la moitié du boulot).
J’ai aussi recréé la fonte originale pour y ajouter la gestion des accents Français, et j’y ai intégré directement les icônes du jeu.
Chaque page affiche son contenu dynamiquement en fonction de variables passées en paramètre (selon la mission d’où l’on vient), par exemple ici Death For Hire avec le paramètre Necro-Coven n’affiche que la partie de la mission qui concerne cette faction. Ainsi on évite le spoil pour la fois où on la refera avec les Imperial Conspirators ou les River Rats :
(oui j’ai corrigé la faute à « Necro Cover » ^^)
Elle est générée à partir du code suivant :
{
"mission_name": "DEATH FOR HIRE",
"color": "#a5b3ce",
"title_color": "#3672e1",
"content": [
{
"type": "paragraph",
"text": "Contract killings are a common way of doing business here in the Borderlands. Your mission is simple - track down your target & murder them dead!",
"style": "italic"
},
{
"type": "subhead",
"text": "SETUP"
},
{
"type": "paragraph",
"text": "If you are playing Death for Hire as a standalone mission, the Bounty Level is 3 & the party starts at <b>Pigskin Port</b>.",
"style": "normal",
"required_url_keyword": "standalone"
},
{
"type": "paragraph",
"text": "Since you are working for the <b>Imperial Conspirators</b>, reduce the Bounty Level & the adventurer with the highest MRL may take <b>Official Papers</b> from the Loot deck or discards. Set up all adventurers <i>(including those that were not captured)</i> at Brüttelburg.",
"style": "normal",
"required_url_keyword": "imperial_conspirators"
},
{
"type": "paragraph",
"text": "No specific setup needed when working for the Necro Coven.",
"style": "italic",
"required_url_keyword": "necro_coven"
},
{
"type": "paragraph",
"text": "No specific setup needed when working for the River Rats.",
"style": "italic",
"required_url_keyword": "river_rats"
},
{
"type": "subhead",
"text": "OBJECTIVE"
},
{
"type": "paragraph",
"text": "Destroy your target, then Rest at the Hunt Lodge.",
"required_url_keyword": "imperial_conspirators",
"style": "normal"
},
{
"type": "paragraph",
"text": "Destroy your target, then Rest at the Graveyard.",
"required_url_keyword": "necro_coven",
"style": "normal"
},
{
"type": "paragraph",
"text": "Destroy your target, then Rest at the Bandit Camp or Pigskin Port.",
"required_url_keyword": "river_rats",
"style": "normal"
},
{
"type": "paragraph",
"text": "Destroy your target, then Rest at Pigskin Port.",
"required_url_keyword": "standalone",
"style": "normal"
},
{
"type": "subhead",
"text": "DETERMINING YOUR TARGET"
},
{
"type": "paragraph",
"text": "Roll a die to determine your target, then locate that card in the indicated Encounter deck & set it aside to create the mission [mission] 'deck' <i>(although in this case it is only one card).</i>",
"style": "normal"
},
{
"type": "paragraph",
"text": "To find your target, you must destroy or interact with one of the indicated <i>'Informants'</i>. When you do, place a random Clue [clue] counter face down on each space indicated in the <i>'Clues'</i> column.",
"style": "normal"
},
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Organ Grinder</b><br><i>(Highlands)</i>", "INFORMANTS": "Caravan <i>(Trade)</i><br>Game of Cards <i>(Gamble)</i><br>Prisoner <i>(Free)</i>", "CLUES": "[clue] Bandit Camp<br>[clue] The Watchtower"}
]
},
{
"type": "paragraph",
"text": "<center>In this example, your target is the Organ Grinder. You must Trade with/destroy a Caravan, Gamble in a Game of Cards, or Free/destroy a Prisoner to learn where he can be found. Once you accomplish this, you can place Clue </i>[clue]<i> counters at the Bandit Camp & the Watchtower.</center>",
"style": "italic"
},
{
"type": "subhead",
"text": "TRACKING THE TARGET"
},
{
"type": "paragraph",
"text": "When you successfully Explore [explored] in a space with a Clue [clue] counter, flip that counter & compare your highest single die to the value on the counter. If your highest die is equal to or greater than the counter's value, you have tracked down your target! Remove the counter, take your target's card from the Mission [mission] deck & fight it during the Encounter Phase <i>(do not draw a random encounter this turn).</i>",
"style": "normal"
},
{
"type": "paragraph",
"text": "If your highest die is less than the counter's value, simply remove the counter. When you have removed the last Clue [clue] counter from the board, shuffle your target into its deck if you haven't yet been able to destroy it, or give up & Rest at your objective space to roll up a new target <i>(you may then shuffle any discarded Informants for your new target back into their decks)</i>",
"style": "normal"
},
{
"type": "dice_roll",
"title": "Roll a die to determine your target for the Imperial Conspirators:",
"required_url_keyword": "imperial_conspirators",
"no_background": "true",
"buttons": [
{
"value": "[dice1]/[dice2]/[dice3]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Würstreich Aristocrat</b><br><i>(Lowlands)</i>", "INFORMANTS": "Lone Pilgrim <i>(Approach)</i><br>Suspicious Local <i>(Approach)</i><br>Travelling Carnival <i>(Trade)</i>", "CLUES": "[clue] Crossroads<br>[clue] Witch Hill"}
]
}
]
},
{
"value": "[dice4]/[dice5]/[dice6]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Caravan</b><br><i>(Highlands)</i>", "INFORMANTS": "Burning Carriage <i>(Defend)</i><br>Game of Cards <i>(Gamble)</i><br>Organ Grinder <i>(Approach)</i>", "CLUES": "[clue] The Windmill<br>[clue] Slaver's Pass"}
]
}
]
}
]
},
{
"type": "dice_roll",
"required_url_keyword": "necro_coven",
"no_background": "true",
"title": "Roll a die to determine your target for the Necro Cover:",
"buttons": [
{
"value": "[dice1]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"required_url_keyword": "necro_coven",
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Lone Pilgrim</b><br><i>(Lowlands)</i>", "INFORMANTS": "Festival of Kürbisnacht <i>(Join)</i><br>Truffle Hunter <i>(Approach)</i><br>Wailing Ghost Child", "CLUES": "[clue] The Holy Order<br>[clue] Witch Hill"}
]
}
]
},
{
"value": "[dice2]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Würstreich Aristocrat</b><br><i>(Lowlands)</i>", "INFORMANTS": "Festival of Kürbisnacht <i>(Join)</i><br>Travelling Carnival <i>(Consult)</i><br>Truffle Hunter <i>(Approach)</i>", "CLUES": "[clue] East Bridge<br>[clue] North Bridge"}
]
}
]
},
{
"value": "[dice3]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Suspicious Local</b><br><i>(Lowlands)</i>", "INFORMANTS": "Travelling Carnival <i>(Consult)</i><br>Trapped Stage Coach <i>(Plunder)</i><br>Truffle Hunter <i>(Approach)</i>", "CLUES": "[clue] Crossroads<br>[clue] Fishmonger Camp"}
]
}
]
},
{
"value": "[dice4]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Organ Grinder</b><br><i>(Highlands)</i>", "INFORMANTS": "Alchemist <i>(Approach)</i><br>Hungry Pillar <i>(Blood/Food)</i><br>Inhuman Voices <i>(pass PER Test)</i>", "CLUES": "[clue] Bandit Camp<br>[clue] The Windmill"}
]
}
]
},
{
"value": "[dice5]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Alchemist</b><br><i>(Highlands)</i>", "INFORMANTS": "Burning Carriage <i>(Defend)</i><br>Caravan <i>(Trade)</i><br>Shady Dealings <i>(Bribe)</i>", "CLUES": "[clue] Tunnel of Terror<br>[clue] The Watchtower"}
]
}
]
},
{
"value": "[dice6]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Albino Scrog</b><br><i>(Wetlands)</i>", "INFORMANTS": "Curse Eater <i>(Approach)</i><br>Scrog Spiker <i>(Approach)</i><br>Swamp Hag <i>(Approach & roll 5+)</i>", "CLUES": "[clue] Ghostgate<br>[clue] Sunken Village"}
]
}
]
}
]
},
{
"type": "dice_roll",
"required_url_keyword": "river_rats",
"no_background": "true",
"title": "Roll a die to determine your target for the River Rats gang:",
"buttons": [
{
"value": "[dice1]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"required_url_keyword": "necro_coven",
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Würstreich Aristocrat</b><br><i>(Lowlands)</i>", "INFORMANTS": "Lone Pilgrim <i>(Approach)</i><br>Suspicious Local <i>(Approach)</i><br>Travelling Carnival <i>(Gamble/Trade)</i>", "CLUES": "[clue] Crossroads<br>[clue] Hunt Lodge"}
]
}
]
},
{
"value": "[dice2]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Prisoner</b><br><i>(Highlands)</i>", "INFORMANTS": "Burning Carriage <i>(Defend)</i><br>Fugitive <i>(Hide)</i><br>Game of Cards <i>(Gamble)</i>", "CLUES": "[clue] Bandit Camp<br>[clue] The Watchtower"}
]
}
]
},
{
"value": "[dice3]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Captive</b><br><i>(Badlands)</i>", "INFORMANTS": "Goblin Emissary <i>(Approach & pass Test)</i><br>Madman <i>(Hire)</i><br>Scrag Milker <i>(Drink)</i>", "CLUES": "[clue] Crystal Crater<br>[clue] Skull Bridge"}
]
}
]
},
{
"value": "[dice4]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Goblin Emissary</b><br><i>(Badlands)</i>", "INFORMANTS": "Captive <i>(Free)</i><br>Goblin Cockfight <i>(Gamble)</i><br>Goblin Merchant <i>(Trade)</i>", "CLUES": "[clue] Bandit Camp<br>[clue] The Watchtower"}
]
}
]
},
{
"value": "[dice5]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Goblin Merchant</b><br><i>(Badlands)</i>", "INFORMANTS": "Dice Goblin <i>(Gamble)</i><br>Goblin Cockfight <i>(Gamble)</i><br>Scrag Milker <i>(Drink)</i>", "CLUES": "[clue] Bandit Camp<br>[clue] Goblin Fortress<br>[clue] Gutfish Ford"}
]
}
]
},
{
"value": "[dice6]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Weed Wizard</b><br><i>(Wetlands)</i>", "INFORMANTS": "Bog Walker <i>(Approach/Trade)</i><br>Swamp Hag <i>(Approach & roll 5+)</i><br>Talking Bird <i>(Approach & pass Test)</i>", "CLUES": "[clue] Dusk Falls<br>[clue] Fishmonger Camp<br>[clue] Stone Circle"}
]
}
]
}
]
},
{
"type": "small_subhead",
"text": "UNDERWORLD CONTRACT (Standalone Game)",
"required_url_keyword": "standalone"
},
{
"type": "dice_roll",
"required_url_keyword": "standalone",
"no_background": "true",
"title": "Roll a die to determine your target :",
"buttons": [
{
"value": "[dice1]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"required_url_keyword": "necro_coven",
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Organ Grinder</b><br><i>(Highlands)</i>", "INFORMANTS": "Caravan <i>(Trade)</i><br>Game of Cards <i>(Gamble)</i><br>Prisoner <i>(Free)</i>", "CLUES": "[clue] Bandit Camp<br>[clue] The Watchtower"}
]
}
]
},
{
"value": "[dice2]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Truffle Hunter</b><br><i>(Lowlands)</i>", "INFORMANTS": "Suspicious Local <i>(Approach)</i><br>Trapped Stage Coach <i>(Help/Plunder)</i><br>Travelling Carnival <i>(Gamble/Trade)</i>", "CLUES": "[clue] The Graveyard<br>[clue] East Bridge"}
]
}
]
},
{
"value": "[dice3]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Madman</b><br><i>(Badlands)</i>", "INFORMANTS": "Geomancer <i>(Approach)</i><br>Human Sacrifice <i>(victim must survive)</i><br>Dark Wanderer <i>(Approach)</i>", "CLUES": "[clue] The Hell Pit<br>[clue] The Maze<br>[clue] Temple of Madness"}
]
}
]
},
{
"value": "[dice4]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Curse Eater</b><br><i>(Wetlands)</i>", "INFORMANTS": "Albino Scrog <i>(Approach & give Food)</i><br>Bog Walker <i>(Approach/Trade)</i><br>Talking Bird <i>(Approach & pass Test)</i>", "CLUES": "[clue] Dusk Falls<br>[clue] Hag's Fork"}
]
}
]
},
{
"value": "[dice5]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Scrag Milker</b><br><i>(Badlands)</i>", "INFORMANTS": "Dice Goblin <i>(Gamble)</i><br>Goblin Cockfight <i>(Gamble)</i><br>Goblin Merchant <i>(Trade)</i>", "CLUES": "[clue] Last Chance<br>[clue] Gutfish Ford"}
]
}
]
},
{
"value": "[dice6]",
"content": [
{
"type": "table",
"columns": ["TARGET", "INFORMANTS", "CLUES"],
"columns_sizes": ["25%", "45%", "30%"],
"table_width": "850px",
"first_column_alignment": "center",
"row_color": "#D2D9E6",
"rows": [
{"TARGET": "[mission] <b>Hypnotist</b><br><i>(Highlands)</i>", "INFORMANTS": "Inhuman Voices <i>(pass PER Test)</i><br>Hungry Pillar <i>(Blood/Food)</i><br>Shady Dealings <i>(Bribe)</i>", "CLUES": "[clue] Temple of Madness<br>[clue] The Watchtower"}
]
}
]
}
]
},
{
"type": "separator"
},
{
"type": "subhead",
"text": "REWARD"
},
{
"type": "paragraph",
"text": "Each adventurer gains 1 Luck [luck]. The conspirators pay D8+1 GP[gp] to each adventurer in the party. Reduce the Bounty Level & increase the Town Level at the Hunt Lodge.",
"required_url_keyword": "imperial_conspirators",
"style": "normal"
},
{
"type": "paragraph",
"text": "Each adventurer gains 1 Luck [luck]. Remove 1 blue Doom [handofdoom] counter from the Doom track. If you destroyed the target, take the <b>Killer for the Necro Coven</b> Triumph card.",
"required_url_keyword": "necro_coven",
"style": "normal"
},
{
"type": "paragraph",
"text": "Each adventurer gains 1 Luck [luck]. The gang pays 2D6+2 GP[gp] distributed amongst the party. Increase the Town Level at the Bandit Camp. The adventurer who destroyed the target may take the <b>Gang Member</b> Triumph card.",
"required_url_keyword": "river_rats",
"style": "normal"
},
{
"type": "paragraph",
"text": "Each adventurer gains 1 Luck [luck]. The contract pays 2D6+6 GP[gp] distributed amongst the party.",
"required_url_keyword": "standalone",
"style": "normal"
},
{
"type": "subhead",
"text": "MISSION PATH"
},
{
"type": "condition",
"text": "Did you rest at Pigskin Port?",
"condition_id": "pigskinport",
"required_url_keyword": "river_rats"
},
{
"type": "start_required_condition",
"required_condition_id": "pigskinport",
"required_url_keyword": "river_rats"
},
{
"type": "paragraph",
"text": "As you navigate the unfamiliar streets of Pigskin Port, an old man catches your eye, staring at you with a peculiar intensity. Will you talk to him and venture <<Into the Unknown>>?",
"links": ["./intotheunknown01.html"],
"style": "italic",
"shift_left": "1",
"required_url_keyword": "river_rats"
},
{
"type": "end_required_condition",
"required_condition_id": "pigskinport",
"required_url_keyword": "river_rats"
},
{
"type": "paragraph",
"text": "As you navigate the unfamiliar streets of Pigskin Port, an old man catches your eye, staring at you with a peculiar intensity. Will you talk to him and venture <<Into the Unknown>>?",
"links": ["./intotheunknown01.html"],
"style": "normal",
"required_url_keyword": "standalone"
},
{
"type": "paragraph",
"required_url_keyword": "imperial_conspirators",
"text": "Your masters in the secret Brotherhood have further use for you: now you must disguise yourself as an Imperial agent in order to <<Start a War>> through trickery. Sow fear amongst the villages of the Borderlands & drive them to take arms against the Empire! Alternatively, they want you to go and meet the Meister Zähesfleisch which has some <<Dirty Deeds>> to do in order to destabilise the Wetlands.",
"links": ["./startawar01.html","./dirtydeeds01.html"],
"style": "italic"
},
{
"type": "paragraph",
"required_url_keyword": "necro_coven",
"text": "With the fresh blood of your victim on your hands, you are marked with the secret sign of the Necro Coven & initiated into their ranks. The seven secret sorcerers of the Coven have a special task for their newest recruit: make a mockery of the Holy Order, break the <<Curse of the Dread Saint>> & bind the Saint's ghost with ancient necromantic rites described in the wicked & accursed tome known as the Morbadicon! They also have another mission for you to complete : travel to Hag's Fork to find out if <<The Hell Pit wos a Gasser>>...",
"links": ["./curseofthedreadsaint01.html","./thehellpitwosagasser01.html"],
"style": "italic"
},
{
"type": "paragraph",
"required_url_keyword": "river_rats",
"text": "Now that you're a full-fledged member of the River Rats gang, there's plenty of work to be done. Will you secure alliances in the North to <<Unify the Highland>> in preparation for conflict with the Empire, or head East to help with the <<War on Goblins>>? Perhaps instead you are ready to sneak into the Würstreich under disguise & <<Start a War>> to break its control over the Lowlands, or maybe you want to help them unblock a situation which makes it difficult to <<Take a Powder>>...",
"links": ["./unifythehighlands01.html","./warongoblins01.html","./startawar01.html","./takeapowder01.html"],
"style": "italic"
}
]
}
J’ai aussi ajouté la notion de case à cocher pour afficher du contenu dépendant de diverses choses, à la fois pour ne pas surcharger la page et éviter le spoil :
Bref, le plus dur est fait, reste à terminer tout ça, et dans l’idée fournir l’outil qui devrait faciliter énormément la création de campagnes maison 
La traduction ne devrait être qu’une formalité ensuite.