Files
fvtt-chroniques-de-l-etrange/src/ui/apps/singletons.js

84 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Chroniques de l'Étrange — Système FoundryVTT
*
* Chroniques de l'Étrange est un jeu de rôle édité par Antre-Monde Éditions.
* Ce système FoundryVTT est une implémentation indépendante et n'est pas
* affilié à Antre-Monde Éditions,
* mais a été réalisé avec l'autorisation d'Antre-Monde Éditions.
*
* @author LeRatierBretonnien
* @copyright 20242026 LeRatierBretonnien
* @license CC BY-NC-SA 4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/
*/
/**
* Loksyu / TinJi settings-based helpers.
*
* Data is stored as world settings instead of singleton Actor documents.
*/
import { SYSTEM_ID, WU_XING_CYCLE, ASPECT_FACES } from "../../config/constants.js"
/** Read the current loksyu data object from world settings */
export function getLoksyuData() {
return game.settings.get(SYSTEM_ID, "loksyuData") ?? {
wood: {yin:0,yang:0}, fire: {yin:0,yang:0}, earth: {yin:0,yang:0}, metal: {yin:0,yang:0}, water: {yin:0,yang:0},
}
}
/** Write the loksyu data object to world settings */
export async function setLoksyuData(data) {
await game.settings.set(SYSTEM_ID, "loksyuData", data)
Hooks.callAll("cde:loksyuUpdated", data)
}
/** Read current TinJi value from world settings */
export function getTinjiValue() {
return game.settings.get(SYSTEM_ID, "tinjiData") ?? 0
}
/** Write TinJi value to world settings */
export async function setTinjiValue(value) {
await game.settings.set(SYSTEM_ID, "tinjiData", Math.max(0, value))
Hooks.callAll("cde:tinjiUpdated", Math.max(0, value))
}
/**
* After a WuXing roll, add the loksyu faces (yin + yang) of the relevant
* aspect to the loksyu settings data.
*
* @param {string} activeAspect - e.g. "fire"
* @param {Object} faces - Die face counts { 0: n, 1: n, …, 9: n }
*/
export async function updateLoksyuFromRoll(activeAspect, faces) {
const cycle = WU_XING_CYCLE[activeAspect]
if (!cycle) return
const lokAspect = cycle[3]
const [yinFace, yangFace] = ASPECT_FACES[lokAspect] ?? []
if (yinFace === undefined) return
const yinCount = faces[yinFace] ?? 0
const yangCount = faces[yangFace] ?? 0
if (yinCount === 0 && yangCount === 0) return
const data = getLoksyuData()
const current = data[lokAspect] ?? { yin: 0, yang: 0 }
data[lokAspect] = {
yin: (current.yin ?? 0) + yinCount,
yang: (current.yang ?? 0) + yangCount,
}
await setLoksyuData(data)
}
/**
* After a WuXing roll, add tinji faces to the TinJi settings.
*
* @param {number} count - Number of tinji faces rolled
*/
export async function updateTinjiFromRoll(count) {
if (!count || count <= 0) return
const current = getTinjiValue()
await setTinjiValue(current + count)
}