diff --git a/lang/en.json b/lang/en.json index 4e786e28..4a4d073d 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2644,6 +2644,14 @@ "title": "Triggers" } }, + "Metagaming": { + "FIELDS": { + "hideObserverPermissionInChat": { + "label": "Hide Chat Info From Players", + "hint": "Information such as hit/miss on attack rolls against adversaries will be hidden" + } + } + }, "Homebrew": { "newDowntimeMove": "Downtime Move", "downtimeMove": "Downtime Move", @@ -2703,6 +2711,11 @@ "label": "Configure Automation", "hint": "Various settings automating resource management and more" }, + "metagaming": { + "name": "Metagaming Settings", + "label": "Configure Metagaming", + "hint": "Various settings controlling the flow of information to players" + }, "homebrew": { "name": "Homebrew Settings", "label": "Configure Homebrew", diff --git a/module/applications/settings/_module.mjs b/module/applications/settings/_module.mjs index b565777c..28972397 100644 --- a/module/applications/settings/_module.mjs +++ b/module/applications/settings/_module.mjs @@ -1,4 +1,5 @@ export { default as DhAppearanceSettings } from './appearanceSettings.mjs'; export { default as DhAutomationSettings } from './automationSettings.mjs'; export { default as DhHomebrewSettings } from './homebrewSettings.mjs'; +export { default as DhMetagamingSettings } from './metagamingSettings.mjs'; export { default as DhVariantRuleSettings } from './variantRuleSettings.mjs'; diff --git a/module/applications/settings/automationSettings.mjs b/module/applications/settings/automationSettings.mjs index e720733e..52def7db 100644 --- a/module/applications/settings/automationSettings.mjs +++ b/module/applications/settings/automationSettings.mjs @@ -31,8 +31,8 @@ export default class DhAutomationSettings extends HandlebarsApplicationMixin(App }; static PARTS = { - tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, header: { template: 'systems/daggerheart/templates/settings/automation-settings/header.hbs' }, + tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, general: { template: 'systems/daggerheart/templates/settings/automation-settings/general.hbs' }, rules: { template: 'systems/daggerheart/templates/settings/automation-settings/deathMoves.hbs' }, roll: { template: 'systems/daggerheart/templates/settings/automation-settings/roll.hbs' }, diff --git a/module/applications/settings/metagamingSettings.mjs b/module/applications/settings/metagamingSettings.mjs new file mode 100644 index 00000000..c29a021b --- /dev/null +++ b/module/applications/settings/metagamingSettings.mjs @@ -0,0 +1,62 @@ +import { DhMetagaming } from '../../data/settings/_module.mjs'; + +const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; + +export default class DhMetagamingSettings extends HandlebarsApplicationMixin(ApplicationV2) { + constructor() { + super({}); + + this.settings = new DhMetagaming( + game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Metagaming).toObject() + ); + } + + get title() { + return game.i18n.localize('DAGGERHEART.SETTINGS.Menu.title'); + } + + static DEFAULT_OPTIONS = { + tag: 'form', + id: 'daggerheart-metagaming-settings', + classes: ['daggerheart', 'dh-style', 'dialog', 'setting'], + position: { width: '600', height: 'auto' }, + window: { + icon: 'fa-solid fa-eye-low-vision' + }, + actions: { + reset: this.reset, + save: this.save + }, + form: { handler: this.updateData, submitOnChange: true } + }; + + static PARTS = { + header: { template: 'systems/daggerheart/templates/settings/metagaming-settings/header.hbs' }, + general: { template: 'systems/daggerheart/templates/settings/metagaming-settings/general.hbs' }, + footer: { template: 'systems/daggerheart/templates/settings/metagaming-settings/footer.hbs' } + }; + + async _prepareContext(_options) { + const context = await super._prepareContext(_options); + context.settingFields = this.settings; + + return context; + } + + static async updateData(_event, _element, formData) { + const updatedSettings = foundry.utils.expandObject(formData.object); + + await this.settings.updateSource(updatedSettings); + this.render(); + } + + static async reset() { + this.settings = new DhMetagaming(); + this.render(); + } + + static async save() { + await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Metagaming, this.settings.toObject()); + this.close(); + } +} diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index d3f752bb..38ffcf3b 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -3,6 +3,10 @@ export const menu = { Name: 'GameSettingsAutomation', Icon: 'fa-solid fa-robot' }, + Metagaming: { + Name: 'GameSettingsMetagaming', + Icon: 'fa-solid fa-eye-low-vision' + }, Homebrew: { Name: 'GameSettingsHomebrew', Icon: 'fa-solid fa-flask-vial' @@ -19,6 +23,7 @@ export const menu = { export const gameSettings = { Automation: 'Automation', + Metagaming: 'Metagaming', Homebrew: 'Homebrew', appearance: 'Appearance', variantRules: 'VariantRules', diff --git a/module/data/settings/Metagaming.mjs b/module/data/settings/Metagaming.mjs new file mode 100644 index 00000000..2bb5afdf --- /dev/null +++ b/module/data/settings/Metagaming.mjs @@ -0,0 +1,12 @@ +export default class DhMetagaming extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + return { + hideObserverPermissionInChat: new fields.BooleanField({ + initial: false, + label: 'DAGGERHEART.SETTINGS.Metagaming.FIELDS.hideObserverPermissionInChat.label', + hint: 'DAGGERHEART.SETTINGS.Metagaming.FIELDS.hideObserverPermissionInChat.hint' + }) + }; + } +} diff --git a/module/data/settings/_module.mjs b/module/data/settings/_module.mjs index db1fbfec..45405ba5 100644 --- a/module/data/settings/_module.mjs +++ b/module/data/settings/_module.mjs @@ -1,4 +1,5 @@ export { default as DhAppearance } from './Appearance.mjs'; export { default as DhAutomation } from './Automation.mjs'; export { default as DhHomebrew } from './Homebrew.mjs'; +export { default as DhMetagaming } from './Metagaming.mjs'; export { default as DhVariantRules } from './VariantRules.mjs'; diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index d8e5f6dd..a836a2ea 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -140,8 +140,10 @@ export default class DHRoll extends Roll { /** @inheritDoc */ async render({ flavor, template = this.constructor.CHAT_TEMPLATE, isPrivate = false, ...options } = {}) { if (!this._evaluated) return; + + const metagamingSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Metagaming); const chatData = await this._prepareChatRenderContext({ flavor, isPrivate, ...options }); - return foundry.applications.handlebars.renderTemplate(template, chatData); + return foundry.applications.handlebars.renderTemplate(template, { ...chatData, metagamingSettings }); } /** @inheritDoc */ diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index 668ad06b..53921329 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -68,8 +68,11 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { document = fromUuidSync(uuid); if (!document) return; - e.setAttribute('data-view-perm', document.testUserPermission(game.user, 'OBSERVER')); e.setAttribute('data-use-perm', document.testUserPermission(game.user, 'OWNER')); + + const settings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Metagaming); + if (settings.hideObserverPermissionInChat) + e.setAttribute('data-view-perm', document.testUserPermission(game.user, 'OBSERVER')); }); if (this.isContentVisible) { diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index 6756dcab..1cd627af 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -1,10 +1,11 @@ import { defaultLevelTiers, DhLevelTiers } from '../data/levelTier.mjs'; import DhCountdowns from '../data/countdowns.mjs'; -import { DhAppearance, DhAutomation, DhHomebrew, DhVariantRules } from '../data/settings/_module.mjs'; +import { DhAppearance, DhAutomation, DhHomebrew, DhMetagaming, DhVariantRules } from '../data/settings/_module.mjs'; import { DhAppearanceSettings, DhAutomationSettings, DhHomebrewSettings, + DhMetagamingSettings, DhVariantRuleSettings } from '../applications/settings/_module.mjs'; import { CompendiumBrowserSettings, DhTagTeamRoll } from '../data/_module.mjs'; @@ -38,6 +39,12 @@ const registerMenuSettings = () => { type: DhAutomation }); + game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Metagaming, { + scope: 'world', + config: false, + type: DhMetagaming + }); + game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew, { scope: 'world', config: false, @@ -76,6 +83,16 @@ const registerMenus = () => { type: DhAutomationSettings, restricted: true }); + + game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.menu.Metagaming.Name, { + name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.metagaming.name'), + label: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.metagaming.label'), + hint: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.metagaming.hint'), + icon: CONFIG.DH.SETTINGS.menu.Metagaming.Icon, + type: DhMetagamingSettings, + restricted: true + }); + game.settings.registerMenu(CONFIG.DH.id, CONFIG.DH.SETTINGS.menu.Homebrew.Name, { name: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.homebrew.name'), label: game.i18n.localize('DAGGERHEART.SETTINGS.Menu.homebrew.label'), diff --git a/styles/less/ui/chat/chat.less b/styles/less/ui/chat/chat.less index 3591fc65..e9ef9147 100644 --- a/styles/less/ui/chat/chat.less +++ b/styles/less/ui/chat/chat.less @@ -450,6 +450,10 @@ .target-data { flex: 1; + + .target-name { + text-align: left; + } } .target-save { diff --git a/system.json b/system.json index fc5e1615..34d7e438 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "1.8.0", + "version": "1.9.0", "compatibility": { "minimum": "13.346", "verified": "13.351", diff --git a/templates/settings/metagaming-settings/footer.hbs b/templates/settings/metagaming-settings/footer.hbs new file mode 100644 index 00000000..54939c17 --- /dev/null +++ b/templates/settings/metagaming-settings/footer.hbs @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/templates/settings/metagaming-settings/general.hbs b/templates/settings/metagaming-settings/general.hbs new file mode 100644 index 00000000..7f36715e --- /dev/null +++ b/templates/settings/metagaming-settings/general.hbs @@ -0,0 +1,3 @@ +