1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.Xml; |
4 |
using Oni.Metadata; |
5 |
using Oni.Particles; |
6 |
using Oni.Xml; |
7 |
|
8 |
namespace Oni.Sound |
9 |
{ |
10 |
internal class SabdXmlImporter : RawXmlImporter |
11 |
{ |
12 |
#region Private data |
13 |
private static readonly Dictionary<string, string> modifierMap = new Dictionary<string, string>(); |
14 |
private static readonly Dictionary<string, string> typeMap = new Dictionary<string, string>(); |
15 |
#endregion |
16 |
|
17 |
static SabdXmlImporter() |
18 |
{ |
19 |
var modifiers = new[] { |
20 |
"Any", "Crouch", "Jump", "Heavy Damage", "Medium Damage", "Light Damage" |
21 |
}; |
22 |
|
23 |
var types = new[] { |
24 |
"Block", "Draw Weapon", "Fall", "Fly", "Getting Hit", "Holster", |
25 |
"Kick", "Knockdown", "Land", "Jump", "Pickup", "Punch", |
26 |
"Reload Pistol", "Reload Rifle", "Reload Stream", "Reload Superball", |
27 |
"Reload Vandegraf", "Reload Scram Cannon", "Reload Mercury Bow", "Reload Screamer", |
28 |
"Run", "Slide", "Stand", "Starle", "Walk", "Powerup", "Roll", "Falling Flail" |
29 |
}; |
30 |
|
31 |
foreach (string modifier in modifiers) |
32 |
modifierMap.Add(modifier.Replace(" ", ""), modifier); |
33 |
|
34 |
foreach (string type in types) |
35 |
typeMap.Add(type.Replace(" ", ""), type); |
36 |
} |
37 |
|
38 |
private SabdXmlImporter(XmlReader reader, BinaryWriter writer) |
39 |
: base(reader, writer) |
40 |
{ |
41 |
} |
42 |
|
43 |
public static void Import(XmlReader reader, BinaryWriter writer) |
44 |
{ |
45 |
var importer = new SabdXmlImporter(reader, writer); |
46 |
importer.Import(); |
47 |
} |
48 |
|
49 |
#region private class SoundAnimationData |
50 |
|
51 |
private class SoundAnimationData |
52 |
{ |
53 |
#region Private data |
54 |
private string variant; |
55 |
private List<SoundAssignment> assignments; |
56 |
#endregion |
57 |
|
58 |
private enum Tag |
59 |
{ |
60 |
SAFT = 0x54464153, |
61 |
SAVT = 0x54564153, |
62 |
SASA = 0x41534153 |
63 |
} |
64 |
|
65 |
public SoundAnimationData(XmlReader xml) |
66 |
{ |
67 |
variant = xml.GetAttribute("Variant"); |
68 |
|
69 |
xml.ReadStartElement("SoundAnimation"); |
70 |
assignments = new List<SoundAssignment>(); |
71 |
|
72 |
while (xml.IsStartElement("Assignment")) |
73 |
{ |
74 |
xml.ReadStartElement(); |
75 |
assignments.Add(new SoundAssignment(xml)); |
76 |
xml.ReadEndElement(); |
77 |
} |
78 |
|
79 |
xml.ReadEndElement(); |
80 |
} |
81 |
|
82 |
public void Write(BinaryWriter writer) |
83 |
{ |
84 |
writer.Write((int)Tag.SAFT); |
85 |
writer.Write(4); |
86 |
writer.Write(6); |
87 |
writer.Write((int)Tag.SAVT); |
88 |
writer.Write(32); |
89 |
writer.Write(variant, 32); |
90 |
|
91 |
foreach (SoundAssignment assignment in assignments) |
92 |
{ |
93 |
writer.Write((int)Tag.SASA); |
94 |
writer.Write(132); |
95 |
assignment.Write(writer); |
96 |
} |
97 |
} |
98 |
} |
99 |
|
100 |
#endregion |
101 |
#region private class SoundAssignment |
102 |
|
103 |
private class SoundAssignment |
104 |
{ |
105 |
#region Private data |
106 |
private int frame; |
107 |
private string modifier; |
108 |
private string type; |
109 |
private string animationName; |
110 |
private string soundName; |
111 |
#endregion |
112 |
|
113 |
public SoundAssignment(XmlReader xml) |
114 |
{ |
115 |
xml.ReadStartElement("Target"); |
116 |
|
117 |
if (xml.LocalName == "Animation") |
118 |
{ |
119 |
type = "Animation"; |
120 |
animationName = xml.ReadElementContentAsString("Animation", ""); |
121 |
} |
122 |
else |
123 |
{ |
124 |
type = xml.ReadElementContentAsString("Type", ""); |
125 |
animationName = string.Empty; |
126 |
|
127 |
if (!typeMap.TryGetValue(type, out type)) |
128 |
throw new NotSupportedException(string.Format("Unknown assignment type '{0}' found", type)); |
129 |
} |
130 |
|
131 |
if (xml.IsStartElement("Modifier")) |
132 |
modifier = xml.ReadElementContentAsString(); |
133 |
else |
134 |
modifier = "Any"; |
135 |
|
136 |
if (!modifierMap.TryGetValue(modifier, out modifier)) |
137 |
throw new NotSupportedException(string.Format("Unknown assignment modifier '{0}' found", modifier)); |
138 |
|
139 |
xml.ReadStartElement("Frame"); |
140 |
frame = xml.ReadContentAsInt(); |
141 |
xml.ReadEndElement(); |
142 |
|
143 |
xml.ReadEndElement(); |
144 |
|
145 |
soundName = xml.ReadElementContentAsString("Sound", ""); |
146 |
} |
147 |
|
148 |
public void Write(BinaryWriter writer) |
149 |
{ |
150 |
writer.Write(frame); |
151 |
writer.Write(modifier, 32); |
152 |
writer.Write(type, 32); |
153 |
writer.Write(animationName, 32); |
154 |
writer.Write(soundName, 32); |
155 |
} |
156 |
} |
157 |
|
158 |
#endregion |
159 |
|
160 |
private void Import() |
161 |
{ |
162 |
var data = new SoundAnimationData(Xml); |
163 |
data.Write(Writer); |
164 |
} |
165 |
} |
166 |
} |