Mercurial > repos > IBBoard.WarFoundry.API
comparison api/Savers/Xml/WarFoundryXmlGameSystemSaver.cs @ 316:40a2df1f629a
Re #324: Add saving of Race and System data to files
* Move saver classes out of Factories folder and into Savers folder/namespace
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 05 Mar 2011 11:52:09 +0000 |
parents | |
children | 3e9b0603afad |
comparison
equal
deleted
inserted
replaced
315:6cb0fb78b9a6 | 316:40a2df1f629a |
---|---|
1 // This file (WarFoundryXmlGameSystemSaver.cs) is a part of the IBBoard.WarFoundry.API project and is copyright 2008, 2009 IBBoard. | |
2 // | |
3 // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU Affero GPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license. | |
4 | |
5 using System; | |
6 using System.Collections.Generic; | |
7 using System.IO; | |
8 using System.Xml; | |
9 using System.Xml.Schema; | |
10 using IBBoard.Lang; | |
11 using IBBoard.Xml; | |
12 using IBBoard.WarFoundry.API.Factories.Xml.Zip; | |
13 using IBBoard.WarFoundry.API.Objects; | |
14 using IBBoard.WarFoundry.API.Savers; | |
15 using IBBoard.WarFoundry.API.Util; | |
16 using ICSharpCode.SharpZipLib.Zip; | |
17 | |
18 namespace IBBoard.WarFoundry.API.Savers.Xml | |
19 { | |
20 public class WarFoundryXmlGameSystemSaver : IWarFoundryGameSystemSaver | |
21 { | |
22 public const string GAMESYSTEM_FILE_EXTENSION = ".system"; | |
23 | |
24 public bool Save(GameSystem toSave, string savePath) | |
25 { | |
26 bool success = false; | |
27 ZipFile file = null; | |
28 | |
29 if (!savePath.EndsWith(GAMESYSTEM_FILE_EXTENSION)) | |
30 { | |
31 savePath = savePath + GAMESYSTEM_FILE_EXTENSION; | |
32 } | |
33 | |
34 try | |
35 { | |
36 file = ZipFile.Create(savePath); | |
37 file.BeginUpdate(); | |
38 file.Add(new StringZipEntrySource(CreateXmlString(toSave)), "data.systemx"); | |
39 file.CommitUpdate(); | |
40 success = true; | |
41 } | |
42 finally | |
43 { | |
44 if (file != null) | |
45 { | |
46 file.Close(); | |
47 } | |
48 } | |
49 | |
50 return success; | |
51 } | |
52 | |
53 private string CreateXmlString(WarFoundryObject toSave) | |
54 { | |
55 string xmlString = ""; | |
56 | |
57 if (toSave is GameSystem) | |
58 { | |
59 xmlString = CreateGameSystemXmlString((GameSystem)toSave); | |
60 } | |
61 | |
62 return xmlString; | |
63 } | |
64 | |
65 private string CreateGameSystemXmlString(GameSystem toSave) | |
66 { | |
67 XmlDocument doc = new XmlDocument(); | |
68 XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", null, null); | |
69 doc.AppendChild(declaration); | |
70 XmlSchema schema = new XmlSchema(); | |
71 schema.Namespaces.Add("", "http://ibboard.co.uk/warfoundry/system"); | |
72 schema.Namespaces.Add("cats", "http://ibboard.co.uk/warfoundry/cats"); | |
73 doc.Schemas.Add(schema); | |
74 XmlElement root = doc.CreateElement("system"); | |
75 root.SetAttribute("xmlns", "http://ibboard.co.uk/warfoundry/system"); | |
76 root.SetAttribute("xmlns:cats", "http://ibboard.co.uk/warfoundry/cats"); | |
77 doc.AppendChild(root); | |
78 root.SetAttribute("id", XmlTools.GetAsciiXmlIdForString(toSave.ID)); | |
79 root.SetAttribute("name", toSave.Name); | |
80 root.SetAttribute("defaultArmySize", toSave.SystemArmyDefaultSize.ToString()); | |
81 root.SetAttribute("warn", toSave.WarnOnError.ToString().ToLowerInvariant()); | |
82 root.SetAttribute("allowAllies", toSave.AllowAllies.ToString().ToLowerInvariant()); | |
83 XmlElement cats = doc.CreateElement("categories"); | |
84 root.AppendChild(cats); | |
85 | |
86 foreach (Category cat in toSave.Categories) | |
87 { | |
88 cats.AppendChild(CreateCategoryElement(cat, doc)); | |
89 } | |
90 | |
91 XmlElement sysStatsList = doc.CreateElement("sysStatsList"); | |
92 sysStatsList.SetAttribute("defaultStats", XmlTools.GetAsciiXmlIdForString(toSave.StandardSystemStatsID)); | |
93 root.AppendChild(sysStatsList); | |
94 | |
95 foreach(SystemStats stats in toSave.SystemStats) | |
96 { | |
97 sysStatsList.AppendChild(CreateSystemStatsElement(stats, doc)); | |
98 } | |
99 | |
100 return doc.OuterXml; | |
101 } | |
102 | |
103 private XmlElement CreateCategoryElement(Category cat, XmlDocument doc) | |
104 { | |
105 XmlElement catElem = doc.CreateElement("cats:cat"); | |
106 catElem.SetAttribute("id", XmlTools.GetAsciiXmlIdForString(cat.ID)); | |
107 catElem.SetAttribute("name", (cat.HasDefaultName() ? "" : cat.Name)); | |
108 if (cat.MinimumPoints > 0) | |
109 { | |
110 catElem.SetAttribute("minPoints", cat.MaximumPercentage.ToString()); | |
111 } | |
112 if (cat.MaximumPoints < 100) | |
113 { | |
114 catElem.SetAttribute("maxPoints", cat.MaximumPercentage.ToString()); | |
115 } | |
116 if(cat.MinimumPercentage > 0) | |
117 { | |
118 catElem.SetAttribute("minPercentage", cat.MaximumPercentage.ToString()); | |
119 } | |
120 if(cat.MaximumPercentage < 100) | |
121 { | |
122 catElem.SetAttribute("maxPercentage", cat.MaximumPercentage.ToString()); | |
123 } | |
124 | |
125 return catElem; | |
126 } | |
127 | |
128 private XmlElement CreateSystemStatsElement(SystemStats stats, XmlDocument doc) | |
129 { | |
130 XmlElement statsElem = doc.CreateElement("sysStats"); | |
131 statsElem.SetAttribute("id", XmlTools.GetAsciiXmlIdForString(stats.ID)); | |
132 | |
133 foreach(StatSlot stat in stats.StatSlots) | |
134 { | |
135 statsElem.AppendChild(CreateSystemStatElement(stat, doc)); | |
136 } | |
137 | |
138 return statsElem; | |
139 } | |
140 | |
141 private XmlElement CreateSystemStatElement(StatSlot stat, XmlDocument doc) | |
142 { | |
143 XmlElement statElem = doc.CreateElement("sysStat"); | |
144 statElem.SetAttribute("name", stat.Name); | |
145 | |
146 return statElem; | |
147 } | |
148 } | |
149 } |