Coverage Summary for Class: SaveObject (com.mygdx.utils)
| Class | Class, % | Method, % | Line, % |
|---|---|---|---|
| SaveObject | 100% (1/1) | 90% (9/10) | 91.8% (180/196) |
1 package com.mygdx.utils; 2 3 import com.badlogic.gdx.Game; 4 import com.mygdx.game.Components.Pirate; 5 import com.mygdx.game.Entitys.College; 6 import com.mygdx.game.Entitys.Player; 7 import com.mygdx.game.Entitys.Ship; 8 import com.mygdx.game.Managers.GameManager; 9 10 import javax.xml.stream.*; 11 import javax.xml.stream.events.Characters; 12 import javax.xml.stream.events.StartElement; 13 import javax.xml.stream.events.XMLEvent; 14 import java.io.*; 15 /**NEW 16 * This classes job is to hold all the data needed to reconstruct the game state 17 * Its the object that will be written using serilisation to a file 18 */ 19 public final class SaveObject { 20 21 22 //uses STAX parser 23 24 /** 25 * A method which saves the Game to XML using a STAX parser 26 * 27 * @param path The path to where the file will be saved 28 */ 29 public static void writeXMl(String path){ 30 31 try{ 32 //setUP outputs 33 StringWriter stringWriter = new StringWriter(); 34 XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance(); 35 XMLStreamWriter xMLStreamWriter = 36 xMLOutputFactory.createXMLStreamWriter(new FileOutputStream(path)); 37 //write the xml 38 xMLStreamWriter.writeStartDocument(); 39 xMLStreamWriter.writeStartElement("SAVE"); 40 41 //write all the ships 42 xMLStreamWriter.writeStartElement("Ships"); 43 xMLStreamWriter.writeAttribute("Number", "value"); 44 int i =0; 45 for(Ship s : GameManager.ships){ 46 writeShiptoXML(xMLStreamWriter,s,i); 47 i = i +1; 48 49 } 50 i=0; 51 xMLStreamWriter.writeEndElement(); 52 for(College c : GameManager.colleges){ 53 writeCollegeToXML(xMLStreamWriter,c,i); 54 i = i +1; 55 } 56 //write the game data 57 Player p = GameManager.getPlayer(); 58 writeGamedatatoXML(xMLStreamWriter,p); 59 60 61 62 xMLStreamWriter.writeEndElement(); 63 xMLStreamWriter.writeEndDocument(); 64 65 xMLStreamWriter.flush(); 66 xMLStreamWriter.close(); 67 //String xmlString = stringWriter.getBuffer().toString(); 68 69 stringWriter.close(); 70 //System.out.println(xmlString); 71 } catch (XMLStreamException e) { 72 e.printStackTrace(); 73 } catch (IOException e) { 74 e.printStackTrace(); 75 } 76 77 } 78 79 /** 80 * Takes the Ship and writes it to XML 81 * 82 * @param xmlDoc The Document which is being written to 83 * @param ship The Ship object which we want to save in XML 84 * @param index The index of the ship 85 * @throws XMLStreamException 86 */ 87 private static void writeShiptoXML(XMLStreamWriter xmlDoc,Ship ship,int index) throws XMLStreamException { 88 xmlDoc.writeStartElement("position"); 89 90 xmlDoc.writeStartElement("X"); 91 xmlDoc.writeCharacters(String.valueOf(ship.getPosition().x)); 92 xmlDoc.writeEndElement(); 93 94 xmlDoc.writeStartElement("Y"); 95 xmlDoc.writeCharacters(String.valueOf(ship.getPosition().y)); 96 xmlDoc.writeEndElement(); 97 98 xmlDoc.writeStartElement("Index"); 99 xmlDoc.writeCharacters(String.valueOf(index)); 100 xmlDoc.writeEndElement(); 101 102 xmlDoc.writeStartElement("Health"); 103 xmlDoc.writeCharacters(String.valueOf(ship.getHealth())); 104 xmlDoc.writeEndElement(); 105 106 xmlDoc.writeEndElement(); 107 } 108 109 /** 110 * 111 * @param xmlDoc The Document which is being written to 112 * @param college The college to write to XMl 113 * @param index The index of the college in relation to Gamemanager 114 * @throws XMLStreamException 115 */ 116 private static void writeCollegeToXML(XMLStreamWriter xmlDoc, College college,int index) throws XMLStreamException{ 117 xmlDoc.writeStartElement("College"); 118 119 xmlDoc.writeStartElement("Name"); 120 xmlDoc.writeCharacters(String.valueOf(college.getName())); 121 xmlDoc.writeEndElement(); 122 123 xmlDoc.writeStartElement("Alive"); 124 xmlDoc.writeCharacters(String.valueOf(college.isAlive())); 125 xmlDoc.writeEndElement(); 126 127 xmlDoc.writeStartElement("Index"); 128 xmlDoc.writeCharacters(String.valueOf(index)); 129 xmlDoc.writeEndElement(); 130 131 xmlDoc.writeEndElement(); 132 133 } 134 135 /** 136 * Method that writes game data to XML 137 * 138 * @param xmlDoc The Document which is being written to 139 * @param player The player Object which contains the data we wish to write 140 * @throws XMLStreamException 141 */ 142 private static void writeGamedatatoXML(XMLStreamWriter xmlDoc,Player player) throws XMLStreamException{ 143 xmlDoc.writeStartElement("GAMEDATA"); 144 145 xmlDoc.writeStartElement("Ammo"); 146 xmlDoc.writeCharacters(String.valueOf(player.getAmmo())); 147 xmlDoc.writeEndElement(); 148 149 xmlDoc.writeStartElement("Plunder"); 150 xmlDoc.writeCharacters(String.valueOf(player.getPlunder())); 151 xmlDoc.writeEndElement(); 152 153 xmlDoc.writeStartElement("Points"); 154 xmlDoc.writeCharacters(String.valueOf(player.getComponent(Pirate.class).getPoints())); 155 xmlDoc.writeEndElement(); 156 157 158 xmlDoc.writeEndElement(); 159 } 160 161 /** 162 * Loads a saved game which is an XML file 163 * 164 * @param path the path to the XML file that the method will load 165 */ 166 public static void readXML(String path){ 167 try{ 168 XMLInputFactory factory = XMLInputFactory.newInstance(); 169 XMLEventReader eventReader = 170 factory.createXMLEventReader(new FileReader(path)); 171 172 while(eventReader.hasNext()) { 173 XMLEvent event = eventReader.nextEvent(); 174 175 switch (event.getEventType()){ 176 177 case XMLStreamConstants.START_ELEMENT: 178 StartElement startElement = event.asStartElement(); 179 String qName = startElement.getName().getLocalPart(); 180 181 if(qName.equalsIgnoreCase("ships")){ 182 183 } 184 else if(qName.equalsIgnoreCase("position")){ 185 placeShip(eventReader); 186 } 187 else if(qName.equalsIgnoreCase("GAMEDATA")){ 188 loadGameData(eventReader); 189 } else if (qName.equalsIgnoreCase("College")) { 190 loadCollege(eventReader); 191 } 192 break; 193 194 case XMLStreamConstants.CHARACTERS: 195 Characters characters = event.asCharacters(); 196 System.out.println(characters.getData()); 197 break; 198 199 case XMLStreamConstants.END_ELEMENT: 200 break; 201 } 202 203 } 204 205 206 207 } 208 catch (FileNotFoundException e){ 209 e.printStackTrace(); 210 }catch (XMLStreamException e){ 211 e.printStackTrace(); 212 } 213 } 214 215 /** 216 * Reads A ships data from XMl and updates the game to place it in it. 217 * 218 * @param eventReader The eventReader currently parsing the tree 219 * @throws XMLStreamException 220 */ 221 private static void placeShip(XMLEventReader eventReader) throws XMLStreamException { 222 //skip through the xml till we find data values 223 Next(eventReader); 224 XMLEvent event = eventReader.nextEvent(); 225 Characters chars = event.asCharacters(); 226 float x = Float.parseFloat(chars.getData()) ; 227 228 Next(eventReader); 229 event = eventReader.nextEvent(); 230 chars = event.asCharacters(); 231 float y = Float.parseFloat(chars.getData()) ; 232 233 Next(eventReader); 234 event = eventReader.nextEvent(); 235 chars = event.asCharacters(); 236 int index = Integer.parseInt(chars.getData()) ; 237 238 Next(eventReader); 239 event = eventReader.nextEvent(); 240 chars = event.asCharacters(); 241 int health = Integer.parseInt(chars.getData()); 242 243 244 GameManager.ships.get(index).setPosition(x,y); 245 GameManager.ships.get(index).setHealth(health); 246 if(health<=0){ 247 GameManager.ships.get(index).ShipDeath(); 248 } 249 } 250 251 /** 252 * Reads the data relating to a college 253 * 254 * @param eventReader The eventReader currently parsing the tree 255 * @throws XMLStreamException 256 */ 257 private static void loadCollege(XMLEventReader eventReader) throws XMLStreamException{ 258 Next(eventReader); 259 XMLEvent event = eventReader.nextEvent(); 260 Characters chars = event.asCharacters(); 261 String college_name = chars.getData(); 262 263 Next(eventReader); 264 event = eventReader.nextEvent(); 265 chars = event.asCharacters(); 266 Boolean alive = Boolean.parseBoolean(chars.getData()); 267 268 Next(eventReader); 269 event = eventReader.nextEvent(); 270 chars = event.asCharacters(); 271 Integer index = Integer.parseInt(chars.getData()); 272 273 if(!alive){ 274 GameManager.colleges.get(index).kill(); 275 } 276 277 } 278 279 /** 280 * Iterates through the XML tree until it comes to a character 281 * 282 * @param eventReader The event reader currently parsing the tree 283 * @throws XMLStreamException 284 */ 285 private static void Next(XMLEventReader eventReader) throws XMLStreamException { 286 while (! eventReader.peek().isCharacters()){ 287 eventReader.nextEvent(); 288 } 289 } 290 291 /** 292 * Reads Game data from XML 293 * @param eventReader The eventReader currently parsing the tree 294 * @throws XMLStreamException 295 */ 296 private static void loadGameData(XMLEventReader eventReader) throws XMLStreamException { 297 298 while (! eventReader.peek().isCharacters()){ 299 eventReader.nextEvent(); 300 } 301 XMLEvent event = eventReader.nextEvent(); 302 303 Characters chars = event.asCharacters(); 304 int ammo = Integer.parseInt(chars.getData()); 305 GameManager.getPlayer().setAmmo(ammo); 306 307 while (! eventReader.peek().isCharacters()){ 308 eventReader.nextEvent(); 309 } 310 event = eventReader.nextEvent(); 311 chars = event.asCharacters(); 312 int plunder = Integer.parseInt(chars.getData()); 313 //as game starts at 0 add the money from the save on. 314 GameManager.getPlayer().plunder(plunder); 315 316 Next(eventReader); 317 event = eventReader.nextEvent(); 318 GameManager.getPlayer().getComponent(Pirate.class).points =Integer.parseInt(event.asCharacters().getData()); 319 320 } 321 }