coreize-msagent #20

Open
modeco80 wants to merge 3 commits from coreize-msagent into master
5 changed files with 54 additions and 54 deletions
Showing only changes of commit f8511894e3 - Show all commits

View file

@ -8,3 +8,5 @@ export * from './structs/image.js';
export * from './types.js'; export * from './types.js';
export * from './decompress.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 { agentCharacterParseACS, AcsData, BufferStream } 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 { Agent } from './agent.js'; import { Agent } from './agent.js';
// Data
export class AcsData {
characterInfo = new AcsCharacterInfo();
animInfo: AcsAnimationEntry[] = [];
images: AcsImageEntry[] = [];
}
// Cache of ACS data per character (for agentCreateCharacterFromUrl) // Cache of ACS data per character (for agentCreateCharacterFromUrl)
let acsDataCache = new Map<string, AcsData>(); let acsDataCache = new Map<string, AcsData>();
@ -21,47 +9,10 @@ export function agentPurgeACSCache() {
acsDataCache.clear(); 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> { export async function agentCreateCharacterFromUrl(url: string): Promise<Agent> {
// just return the cache object // just return the cache object
if (acsDataCache.has(url)) { if (acsDataCache.has(url)) {
return agentCreateCharacter(acsDataCache.get(url)!); return new Agent(acsDataCache.get(url)!);
} else { } else {
let res = await fetch(url); let res = await fetch(url);
let data = await res.arrayBuffer(); let data = await res.arrayBuffer();
@ -70,6 +21,6 @@ export async function agentCreateCharacterFromUrl(url: string): Promise<Agent> {
let acsData = agentCharacterParseACS(new BufferStream(buffer)); let acsData = agentCharacterParseACS(new BufferStream(buffer));
acsDataCache.set(url, acsData); acsDataCache.set(url, acsData);
return agentCreateCharacter(acsData); return new Agent(acsData);
} }
} }

View file

@ -1,5 +1,5 @@
import { MSWindow, MSWindowStartPosition } from './MSWindow.js'; 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 { MSAgentClient } from './client.js';
import { Config } from '../../config.js'; import { Config } from '../../config.js';
import { RunCommand } from './commands.js'; import { RunCommand } from './commands.js';
@ -36,6 +36,7 @@ function roomInit() {
user.agent.remove(); user.agent.remove();
} }
roomInit(); roomInit();
agentPurgeACSCache();
loggingIn = false; loggingIn = false;
elements.logonButton.disabled = false; elements.logonButton.disabled = false;
logonWindow.show(); 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'; import { AgentAnimationConfig } from '@msagent-chat/protocol';
export class User { export class User {