{ "name": "Magie et Capacités des Employés", "type": "script", "command": "// =========================================================\n// 1. RECUPERATION DES PC (employés)\n// =========================================================\nconst pcs = game.actors.filter(a => a.type === \"character\" || a.hasPlayerOwner);\n\nif (pcs.length === 0) {\n ui.notifications.warn(\"Aucun personnage de joueur trouvé.\");\n return;\n}\n\n// =========================================================\n// 2. CONSTRUCTION DU CODE HTML (avec onglets et panel)\n// =========================================================\nlet tabsHtml = `
`;\nlet panelsHtml = ``;\n\n// =========================================================\n// 3. POUR CHAQUE PC\n// =========================================================\npcs.forEach((pc, index) => {\n const sys = pc.system || {};\n \n // ---------------------------\n // Bouton d'onglet\n // ---------------------------\n tabsHtml += `\n \n `;\n \n // ---------------------------\n // Données martiales\n // ---------------------------\n const focus = \"Δ\" + sys.magie?.focus?.delta ?? 0;\n const ptsMagie = sys.magie?.focus?.resultat ?? 0;\n\n // ---------------------------\n // Equipements\n // ---------------------------\n const items = pc.items ? pc.items.contents : [];\n let magieHtml = \"\";\n let capacitesHtml = \"\";\n\n // ---------------------------\n // POUR CHAQUE CAPACITE\n // ---------------------------\n items.forEach(item => {\n const itemSys = item.system || {};\n \n // ---------------------------\n // --- TRAITEMENT DES CAPACITES ---\n // ---------------------------\n if (item.type === \"capacite\") {\n const cout = itemSys.cout ?? \"\";\n const effet = itemSys.effet ?? \"\";\n const notes = itemSys.notes ? `

Note: ${itemSys.notes}

` : \"\";\n const desc = item.description || itemSys.description;\n const descHtml = desc && desc.trim() !== \"\" ? `
${desc}
` : \"\";\n\n capacitesHtml += `\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
${item.name}
Cout :${cout}
Effet :${effet}
Description :${descHtml}
Notes :${notes}
\n
\n
\n
`;\n }\n\n // ---------------------------\n // --- TRAITEMENT DES SORTS ---\n // ---------------------------\n if (item.type === \"sortilege\") {\n const cout = itemSys.coutPv ?? \"\";\n const carac = itemSys.caracteristique ?? \"\";\n const effet = itemSys.effet ?? \"\";\n const degats = itemSys.degats ?? \"\";\n const difficulte = itemSys.difficulte ?? 0;\n const duree = itemSys.duree ?? \"\";\n const portee = itemSys.portee ?? \"\"; \n \n const notes = itemSys.notes ? `

Note: ${itemSys.notes}

` : \"\";\n const desc = item.description || itemSys.description;\n const descHtml = desc && desc.trim() !== \"\" ? `
${desc}
` : \"\";\n\n magieHtml += `\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
${item.name}${carac}${cout} PV
Dégats :${degats}Portée :${portee}Durée :${duree}Diff. :${difficulte}
Effet :${effet}
Notes :${notes}
Description :${descHtml}
\n
\n
\n
`;\n }\n });\n\n if (!capacitesHtml) capacitesHtml = `

Aucune capacité.

`;\n if (!magieHtml) magieHtml = `

Aucun sort.

`;\n\n panelsHtml += `\n
\n
\n
\n Focus\n

${focus}

\n
\n
\n Focus restant\n

${ptsMagie}

\n
\n
\n\n
\n

Sorts

\n
${magieHtml}
\n
\n\n
\n

Capacités

\n
${capacitesHtml}
\n
\n
`;\n});\n\ntabsHtml += `
`;\n\nlet content = `\n
\n
\n

Capacités Spéciales et Magiques des Employés

\n ${tabsHtml}\n
\n ${panelsHtml}\n
\n
\n
\n`;\n\n// =========================================================\n// 4. AFFICHE DE LA BOITE DE DIALOGUE\n// =========================================================\nconst dialog = await foundry.applications.api.DialogV2.wait({\n window: {\n title: \"Capacités Spéciales et Magiques des Employés\",\n icon: \"fa-solid fa-shield-halved\"\n },\n content: content,\n classes: [\"fvtt-donjon-et-cie\"],\n buttons: [\n {\n action: \"close\",\n label: \"Fermer\",\n icon: \"fas fa-xmark\",\n callback: () => ({action: \"Fermer\"})\n } \n ],\n rejectClose: false,\n render: (event, dialog) => {\n const root = dialog.element;\n \n const triggers = root.querySelectorAll('.custom-tab-trigger');\n const panels = root.querySelectorAll('.custom-pc-panel');\n \n const setActiveTab = (activeId) => {\n triggers.forEach(btn => {\n const pcId = btn.getAttribute('data-pc-id');\n if (pcId === activeId) {\n btn.style.setProperty('background', '#8b2e17', 'important');\n btn.style.setProperty('color', '#ffffff', 'important');\n btn.style.setProperty('border-color', '#561d0e', 'important');\n } else {\n btn.style.setProperty('background', 'rgba(226, 208, 177, 0.6)', 'important');\n btn.style.setProperty('color', '#221b18', 'important');\n btn.style.setProperty('border-color', '#561d0e', 'important');\n }\n });\n \n panels.forEach(panel => {\n const panelId = panel.getAttribute('id');\n if (panelId === `panel-pc-${activeId}`) {\n panel.style.setProperty('display', 'block', 'important');\n } else {\n panel.style.setProperty('display', 'none', 'important');\n }\n });\n };\n \n if (triggers.length > 0) {\n const firstId = triggers[0].getAttribute('data-pc-id');\n setActiveTab(firstId);\n }\n \n triggers.forEach(btn => {\n btn.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n const pcId = btn.getAttribute('data-pc-id');\n setActiveTab(pcId);\n });\n });\n }, \n submit: (result) => {}\n});", "img": "icons/magic/air/air-smoke-casting.webp", "author": "eibNkxM8PO50SgGM", "scope": "global", "folder": null, "flags": {}, "_stats": { "compendiumSource": null, "duplicateSource": null, "exportSource": { "worldId": "donjon-et-cie", "uuid": "Macro.ONARNmaGsRGT32S6", "coreVersion": "13.351", "systemId": "fvtt-donjon-et-cie", "systemVersion": "14.0.14" }, "coreVersion": "13.351", "systemId": "fvtt-donjon-et-cie", "systemVersion": "14.0.14", "createdTime": 1780387298591, "modifiedTime": 1780424861265, "lastModifiedBy": "eibNkxM8PO50SgGM" }, "ownership": { "default": 0 } }