MSAgent-Chat/msagent.js/src/character.ts

53 lines
1.5 KiB
TypeScript
Raw Normal View History

import { BufferStream, SeekDir } from './buffer.js';
import { LOCATION } from './structs/core.js';
import { AcsCharacterInfo } from './structs/character.js';
import { AcsAnimationEntry } from './structs/animation.js';
import { AcsImageEntry } from './structs/image.js';
2024-07-09 19:47:10 -04:00
import { Agent } from './agent.js';
// Data
2024-07-09 19:47:10 -04:00
export class AcsData {
characterInfo = new AcsCharacterInfo();
animInfo: AcsAnimationEntry[] = [];
images: AcsImageEntry[] = [];
}
function agentCharacterParseACS(buffer: BufferStream): AcsData {
// Make sure the magic is correct for the ACS file.
if (buffer.readU32LE() != 0xabcdabc3) {
throw new Error('The provided data buffer does not contain valid ACS data.');
}
let acsData = new AcsData();
// Read the rest of the header.
let characterInfoLocation = LOCATION.read(buffer);
let animationInfoLocation = LOCATION.read(buffer);
let imageInfoLocation = LOCATION.read(buffer);
let audioInfoLocation = LOCATION.read(buffer);
buffer.withOffset(characterInfoLocation.offset, () => {
acsData.characterInfo = AcsCharacterInfo.read(buffer);
});
buffer.withOffset(animationInfoLocation.offset, () => {
acsData.animInfo = buffer.readCountedList(() => {
return AcsAnimationEntry.read(buffer);
});
});
buffer.withOffset(imageInfoLocation.offset, () => {
acsData.images = buffer.readCountedList(() => {
return AcsImageEntry.read(buffer);
});
});
2024-07-09 19:47:10 -04:00
return acsData;
}
export function agentCreateCharacter(data: Uint8Array): Agent {
return new Agent(agentCharacterParseACS(new BufferStream(data)));
}