Build release archive / release (push) Failing after 28s
Изменено: - Поддержка новых типов товаров: "Механические приспособления" и "Религиозные товары". - Добавлена возможность случайной генерации уровня торговца. - Улучшена производительность при загрузке предметов из компендиумов. - Обновлены тексты описаний для категорий товаров. - Исправлена ошибка при добавлении предметов к торговцу (см. `module/data.mjs`, строки 2436-2446). - Исправлена проблема с отображением характеристик торговца в интерфейсе.
131 lines
5.3 KiB
JavaScript
Executable File
131 lines
5.3 KiB
JavaScript
Executable File
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<Array>} Массив с данными о расах
|
|
*/
|
|
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];
|
|
}
|
|
}
|
|
|
|
//Варелянка
|