From e8961afc5ed8afcf143db95e9d8632302e218a8e Mon Sep 17 00:00:00 2001 From: WBHarry Date: Thu, 6 Nov 2025 21:48:41 +0100 Subject: [PATCH] Added the clown car --- assets/icons/arrow-dunk.png | Bin 0 -> 26971 bytes lang/en.json | 4 +- module/applications/hud/tokenHUD.mjs | 105 ++++++++++++++++++++++- module/helpers/utils.mjs | 12 +++ styles/less/hud/token-hud/token-hud.less | 8 ++ templates/hud/tokenHUD.hbs | 8 ++ 6 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 assets/icons/arrow-dunk.png diff --git a/assets/icons/arrow-dunk.png b/assets/icons/arrow-dunk.png new file mode 100644 index 0000000000000000000000000000000000000000..1958713e9d40e7a63e35555439ae04a0118774b3 GIT binary patch literal 26971 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 literal 0 HcmV?d00001 diff --git a/lang/en.json b/lang/en.json index 7dacd0ea..3c6a9770 100755 --- a/lang/en.json +++ b/lang/en.json @@ -439,7 +439,9 @@ }, "HUD": { "tokenHUD": { - "genericEffects": "Foundry Effects" + "genericEffects": "Foundry Effects", + "depositPartyTokens": "Deposit Party Tokens", + "retrievePartyTokens": "Retrieve Party Tokens" } }, "Levelup": { diff --git a/module/applications/hud/tokenHUD.mjs b/module/applications/hud/tokenHUD.mjs index 48d5ac89..a5a3f490 100644 --- a/module/applications/hud/tokenHUD.mjs +++ b/module/applications/hud/tokenHUD.mjs @@ -1,8 +1,11 @@ +import { shuffleArray } from '../../helpers/utils.mjs'; + export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { static DEFAULT_OPTIONS = { classes: ['daggerheart'], actions: { - combat: DHTokenHUD.#onToggleCombat + combat: DHTokenHUD.#onToggleCombat, + togglePartyTokens: DHTokenHUD.#togglePartyTokens } }; @@ -19,6 +22,10 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { async _prepareContext(options) { const context = await super._prepareContext(options); + context.partyOnCanvas = this.actor.system.partyMembers.some(member => member.getActiveTokens().length > 0); + context.icons.toggleParty = 'systems/daggerheart/assets/icons/arrow-dunk.png'; + context.actorType = this.actor.type; + context.usesEffects = this.actor.type !== 'party'; context.canToggleCombat = DHTokenHUD.#nonCombatTypes.includes(this.actor.type) ? false : context.canToggleCombat; @@ -59,6 +66,102 @@ export default class DHTokenHUD extends foundry.applications.hud.TokenHUD { } } + static async #togglePartyTokens(_, button) { + const icon = button.querySelector('img'); + icon.classList.toggle('flipped'); + button.dataset.tooltip = game.i18n.localize( + icon.classList.contains('flipped') + ? 'DAGGERHEART.APPLICATIONS.HUD.tokenHUD.retrievePartyTokens' + : 'DAGGERHEART.APPLICATIONS.HUD.tokenHUD.depositPartyTokens' + ); + + const animationDuration = 500; + const activeTokens = this.actor.system.partyMembers.flatMap(member => member.getActiveTokens()); + const { x: actorX, y: actorY } = this.actor.token; + if (activeTokens.length > 0) { + for (let token of activeTokens) { + await token.document.update( + { x: actorX, y: actorY, alpha: 0 }, + { animation: { duration: animationDuration } } + ); + setTimeout(() => token.document.delete(), animationDuration); + } + } else { + const activeScene = game.scenes.find(x => x.active); + const newTokens = await activeScene.createEmbeddedDocuments( + 'Token', + this.actor.system.partyMembers.map(member => ({ + ...member.getTokenDocument(), + actorId: member.id, + actorLink: true, + alpha: 0, + x: actorX, + y: actorY + })) + ); + + const { sizeX, sizeY } = activeScene.grid; + const nrRandomPositions = Math.ceil(newTokens.length / 8) * 8; + /* This is an overcomplicated mess, but I'm stupid */ + const positions = shuffleArray( + [...Array(nrRandomPositions).keys()].map((_, index) => { + const nonZeroIndex = index + 1; + const indexFloor = Math.floor(index / 8); + const distanceCoefficient = indexFloor + 1; + const side = 3 + indexFloor * 2; + const sideMiddle = Math.ceil(side / 2); + const inbetween = 1 + indexFloor * 2; + const inbetweenMiddle = Math.ceil(inbetween / 2); + + if (index < side) { + const distance = + nonZeroIndex === sideMiddle + ? 0 + : nonZeroIndex < sideMiddle + ? -nonZeroIndex + : nonZeroIndex - sideMiddle; + return { x: actorX - sizeX * distance, y: actorY - sizeY * distanceCoefficient }; + } else if (index < side + inbetween) { + const inbetweenIndex = nonZeroIndex - side; + const distance = + inbetweenIndex === inbetweenMiddle + ? 0 + : inbetweenIndex < inbetweenMiddle + ? -inbetweenIndex + : inbetweenIndex - inbetweenMiddle; + return { x: actorX + sizeX * distanceCoefficient, y: actorY + sizeY * distance }; + } else if (index < 2 * side + inbetween) { + const sideIndex = nonZeroIndex - side - inbetween; + const distance = + sideIndex === sideMiddle + ? 0 + : sideIndex < sideMiddle + ? sideIndex + : -(sideIndex - sideMiddle); + return { x: actorX + sizeX * distance, y: actorY + sizeY * distanceCoefficient }; + } else { + const inbetweenIndex = nonZeroIndex - 2 * side - inbetween; + const distance = + inbetweenIndex === inbetweenMiddle + ? 0 + : inbetweenIndex < inbetweenMiddle + ? inbetweenIndex + : -(inbetweenIndex - inbetweenMiddle); + return { x: actorX - sizeX * distanceCoefficient, y: actorY + sizeY * distance }; + } + }) + ); + + for (let token of newTokens) { + const position = positions.pop(); + token.update( + { x: position.x, y: position.y, alpha: 1 }, + { animation: { duration: animationDuration } } + ); + } + } + } + _getStatusEffectChoices() { // Include all HUD-enabled status effects const choices = {}; diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index dbf66ff4..3044cd71 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -418,3 +418,15 @@ export async function createEmbeddedItemsWithEffects(actor, baseData) { export const slugify = name => { return name.toLowerCase().replaceAll(' ', '-').replaceAll('.', ''); }; + +export function shuffleArray(array) { + let currentIndex = array.length; + while (currentIndex != 0) { + let randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex--; + + [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; + } + + return array; +} diff --git a/styles/less/hud/token-hud/token-hud.less b/styles/less/hud/token-hud/token-hud.less index 7d231e8c..c73c611b 100644 --- a/styles/less/hud/token-hud/token-hud.less +++ b/styles/less/hud/token-hud/token-hud.less @@ -6,5 +6,13 @@ font-weight: bold; } } + + .clown-car img { + transition: 0.5s; + + &.flipped { + transform: scaleX(-1); + } + } } } diff --git a/templates/hud/tokenHUD.hbs b/templates/hud/tokenHUD.hbs index 197b94f7..0ea047c5 100644 --- a/templates/hud/tokenHUD.hbs +++ b/templates/hud/tokenHUD.hbs @@ -40,6 +40,7 @@ {{/if}} + {{#if usesEffects}} @@ -54,6 +55,13 @@ {{/each}} {{/if}} + {{/if}} + + {{#if (eq actorType 'party')}} + + {{/if}}