forked from cardoso/ODK-FrameLib
/
CCreatureFramePack.cs
152 lines (115 loc) · 4.24 KB
/
CCreatureFramePack.cs
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace FrameLib
{
public class CCreatureFramePack
{
public struct Creature
{
/// <summary>
/// List of directions in this effect
/// </summary>
public List<Action> Actions;
}
public struct Action
{
/// <summary>
/// List of frames in this direction
/// </summary>
public List<Direction> Directions;
}
public struct Direction
{
/// <summary>
/// List of frames in this direction
/// </summary>
public CCreatureFrame[] Frames;
}
/// <summary>
/// List of effects in this instance of CCreatureFramePack
/// </summary>
public List<Creature> Creatures;
/// <summary>
/// Initializes a new instance of CFramePack from a valid FileStream.
/// </summary>
/// <param name="file">The FileStream as it would be read by DarkEden.</param>
public CCreatureFramePack(ref FileStream file)
{
if (file.Length == 0) return;
this.Creatures = new List<Creature>();
byte[] _crc = new byte[2];
file.Read(_crc, 0, 2);
UInt16 creaturecount = BitConverter.ToUInt16(_crc, 0);
for (int i = 0; i < creaturecount; i++)
{
Creature cr;
byte actioncount = (byte)file.ReadByte();
cr.Actions = new List<Action>();
for (int a = 0; a < actioncount; a++)
{
Action ac;
byte dircount = (byte)file.ReadByte();
ac.Directions = new List<Direction>();
for (int d = 0; d < dircount; d++ )
{
Direction di;
byte[] _frc = new byte[2];
file.Read(_frc, 0, 2);
UInt16 framecount = BitConverter.ToUInt16(_frc, 0);
di.Frames = new CCreatureFrame[framecount];
for (int f = 0; f < framecount; f++)
{
di.Frames[f] = new CCreatureFrame(ref file);
}
ac.Directions.Add(di);
}
cr.Actions.Add(ac);
}
this.Creatures.Add(cr);
}
}
/// <summary>
/// Initializes a new instance of CCreatureFramePack from a valid directory.
/// </summary>
/// <param name="filedir">The directory of the .cfpk.</param>
public CCreatureFramePack(string filedir)
{
FileStream file = File.Open(filedir, FileMode.Open);
if (file.Length == 0) return;
this.Creatures = new List<Creature>();
byte[] _crc = new byte[2];
file.Read(_crc, 0, 2);
UInt16 creaturecount = BitConverter.ToUInt16(_crc, 0);
for (int i = 0; i < creaturecount; i++)
{
Creature cr;
byte actioncount = (byte)file.ReadByte();
cr.Actions = new List<Action>();
for (int a = 0; a < actioncount; a++)
{
Action ac;
byte dircount = (byte)file.ReadByte();
ac.Directions = new List<Direction>();
for (int d = 0; d < dircount; d++ )
{
Direction di;
byte[] _frc = new byte[2];
file.Read(_frc, 0, 2);
UInt16 framecount = BitConverter.ToUInt16(_frc, 0);
di.Frames = new CCreatureFrame[framecount];
for (int f = 0; f < framecount; f++)
{
di.Frames[f] = new CCreatureFrame(ref file);
}
ac.Directions.Add(di);
}
cr.Actions.Add(ac);
}
this.Creatures.Add(cr);
}
}
}
}