source: OniSplit/Sound/SabdXmlImporter.cs@ 1124

Last change on this file since 1124 was 1114, checked in by iritscen, 5 years ago

Adding OniSplit source code (v0.9.99.0). Many thanks to Neo for all his work over the years.

File size: 5.4 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Xml;
4using Oni.Metadata;
5using Oni.Particles;
6using Oni.Xml;
7
8namespace 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}
Note: See TracBrowser for help on using the repository browser.