move character parsing stuff to core

This commit is contained in:
Lily Tsuru 2024-08-25 09:05:51 -04:00
parent e170c5c6b6
commit f8511894e3
5 changed files with 54 additions and 54 deletions

View file

@ -8,3 +8,5 @@ export * from './structs/image.js';
export * from './types.js';
export * from './decompress.js';
export * from './parse.js';

View 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;
}

View file

@ -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);
}
}

View file

@ -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();

View file

@ -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 {