288 lines
7.5 KiB
TypeScript
288 lines
7.5 KiB
TypeScript
import { AvatarEditorUtilities } from './AvatarEditorUtilities';
|
|
|
|
export class FigureData
|
|
{
|
|
private static DEFAULT_DIRECTION: number = 4;
|
|
|
|
public static MALE: string = 'M';
|
|
public static FEMALE: string = 'F';
|
|
public static UNISEX: string = 'U';
|
|
public static SCALE: string = 'h';
|
|
public static STD: string = 'std';
|
|
public static DEFAULT_FRAME: string = '0';
|
|
public static FACE: string = 'hd';
|
|
public static HAIR: string = 'hr';
|
|
public static HAT: string = 'ha';
|
|
public static HEAD_ACCESSORIES: string = 'he';
|
|
public static EYE_ACCESSORIES: string = 'ea';
|
|
public static FACE_ACCESSORIES: string = 'fa';
|
|
public static JACKET: string = 'cc';
|
|
public static SHIRT: string = 'ch';
|
|
public static CHEST_ACCESSORIES: string = 'ca';
|
|
public static CHEST_PRINTS: string = 'cp';
|
|
public static TROUSERS: string = 'lg';
|
|
public static SHOES: string = 'sh';
|
|
public static TROUSER_ACCESSORIES: string = 'wa';
|
|
public static SET_TYPES = [ FigureData.FACE, FigureData.HAIR, FigureData.HAT, FigureData.HEAD_ACCESSORIES, FigureData.EYE_ACCESSORIES, FigureData.FACE_ACCESSORIES, FigureData.JACKET, FigureData.SHIRT, FigureData.CHEST_ACCESSORIES, FigureData.CHEST_PRINTS, FigureData.TROUSERS, FigureData.SHOES, FigureData.TROUSERS ];
|
|
|
|
private _data: Map<string, number>;
|
|
private _colors: Map<string, number[]>;
|
|
private _gender: string = 'M';
|
|
private _direction: number = FigureData.DEFAULT_DIRECTION;
|
|
private _avatarEffectType: number = -1;
|
|
private _notifier: () => void = null;
|
|
|
|
public loadAvatarData(figureString: string, gender: string): void
|
|
{
|
|
this._data = new Map();
|
|
this._colors = new Map();
|
|
this._gender = gender;
|
|
|
|
this.parseFigureString(figureString);
|
|
this.updateView();
|
|
}
|
|
|
|
private parseFigureString(figure: string): void
|
|
{
|
|
if(!figure) return;
|
|
|
|
const sets = figure.split('.');
|
|
|
|
if(!sets || !sets.length) return;
|
|
|
|
for(const set of sets)
|
|
{
|
|
const parts = set.split('-');
|
|
|
|
if(!parts.length) continue;
|
|
|
|
const setType = parts[0];
|
|
const setId = parseInt(parts[1]);
|
|
const colorIds: number[] = [];
|
|
|
|
let offset = 2;
|
|
|
|
while(offset < parts.length)
|
|
{
|
|
colorIds.push(parseInt(parts[offset]));
|
|
|
|
offset++;
|
|
}
|
|
|
|
if(!colorIds.length) colorIds.push(0);
|
|
|
|
this.savePartSetId(setType, setId, false);
|
|
this.savePartSetColourId(setType, colorIds, false);
|
|
}
|
|
}
|
|
|
|
public getPartSetId(setType: string): number
|
|
{
|
|
const existing = this._data.get(setType);
|
|
|
|
if(existing !== undefined) return existing;
|
|
|
|
return -1;
|
|
}
|
|
|
|
public getColorIds(setType: string): number[]
|
|
{
|
|
const existing = this._colors.get(setType);
|
|
|
|
if(existing !== undefined) return existing;
|
|
|
|
return [ AvatarEditorUtilities.avatarSetFirstSelectableColor(setType) ];
|
|
}
|
|
|
|
public getFigureString(): string
|
|
{
|
|
let figureString = '';
|
|
const setParts: string[] = [];
|
|
|
|
for(const [ setType, setId ] of this._data.entries())
|
|
{
|
|
const colorIds = this._colors.get(setType);
|
|
|
|
let setPart = ((setType + '-') + setId);
|
|
|
|
if(colorIds && colorIds.length)
|
|
{
|
|
let i = 0;
|
|
|
|
while(i < colorIds.length)
|
|
{
|
|
setPart = (setPart + ('-' + colorIds[i]));
|
|
|
|
i++;
|
|
}
|
|
}
|
|
|
|
setParts.push(setPart);
|
|
}
|
|
|
|
let i = 0;
|
|
|
|
while(i < setParts.length)
|
|
{
|
|
figureString = (figureString + setParts[i]);
|
|
|
|
if(i < (setParts.length - 1)) figureString = (figureString + '.');
|
|
|
|
i++;
|
|
}
|
|
|
|
return figureString;
|
|
}
|
|
|
|
public savePartData(setType: string, partId: number, colorIds: number[], update: boolean = false): void
|
|
{
|
|
this.savePartSetId(setType, partId, update);
|
|
this.savePartSetColourId(setType, colorIds, update);
|
|
}
|
|
|
|
private savePartSetId(setType: string, partId: number, update: boolean = true): void
|
|
{
|
|
switch(setType)
|
|
{
|
|
case FigureData.FACE:
|
|
case FigureData.HAIR:
|
|
case FigureData.HAT:
|
|
case FigureData.HEAD_ACCESSORIES:
|
|
case FigureData.EYE_ACCESSORIES:
|
|
case FigureData.FACE_ACCESSORIES:
|
|
case FigureData.SHIRT:
|
|
case FigureData.JACKET:
|
|
case FigureData.CHEST_ACCESSORIES:
|
|
case FigureData.CHEST_PRINTS:
|
|
case FigureData.TROUSERS:
|
|
case FigureData.SHOES:
|
|
case FigureData.TROUSER_ACCESSORIES:
|
|
if(partId >= 0)
|
|
{
|
|
this._data.set(setType, partId);
|
|
}
|
|
else
|
|
{
|
|
this._data.delete(setType);
|
|
}
|
|
break;
|
|
}
|
|
|
|
if(update) this.updateView();
|
|
}
|
|
|
|
public savePartSetColourId(setType: string, colorIds: number[], update: boolean = true): void
|
|
{
|
|
switch(setType)
|
|
{
|
|
case FigureData.FACE:
|
|
case FigureData.HAIR:
|
|
case FigureData.HAT:
|
|
case FigureData.HEAD_ACCESSORIES:
|
|
case FigureData.EYE_ACCESSORIES:
|
|
case FigureData.FACE_ACCESSORIES:
|
|
case FigureData.SHIRT:
|
|
case FigureData.JACKET:
|
|
case FigureData.CHEST_ACCESSORIES:
|
|
case FigureData.CHEST_PRINTS:
|
|
case FigureData.TROUSERS:
|
|
case FigureData.SHOES:
|
|
case FigureData.TROUSER_ACCESSORIES:
|
|
this._colors.set(setType, colorIds);
|
|
break;
|
|
}
|
|
|
|
if(update) this.updateView();
|
|
}
|
|
|
|
public getFigureStringWithFace(k: number, override = true): string
|
|
{
|
|
let figureString = '';
|
|
|
|
const setTypes: string[] = [ FigureData.FACE ];
|
|
const figureSets: string[] = [];
|
|
|
|
for(const setType of setTypes)
|
|
{
|
|
const colors = this._colors.get(setType);
|
|
|
|
if(!colors) continue;
|
|
|
|
let setId = this._data.get(setType);
|
|
|
|
if((setType === FigureData.FACE) && override) setId = k;
|
|
|
|
let figureSet = ((setType + '-') + setId);
|
|
|
|
if(setId >= 0)
|
|
{
|
|
let i = 0;
|
|
|
|
while(i < colors.length)
|
|
{
|
|
figureSet = (figureSet + ('-' + colors[i]));
|
|
|
|
i++;
|
|
}
|
|
}
|
|
|
|
figureSets.push(figureSet);
|
|
}
|
|
|
|
let i = 0;
|
|
|
|
while(i < figureSets.length)
|
|
{
|
|
figureString = (figureString + figureSets[i]);
|
|
|
|
if(i < (figureSets.length - 1)) figureString = (figureString + '.');
|
|
|
|
i++;
|
|
}
|
|
|
|
return figureString;
|
|
}
|
|
|
|
public updateView(): void
|
|
{
|
|
if(this.notify) this.notify();
|
|
}
|
|
|
|
public get gender(): string
|
|
{
|
|
return this._gender;
|
|
}
|
|
|
|
public get direction(): number
|
|
{
|
|
return this._direction;
|
|
}
|
|
|
|
public set direction(direction: number)
|
|
{
|
|
this._direction = direction;
|
|
|
|
this.updateView();
|
|
}
|
|
|
|
public set avatarEffectType(k: number)
|
|
{
|
|
this._avatarEffectType = k;
|
|
}
|
|
|
|
public get avatarEffectType(): number
|
|
{
|
|
return this._avatarEffectType;
|
|
}
|
|
|
|
public get notify(): () => void
|
|
{
|
|
return this._notifier;
|
|
}
|
|
|
|
public set notify(notifier: () => void)
|
|
{
|
|
this._notifier = notifier;
|
|
}
|
|
}
|