A repository for a FoundryVTT plugin for Kingmaker homebrew.

Starting to work on Kingdom Checks stuff

+61 -19
+4 -1
public/lang/en.json
··· 1374 1374 "supernaturalSolutions": "Supernatural Solutions" 1375 1375 }, 1376 1376 "collectResources": "Collecting resources...", 1377 - "payConsumption": "Paying Consumption..." 1377 + "payConsumption": "Paying Consumption...", 1378 + "skillChoose": "Choose a skill", 1379 + "submit": "Submit", 1380 + "skillLore": "@Skill @Lore" 1378 1381 } 1379 1382 }
+36 -17
src/socket.ts
··· 2 2 import type { Socket, isocketlib } from "./utils"; 3 3 import type * as Data from "./data"; 4 4 import type { AttributeInfo } from "./kingdom"; 5 + import { kmLocalize, capitalize } from "./utils"; 5 6 declare var socketlib: isocketlib; 6 7 7 8 export let socket: Socket | null = null; ··· 20 21 socket.register("updateHeartlandBoost", updateHeartlandBoost); 21 22 socket.register("updateGovernmentBoost", updateGovernmentBoost); 22 23 socket.register("updateFreeBoost", updateFreeBoost); 23 - socket.register("gainKRP", gainKRP); 24 - socket.register("adjustUnrest", adjustUnrest); 25 - socket.register("collectResources", collectResources); 26 - socket.register("payConsumption", payConsumption); 24 + socket.register("showRollDialog", showRollDialog); 27 25 } 28 26 29 27 function updateKingdomValue(key: string, actor: KingdomActor, value: any): void { ··· 170 168 })); 171 169 } 172 170 173 - function gainKRP(actor: KingdomActor): void { 171 + function showRollDialog(actor: KingdomActor, kingdomAttribute: string, skills: string[]): void { 172 + try { 173 + foundry.applications.api.DialogV2.prompt({ 174 + window: { 175 + title: kmLocalize("skillChoose") 176 + }, 177 + content: `<select name="kmhb-skill-choose" class="kmhb-skill-choose">${ 178 + skills.map((skill: string) => { 179 + if (skill.indexOf("lore") === -1) { 180 + return `<option value="${skill}">${(game as foundry.Game).i18n!.localize(`PF2E.Skill.${capitalize(skill)}`)}</option>` 181 + } else { 182 + const loreSkill = capitalize(skill.replace("lore", "").replace(/\-/g, "")); 183 + const loreSkillLore = (game as foundry.Game).i18n!.localize("PF2E.SkillLore"); 184 + return `<option value="${skill}">${kmLocalize("skillLore").replace("@Skill", loreSkill).replace("@Lore", loreSkillLore)}</option>` 185 + } 186 + }).join("\n") 187 + }</select>`, 188 + ok: { 189 + label: kmLocalize("sheet", "submit"), 190 + callback: (_event: PointerEvent | SubmitEvent, button: HTMLButtonElement, _dialog: foundry.applications.api.DialogV2): Promise<string | null> => { 191 + return new Promise((resolve: (value: string | null) => void, reject: (reason: any) => void): void => { 192 + const element = (button.form?.elements.namedItem("kmhb-skill-choose") as HTMLSelectElement | null); 174 193 175 - } 176 - 177 - function adjustUnrest(actor: KingdomActor): void { 178 - 179 - } 180 - 181 - function collectResources(actor: KingdomActor): void { 182 - 183 - } 184 - 185 - function payConsumption(actor: KingdomActor): void { 186 - 194 + if (element === null) { 195 + resolve(null); 196 + } else { 197 + resolve(element.value); 198 + } 199 + }); 200 + } 201 + } 202 + }).then((skill: string): void => { 203 + // proc roll 204 + }); 205 + } catch {} 187 206 }
+1 -1
src/svelte/kingdom-desc.svelte
··· 82 82 }, 83 83 content: `<input name="kmhb-multiple" type="number" min="1" max="50" step="1" autofocus />`, 84 84 ok: { 85 - label: "Submit", 85 + label: kmLocalize("sheet", "submit"), 86 86 callback: (_event: PointerEvent | SubmitEvent, button: HTMLButtonElement, _dialog: foundry.applications.api.DialogV2): any => (button.form?.elements.namedItem("kmhb-multiple") as HTMLInputElement | null)?.valueAsNumber 87 87 } 88 88 }).then((val: number): void => {
+16
src/svelte/tabs/turn.svelte
··· 140 140 }); 141 141 }); 142 142 } 143 + 144 + // roll resource dice and add value 143 145 }, 144 146 payConsumption: (_event: Event): void => { 145 147 const priorValue = actor.getFlag("kingdom-homebrew", "commodities.food.current") as number; ··· 160 162 161 163 function performRoll(event: Event): void { 162 164 const rollData = JSON.parse((event.target as HTMLElement).dataset.rollData!); 165 + const leaderActor = (game as foundry.Game).actors.get(actor.getFlag("kingdom-homebrew", `leaders.${rollData.leader}`)); 166 + 167 + const leaders: Record<string, string> = { 168 + ruler: "loyalty", 169 + viceroy: "economy", 170 + emissary: "loyalty", 171 + general: "stability", 172 + treasurer: "economy", 173 + magister: "culture", 174 + warden: "stability", 175 + counselor: "culture" 176 + }; 177 + 178 + socket?.executeAsUser("showRollDialog", leaderActor.id, actor, leaders[rollData.leader], rollData.skills); 163 179 } 164 180 165 181 function getPerformButtonDisabled(activityData: any): boolean {
+4
src/utils.ts
··· 174 174 thumb: `worlds/${(game as foundry.Game).world.id}/assets/scenes/${scene.id}-thumb.webp` 175 175 }); 176 176 }); 177 + } 178 + 179 + export function capitalize(s: string): string { 180 + return String(s).charAt(0).toUpperCase() + String(s).slice(1); 177 181 }