-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathAgi_View.ts
81 lines (77 loc) · 3.44 KB
/
Agi_View.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
namespace Agi {
export class Cel {
pixelData: Uint8Array;
constructor(public width: number, public height: number, public transparentColor: number, public mirrored: boolean, public mirroredLoop: number) {
}
}
export class Loop {
cels: Cel[] = [];
}
export class View {
loops: Loop[] = [];
description: string;
constructor(data: Fs.ByteStream) {
var unk1: number = data.readUint8();
var unk2: number = data.readUint8();
var numLoops = data.readUint8();
var descriptionOffset: number = data.readUint16();
for (var i = 0; i < numLoops; i++) {
// Loop header
var loop: Loop = new Loop();
var loopOffset: number = data.readUint16();
var streamPosLoop: number = data.position;
data.position = loopOffset;
var numCels: number = data.readUint8();
for (var j = 0; j < numCels; j++) {
var celOffset: number = data.readUint16();
var streamPosCel: number = data.position;
data.position = loopOffset + celOffset;
// Cel header
var celWidth: number = data.readUint8();
var celHeight: number = data.readUint8();
var celMirrorTrans: number = data.readUint8();
var celMirrored: boolean = (celMirrorTrans & 0x80) == 0x80;
var celMirrorLoop: number = (celMirrorTrans >>> 4) & 7;
var celTransparentColor: number = celMirrorTrans & 0x0F;
if (celMirrorLoop == i)
celMirrored = false;
var cel = new Cel(celWidth, celHeight, celTransparentColor, celMirrored, celMirrorLoop);
if (!celMirrored) {
cel.pixelData = new Uint8Array(cel.width * cel.height);
for (var k = 0; k < cel.pixelData.length; k++) {
cel.pixelData[k] = celTransparentColor;
}
var celY: number = 0;
var celX: number = 0;
while (true) {
var chunkData: number = data.readUint8();
if (chunkData == 0) {
celX = 0;
celY++;
if (celY >= celHeight)
break;
}
var color: number = chunkData >>> 4;
var numPixels: number = chunkData & 0x0F;
for (var x: number = 0; x < numPixels; x++) {
cel.pixelData[celY * celWidth + celX + x] = color;
}
celX += numPixels;
}
}
loop.cels[j] = cel;
data.position = streamPosCel;
}
this.loops[i] = loop;
data.position = streamPosLoop;
}
data.position = descriptionOffset;
while (true) {
var chr: number = data.readUint8();
if (chr == 0)
break;
this.description += String.fromCharCode(chr);
}
}
}
}