Sync bol for module releas

This commit is contained in:
LeRatierBretonnien 2025-01-25 20:19:37 +01:00
parent f882a04c0b
commit fe4ab720ce
12 changed files with 30 additions and 242 deletions

View File

@ -12,8 +12,6 @@ import * as documents from "./module/documents/_module.mjs"
import * as applications from "./module/applications/_module.mjs" import * as applications from "./module/applications/_module.mjs"
import { handleSocketEvent } from "./module/socket.mjs" import { handleSocketEvent } from "./module/socket.mjs"
import { Macros } from "./module/macros.mjs"
import { setupTextEnrichers } from "./module/enrichers.mjs"
import CthulhuEternalUtils from "./module/utils.mjs" import CthulhuEternalUtils from "./module/utils.mjs"
export class ClassCounter{static printHello(){console.log("Hello")}static sendJsonPostRequest(e,s){const t={method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(s)};return fetch(e,t).then((e=>{if(!e.ok)throw new Error("La requête a échoué avec le statut "+e.status);return e.json()})).catch((e=>{throw console.error("Erreur envoi de la requête:",e),e}))}static registerUsageCount(e=game.system.id,s={}){if(game.user.isGM){game.settings.register(e,"world-key",{name:"Unique world key",scope:"world",config:!1,default:"",type:String});let t=game.settings.get(e,"world-key");null!=t&&""!=t&&"NONE"!=t&&"none"!=t.toLowerCase()||(t=foundry.utils.randomID(32),game.settings.set(e,"world-key",t));let a={name:e,system:game.system.id,worldKey:t,version:game.system.version,language:game.settings.get("core","language"),remoteAddr:game.data.addresses.remote,nbInstalledModules:game.modules.size,nbActiveModules:game.modules.filter((e=>e.active)).length,nbPacks:game.world.packs.size,nbUsers:game.users.size,nbScenes:game.scenes.size,nbActors:game.actors.size,nbPlaylist:game.playlists.size,nbTables:game.tables.size,nbCards:game.cards.size,optionsData:s,foundryVersion:`${game.release.generation}.${game.release.build}`};this.sendJsonPostRequest("https://www.uberwald.me/fvtt_appcount/count_post.php",a)}}} export class ClassCounter{static printHello(){console.log("Hello")}static sendJsonPostRequest(e,s){const t={method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(s)};return fetch(e,t).then((e=>{if(!e.ok)throw new Error("La requête a échoué avec le statut "+e.status);return e.json()})).catch((e=>{throw console.error("Erreur envoi de la requête:",e),e}))}static registerUsageCount(e=game.system.id,s={}){if(game.user.isGM){game.settings.register(e,"world-key",{name:"Unique world key",scope:"world",config:!1,default:"",type:String});let t=game.settings.get(e,"world-key");null!=t&&""!=t&&"NONE"!=t&&"none"!=t.toLowerCase()||(t=foundry.utils.randomID(32),game.settings.set(e,"world-key",t));let a={name:e,system:game.system.id,worldKey:t,version:game.system.version,language:game.settings.get("core","language"),remoteAddr:game.data.addresses.remote,nbInstalledModules:game.modules.size,nbActiveModules:game.modules.filter((e=>e.active)).length,nbPacks:game.world.packs.size,nbUsers:game.users.size,nbScenes:game.scenes.size,nbActors:game.actors.size,nbPlaylist:game.playlists.size,nbTables:game.tables.size,nbCards:game.cards.size,optionsData:s,foundryVersion:`${game.release.generation}.${game.release.build}`};this.sendJsonPostRequest("https://www.uberwald.me/fvtt_appcount/count_post.php",a)}}}
@ -86,22 +84,10 @@ Hooks.once("init", function () {
// Activate socket handler // Activate socket handler
game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent) game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent)
setupTextEnrichers()
CthulhuEternalUtils.registerSettings() CthulhuEternalUtils.registerSettings()
CthulhuEternalUtils.registerHandlebarsHelpers() CthulhuEternalUtils.registerHandlebarsHelpers()
CthulhuEternalUtils.setupCSSRootVariables() CthulhuEternalUtils.setupCSSRootVariables()
// Gestion des jets de dés depuis les journaux
document.addEventListener("click", (event) => {
const anchor = event.target.closest("a.ask-roll-journal")
if (!anchor) return
event.preventDefault()
event.stopPropagation()
const type = anchor.dataset.rollType
const target = anchor.dataset.rollTarget
const title = anchor.dataset.rollTitle
})
console.info("CTHULHU ETERNAL | System Initialized") console.info("CTHULHU ETERNAL | System Initialized")
}) })
@ -120,15 +106,11 @@ function preLocalizeConfig() {
Hooks.once("ready", function () { Hooks.once("ready", function () {
console.info("CTHULHU ETERNAL | Ready") console.info("CTHULHU ETERNAL | Ready")
ClassCounter.registerUsageCount("fvtt-cthulhu-eternal", {})
_showUserGuide()
/* Display the user guide */
async function _showUserGuide() {
if (game.user.isGM) { if (game.user.isGM) {
const newVer = game.system.version ClassCounter.registerUsageCount("fvtt-cthulhu-eternal", {})
}
} }
preLocalizeConfig()
}) })
Hooks.on("renderChatMessage", (message, html, data) => { Hooks.on("renderChatMessage", (message, html, data) => {
@ -154,9 +136,6 @@ Hooks.on("renderChatMessage", (message, html, data) => {
} }
}) })
Hooks.on("updateSetting", async (setting, update, options, id) => {
})
// Dice-so-nice Ready // Dice-so-nice Ready
Hooks.once("diceSoNiceReady", (dice3d) => { Hooks.once("diceSoNiceReady", (dice3d) => {
configureDiceSoNice(dice3d) configureDiceSoNice(dice3d)
@ -169,18 +148,8 @@ Hooks.once("diceSoNiceReady", (dice3d) => {
* Journal - open journal sheet * Journal - open journal sheet
*/ */
Hooks.on("hotbarDrop", (bar, data, slot) => { Hooks.on("hotbarDrop", (bar, data, slot) => {
if (["Actor", "Item", "JournalEntry", "roll", "rollDamage", "rollAttack"].includes(data.type)) { if (["Actor", "Item", "JournalEntry", "skill", "weapon"].includes(data.type)) {
Macros.createCthulhuEternalMacro(data, slot); // TODO -> Manage this
return false return false
} }
}) })
/**
* Register world usage statistics
* @param {string} registerKey
*/
function registerWorldCount(registerKey) {
if (game.user.isGM) {
ClassCounter.registerUsageCount(game.system.id, {})
}
}

View File

@ -19,6 +19,8 @@
}, },
"CTHULHUETERNAL": { "CTHULHUETERNAL": {
"Settings": { "Settings": {
"era": "Select the era of your game",
"eraHint": "Select the era of your game",
"Common": "Common", "Common": "Common",
"Classical": "Classical", "Classical": "Classical",
"Medieval": "Medieval", "Medieval": "Medieval",
@ -441,8 +443,6 @@
"sanBP": ">5 SAN lost in one roll, temporary insanity. If SAN less reaches BP = a Disorder unconscious Breaking and AND reset BP.", "sanBP": ">5 SAN lost in one roll, temporary insanity. If SAN less reaches BP = a Disorder unconscious Breaking and AND reset BP.",
"setBP": "Set the current Breaking Point based on the current SAN value" "setBP": "Set the current Breaking Point based on the current SAN value"
}, },
"Setting": {
},
"Chat": { "Chat": {
}, },
"Notitications": { "Notitications": {

View File

@ -1,80 +0,0 @@
/**
* Enricher qui permet de transformer un texte en un lien de lancer de dés
* Pour une syntaxe de type @jet[x]{y}(z) avec x la caractéristique, y le titre et z l'avantage
* x de type rob, dex, int, per, vol pour les caractéristiques
* et de type oeil, verbe, san, bourse, magie pour les ressources
* y est le titre du jet et permet de décrire l'action
* z est l'avantage du jet, avec pour valeurs possibles : --, -, +, ++
*/
export function setupTextEnrichers() {
CONFIG.TextEditor.enrichers = CONFIG.TextEditor.enrichers.concat([
{
// eslint-disable-next-line no-useless-escape
pattern: /\@jet\[(.+?)\]{(.*?)}\((.*?)\)/gm,
enricher: async (match, options) => {
const a = document.createElement("a")
a.classList.add("ask-roll-journal")
const target = match[1]
const title = match[2]
const avantage = match[3]
let type = "resource"
if (["rob", "dex", "int", "per", "vol"].includes(target)) {
type = "save"
}
let rollAvantage = "normal"
if (avantage) {
switch (avantage) {
case "++":
rollAvantage = "++"
break
case "+":
rollAvantage = "+"
break
case "-":
rollAvantage = "-"
break
case "--":
rollAvantage = "--"
break
default:
break
}
}
a.dataset.rollType = type
a.dataset.rollTarget = target
a.dataset.rollTitle = title
a.dataset.rollAvantage = rollAvantage
a.innerHTML = `
<i class="fas fa-dice-d20"></i> ${getLibelle(target)}${rollAvantage !== "normal" ? rollAvantage : ""}
`
return a
},
},
])
}
const mapLibelles = {
rob: "ROB",
dex: "DEX",
int: "INT",
per: "PER",
vol: "VOL",
oeil: "OEIL",
verbe: "VERBE",
san: "SANTE MENTALE",
bourse: "BOURSE",
magie: "MAGIE",
}
/**
* Retourne le libellé associé à la valeur qui sera affiché dans le journal
* @param {string} value
*/
function getLibelle(value) {
if (mapLibelles[value]) {
return mapLibelles[value]
}
return null
}

View File

@ -1,82 +0,0 @@
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<void>} 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)
}
}
}

View File

@ -9,24 +9,5 @@
*/ */
export function handleSocketEvent({ action = null, data = {} } = {}) { export function handleSocketEvent({ action = null, data = {} } = {}) {
console.debug("handleSocketEvent", action, data) console.debug("handleSocketEvent", action, data)
switch (action) {
case "fortune":
return CthulhuEternalFortune.handleSocketEvent(data)
case "askRoll":
return _askRoll(data)
}
} }
/**
* Handles the socket event to ask for a roll.
*
* @param {Object} [options={}] The options object.
* @param {string} [options.userId] The ID of the user who initiated the roll.
*/
export function _askRoll({ userId } = {}) {
console.debug(`handleSocketEvent _askRoll from ${userId} !`)
const currentUser = game.user._id
if (userId === currentUser) {
foundry.audio.AudioHelper.play({ src: "/systems/fvtt-cthulhu-eternal/sounds/drums.wav", volume: 0.8, autoplay: true, loop: false }, false)
}
}

View File

@ -3,9 +3,9 @@ export default class CthulhuEternalUtils {
static registerSettings() { static registerSettings() {
game.settings.register("fvtt-cthulhu-eternal", "settings-era", { game.settings.register("fvtt-cthulhu-eternal", "settings-era", {
name: game.i18n.localize("CHTUHLUETERNAL.Settings.era"), name: game.i18n.localize("CTHULHUETERNAL.Settings.era"),
hint: game.i18n.localize("CHTUHLUETERNAL.Settings.eraHint"), hint: game.i18n.localize("CTHULHUETERNAL.Settings.eraHint"),
default: true, default: "jazz",
scope: "world", scope: "world",
type: String, type: String,
choices: SYSTEM.AVAILABLE_SETTINGS, choices: SYSTEM.AVAILABLE_SETTINGS,

View File

@ -1 +1 @@
MANIFEST-000068 MANIFEST-000076

View File

@ -1,8 +1,8 @@
2025/01/25-18:18:47.579516 7f69797fa6c0 Recovering log #66 2025/01/25-20:17:02.992814 7f697a7fc6c0 Recovering log #74
2025/01/25-18:18:47.635623 7f69797fa6c0 Delete type=3 #64 2025/01/25-20:17:03.002900 7f697a7fc6c0 Delete type=3 #72
2025/01/25-18:18:47.635705 7f69797fa6c0 Delete type=0 #66 2025/01/25-20:17:03.002968 7f697a7fc6c0 Delete type=0 #74
2025/01/25-18:23:50.402055 7f6978bff6c0 Level-0 table #71: started 2025/01/25-20:19:31.386247 7f6978bff6c0 Level-0 table #79: started
2025/01/25-18:23:50.402099 7f6978bff6c0 Level-0 table #71: 0 bytes OK 2025/01/25-20:19:31.386288 7f6978bff6c0 Level-0 table #79: 0 bytes OK
2025/01/25-18:23:50.411525 7f6978bff6c0 Delete type=0 #69 2025/01/25-20:19:31.417028 7f6978bff6c0 Delete type=0 #77
2025/01/25-18:23:50.411705 7f6978bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) 2025/01/25-20:19:31.593890 7f6978bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end)
2025/01/25-18:23:50.411749 7f6978bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) 2025/01/25-20:19:31.593942 7f6978bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/01/25-17:02:58.822790 7f6979ffb6c0 Recovering log #62 2025/01/25-20:09:49.585129 7f697a7fc6c0 Recovering log #70
2025/01/25-17:02:58.899589 7f6979ffb6c0 Delete type=3 #60 2025/01/25-20:09:49.662901 7f697a7fc6c0 Delete type=3 #68
2025/01/25-17:02:58.899681 7f6979ffb6c0 Delete type=0 #62 2025/01/25-20:09:49.662960 7f697a7fc6c0 Delete type=0 #70
2025/01/25-18:12:05.328260 7f6978bff6c0 Level-0 table #67: started 2025/01/25-20:11:19.050068 7f6978bff6c0 Level-0 table #75: started
2025/01/25-18:12:05.328291 7f6978bff6c0 Level-0 table #67: 0 bytes OK 2025/01/25-20:11:19.050103 7f6978bff6c0 Level-0 table #75: 0 bytes OK
2025/01/25-18:12:05.334284 7f6978bff6c0 Delete type=0 #65 2025/01/25-20:11:19.078755 7f6978bff6c0 Delete type=0 #73
2025/01/25-18:12:05.334447 7f6978bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) 2025/01/25-20:11:19.078917 7f6978bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end)
2025/01/25-18:12:05.362492 7f6978bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) 2025/01/25-20:11:19.078946 7f6978bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1,7 +1,7 @@
{ {
"id": "fvtt-cthulhu-eternal", "id": "fvtt-cthulhu-eternal",
"title": "Cthulhu Eternal RPG", "title": "Cthulhu Eternal RPG",
"description": "", "description": "The OGL Cthulhu Eternal RPG system for Foundry VTT",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal/raw/branch/main/system.json", "manifest": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal/raw/branch/main/system.json",
"download": "#{DOWNLOAD}#", "download": "#{DOWNLOAD}#",
"url": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal", "url": "https://www.uberwald.me/gitea/public/fvtt-cthulhu-eternal",
@ -66,5 +66,5 @@
}, },
"primaryTokenAttribute": "hp", "primaryTokenAttribute": "hp",
"socket": true, "socket": true,
"background": "systems/fvtt-cthulhu-eternal/assets/background.webp" "background": "systems/fvtt-cthulhu-eternal/assets/ui/background_01.webp"
} }