91 lines
3.0 KiB
TypeScript
91 lines
3.0 KiB
TypeScript
import { AvatarFigureContainer, IFigurePartSet, IPalette, IPartColor, SetType } from '@nitrots/nitro-renderer';
|
|
import { GetAvatarRenderManager } from '../nitro';
|
|
import { Randomizer } from '../utils';
|
|
import { FigureData } from './FigureData';
|
|
|
|
function getTotalColors(partSet: IFigurePartSet): number
|
|
{
|
|
const parts = partSet.parts;
|
|
|
|
let totalColors = 0;
|
|
|
|
for(const part of parts) totalColors = Math.max(totalColors, part.colorLayerIndex);
|
|
|
|
return totalColors;
|
|
}
|
|
|
|
function getRandomSetTypes(requiredSets: string[], options: string[]): string[]
|
|
{
|
|
options = options.filter(option => (requiredSets.indexOf(option) === -1));
|
|
|
|
return [ ...requiredSets, ...Randomizer.getRandomElements(options, (Randomizer.getRandomNumber(options.length) + 1)) ];
|
|
}
|
|
|
|
function getRandomPartSet(setType: SetType, gender: string, clubLevel: number = 0, figureSetIds: number[] = []): IFigurePartSet
|
|
{
|
|
if(!setType) return null;
|
|
|
|
const options = setType.partSets.getValues().filter(option =>
|
|
{
|
|
if(!option.isSelectable || ((option.gender !== 'U') && (option.gender !== gender)) || (option.clubLevel > clubLevel) || (option.isSellable && (figureSetIds.indexOf(option.id) === -1))) return null;
|
|
|
|
return option;
|
|
});
|
|
|
|
if(!options || !options.length) return null;
|
|
|
|
return Randomizer.getRandomElement(options);
|
|
}
|
|
|
|
function getRandomColors(palette: IPalette, partSet: IFigurePartSet, clubLevel: number = 0): IPartColor[]
|
|
{
|
|
if(!palette) return [];
|
|
|
|
const options = palette.colors.getValues().filter(option =>
|
|
{
|
|
if(!option.isSelectable || (option.clubLevel > clubLevel)) return null;
|
|
|
|
return option;
|
|
});
|
|
|
|
if(!options || !options.length) return null;
|
|
|
|
return Randomizer.getRandomElements(options, getTotalColors(partSet));
|
|
}
|
|
|
|
export function generateRandomFigure(figureData: FigureData, gender: string, clubLevel: number = 0, figureSetIds: number[] = [], ignoredSets: string[] = []): string
|
|
{
|
|
const structure = GetAvatarRenderManager().structure;
|
|
const figureContainer = new AvatarFigureContainer('');
|
|
const requiredSets = getRandomSetTypes(structure.getMandatorySetTypeIds(gender, clubLevel), FigureData.SET_TYPES);
|
|
|
|
for(const setType of ignoredSets)
|
|
{
|
|
const partSetId = figureData.getPartSetId(setType);
|
|
const colors = figureData.getColorIds(setType);
|
|
|
|
figureContainer.updatePart(setType, partSetId, colors);
|
|
}
|
|
|
|
for(const type of requiredSets)
|
|
{
|
|
if(figureContainer.hasPartType(type)) continue;
|
|
|
|
const setType = (structure.figureData.getSetType(type) as SetType);
|
|
const selectedSet = getRandomPartSet(setType, gender, clubLevel, figureSetIds);
|
|
|
|
if(!selectedSet) continue;
|
|
|
|
let selectedColors: number[] = [];
|
|
|
|
if(selectedSet.isColorable)
|
|
{
|
|
selectedColors = getRandomColors(structure.figureData.getPalette(setType.paletteID), selectedSet, clubLevel).map(color => color.id);
|
|
}
|
|
|
|
figureContainer.updatePart(setType.type, selectedSet.id, selectedColors);
|
|
}
|
|
|
|
return figureContainer.getFigureString();
|
|
}
|