export class Macros { /** * Creates a macro based on the type of data dropped onto the hotbar. * * @param {Object} dropData The data object representing the item dropped. * @param {string} dropData.type The type of the dropped item (e.g., "Actor", "JournalEntry", "roll"). * @param {string} dropData.uuid The UUID of the dropped item. * @param {string} [dropData.actorId] The ID of the actor (required if type is "roll"). * @param {string} [dropData.rollType] The type of roll (required if type is "roll"). * @param {string} [dropData.rollTarget] The target of the roll (required if type is "roll"). * @param {string} [dropData.value] The value of the roll (required if type is "roll"). * @param {number} slot The hotbar slot where the macro will be created. * * @returns {Promise} A promise that resolves when the macro is created. */ static createCthulhuEternalMacro = async function (dropData, slot) { switch (dropData.type) { case "Actor": const actor = await fromUuid(dropData.uuid) const actorCommand = `game.actors.get("${actor.id}").sheet.render(true)` this.createMacro(slot, actor.name, actorCommand, actor.img) break case "JournalEntry": const journal = await fromUuid(dropData.uuid) const journalCommand = `game.journal.get("${journal.id}").sheet.render(true)` this.createMacro(slot, journal.name, journalCommand, journal.img ? journal.img : "icons/svg/book.svg") break case "roll": const rollCommand = dropData.rollType === "save" ? `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollType}', '${dropData.rollTarget}', '=');` : `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollType}', '${dropData.rollTarget}');` const rollName = `${game.i18n.localize("TENEBRIS.Label.jet")} ${game.i18n.localize(`TENEBRIS.Manager.${dropData.rollTarget}`)}` this.createMacro(slot, rollName, rollCommand, "icons/svg/d20-grey.svg") break case "rollDamage": const weapon = game.actors.get(dropData.actorId).items.get(dropData.rollTarget) const rollDamageCommand = `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollType}', '${dropData.rollTarget}');` const rollDamageName = `${game.i18n.localize("TENEBRIS.Label.jet")} ${weapon.name}` this.createMacro(slot, rollDamageName, rollDamageCommand, weapon.img) break case "rollAttack": const rollAttackCommand = `game.actors.get('${dropData.actorId}').system.roll('${dropData.rollValue}', '${dropData.rollTarget}');` const rollAttackName = `${game.i18n.localize("TENEBRIS.Label.jet")} ${dropData.rollTarget}` this.createMacro(slot, rollAttackName, rollAttackCommand, "icons/svg/d20-grey.svg") break default: // Handle other cases or do nothing break } } /** * Create a macro * All macros are flaged with a tenebris.macro flag at true * @param {*} slot * @param {*} name * @param {*} command * @param {*} img */ static createMacro = async function (slot, name, command, img) { let macro = game.macros.contents.find((m) => m.name === name && m.command === command) if (!macro) { macro = await Macro.create( { name: name, type: "script", img: img, command: command, flags: { "tenebris.macro": true }, }, { displaySheet: false }, ) game.user.assignHotbarMacro(macro, slot) } } }