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 }