nitro/apps/frontend/src/api/avatar/CategoryData.ts

419 lines
9.6 KiB
TypeScript

import {IPartColor} from "@nitro/renderer";
import {AvatarEditorGridColorItem} from "./AvatarEditorGridColorItem";
import {AvatarEditorGridPartItem} from "./AvatarEditorGridPartItem";
export class CategoryData {
private _name: string;
private _parts: AvatarEditorGridPartItem[];
private _palettes: AvatarEditorGridColorItem[][];
private _selectedPartIndex: number = -1;
private _paletteIndexes: number[];
constructor(name: string, partItems: AvatarEditorGridPartItem[], colorItems: AvatarEditorGridColorItem[][]) {
this._name = name;
this._parts = partItems;
this._palettes = colorItems;
this._selectedPartIndex = -1;
}
private static defaultColorId(palettes: AvatarEditorGridColorItem[], clubLevel: number): number {
if (!palettes || !palettes.length) return -1;
let i = 0;
while (i < palettes.length) {
const colorItem = palettes[i];
if (colorItem.partColor && colorItem.partColor.clubLevel <= clubLevel) {
return colorItem.partColor.id;
}
i++;
}
return -1;
}
public init(): void {
for (const part of this._parts) {
if (!part) continue;
part.init();
}
}
public dispose(): void {
if (this._parts) {
for (const part of this._parts) part.dispose();
this._parts = null;
}
if (this._palettes) {
for (const palette of this._palettes) for (const colorItem of palette) colorItem.dispose();
this._palettes = null;
}
this._selectedPartIndex = -1;
this._paletteIndexes = null;
}
public selectPartId(partId: number): void {
if (!this._parts) return;
let i = 0;
while (i < this._parts.length) {
const partItem = this._parts[i];
if (partItem.id === partId) {
this.selectPartIndex(i);
return;
}
i++;
}
}
public selectColorIds(colorIds: number[]): void {
if (!colorIds || !this._palettes) return;
this._paletteIndexes = new Array(colorIds.length);
let i = 0;
while (i < this._palettes.length) {
const palette = this.getPalette(i);
if (palette) {
let colorId = 0;
if (colorIds.length > i) {
colorId = colorIds[i];
} else {
const colorItem = palette[0];
if (colorItem && colorItem.partColor) colorId = colorItem.partColor.id;
}
let j = 0;
while (j < palette.length) {
const colorItem = palette[j];
if (colorItem.partColor.id === colorId) {
this._paletteIndexes[i] = j;
colorItem.isSelected = true;
} else {
colorItem.isSelected = false;
}
j++;
}
}
i++;
}
this.updatePartColors();
}
public selectPartIndex(partIndex: number): AvatarEditorGridPartItem {
if (!this._parts) return null;
if (this._selectedPartIndex >= 0 && this._parts.length > this._selectedPartIndex) {
const partItem = this._parts[this._selectedPartIndex];
if (partItem) partItem.isSelected = false;
}
if (this._parts.length > partIndex) {
const partItem = this._parts[partIndex];
if (partItem) {
partItem.isSelected = true;
this._selectedPartIndex = partIndex;
return partItem;
}
}
return null;
}
public selectColorIndex(colorIndex: number, paletteId: number): AvatarEditorGridColorItem {
const palette = this.getPalette(paletteId);
if (!palette) return null;
if (palette.length <= colorIndex) return null;
this.deselectColorIndex(this._paletteIndexes[paletteId], paletteId);
this._paletteIndexes[paletteId] = colorIndex;
const colorItem = palette[colorIndex];
if (!colorItem) return null;
colorItem.isSelected = true;
this.updatePartColors();
return colorItem;
}
public getCurrentColorIndex(k: number): number {
return this._paletteIndexes[k];
}
private deselectColorIndex(colorIndex: number, paletteIndex: number): void {
const palette = this.getPalette(paletteIndex);
if (!palette) return;
if (palette.length <= colorIndex) return;
const colorItem = palette[colorIndex];
if (!colorItem) return;
colorItem.isSelected = false;
}
public getSelectedColorIds(): number[] {
if (!this._paletteIndexes || !this._paletteIndexes.length) return null;
if (!this._palettes || !this._palettes.length) return null;
const palette = this._palettes[0];
if (!palette || !palette.length) return null;
const colorItem = palette[0];
if (!colorItem || !colorItem.partColor) return null;
const colorId = colorItem.partColor.id;
const colorIds: number[] = [];
let i = 0;
while (i < this._paletteIndexes.length) {
const paletteSet = this._palettes[i];
if (!(!paletteSet || paletteSet.length <= i)) {
if (paletteSet.length > this._paletteIndexes[i]) {
const color = paletteSet[this._paletteIndexes[i]];
if (color && color.partColor) {
colorIds.push(color.partColor.id);
} else {
colorIds.push(colorId);
}
} else {
colorIds.push(colorId);
}
}
i++;
}
const partItem = this.getCurrentPart();
if (!partItem) return null;
return colorIds.slice(0, Math.max(partItem.maxColorIndex, 1));
}
private getSelectedColors(): IPartColor[] {
const partColors: IPartColor[] = [];
let i = 0;
while (i < this._paletteIndexes.length) {
const colorItem = this.getSelectedColor(i);
if (colorItem) {
partColors.push(colorItem.partColor);
} else {
partColors.push(null);
}
i++;
}
return partColors;
}
public getSelectedColor(paletteId: number): AvatarEditorGridColorItem {
const palette = this.getPalette(paletteId);
if (!palette || palette.length <= this._paletteIndexes[paletteId]) return null;
return palette[this._paletteIndexes[paletteId]];
}
public getSelectedColorId(paletteId: number): number {
const colorItem = this.getSelectedColor(paletteId);
if (colorItem && colorItem.partColor) return colorItem.partColor.id;
return 0;
}
public getPalette(paletteId: number): AvatarEditorGridColorItem[] {
if (!this._paletteIndexes || !this._palettes || this._palettes.length <= paletteId) {
return null;
}
return this._palettes[paletteId];
}
public getCurrentPart(): AvatarEditorGridPartItem {
return this._parts[this._selectedPartIndex] as AvatarEditorGridPartItem;
}
private updatePartColors(): void {
const partColors = this.getSelectedColors();
for (const partItem of this._parts) {
if (partItem) partItem.partColors = partColors;
}
}
public hasClubSelectionsOverLevel(level: number): boolean {
let hasInvalidSelections = false;
const partColors = this.getSelectedColors();
if (partColors) {
let i = 0;
while (i < partColors.length) {
const partColor = partColors[i];
if (partColor && partColor.clubLevel > level) hasInvalidSelections = true;
i++;
}
}
const partItem = this.getCurrentPart();
if (partItem && partItem.partSet) {
const partSet = partItem.partSet;
if (partSet && partSet.clubLevel > level) hasInvalidSelections = true;
}
return hasInvalidSelections;
}
public hasInvalidSelectedItems(ownedItems: number[]): boolean {
const part = this.getCurrentPart();
if (!part) return false;
const partSet = part.partSet;
if (!partSet || !partSet.isSellable) return;
return ownedItems.indexOf(partSet.id) > -1;
}
public stripClubItemsOverLevel(level: number): boolean {
const partItem = this.getCurrentPart();
if (partItem && partItem.partSet) {
const partSet = partItem.partSet;
if (partSet.clubLevel > level) {
const newPartItem = this.selectPartIndex(0);
if (newPartItem && !newPartItem.partSet) this.selectPartIndex(1);
return true;
}
}
return false;
}
public stripClubColorsOverLevel(level: number): boolean {
const colorIds: number[] = [];
const partColors = this.getSelectedColors();
const colorItems = this.getPalette(0);
let didStrip = false;
const colorId = CategoryData.defaultColorId(colorItems, level);
if (colorId === -1) return false;
let i = 0;
while (i < partColors.length) {
const partColor = partColors[i];
if (!partColor) {
colorIds.push(colorId);
didStrip = true;
} else {
if (partColor.clubLevel > level) {
colorIds.push(colorId);
didStrip = true;
} else {
colorIds.push(partColor.id);
}
}
i++;
}
if (didStrip) this.selectColorIds(colorIds);
return didStrip;
}
// public stripInvalidSellableItems(k:IHabboInventory): boolean
// {
// var _local_3:IFigurePartSet;
// var _local_4:AvatarEditorGridPartItem;
// var _local_2:AvatarEditorGridPartItem = this._Str_6315();
// if (((_local_2) && (_local_2.partSet)))
// {
// _local_3 = _local_2.partSet;
// if (((_local_3.isSellable) && (!(k._Str_14439(_local_3.id)))))
// {
// _local_4 = this._Str_8066(0);
// if (((!(_local_4 == null)) && (_local_4.partSet == null)))
// {
// this._Str_8066(1);
// }
// return true;
// }
// }
// return false;
// }
public get name(): string {
return this._name;
}
public get parts(): AvatarEditorGridPartItem[] {
return this._parts;
}
public get selectedPartIndex(): number {
return this._selectedPartIndex;
}
}