package core; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.*; import core.Roll; import guis.DieWindow; /** * XML saving from * http://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/ * * XML loading from * http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/ * * @author Ryan */ public class DnDie { static RNG rng = new RNG(); /** Rolls the number of a given die (ie rolls 5 20s) * * @param die * @param dieCount * @return an integer that represent the result. */ public static int roll (int die, int dieCount){ int number = 0; for(int i = 0; i < dieCount; i ++){ number += rng.GetRandomInteger(1, die); } return number; } /** roll the die, and add in the modifier * * @param die * @param dieCount * @param modifier * @return an integer that represent the result. */ public static int roll (int die, int dieCount, int modifier){ int number = modifier; for(int i = 0; i < dieCount; i ++){ number += rng.GetRandomInteger(1, die); } return number; } /** loads the die, and then sends them off to get rolled * * @param fileName * @return an integer that represent the final result. */ public static int rollFavDie(String fileName){ ArrayList<Roll> loaded = new ArrayList<Roll>(10); loaded = loadFavDie(fileName); int rolls = 0; for(int i = 0; i < loaded.size(); i++){ if(loaded.get(i).getModifier() != 0) rolls += roll(loaded.get(i).getDieSize(), loaded.get(i).getDieCount()); else rolls += roll(loaded.get(i).getDieSize(), loaded.get(i).getDieCount(), loaded.get(i).getModifier()); } return rolls; } /** save the favorite die selection to the xml * * @param fileName * @param roll */ public static void saveFavDie(String fileName, ArrayList<Roll> roll){ try { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); // root elements Document doc = docBuilder.newDocument(); Element rootElement = doc.createElement(fileName); doc.appendChild(rootElement); for(int i = 0; i < roll.size(); i++){ // Die elements Element Die = doc.createElement("Die"); rootElement.appendChild(Die); // What die is being saved Element dieSize = doc.createElement("die_Size"); dieSize.appendChild(doc.createTextNode( Integer.toString(roll.get(i).getDieSize()))); Die.appendChild(dieSize); // shorten way // Die.setAttribute("id", "1"); // The number of die Element dieCount = doc.createElement("die_Count"); dieCount.appendChild(doc.createTextNode( Integer.toString(roll.get(i).getDieCount()))); Die.appendChild(dieCount); // The modifier on the die roll (if applies) Element modifier = doc.createElement("modifier"); modifier.appendChild(doc.createTextNode( Integer.toString(roll.get(i).getModifier()))); Die.appendChild(modifier); // What is this player level Adjustment? Element playerLevelAdjust = doc.createElement("player_Level_Adjust"); playerLevelAdjust.appendChild(doc.createTextNode( Integer.toString(roll.get(i).getPlayerLevelAdjust()))); Die.appendChild(playerLevelAdjust); } // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result; if(Main.gameState.currentlyLoadedCharacter == null){ File CHARDIR = new File(System.getProperty("user.dir") + "//" + "User Data" + "//favRolls"); CHARDIR.mkdir(); result = new StreamResult(CHARDIR.getPath() + "//" + fileName + ".xml"); }else{ String charFileName = Main.gameState.currentlyLoadedCharacter.getName(); charFileName = charFileName.replaceAll("[^A-Za-z0-9]", ""); if(charFileName.equals("BiggusDickus")){ File CHARDIR = new File(System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//" + charFileName + "//favRolls"); CHARDIR.mkdir(); result = new StreamResult(CHARDIR.getPath() + "//" + fileName + ".xml"); } else{ File CHARDIR = new File(System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//DND" + charFileName + "//favRolls"); CHARDIR.mkdir(); result = new StreamResult(CHARDIR.getPath() + "//" + fileName + ".xml"); } } // Output to console for testing // StreamResult result = new StreamResult(System.out); transformer.transform(source, result); System.out.println("File saved!"); } catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (TransformerException tfe) { tfe.printStackTrace(); } return; } /** load the favorite die selection from the xml * * @param fileName * @return The selected favorite die roll as a form of ArrayList<Roll> */ public static ArrayList<Roll> loadFavDie(String fileName){ ArrayList<Roll> roll = new ArrayList<Roll>(50); try { File fXmlFile; if(Main.gameState.currentlyLoadedCharacter == null){ fXmlFile = new File(System.getProperty("user.dir") + "//" + "User Data" + "//" + "favRolls" + "//" + fileName + ".xml"); }else{ String charFileName = Main.gameState.currentlyLoadedCharacter.getName(); charFileName = charFileName.replaceAll("[^A-Za-z0-9]", ""); if(charFileName.equals("BiggusDickus")){ fXmlFile = new File(System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//" + charFileName + "//favRolls" + "//" + fileName + ".xml"); } else{ fXmlFile = new File(System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//DND" + charFileName + "//favRolls" + "//" + fileName + ".xml"); } } DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); //optional, but recommended //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work doc.getDocumentElement().normalize(); System.out.println("Favorite_Die: " + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("Die"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); //System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; //System.out.println("die_Size : " + eElement.getElementsByTagName("die_Size").item(0).getTextContent()); String dieSize = eElement.getElementsByTagName("die_Size").item(0).getTextContent(); //System.out.println("die_Count : " + eElement.getElementsByTagName("die_Count").item(0).getTextContent()); String dieCount = eElement.getElementsByTagName("die_Count").item(0).getTextContent(); //System.out.println("modifier : " + eElement.getElementsByTagName("modifier").item(0).getTextContent()); String modifier = eElement.getElementsByTagName("modifier").item(0).getTextContent(); //System.out.println("player_Level_Adjust : " + eElement.getElementsByTagName("player_Level_Adjust").item(0).getTextContent()); String playerLevelAdjust = eElement.getElementsByTagName("player_Level_Adjust").item(0).getTextContent(); roll.add( new Roll(Integer.parseInt(dieSize), Integer.parseInt(dieCount), Integer.parseInt(modifier), Integer.parseInt(playerLevelAdjust))); } } } catch (Exception e) { System.out.println("Load failed"); } return roll; } //populates the Favorite die rolls list public static void populateDieList(){ DieWindow.favList.removeAll(); DieWindow.favList.add("Favorite Die Roll"); DieWindow.favList.select(0); try { //Loads the current favRolls into the list if(Main.gameState.currentlyLoadedCharacter == null){ Files.walk(Paths.get(System.getProperty("user.dir") + "//" + "User Data" + "//favRolls")).forEach(filePath ->{ if(filePath.getFileName().toString().contains(".xml")){ String fileName = filePath.getFileName().toString(); fileName = (String) fileName.subSequence(0, fileName.length() - 4); DieWindow.favList.add(fileName); } else{ //System.out.println(filePath.getFileName() + " is not an XML file"); } }); } else{ String charFileName = Main.gameState.currentlyLoadedCharacter.getName(); charFileName = charFileName.replaceAll("[^A-Za-z0-9]", ""); String filepath; if(charFileName.equals("BiggusDickus")){ filepath = System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//" + charFileName + "//favRolls"; } else{ filepath = System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//DND" + charFileName + "//favRolls"; } Files.walk(Paths.get(filepath)).forEach(filePath ->{ if(filePath.getFileName().toString().contains(".xml")){ String fileName = filePath.getFileName().toString(); fileName = (String) fileName.subSequence(0, fileName.length() - 4); DieWindow.favList.add(fileName); } else{ //System.out.println(filePath.getFileName() + " is not an XML file"); } }); } } catch (IOException e) { } } /** delete a favorite die from the xml * * @param fileName */ public static void deleteFavDie(String fileName){ File file = null; if(Main.gameState.currentlyLoadedCharacter == null){ file = new File(System.getProperty("user.dir") + "//" + "User Data" + "//" + "favRolls" + "//" + fileName + ".xml"); } else{ String charFileName = Main.gameState.currentlyLoadedCharacter.getName(); charFileName = charFileName.replaceAll("[^A-Za-z0-9]", ""); if(charFileName.equals("BiggusDickus")){ file = new File(System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//" + charFileName + "//favRolls" + "//" + fileName + ".xml"); } else{ file = new File(System.getProperty("user.dir") + "//" + "User Data" + "//Character" + "//DND" + charFileName + "//favRolls" + "//" + fileName + ".xml"); } } try{ if(file.delete()){ System.out.println(file.getName() + " is deleted!"); }else{ System.out.println("Delete operation has failed."); } }catch(Exception error){ error.printStackTrace(); } return; } }