import { ErrorHandler } from "./errorslog.mjs"; /** * Класс RaceManager управляет расами и связанными с ними данными * * @class RaceManager * @description Предоставляет методы для работы с расами, включая загрузку, * получение случайных рас, подрас и имен персонажей. * * @example * // Создание экземпляра менеджера рас * const raceManager = new RaceManager("dnd5e"); * * @example * // Загрузка рас * await raceManager.loadRaces(); * * @example * // Получение случайной расы * const randomRace = raceManager.getRandomRace(); * * @param {string} systemName - Название игровой системы (например, "dnd5e") * @property {string} systemName - Название игровой системы * @property {string} racesPath - Путь к файлам с данными о расах * @property {Array} races - Массив с загруженными расами */ export class RaceManager { constructor(systemName) { this.systemName = systemName; this.racesPath = `/modules/test_tube_merchant/module/race/${this.systemName}`; this.races = []; } /** * Загружает все доступные расы из папки race * @returns {Promise} Массив с данными о расах */ async loadRaces() { try { const raceFiles = await FilePicker.browse('data', this.racesPath); const races = []; for (const file of raceFiles.files) { const response = await fetch(file); const raceData = await response.json(); races.push(raceData); } this.races = races; return races; } catch (error) { const errorHandler = ErrorHandler.getInstance(); const message = errorHandler.wrapError(error, "Загрузка рас"); ui.notifications.error(message); return []; } } /** * Возвращает список всех рас * @returns {Array} Массив с данми о расах */ getRaces() { return this.races; } /** * Возвращает случайную расу * @returns {Object|null} Данные выбранной расы или null при ошибке */ getRandomRace() { if (this.races.length === 0) return null; const randomIndex = Math.floor(Math.random() * this.races.length); return this.races[randomIndex]; } /** * Возвращает список подрас для указанной расы * @param {string} raceName - Название расы * @returns {Array|null} Массив с данными о подрасах или null, если раса не найдена */ getSubraces(raceName) { const race = this.races.find(r => r.name === raceName); return race ? race.list : null; } /** * Возвращает случайную подрасу для указанной расы * @param {string} raceName - Название расы * @returns {Object|null} Данные выбранной подрасы или null, если подрасы отсутствуют */ getRandomSubrace(raceName) { const subraces = this.getSubraces(raceName); if (!subraces || subraces.length === 0) return null; const randomIndex = Math.floor(Math.random() * subraces.length); return subraces[randomIndex]; } /** * Возвращает список имен для указанной расы и пола * @param {string} raceName - Название расы * @param {string} gender - Пол ("male" или "female") * @returns {Array|null} Массив с именами или null, если данные не найдены */ getNames(raceName, gender) { const race = this.races.find(r => r.name === raceName); if (!race || !race.list) return null; const subrace = race.list[0]; // Берем первую подрасу (можно адаптировать для выбора конкретной подрасы) if (!subrace || !subrace.src) return null; const names = subrace.src.find(s => s.name === gender); return names ? names.l.split(', ') : null; } /** * Возвращает случайное имя для указанной расы и пола * @param {string} raceName - Название расы * @param {string} gender - Пол ("male" или "female") * @returns {string|null} Случайное имя или null, если данные не найдены */ getRandomName(raceName, gender) { const names = this.getNames(raceName, gender); if (!names || names.length === 0) return null; const randomIndex = Math.floor(Math.random() * names.length); return names[randomIndex]; } } //Варелянка