Nombreuses corrections sur les fiches settlement/NPC
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import OathHammerActorSheet from "./base-actor-sheet.mjs"
|
||||
|
||||
const ALLOWED_ITEM_TYPES = new Set(["building", "equipment", "weapon", "armor"])
|
||||
const ALLOWED_ITEM_TYPES = new Set(["building", "equipment", "weapon", "armor", "regiment"])
|
||||
|
||||
export default class OathHammerSettlementSheet extends OathHammerActorSheet {
|
||||
/** @override */
|
||||
@@ -14,9 +14,11 @@ export default class OathHammerSettlementSheet extends OathHammerActorSheet {
|
||||
contentClasses: ["settlement-content"],
|
||||
},
|
||||
actions: {
|
||||
adjustCurrency: OathHammerSettlementSheet.#onAdjustCurrency,
|
||||
adjustQty: OathHammerSettlementSheet.#onAdjustQty,
|
||||
adjustCurrency: OathHammerSettlementSheet.#onAdjustCurrency,
|
||||
adjustQty: OathHammerSettlementSheet.#onAdjustQty,
|
||||
toggleConstructed: OathHammerSettlementSheet.#onToggleConstructed,
|
||||
createRegiment: OathHammerSettlementSheet.#onCreateRegiment,
|
||||
collectTaxes: OathHammerSettlementSheet.#onCollectTaxes,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -37,6 +39,9 @@ export default class OathHammerSettlementSheet extends OathHammerActorSheet {
|
||||
inventory: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/settlement-inventory.hbs",
|
||||
},
|
||||
garrison: {
|
||||
template: "systems/fvtt-oath-hammer/templates/actor/settlement-garrison.hbs",
|
||||
},
|
||||
}
|
||||
|
||||
/** @override */
|
||||
@@ -46,9 +51,10 @@ export default class OathHammerSettlementSheet extends OathHammerActorSheet {
|
||||
|
||||
#getTabs() {
|
||||
const tabs = {
|
||||
overview: { id: "overview", group: "sheet", icon: "fa-solid fa-city", label: "OATHHAMMER.Tab.Overview" },
|
||||
buildings: { id: "buildings", group: "sheet", icon: "fa-solid fa-building", label: "OATHHAMMER.Tab.Buildings" },
|
||||
inventory: { id: "inventory", group: "sheet", icon: "fa-solid fa-boxes-stacked", label: "OATHHAMMER.Tab.Inventory" },
|
||||
overview: { id: "overview", group: "sheet", icon: "fa-solid fa-city", label: "OATHHAMMER.Tab.Overview" },
|
||||
buildings: { id: "buildings", group: "sheet", icon: "fa-solid fa-building", label: "OATHHAMMER.Tab.Buildings" },
|
||||
inventory: { id: "inventory", group: "sheet", icon: "fa-solid fa-boxes-stacked", label: "OATHHAMMER.Tab.Inventory" },
|
||||
garrison: { id: "garrison", group: "sheet", icon: "fa-solid fa-shield-halved", label: "OATHHAMMER.Tab.Garrison" },
|
||||
}
|
||||
for (const v of Object.values(tabs)) {
|
||||
v.active = this.tabGroups[v.group] === v.id
|
||||
@@ -81,7 +87,11 @@ export default class OathHammerSettlementSheet extends OathHammerActorSheet {
|
||||
break
|
||||
case "buildings":
|
||||
context.tab = context.tabs.buildings
|
||||
context.buildings = doc.itemTypes.building
|
||||
context.buildings = doc.itemTypes.building.map(b => ({
|
||||
id: b.id, uuid: b.uuid, img: b.img, name: b.name, system: b.system,
|
||||
_descTooltip: b.system.description?.replace(/<[^>]+>/g, "").trim().slice(0, 400) ?? ""
|
||||
}))
|
||||
context.hasTaxBuildings = doc.itemTypes.building.some(b => b.system.constructed && b.system.taxRevenue?.trim())
|
||||
break
|
||||
case "inventory": {
|
||||
context.tab = context.tabs.inventory
|
||||
@@ -90,6 +100,10 @@ export default class OathHammerSettlementSheet extends OathHammerActorSheet {
|
||||
context.equipments = doc.itemTypes.equipment
|
||||
break
|
||||
}
|
||||
case "garrison":
|
||||
context.tab = context.tabs.garrison
|
||||
context.regiments = doc.itemTypes.regiment ?? []
|
||||
break
|
||||
}
|
||||
return context
|
||||
}
|
||||
@@ -129,4 +143,59 @@ export default class OathHammerSettlementSheet extends OathHammerActorSheet {
|
||||
if (!item) return
|
||||
await item.update({ "system.constructed": !item.system.constructed })
|
||||
}
|
||||
|
||||
static async #onCreateRegiment() {
|
||||
await this.document.createEmbeddedDocuments("Item", [{
|
||||
name: game.i18n.localize("OATHHAMMER.NewItem.Regiment"),
|
||||
type: "regiment",
|
||||
}])
|
||||
}
|
||||
|
||||
static async #onCollectTaxes() {
|
||||
const actor = this.document
|
||||
// Only constructed buildings with a non-empty taxRevenue formula
|
||||
const taxBuildings = actor.itemTypes.building.filter(
|
||||
b => b.system.constructed && b.system.taxRevenue?.trim()
|
||||
)
|
||||
if (!taxBuildings.length) {
|
||||
ui.notifications.warn(game.i18n.localize("OATHHAMMER.Settlement.NoTaxRevenue"))
|
||||
return
|
||||
}
|
||||
|
||||
// Roll each building's formula individually, sum totals
|
||||
const rolls = []
|
||||
const lines = []
|
||||
let total = 0
|
||||
for (const b of taxBuildings) {
|
||||
const r = new Roll(b.system.taxRevenue.trim())
|
||||
await r.evaluate()
|
||||
rolls.push(r)
|
||||
total += r.total
|
||||
lines.push(`<li><strong>${b.name}</strong> — ${b.system.taxRevenue} = <em>${r.total} gp</em></li>`)
|
||||
}
|
||||
|
||||
const content = `
|
||||
<div class="oh-roll-card oh-weapon-card">
|
||||
<div class="oh-roll-header">
|
||||
<span class="oh-roll-title">🏛 ${actor.name}</span>
|
||||
<span class="oh-roll-subtitle">${game.i18n.localize("OATHHAMMER.Settlement.CollectTaxes")}</span>
|
||||
</div>
|
||||
<div class="oh-roll-info">
|
||||
<ul style="margin:4px 0;padding-left:1.2em;">${lines.join("")}</ul>
|
||||
</div>
|
||||
<div class="oh-roll-result">
|
||||
<span class="oh-roll-successes">${total} gp</span>
|
||||
<span class="oh-roll-verdict">${game.i18n.localize("OATHHAMMER.Settlement.TotalRevenue")}</span>
|
||||
</div>
|
||||
</div>`
|
||||
|
||||
const msgData = {
|
||||
speaker: ChatMessage.getSpeaker({ actor }),
|
||||
content,
|
||||
rolls,
|
||||
sound: CONFIG.sounds.dice,
|
||||
}
|
||||
ChatMessage.applyRollMode(msgData, game.settings.get("core", "rollMode"))
|
||||
await ChatMessage.create(msgData)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user