diff --git a/langs/en-ca.json b/langs/en-ca.json index 65bb80d..adda6f2 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -11,6 +11,9 @@ "shield": "Shield", "skill": "Skill", "weapon": "Weapon" + }, + "RegionBehavior": { + "difficultyDelta": "Condition Delta" } }, "RipCrypt": { @@ -189,6 +192,16 @@ "current-tour": "Current Delve Tour", "next-tour": "Next Delve Tour", "prev-tour": "Previous Delve Tour" + }, + "region": { + "difficultyDelta": { + "FIELDS": { + "delta": { + "label": "Delta", + "hint": "How much should actors in this area have their difficulty changed from the global value." + } + } + } } } } diff --git a/module/data/Behavior/DifficultyDelta.mjs b/module/data/Behavior/DifficultyDelta.mjs new file mode 100644 index 0000000..3a6691f --- /dev/null +++ b/module/data/Behavior/DifficultyDelta.mjs @@ -0,0 +1,71 @@ +import { Logger } from "../../utils/Logger.mjs"; + +const { fields } = foundry.data; +const { RegionBehaviorType } = foundry.data.regionBehaviors; + +export class DifficultyDeltaBehaviorData extends RegionBehaviorType { + static LOCALIZATION_PREFIXES = [`RipCrypt.region.difficultyDelta`]; + + static defineSchema() { + return { + delta: new fields.NumberField({ + required: true, + initial: 1, + }), + }; + }; + + static events = { + [CONST.REGION_EVENTS.TOKEN_ENTER]: this.#onTokenEnter, + [CONST.REGION_EVENTS.TOKEN_EXIT]: this.#onTokenExit, + }; + + static async #onTokenEnter(event) { + Logger.debug(`token enter`, event, this); + const actor = event.data.token.actor; + // const token = event.data.token.object; + // Logger.debug(token.center, token.h) + if (!actor) { return }; + + let delta = actor.getFlag(game.system.id, `dcDelta`) ?? 0; + delta += this.delta; + actor.setFlag(game.system.id, `dcDelta`, delta); + ui.notifications.info(`Updated delta to: ${delta}`); + Logger.debug(`Updated delta to:`, delta); + // await canvas.interface.createScrollingText( + // token.center, + // delta, + // { + // distance: 2 * token.h, + // fontSize: 40, + // fill: `#aa0000`, + // } + // ); + }; + + static async #onTokenExit(event) { + Logger.debug(`token exit`, event, this); + const actor = event.data.token.actor; + // const token = event.data.token.object; + if (!actor) { return }; + + let delta = actor.getFlag(game.system.id, `dcDelta`) ?? 0; + delta -= this.delta; + if (delta === 0) { + actor.unsetFlag(game.system.id, `dcDelta`); + } else { + actor.setFlag(game.system.id, `dcDelta`, delta); + }; + ui.notifications.info(`Updated delta to: ${delta}`); + Logger.debug(`Updated delta to:`, delta); + // await canvas.interface.createScrollingText( + // token.center, + // delta, + // { + // distance: 2 * token.h, + // fontSize: 40, + // fill: `#00aa00`, + // } + // ); + }; +}; diff --git a/module/hooks/init.mjs b/module/hooks/init.mjs index 547ea3e..41b6476 100644 --- a/module/hooks/init.mjs +++ b/module/hooks/init.mjs @@ -10,6 +10,7 @@ import { RipCryptCombatTracker } from "../Apps/sidebar/CombatTracker.mjs"; import { AmmoData } from "../data/Item/Ammo.mjs"; import { ArmourData } from "../data/Item/Armour.mjs"; import { CraftData } from "../data/Item/Craft.mjs"; +import { DifficultyDeltaBehaviorData } from "../data/Behavior/DifficultyDelta.mjs"; import { GoodData } from "../data/Item/Good.mjs"; import { HeroData } from "../data/Actor/Hero.mjs"; import { ShieldData } from "../data/Item/Shield.mjs"; @@ -56,6 +57,7 @@ Hooks.once(`init`, () => { CONFIG.Item.dataModels.shield = ShieldData; CONFIG.Item.dataModels.skill = SkillData; CONFIG.Item.dataModels.weapon = WeaponData; + CONFIG.RegionBehavior.dataModels.difficultyDelta = DifficultyDeltaBehaviorData; // #endregion // #region Class Changes diff --git a/system.json b/system.json index 9924bfe..0adbd73 100644 --- a/system.json +++ b/system.json @@ -51,6 +51,9 @@ "shield": {}, "skill": {}, "weapon": {} + }, + "RegionBehavior": { + "difficultyDelta": {} } } } \ No newline at end of file