A repository for a FoundryVTT plugin for Kingmaker homebrew.

I hate that I have to use the experimental features, but here we are

+6 -6
src/svelte/sheet.svelte
··· 2 2 import type { KingdomActor } from "../global"; 3 3 import TabButton from "./tab-button.svelte"; 4 4 import Tab from "./tab.svelte"; 5 - import { iter, kmLocalize } from "../utils"; 5 + import { iter, enrichAndLocalize } from "../utils"; 6 6 import { socket } from "../socket"; 7 7 8 8 let { actor, tabs } : { ··· 47 47 <section class="container"> 48 48 <div class="km-flex-row km-flex"> 49 49 <div class="km-flex-1 km-flex-row"> 50 - <div class="km-label">{kmLocalize("sheet", "name")}</div> 50 + <div class="km-label">{await enrichAndLocalize("sheet", "name")}</div> 51 51 <input type="text" bind:value={actor.flags["kingdom-homebrew"].name} onblur={updateKingdomName} placeholder="Name" /> 52 52 </div> 53 53 <div class="km-flex-1 km-flex-row"> 54 - <div class="km-label" title={kmLocalize("sheet", "krpFull")}>{kmLocalize("sheet", "krp")}</div> 54 + <div class="km-label" title={await enrichAndLocalize("sheet", "krpFull")}>{await enrichAndLocalize("sheet", "krp")}</div> 55 55 <select bind:value={actor.flags["kingdom-homebrew"].krp.current} onblur={krpCurrent}> 56 56 {#each iter(0, 4, 1) as i} 57 57 <option value={i}>{i}</option> ··· 59 59 </select> 60 60 </div> 61 61 <div class="km-flex-1 km-flex-row"> 62 - <div class="km-label">{kmLocalize("sheet", "next")}</div> 62 + <div class="km-label">{await enrichAndLocalize("sheet", "next")}</div> 63 63 <select bind:value={actor.flags["kingdom-homebrew"].krp.next} onblur={krpNext}> 64 64 {#each iter(0, 4, 1) as i} 65 65 <option value={i}>{i}</option> ··· 67 67 </select> 68 68 </div> 69 69 <div class="km-flex-1 km-flex-row"> 70 - <div class="km-label">{kmLocalize("sheet", "level")}</div> 70 + <div class="km-label">{await enrichAndLocalize("sheet", "level")}</div> 71 71 <select bind:value={actor.flags["kingdom-homebrew"].level} onchange={updateLevel}> 72 72 {#each iter(0, 20, 1) as i} 73 73 <option value={i + 1}>{i + 1}</option> ··· 75 75 </select> 76 76 </div> 77 77 <div class="km-flex-1 km-flex-row"> 78 - <div class="km-label">{kmLocalize("sheet", "xp")}</div> 78 + <div class="km-label">{await enrichAndLocalize("sheet", "xp")}</div> 79 79 <input type="text" bind:value={actor.flags["kingdom-homebrew"].xp} onblur={updateXP} placeholder="0" /> 80 80 </div> 81 81 </div>
+2 -2
src/svelte/tab-button.svelte
··· 1 1 <script lang="ts"> 2 - import { kmLocalize } from "../utils"; 2 + import { enrichAndLocalize } from "../utils"; 3 3 4 4 let { tab } : { 5 5 tab: string ··· 29 29 } 30 30 </script> 31 31 32 - <button onclick={openTab} data-tab={tab} class={getClass()}>{kmLocalize("sheet", "tab", tab)}</button> 32 + <button onclick={openTab} data-tab={tab} class={getClass()}>{await enrichAndLocalize("sheet", "tab", tab)}</button>
+5 -5
src/svelte/tabs/kingdom.svelte
··· 1 1 <script lang="ts"> 2 2 import type { KingdomActor } from "../../global"; 3 - import { iter, kmLocalize } from "../../utils"; 3 + import { iter, enrichAndLocalize } from "../../utils"; 4 4 import KingdomLevel from "./kingdom-level.svelte"; 5 5 6 6 let { actor }: { actor: KingdomActor } = $props(); ··· 15 15 16 16 <div class="kingdom-tab-left"> 17 17 <div class="kingdom-ability-outer"> 18 - <div class="kingdom-ability-label">{kmLocalize("attribute", "loyalty")}</div> 18 + <div class="kingdom-ability-label">{await enrichAndLocalize("attribute", "loyalty")}</div> 19 19 <span class="kingdom-ability">{addOpp(actor.flags["kingdom-homebrew"].attributes.loyalty.mod)}</span> 20 20 </div> 21 21 <div class="kingdom-ability-outer"> 22 - <div class="kingdom-ability-label">{kmLocalize("attribute", "culture")}</div> 22 + <div class="kingdom-ability-label">{await enrichAndLocalize("attribute", "culture")}</div> 23 23 <span class="kingdom-ability">{addOpp(actor.flags["kingdom-homebrew"].attributes.culture.mod)}</span> 24 24 </div> 25 25 <div class="kingdom-ability-outer"> 26 - <div class="kingdom-ability-label">{kmLocalize("attribute", "economy")}</div> 26 + <div class="kingdom-ability-label">{await enrichAndLocalize("attribute", "economy")}</div> 27 27 <span class="kingdom-ability">{addOpp(actor.flags["kingdom-homebrew"].attributes.economy.mod)}</span> 28 28 </div> 29 29 <div class="kingdom-ability-outer"> 30 - <div class="kingdom-ability-label">{kmLocalize("attribute", "stability")}</div> 30 + <div class="kingdom-ability-label">{await enrichAndLocalize("attribute", "stability")}</div> 31 31 <span class="kingdom-ability">{addOpp(actor.flags["kingdom-homebrew"].attributes.stability.mod)}</span> 32 32 </div> 33 33 </div>
+34 -34
src/svelte/tabs/levels/level-1.svelte
··· 1 1 <script lang="ts"> 2 2 import type { KingdomActor } from "../../../global"; 3 - import { kmLocalize, } from "../../../utils"; 3 + import { enrichAndLocalize } from "../../../utils"; 4 4 import { data } from "../../../data"; 5 5 import type * as Data from "../../../data"; 6 6 import { socket } from "../../../socket"; ··· 134 134 } 135 135 </script> 136 136 137 - <h2>{kmLocalize("sheet", "level-1", "header")}</h2> 138 - <h3>{kmLocalize("sheet", "level-1", "charter", "choose")}</h3> 139 - <p>{kmLocalize("sheet", "level-1", "charter", "explanation")}</p> 137 + <h2>{await enrichAndLocalize("sheet", "level-1", "header")}</h2> 138 + <h3>{await enrichAndLocalize("sheet", "level-1", "charter", "choose")}</h3> 139 + <p>{await enrichAndLocalize("sheet", "level-1", "charter", "explanation")}</p> 140 140 <select bind:value={actor.flags["kingdom-homebrew"].charter} onchange={parseCharter} id="kmhb-charter"> 141 141 {#each data.charters as charter} 142 - <option value={charter.id}>{kmLocalize("charter", charter.id, "title")}</option> 142 + <option value={charter.id}>{await enrichAndLocalize("charter", charter.id, "title")}</option> 143 143 {/each} 144 144 </select> 145 145 <div class="km-flex"> 146 146 <div class="km-flex-row" style="width:100%;"> 147 - <span class="km-flex-1">{kmLocalize("sheet", "level-1", "freeBoostChoose")}</span> 147 + <span class="km-flex-1">{await enrichAndLocalize("sheet", "level-1", "freeBoostChoose")}</span> 148 148 <div class="km-flex-1"> 149 149 <input type="radio" name="kmhb-charter-free" onchange={setFreeCharterBoost} id="kmhb-charter-free-loyalty" disabled={getBoostDisabled("charter", "loyalty")} checked={isFreeBoost("charter", "loyalty")} /> 150 - <label for="kmhb-charter-free-loyalty">{kmLocalize("attribute", "loyalty")}</label> 150 + <label for="kmhb-charter-free-loyalty">{await enrichAndLocalize("attribute", "loyalty")}</label> 151 151 </div> 152 152 <div class="km-flex-1"> 153 153 <input type="radio" name="kmhb-charter-free" onchange={setFreeCharterBoost} id="kmhb-charter-free-stability" disabled={getBoostDisabled("charter", "stability")} checked={isFreeBoost("charter", "stability")} /> 154 - <label for="kmhb-charter-free-stability">{kmLocalize("attribute", "stability")}</label> 154 + <label for="kmhb-charter-free-stability">{await enrichAndLocalize("attribute", "stability")}</label> 155 155 </div> 156 156 <div class="km-flex-1"> 157 157 <input type="radio" name="kmhb-charter-free" onchange={setFreeCharterBoost} id="kmhb-charter-free-economy" disabled={getBoostDisabled("charter", "economy")} checked={isFreeBoost("charter", "economy")} /> 158 - <label for="kmhb-charter-free-economy">{kmLocalize("attribute", "economy")}</label> 158 + <label for="kmhb-charter-free-economy">{await enrichAndLocalize("attribute", "economy")}</label> 159 159 </div> 160 160 <div class="km-flex-1"> 161 161 <input type="radio" name="kmhb-charter-free" onchange={setFreeCharterBoost} id="kmhb-charter-free-culture" disabled={getBoostDisabled("charter", "culture")} checked={isFreeBoost("charter", "culture")} /> 162 - <label for="kmhb-charter-free-culture">{kmLocalize("attribute", "culture")}</label> 162 + <label for="kmhb-charter-free-culture">{await enrichAndLocalize("attribute", "culture")}</label> 163 163 </div> 164 164 </div> 165 165 </div> 166 - <p>{actor.getFlag("kingdom-homebrew", "charter") == "" ? "" : kmLocalize("charter", actor.getFlag("kingdom-homebrew", "charter"), "description")}</p> 167 - <h3>{kmLocalize("sheet", "level-1", "heartland", "choose")}</h3> 168 - <p>{kmLocalize("sheet", "level-1", "heartland", "explanation")}</p> 166 + <p>{@html actor.getFlag("kingdom-homebrew", "charter") == "" ? "" : await enrichAndLocalize("charter", actor.getFlag("kingdom-homebrew", "charter"), "description")}</p> 167 + <h3>{await enrichAndLocalize("sheet", "level-1", "heartland", "choose")}</h3> 168 + <p>{await enrichAndLocalize("sheet", "level-1", "heartland", "explanation")}</p> 169 169 <select bind:value={actor.flags["kingdom-homebrew"].heartland} onchange={parseHeartland} id="kmhb-heartland"> 170 170 {#each data.heartlands as heartland} 171 - <option value={heartland.id}>{kmLocalize("heartland", heartland.id, "title")}</option> 171 + <option value={heartland.id}>{await enrichAndLocalize("heartland", heartland.id, "title")}</option> 172 172 {/each} 173 173 </select> 174 - <p>{actor.getFlag("kingdom-homebrew", "heartland") == "" ? "" : kmLocalize("heartland", actor.getFlag("kingdom-homebrew", "heartland"), "description")}</p> 175 - <h3>{kmLocalize("sheet", "level-1", "government", "choose")}</h3> 176 - <p>{kmLocalize("sheet", "level-1", "government", "explanation")}</p> 174 + <p>{@html actor.getFlag("kingdom-homebrew", "heartland") == "" ? "" : await enrichAndLocalize("heartland", actor.getFlag("kingdom-homebrew", "heartland"), "description")}</p> 175 + <h3>{await enrichAndLocalize("sheet", "level-1", "government", "choose")}</h3> 176 + <p>{await enrichAndLocalize("sheet", "level-1", "government", "explanation")}</p> 177 177 <select bind:value={actor.flags["kingdom-homebrew"].government} onchange={parseGovernment} id="kmhb-government"> 178 178 {#each data.governments as government} 179 - <option value={government.id}>{kmLocalize("government", government.id, "title")}</option> 179 + <option value={government.id}>{await enrichAndLocalize("government", government.id, "title")}</option> 180 180 {/each} 181 181 </select> 182 182 <div class="km-flex"> 183 183 <div class="km-flex-row" style="width:100%;"> 184 - <span class="km-flex-1">{kmLocalize("sheet", "level-1", "freeBoostChoose")}</span> 184 + <span class="km-flex-1">{await enrichAndLocalize("sheet", "level-1", "freeBoostChoose")}</span> 185 185 <div class="km-flex-1"> 186 186 <input type="radio" name="kmhb-government-free" onchange={setFreeGovernmentBoost} id="kmhb-government-free-loyalty" disabled={getBoostDisabled("government", "loyalty")} checked={isFreeBoost("government", "loyalty")} /> 187 - <label for="kmhb-government-free-loyalty">{kmLocalize("attribute", "loyalty")}</label> 187 + <label for="kmhb-government-free-loyalty">{await enrichAndLocalize("attribute", "loyalty")}</label> 188 188 </div> 189 189 <div class="km-flex-1"> 190 190 <input type="radio" name="kmhb-government-free" onchange={setFreeGovernmentBoost} id="kmhb-government-free-stability" disabled={getBoostDisabled("government", "stability")} checked={isFreeBoost("government", "stability")} /> 191 - <label for="kmhb-government-free-stability">{kmLocalize("attribute", "stability")}</label> 191 + <label for="kmhb-government-free-stability">{await enrichAndLocalize("attribute", "stability")}</label> 192 192 </div> 193 193 <div class="km-flex-1"> 194 194 <input type="radio" name="kmhb-government-free" onchange={setFreeGovernmentBoost} id="kmhb-government-free-economy" disabled={getBoostDisabled("government", "economy")} checked={isFreeBoost("government", "economy")} /> 195 - <label for="kmhb-government-free-economy">{kmLocalize("attribute", "economy")}</label> 195 + <label for="kmhb-government-free-economy">{await enrichAndLocalize("attribute", "economy")}</label> 196 196 </div> 197 197 <div class="km-flex-1"> 198 198 <input type="radio" name="kmhb-government-free" onchange={setFreeGovernmentBoost} id="kmhb-government-free-culture" disabled={getBoostDisabled("government", "culture")} checked={isFreeBoost("government", "culture")} /> 199 - <lable for="kmhb-government-free-culture">{kmLocalize("attribute", "culture")}</lable> 199 + <lable for="kmhb-government-free-culture">{await enrichAndLocalize("attribute", "culture")}</lable> 200 200 </div> 201 201 </div> 202 202 </div> 203 - <p>{actor.getFlag("kingdom-homebrew", "government") == "" ? "" : kmLocalize("government", actor.getFlag("kingdom-homebrew", "government"), "description")}</p> 204 - <h3>{kmLocalize("sheet", "level-1", "leaders", "choose")}</h3> 205 - <p>{kmLocalize("sheet", "level-1", "leaders", "explanation")}</p> 203 + <p>{@html actor.getFlag("kingdom-homebrew", "government") == "" ? "" : await enrichAndLocalize("government", actor.getFlag("kingdom-homebrew", "government"), "description")}</p> 204 + <h3>{await enrichAndLocalize("sheet", "level-1", "leaders", "choose")}</h3> 205 + <p>{await enrichAndLocalize("sheet", "level-1", "leaders", "explanation")}</p> 206 206 {#each leaders as leader} 207 207 {@const leaderId = getLeader(actor.flags["kingdom-homebrew"].leaders, leader)} 208 208 <div class="kmhb-leader-select"> 209 - <span class="kmhb-leader-label">{kmLocalize("leader", leader)}</span> 209 + <span class="kmhb-leader-label">{await enrichAndLocalize("leader", leader)}</span> 210 210 {#if leaderId == ""} 211 - <span class="kmhb-leader-drop-label" ondragend={leaderDrop} role="form">{kmLocalize("sheet", "level-1", "leaders", "drop")}</span> 211 + <span class="kmhb-leader-drop-label" ondragend={leaderDrop} role="form">{await enrichAndLocalize("sheet", "level-1", "leaders", "drop")}</span> 212 212 {:else} 213 213 {@const leaderActor = (game as foundry.Game).actors.get(leaderId)} 214 214 <img src={leaderActor.thumbnail} alt={leaderActor.name} /> 215 215 {/if} 216 - <span class="kmhb-leader-attribute">{kmLocalize("attribute", leaderAttributes[leader])}</span> 216 + <span class="kmhb-leader-attribute">{await enrichAndLocalize("attribute", leaderAttributes[leader])}</span> 217 217 </div> 218 218 {/each} 219 - <button onclick={createVillage}>{kmLocalize("sheet", "level-1", "createVillage")}</button> 220 - <h3>{kmLocalize("sheet", "level-1", "fameInfamy", "title")}</h3> 221 - <p>{kmLocalize("sheet", "level-1", "fameInfamy", "explanation")}</p> 219 + <button onclick={createVillage}>{await enrichAndLocalize("sheet", "level-1", "createVillage")}</button> 220 + <h3>{await enrichAndLocalize("sheet", "level-1", "fameInfamy", "title")}</h3> 221 + <p>{await enrichAndLocalize("sheet", "level-1", "fameInfamy", "explanation")}</p> 222 222 <select onchange={setFameInfamy}> 223 - <option value="fame">{kmLocalize("reputation", "fame")}</option> 224 - <option value="infamy">{kmLocalize("reputation", "infamy")}</option> 223 + <option value="fame">{await enrichAndLocalize("reputation", "fame")}</option> 224 + <option value="infamy">{await enrichAndLocalize("reputation", "infamy")}</option> 225 225 </select>
+16 -2
src/utils.ts
··· 1 - import type { Kingdom } from "./kingdom"; 2 - 3 1 export interface isocketlib { 4 2 registerModule: (moduleName: string) => Socket 5 3 } ··· 27 25 28 26 export function kmLocalize(...args: string[]): string { 29 27 return (game as foundry.Game).i18n!.localize(`kingdom-homebrew.${args.join(".")}`); 28 + } 29 + 30 + export async function enrichText(raw: string, enrichedOptions: object = {}): Promise<string> { 31 + return foundry.applications.ux.TextEditor.enrichHTML(raw, mergeObject( 32 + { 33 + documents: true, 34 + links: true, 35 + secrets: (game as foundry.Game).user.isGM, 36 + rolls: true 37 + }, 38 + enrichedOptions 39 + )); 40 + } 41 + 42 + export async function enrichAndLocalize(...args: string[]): Promise<string> { 43 + return enrichText(kmLocalize(...args)); 30 44 }
+6 -1
svelte.config.js
··· 4 4 preprocess: [ 5 5 sveltePreprocess() 6 6 ], 7 - "enable-ts-plugin": true 7 + "enable-ts-plugin": true, 8 + compilerOptions: { 9 + experimental: { 10 + async: true 11 + } 12 + } 8 13 };