coreize-msagent #20
5 changed files with 54 additions and 54 deletions
|
@ -8,3 +8,5 @@ export * from './structs/image.js';
|
|||
|
||||
export * from './types.js';
|
||||
export * from './decompress.js';
|
||||
|
||||
export * from './parse.js';
|
||||
|
|
46
msagent.js/core/src/parse.ts
Normal file
46
msagent.js/core/src/parse.ts
Normal file
|
@ -0,0 +1,46 @@
|
|||
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';
|
||||
|
||||
// Data
|
||||
export class AcsData {
|
||||
characterInfo = new AcsCharacterInfo();
|
||||
animInfo: AcsAnimationEntry[] = [];
|
||||
images: AcsImageEntry[] = [];
|
||||
}
|
||||
|
||||
export 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);
|
||||
});
|
||||
});
|
||||
|
||||
return acsData;
|
||||
}
|
|
@ -1,18 +1,6 @@
|
|||
import { BufferStream, SeekDir } from '@msagent.js/core';
|
||||
|
||||
import { LOCATION } from '@msagent.js/core';
|
||||
import { AcsCharacterInfo } from '@msagent.js/core';
|
||||
import { AcsAnimationEntry } from '@msagent.js/core';
|
||||
import { AcsImageEntry } from '@msagent.js/core';
|
||||
import { agentCharacterParseACS, AcsData, BufferStream } from '@msagent.js/core';
|
||||
import { Agent } from './agent.js';
|
||||
|
||||
// Data
|
||||
export class AcsData {
|
||||
characterInfo = new AcsCharacterInfo();
|
||||
animInfo: AcsAnimationEntry[] = [];
|
||||
images: AcsImageEntry[] = [];
|
||||
}
|
||||
|
||||
// Cache of ACS data per character (for agentCreateCharacterFromUrl)
|
||||
let acsDataCache = new Map<string, AcsData>();
|
||||
|
||||
|
@ -21,47 +9,10 @@ export function agentPurgeACSCache() {
|
|||
acsDataCache.clear();
|
||||
}
|
||||
|
||||
export 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);
|
||||
});
|
||||
});
|
||||
|
||||
return acsData;
|
||||
}
|
||||
|
||||
export function agentCreateCharacter(data: AcsData): Agent {
|
||||
return new Agent(data);
|
||||
}
|
||||
|
||||
export async function agentCreateCharacterFromUrl(url: string): Promise<Agent> {
|
||||
// just return the cache object
|
||||
if (acsDataCache.has(url)) {
|
||||
return agentCreateCharacter(acsDataCache.get(url)!);
|
||||
return new Agent(acsDataCache.get(url)!);
|
||||
} else {
|
||||
let res = await fetch(url);
|
||||
let data = await res.arrayBuffer();
|
||||
|
@ -70,6 +21,6 @@ export async function agentCreateCharacterFromUrl(url: string): Promise<Agent> {
|
|||
let acsData = agentCharacterParseACS(new BufferStream(buffer));
|
||||
|
||||
acsDataCache.set(url, acsData);
|
||||
return agentCreateCharacter(acsData);
|
||||
return new Agent(acsData);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { MSWindow, MSWindowStartPosition } from './MSWindow.js';
|
||||
import { agentInit } from '@msagent.js/web';
|
||||
import { agentInit, agentPurgeACSCache } from '@msagent.js/web';
|
||||
import { MSAgentClient } from './client.js';
|
||||
import { Config } from '../../config.js';
|
||||
import { RunCommand } from './commands.js';
|
||||
|
@ -36,6 +36,7 @@ function roomInit() {
|
|||
user.agent.remove();
|
||||
}
|
||||
roomInit();
|
||||
agentPurgeACSCache();
|
||||
loggingIn = false;
|
||||
elements.logonButton.disabled = false;
|
||||
logonWindow.show();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Agent } from '@msagent-chat/msagent.js';
|
||||
import { Agent } from '@msagent.js/web';
|
||||
import { AgentAnimationConfig } from '@msagent-chat/protocol';
|
||||
|
||||
export class User {
|
||||
|
|
Loading…
Reference in a new issue