Релиз v1.2.9
Build release archive / release (push) Failing after 28s

Изменено:
 - Поддержка новых типов товаров: "Механические приспособления" и "Религиозные товары".
 - Добавлена возможность случайной генерации уровня торговца.
 - Улучшена производительность при загрузке предметов из компендиумов.
 - Обновлены тексты описаний для категорий товаров.
 - Исправлена ошибка при добавлении предметов к торговцу (см. `module/data.mjs`, строки 2436-2446).
 - Исправлена проблема с отображением характеристик торговца в интерфейсе.
This commit is contained in:
2026-07-15 19:42:45 +03:00
parent 34782dc3b0
commit e21d8c5198
5611 changed files with 163869 additions and 0 deletions
+131
View File
@@ -0,0 +1,131 @@
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];
}
}
//Варелянка