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 './types.js';
|
||||||
export * from './decompress.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 { 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue