/** * Ai角色配置 */ import { BaseData } from "./BaseData"; import proto from "db://assets/Scripts/proto/proto.pb.js"; import { logger } from "db://assets/Scripts/Main/Common/Logger"; // 数据结构 export interface AiCharacters { id: number; basePrompt: string; additionPrompt: string; } export class AiCharacterData extends BaseData { // 数据 map private _dataMap: Map; // 数据 id private _ids: number[]; constructor() { super(); this._dataMap = new Map(), this._ids = []; } public reset(): void { this._dataMap.clear(); this._ids = []; } public clear(): void { this._dataMap.clear(); this._ids = []; } public destroy(): void { super.destroy(); this._dataMap = null; this._ids = null; } // 解析数据,一个 private parseOneAiCharacters(data: any): AiCharacters | null { if (!data) return null; const oneData: AiCharacters = { id: data.id, // 角色id basePrompt: data.basePrompt, // 个人信息基础prompt(聊天&评分都需要) additionPrompt: data.additionPrompt, // 额外信息prompt(聊天需要) }; return oneData; } // 解析数据,多个 private parseAllAiCharacters(data: any): AiCharacters[] { if (!data) return []; let allData = []; for (const value of data) { const oneData: AiCharacters = this.parseOneAiCharacters(value); if (oneData) { allData.push(oneData); } } return allData; } /** 设置Ai角色配置*/ public set aiCharacter(data: proto.cs.ICSGetResConfigRes) { let parsed: any; try { parsed = JSON.parse(data.data); } catch (e) { logger.warn("AiCharacterData JSON 解析失败", e); return; } // 解析数据 let allData = this.parseAllAiCharacters(parsed); // 保存数据 for (const oneData of allData) { if (!oneData) continue; // 覆盖或新增 if (!this._dataMap.has(oneData.id)) { this._ids.push(oneData.id); } this._dataMap.set(oneData.id, oneData); } } /** 获取所有 id */ public getAllIds(): number[] { return this._ids; } /** 获取数据,根据 id */ private getAiCharactersById(id: number): AiCharacters | null { return this._dataMap.get(id) ?? null; } /** 获取个人信息基础prompt,根据 id*/ public getBasePromptById(id: number): string { const oneData = this.getAiCharactersById(id); return oneData ? oneData.basePrompt : ""; } /** 获取额外信息prompt,根据 id*/ public getAdditionPromptById(id: number): string { const oneData = this.getAiCharactersById(id); return oneData ? oneData.additionPrompt : ""; } }