-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathResources.ts
87 lines (82 loc) · 3.31 KB
/
Resources.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
namespace Resources {
interface IDirectoryEntry {
volNo: number;
volOffset: number;
}
var logdirRecords: IDirectoryEntry[] = [],
picdirRecords: IDirectoryEntry[] = [],
viewdirRecords: IDirectoryEntry[] = [],
snddirRecords: IDirectoryEntry[] = [];
var volBuffers: Fs.ByteStream[] = [];
var availableVols: boolean[] = [];
export var fontStream: Fs.ByteStream;
function parseDirfile(buffer: Fs.ByteStream, records: IDirectoryEntry[]): void {
var length: number = buffer.length / 3;
for (var i: number = 0; i < length; i++) {
var val: number = (buffer.readUint8() << 16) + (buffer.readUint8() << 8) + buffer.readUint8();
var volNo: number = val >>> 20;
var volOffset: number = val & 0xFFFFF;
if (val >>> 16 == 0xFF)
continue;
records[i] = { volNo: volNo, volOffset: volOffset };
if (availableVols[volNo] === undefined)
availableVols[volNo] = true;
}
}
export enum AgiResource {
Logic,
Pic,
View,
Sound
}
export function readAgiResource(type: AgiResource, num: number): Fs.ByteStream {
var record = null;
switch (type) {
case AgiResource.Logic:
record = logdirRecords[num];
break;
case AgiResource.Pic:
record = picdirRecords[num];
break;
case AgiResource.View:
record = viewdirRecords[num];
break;
case AgiResource.Sound:
record = snddirRecords[num];
break;
default:
throw "Undefined resource type: " + type;
}
var volstream = new Fs.ByteStream(volBuffers[record.volNo].buffer, record.volOffset);
var sig: number = volstream.readUint16();
var volNo: number = volstream.readUint8();
var resLength = volstream.readUint16();
var volPart = new Fs.ByteStream(volstream.buffer, record.volOffset + 5, record.volOffset + 5 + resLength);
return volPart;
}
export function load(path: string, done: () => void) {
Fs.downloadAllFiles(path, ["LOGDIR", "PICDIR", "VIEWDIR", "SNDDIR"], (buffers: Fs.IByteStreamDict) => {
console.log("Directory files downloaded.");
parseDirfile(buffers["LOGDIR"], logdirRecords);
parseDirfile(buffers["PICDIR"], picdirRecords);
parseDirfile(buffers["VIEWDIR"], viewdirRecords);
parseDirfile(buffers["SNDDIR"], snddirRecords);
var volNames: string[] = [];
for (var i = 0; i < availableVols.length; i++) {
if (availableVols[i] === true) {
volNames.push("VOL." + i);
}
}
Fs.downloadAllFiles(path, volNames, (buffers: Fs.IByteStreamDict) => {
console.log("Resource volumes downloaded.");
for (var j: number = 0; j < volNames.length; j++) {
volBuffers[j] = buffers[volNames[j]];
}
Fs.downloadAllFiles("", ["font.bin"], (buffers: Fs.IByteStreamDict) => {
fontStream = buffers["font.bin"];
done();
});
});
});
}
}