1 |
using System.Xml; |
2 |
using Oni.Particles; |
3 |
|
4 |
namespace Oni.Xml |
5 |
{ |
6 |
internal class OnieXmlExporter : RawXmlExporter |
7 |
{ |
8 |
private OnieXmlExporter(BinaryReader reader, XmlWriter xml) |
9 |
: base(reader, xml) |
10 |
{ |
11 |
} |
12 |
|
13 |
public static void Export(BinaryReader reader, XmlWriter xml) |
14 |
{ |
15 |
var exporter = new OnieXmlExporter(reader, xml); |
16 |
exporter.Export(); |
17 |
} |
18 |
|
19 |
private void Export() |
20 |
{ |
21 |
Reader.Skip(8); |
22 |
var impacts = new string[Reader.ReadInt32()]; |
23 |
var materials = new string[Reader.ReadInt32()]; |
24 |
var particles = new ImpactEffectParticle[Reader.ReadInt32()]; |
25 |
var sounds = new ImpactEffectSound[Reader.ReadInt32()]; |
26 |
var effects = new ImpactEffect[Reader.ReadInt32()]; |
27 |
Reader.Skip(4); |
28 |
|
29 |
for (int i = 0; i < impacts.Length; i++) |
30 |
{ |
31 |
impacts[i] = Reader.ReadString(128); |
32 |
Reader.Skip(4); |
33 |
} |
34 |
|
35 |
for (int i = 0; i < materials.Length; i++) |
36 |
{ |
37 |
materials[i] = Reader.ReadString(128); |
38 |
Reader.Skip(4); |
39 |
} |
40 |
|
41 |
for (int i = 0; i < impacts.Length; i++) |
42 |
{ |
43 |
Reader.Skip(8); |
44 |
} |
45 |
|
46 |
for (int i = 0; i < particles.Length; i++) |
47 |
{ |
48 |
particles[i] = new ImpactEffectParticle(Reader); |
49 |
} |
50 |
|
51 |
for (int i = 0; i < sounds.Length; i++) |
52 |
{ |
53 |
sounds[i] = new ImpactEffectSound(Reader); |
54 |
} |
55 |
|
56 |
for (int i = 0; i < effects.Length; i++) |
57 |
{ |
58 |
effects[i] = new ImpactEffect(Reader, impacts, materials, particles, sounds); |
59 |
} |
60 |
|
61 |
Xml.WriteStartElement("ImpactEffects"); |
62 |
|
63 |
foreach (string impact in impacts) |
64 |
{ |
65 |
Xml.WriteStartElement("Impact"); |
66 |
Xml.WriteAttributeString("Name", impact); |
67 |
|
68 |
foreach (string material in materials) |
69 |
{ |
70 |
bool found = false; |
71 |
|
72 |
foreach (ImpactEffect effect in effects) |
73 |
{ |
74 |
if (effect.ImpactName == impact && effect.MaterialName == material) |
75 |
{ |
76 |
found = true; |
77 |
break; |
78 |
} |
79 |
} |
80 |
|
81 |
if (!found) |
82 |
continue; |
83 |
|
84 |
Xml.WriteStartElement("Material"); |
85 |
Xml.WriteAttributeString("Name", material); |
86 |
|
87 |
foreach (ImpactEffect effect in effects) |
88 |
{ |
89 |
if (effect.ImpactName == impact && effect.MaterialName == material) |
90 |
{ |
91 |
Xml.WriteStartElement("ImpactEffect"); |
92 |
effect.Write(Xml); |
93 |
Xml.WriteEndElement(); |
94 |
} |
95 |
} |
96 |
|
97 |
Xml.WriteEndElement(); |
98 |
} |
99 |
|
100 |
Xml.WriteEndElement(); |
101 |
} |
102 |
|
103 |
Xml.WriteEndElement(); |
104 |
} |
105 |
} |
106 |
} |