diff --git a/module.json b/module.json index a3e658f..7854364 100644 --- a/module.json +++ b/module.json @@ -1,38 +1,40 @@ { - "name": "foundry-die-hard", - "title": "Die Hard", - "description": "Adjustments for DND5e & PF2e die rolls like fudging...", - "author": "Jeremy (UranusBytes)", - "version": "0.1.0", - "minimumCoreVersion": "9", - "compatibleCoreVersion": "10.277", - "esmodules": [ - "scripts/die-hard.js" - ], - "styles": [ - "styles/die-hard.css" - ], - "dependencies": [ - { - "name": "lib-wrapper", - "type": "module" - } - ], - "languages": [ - { - "lang": "en", - "name": "English", - "path": "lang/en.json" - } - ], - "flags": { - "fvttdevleague": { - "package-jam": 2022 - } - }, - "url": "https://github.com/UranusBytes/foundry-die-hard", - "manifest": "TBD", - "readme": "https://github.com/UranusBytes/foundry-die-hard/blob/main/README.md", - "changelog": "https://github.com/UranusBytes/foundry-die-hard/blob/main/CHANGELOG.md", - "download": "TBD" + "id": "foundry-die-hard", + "title": "Die Hard", + "description": "Adjustments for DND5e & PF2e die rolls like fudging...", + "author": "Jeremy (UranusBytes)", + "version": "0.1.0", + "esmodules": [ + "scripts/die-hard.js" + ], + "styles": [ + "styles/die-hard.css" + ], + "dependencies": [ + { + "name": "lib-wrapper", + "type": "module" + } + ], + "languages": [ + { + "lang": "en", + "name": "English", + "path": "lang/en.json" + } + ], + "flags": { + "fvttdevleague": { + "package-jam": 2022 + } + }, + "compatibility": { + "minimum": 10, + "verified": "10.291" + }, + "url": "https://github.com/UranusBytes/foundry-die-hard", + "manifest": "https://github.com/UranusBytes/foundry-die-hard/releases/latest/download/module.json", + "readme": "https://github.com/UranusBytes/foundry-die-hard/blob/main/README.md", + "changelog": "https://github.com/UranusBytes/foundry-die-hard/blob/main/CHANGELOG.md", + "download": "https://github.com/UranusBytes/foundry-die-hard/releases/download/0.1.0/module.zip" } \ No newline at end of file diff --git a/scripts/classes/DieHard.js b/scripts/classes/DieHard.js index 2a7297c..fc40e95 100644 --- a/scripts/classes/DieHard.js +++ b/scripts/classes/DieHard.js @@ -77,17 +77,17 @@ export default class DieHard { static getDefaultSimpleKarmaSettings() { return { enabled: false, - history: 5, - threshold: 5, - floor: 5 + history: 2, + threshold: 7, + floor: 13 } } static getAvgSimpleKarmaSettings() { return { - enabled: false, - history: 5, - threshold: 5, + enabled: false, + history: 3, + threshold: 7, nudge: 5 } } @@ -158,27 +158,33 @@ export default class DieHard { config: false, }); - // Enables fudge - game.settings.register('foundry-die-hard', 'simpleKarmaSettings', { - name: 'Simple Karma Settings', - hint: 'Simple Karma Settings', - scope: 'world', - config: false, - default: DieHard.getDefaultSimpleKarmaSettings(), - type: Object - }); - - // Enables karma - game.settings.register('foundry-die-hard', 'avgKarmaSettings', { - name: 'Average Karma Settings', - hint: 'Average Karma Settings', - scope: 'world', - config: false, - default: DieHard.getAvgSimpleKarmaSettings(), - type: Object - }); + // Simple Karma + game.settings.register('foundry-die-hard', 'simpleKarmaSettings', { + name: 'Simple Karma Settings', + hint: 'Simple Karma Settings', + scope: 'world', + config: false, + default: DieHard.getDefaultSimpleKarmaSettings(), + type: Object + }); + // Average Karma + game.settings.register('foundry-die-hard', 'avgKarmaSettings', { + name: 'Average Karma Settings', + hint: 'Average Karma Settings', + scope: 'world', + config: false, + default: DieHard.getAvgSimpleKarmaSettings(), + type: Object + }); + // Karma Who + game.settings.register('foundry-die-hard', 'karmaWho', { + scope: 'world', + config: false, + default: [], + type: Array + }); } static async refreshDieHardStatus() { diff --git a/scripts/classes/DieHardDnd5e.js b/scripts/classes/DieHardDnd5e.js index d5e79ea..d331c57 100644 --- a/scripts/classes/DieHardDnd5e.js +++ b/scripts/classes/DieHardDnd5e.js @@ -74,7 +74,7 @@ export default class DieHardDnd5e extends DieHardSystem{ this.dmToGm('DieHard-Fudge: Fudge not needed, but still wiped from actor...'); } else { gen_new_result = true; - let dmMessage = "Fudge (" + result.data.fudgeHow + ") values:" + result.total; + let dmMessage = "Fudge (" + result.data.fudgeHow + ")\nValues:" + result.total; // This is a safety to prevent endless loops from possibly sneaking in let SafetyLoopIndex = game.settings.get('foundry-die-hard', 'dieHardSettings').fudgeConfig.maxFudgeAttemptsPerRoll; diff --git a/scripts/classes/DieHardKarmaDialog.js b/scripts/classes/DieHardKarmaDialog.js index 849b232..b4be8ac 100644 --- a/scripts/classes/DieHardKarmaDialog.js +++ b/scripts/classes/DieHardKarmaDialog.js @@ -34,7 +34,10 @@ export default class DieHardKarmaDialog extends FormApplication { simpleKarma: DieHardSetting('simpleKarmaSettings'), simpleKarmaPlayerStats: this.getkarmaPlayerStats('simpleKarma'), avgKarma: DieHardSetting('avgKarmaSettings'), - avgKarmaPlayerStats: this.getkarmaPlayerStats('avgKarmaData') + avgKarmaPlayerStats: this.getkarmaPlayerStats('avgKarmaData'), + whoGmOptions: game.dieHardSystem.getFudgeWhoGmOptions(), + whoUserOptions: game.dieHardSystem.getFudgeWhoUserOptions(), + //whoActorOptions: game.dieHardSystem.getFudgeWhoActorOptions(), }; dieHardLog(false, 'DieHardKarmaDialog.getData', dialogData) return dialogData; @@ -78,7 +81,7 @@ export default class DieHardKarmaDialog extends FormApplication { } async _updateObject(event, formData) { - dieHardLog(false, 'DieHardKarmaDialog._updateObject') + dieHardLog(false, 'DieHardKarmaDialog._updateObject'); if (formData.karmaSimpleEnabled && formData.karmaAvgEnabled) { document.getElementById('karmaWarningHeader').style.display = ''; @@ -88,14 +91,17 @@ export default class DieHardKarmaDialog extends FormApplication { document.getElementById('karmaWarningBody').style.display = 'none'; } - let originalKarmaSimpleSettings = game.settings.get('foundry-die-hard', 'simpleKarmaSettings') + const who = formData.karmaWho.filter(Boolean); + await game.settings.set('foundry-die-hard', 'karmaWho', who); + + let originalKarmaSimpleSettings = DieHardSetting('simpleKarmaSettings'); let karmaSimpleSettings = { enabled: formData.karmaSimpleEnabled, history: formData.karmaSimpleHistory, threshold: formData.karmaSimpleThreshold, floor: formData.karmaSimpleFloor } - await game.settings.set('foundry-die-hard', 'simpleKarmaSettings', karmaSimpleSettings) + await game.settings.set('foundry-die-hard', 'simpleKarmaSettings', karmaSimpleSettings); if (formData.karmaSimpleEnabled) { document.getElementById('divKarmaSimpleHistory').style.display = ''; document.getElementById('divKarmaSimpleThreshold').style.display = ''; @@ -108,7 +114,7 @@ export default class DieHardKarmaDialog extends FormApplication { document.getElementById('divKarmaSimplePlayerStats').style.display = 'none'; } - let originalKarmaAvgSettings = game.settings.get('foundry-die-hard', 'avgKarmaSettings') + let originalKarmaAvgSettings = DieHardSetting('avgKarmaSettings'); let karmaAvgSettings = { enabled: formData.karmaAvgEnabled, history: formData.karmaAvgHistory, diff --git a/scripts/classes/DieHardPf2e.js b/scripts/classes/DieHardPf2e.js index aa193be..2b37af5 100644 --- a/scripts/classes/DieHardPf2e.js +++ b/scripts/classes/DieHardPf2e.js @@ -1,19 +1,20 @@ -import {dieHardLog} from "../lib/helpers.js"; - -import DieHardSystem from "./DieHardSystem.js"; -import {DieHardSetting} from "./DieHard.js"; +import { dieHardLog } from '../lib/helpers.js'; +import DieHardSystem from './DieHardSystem.js'; export default class DieHardPf2e extends DieHardSystem { - constructor() { - dieHardLog(false, 'DieHardPf2e.constructor'); - super(); + constructor() { + dieHardLog(false, 'DieHardPf2e.constructor'); + super(); - this.totalRollClassName = ["CheckRoll", "StrikeAttackRoll"] - this.fudgeWhatOptions = [] - } + this.totalRollClassName = [ + "Roll", + "CheckRoll", + "StrikeAttackRoll", + ]; + this.fudgeWhatOptions = []; + } - hookReady() { - dieHardLog(false, 'PF2e System Hook - Ready'); - } + hookReady() { + dieHardLog(false, 'PF2e System Hook - Ready'); + } } - diff --git a/scripts/classes/DieHardSystem.js b/scripts/classes/DieHardSystem.js index 4302efb..ce4080e 100644 --- a/scripts/classes/DieHardSystem.js +++ b/scripts/classes/DieHardSystem.js @@ -1,6 +1,6 @@ -import {dieHardLog, makeId} from '../lib/helpers.js'; -import DieHardFudgeRoll from './DieHardFudgeRoll.js'; -import DieHard, {DieHardSetting} from './DieHard.js'; +import {dieHardLog, makeId} from "../lib/helpers.js"; +import DieHardFudgeRoll from "./DieHardFudgeRoll.js"; +import DieHard, {DieHardSetting} from "./DieHard.js"; export default class DieHardSystem { constructor() { @@ -194,18 +194,14 @@ export default class DieHardSystem { gen_new_result = false; roll.result = newResult this.results.push(roll); - if (failedRolls.length === 0) { - DieHard.dmToGm('DieHard-Fudge: Total Fudge not needed (' + newResult + ' ' + userFudge.howFormula + ')'); - } else { - DieHard.dmToGm('DieHard-Fudge: Raw Fudge (' + userFudge.howFormula + ') values: ' + failedRolls.join(', ') + ' Final: ' + newResult); - } + DieHard.dmToGm("Raw Fudge (" + userFudge.howFormula + ")
Values: " + failedRolls.join(', ') + "
Final: " + newResult); } else { // New roll is insufficient, but lets at least check if it is "closer" if (game.dieHardSystem.isBetterFudge(roll.result, newResult, userFudge.operator, userFudge.operatorValue)) { - dieHardLog(false, functionLogName + ' - New result (' + newResult + ') insufficient (' + userFudge.fudgeOperator + ' ' + userFudge.fudgeOperatorValue + '), but at least better. Try again (tries left: ' + SafetyLoopIndex + ')...') + dieHardLog(false, functionLogName + ' - New result insufficient, but at least better (' + newResult + "). Try again (tries left: " + SafetyLoopIndex + ")...") roll.result = newResult } else { - dieHardLog(false, functionLogName + ' - New result (' + newResult + ') insufficient (' + userFudge.fudgeOperator + ' ' + userFudge.fudgeOperatorValue + '). Try again (tries left: ' + SafetyLoopIndex + ')...') + dieHardLog(false, functionLogName + ' - New result insufficient (' + newResult + "). Try again (tries left: " + SafetyLoopIndex + ")...") } failedRolls.push(newResult); } @@ -230,9 +226,10 @@ export default class DieHardSystem { } else if (this.faces !== 20) { dieHardLog(false, functionLogName + ' - Karma enabled, but wrong die type', this.faces); } else { - let simpleKarmaSettings = DieHardSetting('simpleKarmaSettings') - let avgKarmaSettings = DieHardSetting('avgKarmaSettings') - if (simpleKarmaSettings.enabled || avgKarmaSettings.enabled) { + let simpleKarmaSettings = DieHardSetting('simpleKarmaSettings'); + let avgKarmaSettings = DieHardSetting('avgKarmaSettings'); + const who = DieHardSetting('karmaWho'); + if ((who.length === 0 || who.includes(game.user.id)) && (simpleKarmaSettings.enabled || avgKarmaSettings.enabled)) { dieHardLog(false, functionLogName + ' - Karma is enabled', simpleKarmaSettings.enabled, avgKarmaSettings.enabled); // Make the initial roll @@ -290,7 +287,7 @@ export default class DieHardSystem { if (avgKarmaSettings.enabled) { dieHardLog(false, functionLogName + ' - Avg Karma', this); let avgKarmaData = game.users.current.getFlag('foundry-die-hard', 'avgKarmaData') - + if (avgKarmaData === undefined) { avgKarmaData = { history: [], @@ -351,7 +348,7 @@ export default class DieHardSystem { wrapRollEvaluate(wrapped, eval_options) { let uuid = makeId(6) let functionLogName = 'DieHardSystem.wrapRollEvaluate-' + uuid - dieHardLog(false, functionLogName, this, eval_options); + dieHardLog(false, functionLogName); if (! DieHardSetting('fudgeEnabled') ) { dieHardLog(false, functionLogName + ' - Fudge disabled'); @@ -398,13 +395,14 @@ export default class DieHardSystem { if (this instanceof CONFIG.Dice.DieHardFudgeRoll) { dieHardLog(false, functionLogName + 'e - recursive roll', this); } else { - dieHardLog(false, functionLogName + ' - base roll', this, result); + dieHardLog(false, functionLogName + ' - base roll', this); + dieHardLog(false, functionLogName + ' - result', result); let gen_new_result = false; let evalResult = game.dieHardSystem.evalFudge(this.total, this.data.fudgeOperator, this.data.fudgeOperatorValue) if (evalResult) { - dieHardLog(false, functionLogName + ' - Fudge not needed (' + this.total + ' ' + this.data.fudgeOperator + ' ' + this.data.fudgeOperatorValue + ')'); - DieHard.dmToGm('DieHard-Fudge: Total Fudge not needed (' + this.total + ' ' + this.data.fudgeOperator + ' ' + this.data.fudgeOperatorValue + ')'); + dieHardLog(false, functionLogName + ' - Fudge not needed, but still disabled'); + DieHard.dmToGm('DieHard-Fudge: Total Fudge not needed, but still disabled...'); dieHardLog(false, functionLogName + ' - dmToGm'); } else { @@ -420,15 +418,15 @@ export default class DieHardSystem { if (evalResult) { dieHardLog(false, functionLogName + ' - New result: ' + new_roll.total) gen_new_result = false; - foundry.utils.mergeObject(this, new_roll); - DieHard.dmToGm('DieHard-Fudge: Total Fudge (' + result.data.fudgeHow + ') values: ' + failedRolls.join(', ') + ' Final: ' + new_roll.total); + foundry.utils.mergeObject(this, new_roll, { recursive: false }); + DieHard.dmToGm("Total Fudge (" + result.data.fudgeHow + ")
Values: " + failedRolls.join(', ') + "
Final: " + new_roll.total); } else { // New roll is insufficient, but lets at least check if it is "closer" if (game.dieHardSystem.isBetterFudge(this.total, new_roll.total, this.data.fudgeOperator, this.data.fudgeOperatorValue)) { - dieHardLog(false, functionLogName + ' - New result (' + new_roll.total + ') insufficient (' + this.data.fudgeOperator + ' ' + this.data.fudgeOperatorValue + '), but at least better. Try again (tries left: ' + SafetyLoopIndex + ')...') - foundry.utils.mergeObject(this, new_roll); + dieHardLog(false, functionLogName + ' - New result insufficient, but at least better (' + new_roll.total + "). Try again (tries left: " + SafetyLoopIndex + ")...") + foundry.utils.mergeObject(this, new_roll, { recursive: false }); } else { - dieHardLog(false, functionLogName + ' - New result (' + new_roll.total + ') insufficient (' + this.data.fudgeOperator + ' ' + this.data.fudgeOperatorValue + '). Try again (tries left: ' + SafetyLoopIndex + ')...') + dieHardLog(false, functionLogName + ' - New result insufficient (' + new_roll.total + "). Try again (tries left: " + SafetyLoopIndex + ")...") } failedRolls.push(new_roll.total); } @@ -455,9 +453,10 @@ export default class DieHardSystem { getUsers(activeOnly = true, includeFudges = false, getGM = false, userId = null) { dieHardLog(false, 'DieHardSystem : getUsers', activeOnly, includeFudges, getGM, userId); if (game.settings.get('foundry-die-hard', 'dieHardSettings').debug.allActors) { - activeOnly = false + activeOnly = false; } - let activeUsers = [] + let activeUsers = []; + const who = DieHardSetting('karmaWho'); for (let userId of game.users.keys()) { let curUser = game.users.get(userId); let curUserType = curUser.isGM; @@ -466,7 +465,7 @@ export default class DieHardSystem { } if (activeOnly) { if (!(curUserType) && curUser.active) { - let newUser = {id: userId, name: curUser.name} + let newUser = { id: userId, name: curUser.name, karma: who.includes(userId) }; if (includeFudges) { newUser.fudges = curUser.getFlag('foundry-die-hard', 'fudges') if (!Array.isArray(newUser.fudges)){ @@ -477,7 +476,7 @@ export default class DieHardSystem { } } else { if (!(curUserType)) { - let newUser = {id: userId, name: curUser.name} + let newUser = { id: userId, name: curUser.name, karma: who.includes(userId) }; if (includeFudges) { newUser.fudges = curUser.getFlag('foundry-die-hard', 'fudges') if (!Array.isArray(newUser.fudges)){ @@ -488,7 +487,7 @@ export default class DieHardSystem { } } } - return activeUsers + return activeUsers; } /** @@ -541,8 +540,8 @@ export default class DieHardSystem { */ hasActiveKarma() { dieHardLog(false, 'DieHardSystem.hasActiveKarma') - let avgKarmaSettings = game.settings.get('foundry-die-hard', 'avgKarmaSettings') - let simpleKarmaSettings = game.settings.get('foundry-die-hard', 'simpleKarmaSettings') + let avgKarmaSettings = DieHardSetting('avgKarmaSettings'); + let simpleKarmaSettings = DieHardSetting('simpleKarmaSettings'); if (avgKarmaSettings.enabled || simpleKarmaSettings.enabled) { return true; } diff --git a/styles/die-hard.css b/styles/die-hard.css index 212fb54..7fa95cf 100644 --- a/styles/die-hard.css +++ b/styles/die-hard.css @@ -16,10 +16,13 @@ Inspiration/plagarism from https://gitlab.com/asacolips-projects/foundry-mods/fo .die-hard-blind-whisper { display: none; } +.die-hard-fudge-icon, .die-hard-karma-icon { + color: gray; +} #chat-controls #die-hard-pause-fudge-icon { flex: 0 0 0; padding-left: 0px; - color: #FFA500; + color: white; /*color: red; */ @@ -29,7 +32,7 @@ Inspiration/plagarism from https://gitlab.com/asacolips-projects/foundry-mods/fo margin-left: 5px; } #chat-controls .die-hard-icon-active { - color: #FFA500; + color: white; /* animation-name: fudge-icon-color; animation-duration: 2s; @@ -43,7 +46,7 @@ Inspiration/plagarism from https://gitlab.com/asacolips-projects/foundry-mods/fo } #chat-controls .die-hard-karma-icon-active { - color: #FFA500; + color: white; } .die-hard-column { @@ -172,7 +175,7 @@ div.die-hard-form-group { 50% { background-color: #ff6961; } - 100 { + 100% { background-color: initial; } } @@ -186,7 +189,7 @@ div.die-hard-form-group { background-color: #77DD77; -webkit-text-stroke: 1px #77DD77; } - 100 { + 100% { background-color: initial; -webkit-text-stroke: 1px #77DD77; } diff --git a/templates/die-hard-karma-config.html b/templates/die-hard-karma-config.html index 13278a3..6321cbf 100644 --- a/templates/die-hard-karma-config.html +++ b/templates/die-hard-karma-config.html @@ -6,7 +6,24 @@

Please be aware that having both Simple Karma and Avg Karma enabled at the same time may have unintended consequences. In particular, a die roll is first evaluated by Simple Karma (and adjusted if needed). The die roll is then evaluated by Avg Karma (with the avg influenced by the adjusted value, and adjusted again if needed).

- +

WHO: Who should be affected by karma?

+ + +
+ {{#each whoGmOptions}} + + {{/each}} +
+
+ {{#each whoUserOptions}} + + {{/each}} +
+
+ {{#each whoActorOptions}} + + {{/each}} +

Simple Karma: Gentle nudges...