From 408a52512b687cbdbd02f7626b2ddef736235d80 Mon Sep 17 00:00:00 2001 From: Wirlaburla Date: Mon, 22 Jul 2024 18:19:38 -0500 Subject: [PATCH] THE MEGA-FORMATTING COMMIT! TABS RULE, SPACES DROOL --- firestar/src/main/java/Bert.java | 452 +++---- firestar/src/main/java/Clifford.java | 378 +++--- firestar/src/main/java/Ernie.java | 262 ++-- .../main/java/FirescriptFormatException.java | 23 +- firestar/src/main/java/Fozzie.java | 250 ++-- firestar/src/main/java/Gonzo.java | 623 +++++----- firestar/src/main/java/Main.java | 430 +++---- firestar/src/main/java/MissPiggy.java | 1076 ++++++++--------- .../src/main/java/ReplacingInputStream.java | 207 ++-- firestar/src/main/java/Rizzo.java | 746 ++++++------ firestar/src/main/java/Rowlf.java | 84 +- firestar/src/main/java/Scooter.java | 96 +- firestar/src/main/java/Suggs.java | 862 ++++++------- firestar/src/main/java/Waldorf.java | 232 ++-- firestar/src/main/java/WilkinsCoffee.java | 456 +++---- 15 files changed, 3084 insertions(+), 3093 deletions(-) diff --git a/firestar/src/main/java/Bert.java b/firestar/src/main/java/Bert.java index ad24e07..c18bdcc 100644 --- a/firestar/src/main/java/Bert.java +++ b/firestar/src/main/java/Bert.java @@ -26,254 +26,254 @@ import java.io.*; import java.util.ArrayList; public class Bert implements ActionListener { - public JFrame frame = new JFrame(); - private JPanel frameContainer; - private JButton cancelbtn; - private JButton downloadbtn; - private JCheckBox patchCheck; - private JCheckBox baseCheck; - private JCheckBox hdCheck; - private JCheckBox furyCheck; - private ButtonGroup radios = new ButtonGroup(); + public JFrame frame = new JFrame(); + private JPanel frameContainer; + private JButton cancelbtn; + private JButton downloadbtn; + private JCheckBox patchCheck; + private JCheckBox baseCheck; + private JCheckBox hdCheck; + private JCheckBox furyCheck; + private ButtonGroup radios = new ButtonGroup(); - private JFrame invoker; + private JFrame invoker; - private boolean wilkinsDownloadFinished = false; + private boolean wilkinsDownloadFinished = false; - public Bert(JFrame parent) { - parent.setEnabled(false); - this.invoker = parent; + public Bert(JFrame parent) { + parent.setEnabled(false); + this.invoker = parent; - frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA + frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA - frame.setSize(600, 300); // 1280 800 - frame.setTitle("Download Assets"); - frame.setResizable(false); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(parent); - frame.setAlwaysOnTop(true); + frame.setSize(600, 300); // 1280 800 + frame.setTitle("Download Assets"); + frame.setResizable(false); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(parent); + frame.setAlwaysOnTop(true); - cancelbtn.addActionListener(this); - downloadbtn.addActionListener(this); + cancelbtn.addActionListener(this); + downloadbtn.addActionListener(this); - frame.setIconImage(Main.windowIcon); + frame.setIconImage(Main.windowIcon); - frame.setVisible(true); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) - { - parent.setEnabled(true); - e.getWindow().dispose(); - } - }); + frame.setVisible(true); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) + { + parent.setEnabled(true); + e.getWindow().dispose(); + } + }); - if (!new File(Main.inpath + "pkg2zip.exe").exists() || !new File(Main.inpath + "psvpfsparser.exe").exists()) { - JOptionPane.showMessageDialog(frame, "The decryption tool is missing.\nPlease select \"Get Dependencies\" in the Options menu.", "Error", JOptionPane.ERROR_MESSAGE); - invoker.setEnabled(true); - frame.dispose(); - } - } + if (!new File(Main.inpath + "pkg2zip.exe").exists() || !new File(Main.inpath + "psvpfsparser.exe").exists()) { + JOptionPane.showMessageDialog(frame, "The decryption tool is missing.\nPlease select \"Get Dependencies\" in the Options menu.", "Error", JOptionPane.ERROR_MESSAGE); + invoker.setEnabled(true); + frame.dispose(); + } + } - public boolean reportWhenDownloaded(WilkinsCoffee setup) { - while (frame.isActive() || !wilkinsDownloadFinished) {} - if (wilkinsDownloadFinished) { // intellij please shut the everloving FUCK up DON'T do this again or i will skin you alive - return true; - } else { - return false; - } - } + public boolean reportWhenDownloaded(WilkinsCoffee setup) { + while (frame.isActive() || !wilkinsDownloadFinished) {} + if (wilkinsDownloadFinished) { // intellij please shut the everloving FUCK up DON'T do this again or i will skin you alive + return true; + } else { + return false; + } + } - @Override - public void actionPerformed(ActionEvent actionEvent) { - if (actionEvent.getSource() == cancelbtn) { - invoker.setEnabled(true); - frame.dispose(); - } else if (actionEvent.getSource() == downloadbtn) { - ArrayList arcs = new ArrayList(); - ArrayList keys = new ArrayList(); - if (baseCheck.isSelected()) { - arcs.add(Main.ArcTarget.BASE); - keys.add(Main.ArcKey.BASE); - System.out.println("Begin download of data (Game version 1.0)"); - } - if (patchCheck.isSelected()) { - arcs.add(Main.ArcTarget.LATEST); - keys.add(Main.ArcKey.LATEST); - System.out.println("Begin download of data2 (Game version 1.04)"); - } - if (hdCheck.isSelected()) { - arcs.add(Main.ArcTarget.ADDON_HD); - keys.add(Main.ArcKey.ADDON_HD); - System.out.println("Begin download of dlc1 (HD DLC)"); - } - if (furyCheck.isSelected()) { - arcs.add(Main.ArcTarget.ADDON_HD_FURY); - keys.add(Main.ArcKey.ADDON_HD_FURY); - System.out.println("Begin download of dlc2 (Fury DLC)"); - } - if (arcs.isEmpty()) { - JOptionPane.showMessageDialog(invoker, "Select one or more asset packs.", "Error", JOptionPane.ERROR_MESSAGE); - return; - } + @Override + public void actionPerformed(ActionEvent actionEvent) { + if (actionEvent.getSource() == cancelbtn) { + invoker.setEnabled(true); + frame.dispose(); + } else if (actionEvent.getSource() == downloadbtn) { + ArrayList arcs = new ArrayList(); + ArrayList keys = new ArrayList(); + if (baseCheck.isSelected()) { + arcs.add(Main.ArcTarget.BASE); + keys.add(Main.ArcKey.BASE); + System.out.println("Begin download of data (Game version 1.0)"); + } + if (patchCheck.isSelected()) { + arcs.add(Main.ArcTarget.LATEST); + keys.add(Main.ArcKey.LATEST); + System.out.println("Begin download of data2 (Game version 1.04)"); + } + if (hdCheck.isSelected()) { + arcs.add(Main.ArcTarget.ADDON_HD); + keys.add(Main.ArcKey.ADDON_HD); + System.out.println("Begin download of dlc1 (HD DLC)"); + } + if (furyCheck.isSelected()) { + arcs.add(Main.ArcTarget.ADDON_HD_FURY); + keys.add(Main.ArcKey.ADDON_HD_FURY); + System.out.println("Begin download of dlc2 (Fury DLC)"); + } + if (arcs.isEmpty()) { + JOptionPane.showMessageDialog(invoker, "Select one or more asset packs.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } - frame.dispose(); - invoker.setVisible(false); + frame.dispose(); + invoker.setVisible(false); - Thread downloaderPopupThread = new Thread(new Runnable() { // run on separate thread to prevent GUI freezing - @Override - public void run() { - for (Main.ArcTarget type : arcs) { - String key = ""; - String arcname = ""; - switch (type) { - case BASE : - key = Main.ArcKey.BASE.toString(); - arcname = "Base game"; - break; - case LATEST : - key = Main.ArcKey.LATEST.toString(); - arcname = "Updates"; - break; - case ADDON_HD : - key = Main.ArcKey.ADDON_HD.toString(); - arcname = "HD Add-On Pack"; - break; - case ADDON_HD_FURY : - key = Main.ArcKey.ADDON_HD_FURY.toString(); - arcname = "Fury Add-On Pack"; - break; - } - if (key.isEmpty()) { - System.out.println("Internal Error: Bert got dementia. Get a programmer!"); - JOptionPane.showMessageDialog(invoker, "Internal Error: Bert got dementia. Get a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); - return; - } + Thread downloaderPopupThread = new Thread(new Runnable() { // run on separate thread to prevent GUI freezing + @Override + public void run() { + for (Main.ArcTarget type : arcs) { + String key = ""; + String arcname = ""; + switch (type) { + case BASE : + key = Main.ArcKey.BASE.toString(); + arcname = "Base game"; + break; + case LATEST : + key = Main.ArcKey.LATEST.toString(); + arcname = "Updates"; + break; + case ADDON_HD : + key = Main.ArcKey.ADDON_HD.toString(); + arcname = "HD Add-On Pack"; + break; + case ADDON_HD_FURY : + key = Main.ArcKey.ADDON_HD_FURY.toString(); + arcname = "Fury Add-On Pack"; + break; + } + if (key.isEmpty()) { + System.out.println("Internal Error: Bert got dementia. Get a programmer!"); + JOptionPane.showMessageDialog(invoker, "Internal Error: Bert got dementia. Get a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); + return; + } - // download file - Fozzie downloaderHandler = new Fozzie(); - boolean downloader = downloaderHandler.DownloadFile(type.toString(), Main.inpath, "asset.pkg", arcname); + // download file + Fozzie downloaderHandler = new Fozzie(); + boolean downloader = downloaderHandler.DownloadFile(type.toString(), Main.inpath, "asset.pkg", arcname); - if (!downloader) { - // cleanup - new File(Main.inpath + "asset.pkg").delete(); + if (!downloader) { + // cleanup + new File(Main.inpath + "asset.pkg").delete(); - // restore controls - invoker.setEnabled(true); - invoker.setVisible(true); - invoker.toFront(); - invoker.repaint(); - return; - } + // restore controls + invoker.setEnabled(true); + invoker.setVisible(true); + invoker.toFront(); + invoker.repaint(); + return; + } - // dump contents - System.out.println("Extracting " + arcname); - Fozzie popup = new Fozzie(); - popup.displayTextOnly("Extracting " + arcname + "...", "Extracting"); - try { - Process p = Main.exec(new String[]{"pkg2zip.exe", "-x", "asset.pkg", key.toString()}, Main.inpath); - InputStream debugin = new BufferedInputStream(p.getInputStream()); - OutputStream debugout = new BufferedOutputStream(System.out); - int c; - while ((c = debugin.read()) != -1) { - debugout.write(c); - } - debugin.close(); - debugout.close(); - p.waitFor(); - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(invoker, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - new File(Main.inpath + "asset.pkg").delete(); - invoker.setEnabled(true); - invoker.setVisible(true); - invoker.toFront(); - invoker.repaint(); - return; - } + // dump contents + System.out.println("Extracting " + arcname); + Fozzie popup = new Fozzie(); + popup.displayTextOnly("Extracting " + arcname + "...", "Extracting"); + try { + Process p = Main.exec(new String[]{"pkg2zip.exe", "-x", "asset.pkg", key.toString()}, Main.inpath); + InputStream debugin = new BufferedInputStream(p.getInputStream()); + OutputStream debugout = new BufferedOutputStream(System.out); + int c; + while ((c = debugin.read()) != -1) { + debugout.write(c); + } + debugin.close(); + debugout.close(); + p.waitFor(); + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(invoker, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + new File(Main.inpath + "asset.pkg").delete(); + invoker.setEnabled(true); + invoker.setVisible(true); + invoker.toFront(); + invoker.repaint(); + return; + } - // decrypt - System.out.println("Decrypting asset.pkg"); - String extracted; - String name; - if (type == Main.ArcTarget.BASE) { - extracted = "app/PCSA00015"; - name = "data.psarc"; - } else if (type == Main.ArcTarget.LATEST) { - extracted = "patch/PCSA00015"; - name = "data2.psarc"; - } else if (type == Main.ArcTarget.ADDON_HD) { - extracted = "addcont/PCSA00015/DLC1W2048PACKAGE"; - name = "dlc1.psarc"; - } else if (type == Main.ArcTarget.ADDON_HD_FURY) { // this is not "always true" - intellij is actually very dumj - extracted = "addcont/PCSA00015/DLC2W2048PACKAGE"; - name = "dlc2.psarc"; - } else { - System.out.println("Internal Error: Bert got dementia. Get a programmer!"); - JOptionPane.showMessageDialog(invoker, "Internal Error: Bert got dementia. Get a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); - new File(Main.inpath + "asset.pkg").delete(); - Main.deleteDir(new File(Main.inpath + "app/")); - Main.deleteDir(new File(Main.inpath + "patch/")); - Main.deleteDir(new File(Main.inpath + "addcont/")); - invoker.setEnabled(true); - invoker.setVisible(true); - invoker.toFront(); - invoker.repaint(); - return; - } + // decrypt + System.out.println("Decrypting asset.pkg"); + String extracted; + String name; + if (type == Main.ArcTarget.BASE) { + extracted = "app/PCSA00015"; + name = "data.psarc"; + } else if (type == Main.ArcTarget.LATEST) { + extracted = "patch/PCSA00015"; + name = "data2.psarc"; + } else if (type == Main.ArcTarget.ADDON_HD) { + extracted = "addcont/PCSA00015/DLC1W2048PACKAGE"; + name = "dlc1.psarc"; + } else if (type == Main.ArcTarget.ADDON_HD_FURY) { // this is not "always true" - intellij is actually very dumj + extracted = "addcont/PCSA00015/DLC2W2048PACKAGE"; + name = "dlc2.psarc"; + } else { + System.out.println("Internal Error: Bert got dementia. Get a programmer!"); + JOptionPane.showMessageDialog(invoker, "Internal Error: Bert got dementia. Get a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); + new File(Main.inpath + "asset.pkg").delete(); + Main.deleteDir(new File(Main.inpath + "app/")); + Main.deleteDir(new File(Main.inpath + "patch/")); + Main.deleteDir(new File(Main.inpath + "addcont/")); + invoker.setEnabled(true); + invoker.setVisible(true); + invoker.toFront(); + invoker.repaint(); + return; + } - popup.setText("Decrypting protected PFS:
" + extracted + "", "Decrypting"); + popup.setText("Decrypting protected PFS:
" + extracted + "", "Decrypting"); - try { - Process p = Main.exec(new String[]{"psvpfsparser.exe", "-i", extracted, "-o", "./temp/", "-z", key.toString(), "-f", "cma.henkaku.xyz"}, Main.inpath); - InputStream debugin = new BufferedInputStream(p.getInputStream()); - OutputStream debugout = new BufferedOutputStream(System.out); - int c; - while ((c = debugin.read()) != -1) { - debugout.write(c); - } - debugin.close(); - debugout.close(); - p.waitFor(); - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(invoker, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - new File(Main.inpath + "asset.pkg").delete(); - Main.deleteDir(new File(Main.inpath + "app/")); - Main.deleteDir(new File(Main.inpath + "patch/")); - Main.deleteDir(new File(Main.inpath + "addcont/")); - invoker.setEnabled(true); - invoker.setVisible(true); - invoker.toFront(); - invoker.repaint(); - return; - } + try { + Process p = Main.exec(new String[]{"psvpfsparser.exe", "-i", extracted, "-o", "./temp/", "-z", key.toString(), "-f", "cma.henkaku.xyz"}, Main.inpath); + InputStream debugin = new BufferedInputStream(p.getInputStream()); + OutputStream debugout = new BufferedOutputStream(System.out); + int c; + while ((c = debugin.read()) != -1) { + debugout.write(c); + } + debugin.close(); + debugout.close(); + p.waitFor(); + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(invoker, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + new File(Main.inpath + "asset.pkg").delete(); + Main.deleteDir(new File(Main.inpath + "app/")); + Main.deleteDir(new File(Main.inpath + "patch/")); + Main.deleteDir(new File(Main.inpath + "addcont/")); + invoker.setEnabled(true); + invoker.setVisible(true); + invoker.toFront(); + invoker.repaint(); + return; + } - popup.setText("Deleting temporary files...", "Cleaning Up"); + popup.setText("Deleting temporary files...", "Cleaning Up"); - // stage & cleanup - System.out.println("Cleaning up"); - new File(Main.inpath + "asset.pkg").delete(); - new File(Main.inpath + "temp/PSP2/" + name).renameTo(new File(Main.inpath + name)); - Main.deleteDir(new File(Main.inpath + "app/")); - Main.deleteDir(new File(Main.inpath + "patch/")); - Main.deleteDir(new File(Main.inpath + "addcont/")); - Main.deleteDir(new File(Main.inpath + "temp/")); + // stage & cleanup + System.out.println("Cleaning up"); + new File(Main.inpath + "asset.pkg").delete(); + new File(Main.inpath + "temp/PSP2/" + name).renameTo(new File(Main.inpath + name)); + Main.deleteDir(new File(Main.inpath + "app/")); + Main.deleteDir(new File(Main.inpath + "patch/")); + Main.deleteDir(new File(Main.inpath + "addcont/")); + Main.deleteDir(new File(Main.inpath + "temp/")); - popup.destroyDialog(); - } + popup.destroyDialog(); + } - // restore controls - JOptionPane.showMessageDialog(frame, "Assets downloaded successfully.", "Download Complete", JOptionPane.INFORMATION_MESSAGE); - invoker.setEnabled(true); - invoker.setVisible(true); - invoker.toFront(); - invoker.repaint(); - wilkinsDownloadFinished = true; - } - }); - downloaderPopupThread.start(); - } - } + // restore controls + JOptionPane.showMessageDialog(frame, "Assets downloaded successfully.", "Download Complete", JOptionPane.INFORMATION_MESSAGE); + invoker.setEnabled(true); + invoker.setVisible(true); + invoker.toFront(); + invoker.repaint(); + wilkinsDownloadFinished = true; + } + }); + downloaderPopupThread.start(); + } + } } diff --git a/firestar/src/main/java/Clifford.java b/firestar/src/main/java/Clifford.java index d8057df..0b0f226 100644 --- a/firestar/src/main/java/Clifford.java +++ b/firestar/src/main/java/Clifford.java @@ -33,217 +33,217 @@ import java.util.ArrayList; import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE; public class Clifford implements ActionListener { - private JFrame frame = new JFrame(); - private JPanel frameContainer; - private JTextField fName; - private JTextField fAuthor; - private JTextField fVersion; - private JTextPane fDescription; - private JButton savebtn; - private JButton cancelbtn; + private JFrame frame = new JFrame(); + private JPanel frameContainer; + private JTextField fName; + private JTextField fAuthor; + private JTextField fVersion; + private JTextPane fDescription; + private JButton savebtn; + private JButton cancelbtn; - JFrame invoker; - MissPiggy invokerPig; - boolean isPig = false; - Main.Mod mod; - int index; - File directory; - boolean isSoundtrack = false; + JFrame invoker; + MissPiggy invokerPig; + boolean isPig = false; + Main.Mod mod; + int index; + File directory; + boolean isSoundtrack = false; - boolean creating; + boolean creating; - public void Action(MissPiggy inv, int modindex) { - invokerPig = inv; - invoker = invokerPig.frame; - mod = Main.Mods.get(modindex); - index = modindex; - creating = false; + public void Action(MissPiggy inv, int modindex) { + invokerPig = inv; + invoker = invokerPig.frame; + mod = Main.Mods.get(modindex); + index = modindex; + creating = false; - isPig = true; + isPig = true; - Action(invoker, modindex); - } + Action(invoker, modindex); + } - public void Action(MissPiggy inv, File dir) { - invokerPig = inv; - invoker = invokerPig.frame; - directory = dir; - creating = true; + public void Action(MissPiggy inv, File dir) { + invokerPig = inv; + invoker = invokerPig.frame; + directory = dir; + creating = true; - isPig = true; + isPig = true; - Action(invoker, dir); - } + Action(invoker, dir); + } - public void Action(JFrame inv, int modindex) { // Editor - invoker = inv; - mod = Main.Mods.get(modindex); - index = modindex; - creating = false; + public void Action(JFrame inv, int modindex) { // Editor + invoker = inv; + mod = Main.Mods.get(modindex); + index = modindex; + creating = false; - frame.add(frameContainer); - frame.setIconImage(Main.windowIcon); - frame.setSize(600, 300); // 1280 800 - frame.setMinimumSize(new Dimension(200,100)); - frame.setTitle("Options"); - frame.setResizable(false); - frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(inv); - frame.setAlwaysOnTop(true); + frame.add(frameContainer); + frame.setIconImage(Main.windowIcon); + frame.setSize(600, 300); // 1280 800 + frame.setMinimumSize(new Dimension(200,100)); + frame.setTitle("Options"); + frame.setResizable(false); + frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(inv); + frame.setAlwaysOnTop(true); - fName.setText(mod.friendlyName); - fAuthor.setText(mod.author); - fVersion.setText(String.valueOf(mod.version)); - fDescription.setText(mod.description); + fName.setText(mod.friendlyName); + fAuthor.setText(mod.author); + fVersion.setText(String.valueOf(mod.version)); + fDescription.setText(mod.description); - cancelbtn.addActionListener(this); - savebtn.addActionListener(this); + cancelbtn.addActionListener(this); + savebtn.addActionListener(this); - frame.setVisible(true); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) - { - invoker.setEnabled(true); - e.getWindow().dispose(); - } - }); - } + frame.setVisible(true); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) + { + invoker.setEnabled(true); + e.getWindow().dispose(); + } + }); + } - public void Action(JFrame inv, File dir) { // Generator - invoker = inv; - directory = dir; - creating = true; + public void Action(JFrame inv, File dir) { // Generator + invoker = inv; + directory = dir; + creating = true; - frame.add(frameContainer); - frame.setSize(600, 200); // 1280 800 - frame.setMinimumSize(new Dimension(200,100)); - frame.setTitle("Options"); - frame.setResizable(false); - frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(null); - frame.setAlwaysOnTop(true); + frame.add(frameContainer); + frame.setSize(600, 200); // 1280 800 + frame.setMinimumSize(new Dimension(200,100)); + frame.setTitle("Options"); + frame.setResizable(false); + frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(null); + frame.setAlwaysOnTop(true); - cancelbtn.addActionListener(this); - savebtn.addActionListener(this); + cancelbtn.addActionListener(this); + savebtn.addActionListener(this); - frame.setVisible(true); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) - { - Main.deleteDir(new File(Main.inpath + "temp/")); // soundtrack gen - invoker.setEnabled(true); - e.getWindow().dispose(); - } - }); - } + frame.setVisible(true); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) + { + Main.deleteDir(new File(Main.inpath + "temp/")); // soundtrack gen + invoker.setEnabled(true); + e.getWindow().dispose(); + } + }); + } - @Override - public void actionPerformed(ActionEvent actionEvent) { - if (actionEvent.getSource() == cancelbtn) { - Main.deleteDir(new File(Main.inpath + "temp/")); // soundtrack gen - invoker.setEnabled(true); - frame.dispose(); - } else if (actionEvent.getSource() == savebtn && !creating) { - try { - mod.version = Integer.parseInt(fVersion.getText()); - } catch (NumberFormatException e) { - JOptionPane.showMessageDialog(frame, "Mod version must be a valid integer.", "Error", JOptionPane.ERROR_MESSAGE); - return; - } - mod.friendlyName = fName.getText(); - mod.author = fAuthor.getText(); - mod.description = fDescription.getText(); + @Override + public void actionPerformed(ActionEvent actionEvent) { + if (actionEvent.getSource() == cancelbtn) { + Main.deleteDir(new File(Main.inpath + "temp/")); // soundtrack gen + invoker.setEnabled(true); + frame.dispose(); + } else if (actionEvent.getSource() == savebtn && !creating) { + try { + mod.version = Integer.parseInt(fVersion.getText()); + } catch (NumberFormatException e) { + JOptionPane.showMessageDialog(frame, "Mod version must be a valid integer.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + mod.friendlyName = fName.getText(); + mod.author = fAuthor.getText(); + mod.description = fDescription.getText(); - JSONObject container = new JSONObject(); - if (mod.friendlyName.isEmpty()) { - JOptionPane.showMessageDialog(frame, "Mod name cannot be empty.", "Error", JOptionPane.ERROR_MESSAGE); - return; - } - container.put("version", mod.version); - container.put("friendlyName", mod.friendlyName); - container.put("author", mod.author); - container.put("description", mod.description); - container.put("loaderversion", mod.loaderversion); - container.put("game", mod.game); + JSONObject container = new JSONObject(); + if (mod.friendlyName.isEmpty()) { + JOptionPane.showMessageDialog(frame, "Mod name cannot be empty.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + container.put("version", mod.version); + container.put("friendlyName", mod.friendlyName); + container.put("author", mod.author); + container.put("description", mod.description); + container.put("loaderversion", mod.loaderversion); + container.put("game", mod.game); - try { - new ZipFile(System.getProperty("user.home") + "/.firestar/mods/" + mod.path.trim()).setComment(container.toString()); - } catch (ZipException e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } + try { + new ZipFile(System.getProperty("user.home") + "/.firestar/mods/" + mod.path.trim()).setComment(container.toString()); + } catch (ZipException e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } - Main.Mods.set(index, mod); - invoker.setEnabled(true); - if (isPig) {invokerPig.InitializeModListInGUI();} - frame.dispose(); - } else if (actionEvent.getSource() == savebtn && creating) { - if (fName.getText().isEmpty()) { - JOptionPane.showMessageDialog(frame, "Mod name cannot be empty.", "Error", JOptionPane.ERROR_MESSAGE); - return; - } - try { - Integer.parseInt(fVersion.getText()); - } catch (NumberFormatException e) { - JOptionPane.showMessageDialog(frame, "Mod version must be a valid integer.", "Error", JOptionPane.ERROR_MESSAGE); - return; - } + Main.Mods.set(index, mod); + invoker.setEnabled(true); + if (isPig) {invokerPig.InitializeModListInGUI();} + frame.dispose(); + } else if (actionEvent.getSource() == savebtn && creating) { + if (fName.getText().isEmpty()) { + JOptionPane.showMessageDialog(frame, "Mod name cannot be empty.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } + try { + Integer.parseInt(fVersion.getText()); + } catch (NumberFormatException e) { + JOptionPane.showMessageDialog(frame, "Mod version must be a valid integer.", "Error", JOptionPane.ERROR_MESSAGE); + return; + } - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setFileFilter(new FileNameExtensionFilter("Firestar Mod Package", "fstar")); - if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { - ZipFile zip = new ZipFile(fileChooser.getSelectedFile()); - boolean hasScript = false; - try { - zip.addFolder(new File(directory.getAbsolutePath() + "/data")); - if (new File(directory.getAbsolutePath() + "/delete.txt").exists()) { - zip.addFile(new File(directory.getAbsolutePath() + "/delete.txt")); - } - if (new File(directory.getAbsolutePath() + "/pack.png").exists()) { - zip.addFile(new File(directory.getAbsolutePath() + "/pack.png")); - } - if (new File(directory.getAbsolutePath() + "/fscript").exists()) { - zip.addFile(new File(directory.getAbsolutePath() + "/fscript")); - hasScript = true; - } + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileFilter(new FileNameExtensionFilter("Firestar Mod Package", "fstar")); + if (fileChooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) { + ZipFile zip = new ZipFile(fileChooser.getSelectedFile()); + boolean hasScript = false; + try { + zip.addFolder(new File(directory.getAbsolutePath() + "/data")); + if (new File(directory.getAbsolutePath() + "/delete.txt").exists()) { + zip.addFile(new File(directory.getAbsolutePath() + "/delete.txt")); + } + if (new File(directory.getAbsolutePath() + "/pack.png").exists()) { + zip.addFile(new File(directory.getAbsolutePath() + "/pack.png")); + } + if (new File(directory.getAbsolutePath() + "/fscript").exists()) { + zip.addFile(new File(directory.getAbsolutePath() + "/fscript")); + hasScript = true; + } - JSONObject container = new JSONObject(); - container.put("version", Integer.parseInt(fVersion.getText())); - container.put("friendlyName", fName.getText()); - container.put("author", fAuthor.getText()); - container.put("description", fDescription.getText()); - // todo later versions: handle logic for setting this depending on the fscript version too. - // firestar 1.3 can't generate any version other than v1 so this is not necessary right now, but will become necessary when fscript features are added. - if (hasScript) { - container.put("loaderversion", 1); - if (isSoundtrack) { - ArrayList requiresTemp = new ArrayList<>(); - requiresTemp.add(new boolean[]{false, true, false, false}); - requiresTemp.add(new boolean[]{true, false, false, false}); - container.put("requires", requiresTemp); // Pull localization files for patching. - } - } else { - container.put("loaderversion", 0); - } - container.put("game", "2048"); + JSONObject container = new JSONObject(); + container.put("version", Integer.parseInt(fVersion.getText())); + container.put("friendlyName", fName.getText()); + container.put("author", fAuthor.getText()); + container.put("description", fDescription.getText()); + // todo later versions: handle logic for setting this depending on the fscript version too. + // firestar 1.3 can't generate any version other than v1 so this is not necessary right now, but will become necessary when fscript features are added. + if (hasScript) { + container.put("loaderversion", 1); + if (isSoundtrack) { + ArrayList requiresTemp = new ArrayList<>(); + requiresTemp.add(new boolean[]{false, true, false, false}); + requiresTemp.add(new boolean[]{true, false, false, false}); + container.put("requires", requiresTemp); // Pull localization files for patching. + } + } else { + container.put("loaderversion", 0); + } + container.put("game", "2048"); - zip.setComment(container.toString()); - zip.close(); - } catch (Exception e) { - fileChooser.getSelectedFile().delete(); //cleanup - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - return; - } - JOptionPane.showMessageDialog(frame, "Mod file created", "Success", JOptionPane.INFORMATION_MESSAGE); - Main.deleteDir(new File(Main.inpath + "temp/")); // soundtrack gen - invoker.setEnabled(true); - frame.dispose(); - } - } - } + zip.setComment(container.toString()); + zip.close(); + } catch (Exception e) { + fileChooser.getSelectedFile().delete(); //cleanup + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + return; + } + JOptionPane.showMessageDialog(frame, "Mod file created", "Success", JOptionPane.INFORMATION_MESSAGE); + Main.deleteDir(new File(Main.inpath + "temp/")); // soundtrack gen + invoker.setEnabled(true); + frame.dispose(); + } + } + } } diff --git a/firestar/src/main/java/Ernie.java b/firestar/src/main/java/Ernie.java index d7eaf8e..764e189 100644 --- a/firestar/src/main/java/Ernie.java +++ b/firestar/src/main/java/Ernie.java @@ -44,147 +44,145 @@ import org.json.JSONException; import org.json.JSONObject; public class Ernie implements ActionListener { - // Base URL for Gitea API - public static final String gitapi = "https://git.worlio.com/api/v1/repos/bonkmaykr/firestar"; - public static final String changelog = "https://bonkmaykr.worlio.com/http/firestar/changelog.htm"; - - private HttpURLConnection httpConn; - private int contentLength; - private InputStream inputStream; - - private JFrame frame = new JFrame(); - private JPanel frameContainer; - private JEditorPane changelogDisplay; - private JButton notnowbtn; - private JButton surebtn; - - public boolean backgroundDone = false; + // Base URL for Gitea API + public static final String gitapi = "https://git.worlio.com/api/v1/repos/bonkmaykr/firestar"; + public static final String changelog = "https://bonkmaykr.worlio.com/http/firestar/changelog.htm"; + + private HttpURLConnection httpConn; + private int contentLength; + private InputStream inputStream; + + private JFrame frame = new JFrame(); + private JPanel frameContainer; + private JEditorPane changelogDisplay; + private JButton notnowbtn; + private JButton surebtn; + + public boolean backgroundDone = false; - private JFrame parent; + private JFrame parent; - public Ernie(JFrame parent) { - this.parent = parent; - frame.setIconImage(Main.windowIcon); - byte[] urlraw = getFile(gitapi+"/releases?draft=false&pre-release=false"); - if (urlraw.length <= 0) { - JOptionPane.showMessageDialog(frame, "Internal Error: Couldn't check for updates.", "Fatal Error", JOptionPane.ERROR_MESSAGE); - } else { - try { - JSONArray releases = new JSONArray(new String(urlraw, Charset.forName("utf-8"))); - System.out.println("Updater: latest release is " + ((JSONObject)releases.get(0)).get("tag_name")); - if (releases.length() >= 1 && !((JSONObject)releases.get(0)).get("tag_name").equals(Main.vtag)) { - System.out.println("Updater: Your version is out of date."); - frame.add(frameContainer); - notnowbtn.addActionListener(this); - surebtn.addActionListener(this); - changelogDisplay.setEditable(false); - changelogDisplay.setPage(changelog); - changelogDisplay.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); // makes text smaller than joe biden's windmill if font set manually. wtf?? - - frame.setTitle("An update is available!"); - frame.setSize(450, 400); - frame.setResizable(false); - frame.setLocationRelativeTo(parent); - frame.setAlwaysOnTop(true); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - parent.setEnabled(false); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) - { - parent.setEnabled(true); - e.getWindow().dispose(); - } - }); - frame.setVisible(true); - } else { System.out.println("Updater: No updates."); } - } catch (IOException ex) { - Logger.getLogger(Ernie.class.getName()).log(Level.SEVERE, null, ex); - } catch (JSONException ex) { - Logger.getLogger(Ernie.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - - @Override - public void actionPerformed(ActionEvent actionEvent) { - if (actionEvent.getSource() == notnowbtn) { - parent.setEnabled(true); - frame.dispose(); - } else - if (actionEvent.getSource() == surebtn) { - if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { - String releasepage = "https://git.worlio.com/bonkmaykr/firestar/releases"; - try { - Desktop.getDesktop().browse(new URI(releasepage)); - parent.setEnabled(true); - frame.dispose(); - } catch (Exception ex) { - JOptionPane.showMessageDialog(frame, "Couldn't open your web browser!\nYou can check out the latest release at the URL below:\n"+releasepage, "Error", JOptionPane.ERROR_MESSAGE); + public Ernie(JFrame parent) { + this.parent = parent; + frame.setIconImage(Main.windowIcon); + byte[] urlraw = getFile(gitapi+"/releases?draft=false&pre-release=false"); + if (urlraw.length <= 0) { + JOptionPane.showMessageDialog(frame, "Internal Error: Couldn't check for updates.", "Fatal Error", JOptionPane.ERROR_MESSAGE); + } else { + try { + JSONArray releases = new JSONArray(new String(urlraw, Charset.forName("utf-8"))); + System.out.println("Updater: latest release is " + ((JSONObject)releases.get(0)).get("tag_name")); + if (releases.length() >= 1 && !((JSONObject)releases.get(0)).get("tag_name").equals(Main.vtag)) { + System.out.println("Updater: Your version is out of date."); + frame.add(frameContainer); + notnowbtn.addActionListener(this); + surebtn.addActionListener(this); + changelogDisplay.setEditable(false); + changelogDisplay.setPage(changelog); + changelogDisplay.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); // makes text smaller than joe biden's windmill if font set manually. wtf?? + + frame.setTitle("An update is available!"); + frame.setSize(450, 400); + frame.setResizable(false); + frame.setLocationRelativeTo(parent); + frame.setAlwaysOnTop(true); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + parent.setEnabled(false); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) + { + parent.setEnabled(true); + e.getWindow().dispose(); + } + }); + frame.setVisible(true); + } else { System.out.println("Updater: No updates."); } + } catch (IOException | JSONException ex) { + Logger.getLogger(Ernie.class.getName()).log(Level.SEVERE, null, ex); + } } - } } - } - - byte[] getFile(String url) { - try { - URL fileURL = new URL(url); - httpConn = (HttpURLConnection) fileURL.openConnection(); - int response = httpConn.getResponseCode(); + + @Override + public void actionPerformed(ActionEvent actionEvent) { + if (actionEvent.getSource() == notnowbtn) { + parent.setEnabled(true); + frame.dispose(); + } else + if (actionEvent.getSource() == surebtn) { + if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { + String releasepage = "https://git.worlio.com/bonkmaykr/firestar/releases"; + try { + Desktop.getDesktop().browse(new URI(releasepage)); + parent.setEnabled(true); + frame.dispose(); + } catch (Exception ex) { + JOptionPane.showMessageDialog(frame, "Couldn't open your web browser!\nYou can check out the latest release at the URL below:\n"+releasepage, "Error", JOptionPane.ERROR_MESSAGE); + } + } + } + } + + byte[] getFile(String url) { + try { + URL fileURL = new URL(url); + httpConn = (HttpURLConnection) fileURL.openConnection(); + int response = httpConn.getResponseCode(); - if (response == HttpURLConnection.HTTP_OK) { - contentLength = httpConn.getContentLength(); - inputStream = httpConn.getInputStream(); - } else if (response == 404) { - throw new IOException( - "File missing from remote server."); - } else { - throw new IOException( - "Unexpected response; Server replied with " + response); - } - ErnieDownloader ed = new ErnieDownloader(this, url, httpConn.getContentLength()); - ed.doInBackground(); - while (!backgroundDone) {} + if (response == HttpURLConnection.HTTP_OK) { + contentLength = httpConn.getContentLength(); + inputStream = httpConn.getInputStream(); + } else if (response == 404) { + throw new IOException( + "File missing from remote server."); + } else { + throw new IOException( + "Unexpected response; Server replied with " + response); + } + ErnieDownloader ed = new ErnieDownloader(this, url, httpConn.getContentLength()); + ed.doInBackground(); + while (!backgroundDone) {} - inputStream.close(); - httpConn.disconnect(); - frame.dispose(); - return ed.output; - } catch (MalformedURLException e) { - JOptionPane.showMessageDialog(frame, "Internal Error: URL given to Ernie is not valid.\nGet a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.dispose(); - return new byte[]{}; - } catch (Exception e) { - JOptionPane.showMessageDialog(frame, "Error: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.dispose(); - return new byte[]{}; - } - } + inputStream.close(); + httpConn.disconnect(); + frame.dispose(); + return ed.output; + } catch (MalformedURLException e) { + JOptionPane.showMessageDialog(frame, "Internal Error: URL given to Ernie is not valid.\nGet a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.dispose(); + return new byte[]{}; + } catch (Exception e) { + JOptionPane.showMessageDialog(frame, "Error: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.dispose(); + return new byte[]{}; + } + } } class ErnieDownloader extends SwingWorker { - private static final int BUFFER_SIZE = 4096; - private String downloadURL; - private final Ernie gui; - public byte[] output; + private static final int BUFFER_SIZE = 4096; + private String downloadURL; + private final Ernie gui; + public byte[] output; - public ErnieDownloader(Ernie gui, String downloadURL, long size) { - this.gui = gui; - this.downloadURL = downloadURL; - } - - @Override - protected Void doInBackground() throws Exception { - BufferedInputStream in = new BufferedInputStream(new URL(downloadURL).openStream()); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - byte[] data = new byte[16384]; - int x; - while ((x = in.read(data, 0, data.length)) != -1) { - buffer.write(data, 0, x); + public ErnieDownloader(Ernie gui, String downloadURL, long size) { + this.gui = gui; + this.downloadURL = downloadURL; + } + + @Override + protected Void doInBackground() throws Exception { + BufferedInputStream in = new BufferedInputStream(new URL(downloadURL).openStream()); + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + byte[] data = new byte[16384]; + int x; + while ((x = in.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, x); + } + output = buffer.toByteArray(); + in.close(); + gui.backgroundDone = true; + return null; } - output = buffer.toByteArray(); - in.close(); - gui.backgroundDone = true; - return null; - } } \ No newline at end of file diff --git a/firestar/src/main/java/FirescriptFormatException.java b/firestar/src/main/java/FirescriptFormatException.java index f373cd3..b5248f3 100644 --- a/firestar/src/main/java/FirescriptFormatException.java +++ b/firestar/src/main/java/FirescriptFormatException.java @@ -16,17 +16,16 @@ * along with this program. If not, see https://www.gnu.org/licenses/. */ - public class FirescriptFormatException extends Exception { - public FirescriptFormatException() { - super(); - } - - public FirescriptFormatException(String msg) { - super(msg); - } - - public FirescriptFormatException(String cmd, String msg) { - super(cmd + ": " + msg); - } + public FirescriptFormatException() { + super(); + } + + public FirescriptFormatException(String msg) { + super(msg); + } + + public FirescriptFormatException(String cmd, String msg) { + super(cmd + ": " + msg); + } } diff --git a/firestar/src/main/java/Fozzie.java b/firestar/src/main/java/Fozzie.java index 4222991..95e52c0 100644 --- a/firestar/src/main/java/Fozzie.java +++ b/firestar/src/main/java/Fozzie.java @@ -24,151 +24,151 @@ import java.net.URL; import java.net.*; public class Fozzie { - private JFrame frame = new JFrame(); - public JProgressBar progressBar; - private JPanel frameContainer; - private JLabel label; + private JFrame frame = new JFrame(); + public JProgressBar progressBar; + private JPanel frameContainer; + private JLabel label; - private HttpURLConnection httpConn; - private int contentLength; - private InputStream inputStream; + private HttpURLConnection httpConn; + private int contentLength; + private InputStream inputStream; - public boolean backgroundDone = false; + public boolean backgroundDone = false; - boolean DownloadFile(String url, String odir, String oname) { - return DownloadFile(url, odir, oname, oname); - } + boolean DownloadFile(String url, String odir, String oname) { + return DownloadFile(url, odir, oname, oname); + } - boolean DownloadFile(String url, String odir, String oname, String dname) { - frame.add(frameContainer); - frame.setSize(300, 100); - frame.setTitle("Download in Progress"); - frame.setResizable(false); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(null); - frame.setAlwaysOnTop(true); - frame.setIconImage(Main.windowIcon); - frame.setVisible(true); + boolean DownloadFile(String url, String odir, String oname, String dname) { + frame.add(frameContainer); + frame.setSize(300, 100); + frame.setTitle("Download in Progress"); + frame.setResizable(false); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(null); + frame.setAlwaysOnTop(true); + frame.setIconImage(Main.windowIcon); + frame.setVisible(true); - label.setText("Downloading \"" + dname + "\""); + label.setText("Downloading \"" + dname + "\""); - try { - URL fileURL = new URL(url); - httpConn = (HttpURLConnection) fileURL.openConnection(); - int response = httpConn.getResponseCode(); + try { + URL fileURL = new URL(url); + httpConn = (HttpURLConnection) fileURL.openConnection(); + int response = httpConn.getResponseCode(); - if (response == HttpURLConnection.HTTP_OK) { - String disposition = httpConn.getHeaderField("Content-Disposition"); - String contentType = httpConn.getContentType(); - contentLength = httpConn.getContentLength(); + if (response == HttpURLConnection.HTTP_OK) { + String disposition = httpConn.getHeaderField("Content-Disposition"); + String contentType = httpConn.getContentType(); + contentLength = httpConn.getContentLength(); - inputStream = httpConn.getInputStream(); - } else if (response == 404) { - throw new IOException( - "File missing from remote server."); - } else { - throw new IOException( - "Unexpected response; Server replied with " + response); - } - new FozzieDownloader(this, url, odir, oname, httpConn.getContentLength()).doInBackground(); - while (!backgroundDone) {} + inputStream = httpConn.getInputStream(); + } else if (response == 404) { + throw new IOException( + "File missing from remote server."); + } else { + throw new IOException( + "Unexpected response; Server replied with " + response); + } + new FozzieDownloader(this, url, odir, oname, httpConn.getContentLength()).doInBackground(); + while (!backgroundDone) {} - inputStream.close(); - httpConn.disconnect(); - frame.dispose(); - return true; - } catch (MalformedURLException e) { - JOptionPane.showMessageDialog(frame, "Internal Error: URL given to Fozzie is not valid.\nGet a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.dispose(); - return false; - } catch (Exception e) { - JOptionPane.showMessageDialog(frame, "Error: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.dispose(); - return false; - } - } + inputStream.close(); + httpConn.disconnect(); + frame.dispose(); + return true; + } catch (MalformedURLException e) { + JOptionPane.showMessageDialog(frame, "Internal Error: URL given to Fozzie is not valid.\nGet a programmer!", "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.dispose(); + return false; + } catch (Exception e) { + JOptionPane.showMessageDialog(frame, "Error: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.dispose(); + return false; + } + } - public void displayTextOnly(String text, String title) { - frame.add(frameContainer); - frame.setSize(300, 100); - frame.setTitle(title); - frame.setResizable(false); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(null); - frame.setAlwaysOnTop(true); - frame.setIconImage(Main.windowIcon); - frame.setVisible(true); + public void displayTextOnly(String text, String title) { + frame.add(frameContainer); + frame.setSize(300, 100); + frame.setTitle(title); + frame.setResizable(false); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(null); + frame.setAlwaysOnTop(true); + frame.setIconImage(Main.windowIcon); + frame.setVisible(true); - label.setText(text); + label.setText(text); - progressBar.setVisible(false); - } + progressBar.setVisible(false); + } - public void setText(String text, String title) { - label.setText(text); - frame.setTitle(title); - } + public void setText(String text, String title) { + label.setText(text); + frame.setTitle(title); + } - public void destroyDialog() { - frame.setVisible(false); - frame.dispose(); - } + public void destroyDialog() { + frame.setVisible(false); + frame.dispose(); + } - public void disconnect() throws IOException { - inputStream.close(); - httpConn.disconnect(); - } + public void disconnect() throws IOException { + inputStream.close(); + httpConn.disconnect(); + } - public int getContentLength() { - return this.contentLength; - } + public int getContentLength() { + return this.contentLength; + } - public InputStream getInputStream() { - return this.inputStream; - } + public InputStream getInputStream() { + return this.inputStream; + } } class FozzieDownloader extends SwingWorker { - private static final int BUFFER_SIZE = 4096; - private String downloadURL; - private String saveDirectory; - private String saveName; - private final Fozzie gui; - private final long completeSize; + private static final int BUFFER_SIZE = 4096; + private String downloadURL; + private String saveDirectory; + private String saveName; + private final Fozzie gui; + private final long completeSize; - public FozzieDownloader(Fozzie gui, String downloadURL, String saveDirectory, String saveName, long size) { - this.gui = gui; - this.downloadURL = downloadURL; - this.saveDirectory = saveDirectory; - this.saveName = saveName; - this.completeSize = size; - } + public FozzieDownloader(Fozzie gui, String downloadURL, String saveDirectory, String saveName, long size) { + this.gui = gui; + this.downloadURL = downloadURL; + this.saveDirectory = saveDirectory; + this.saveName = saveName; + this.completeSize = size; + } - @Override - protected Void doInBackground() throws Exception { - long downloadedSize = 0; - File downloadLocationDir = new File(saveDirectory); - File downloadLocation = new File(saveDirectory + "/" + saveName); - downloadLocationDir.mkdirs(); - if (!downloadLocation.isFile()) { - downloadLocation.createNewFile(); - } - BufferedInputStream in = new BufferedInputStream(new URL(downloadURL).openStream()); - FileOutputStream fos = new FileOutputStream(saveDirectory + "/" + saveName); - BufferedOutputStream out = new BufferedOutputStream(fos,1024); - byte[] data = new byte[1024]; - int x = 0; - while ((x = in.read(data,0,1024))>=0) { - downloadedSize += x; - int progress = (int) ((((double)downloadedSize) / ((double)completeSize)) * 100d); - gui.progressBar.setValue(progress); - out.write(data, 0, x); - } - out.close(); - in.close(); - gui.backgroundDone = true; - return null; - } + @Override + protected Void doInBackground() throws Exception { + long downloadedSize = 0; + File downloadLocationDir = new File(saveDirectory); + File downloadLocation = new File(saveDirectory + "/" + saveName); + downloadLocationDir.mkdirs(); + if (!downloadLocation.isFile()) { + downloadLocation.createNewFile(); + } + BufferedInputStream in = new BufferedInputStream(new URL(downloadURL).openStream()); + FileOutputStream fos = new FileOutputStream(saveDirectory + "/" + saveName); + BufferedOutputStream out = new BufferedOutputStream(fos,1024); + byte[] data = new byte[1024]; + int x = 0; + while ((x = in.read(data,0,1024))>=0) { + downloadedSize += x; + int progress = (int) ((((double)downloadedSize) / ((double)completeSize)) * 100d); + gui.progressBar.setValue(progress); + out.write(data, 0, x); + } + out.close(); + in.close(); + gui.backgroundDone = true; + return null; + } } diff --git a/firestar/src/main/java/Gonzo.java b/firestar/src/main/java/Gonzo.java index 397d2ff..2b8fe02 100644 --- a/firestar/src/main/java/Gonzo.java +++ b/firestar/src/main/java/Gonzo.java @@ -16,9 +16,6 @@ * along with this program. If not, see https://www.gnu.org/licenses/. */ -import com.github.difflib.DiffUtils; -import com.github.difflib.UnifiedDiffUtils; -import com.github.difflib.patch.Patch; import net.lingala.zip4j.ZipFile; import javax.swing.*; @@ -35,337 +32,331 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.Stream; public class Gonzo { - JFrame frame = new JFrame(); - private JPanel frameContainer; - private JTextArea consoleDisplay; - private JScrollPane scrollPane; - public boolean data0; - public boolean data1; - public boolean data2; - public boolean dlc1; - public boolean dlc2; - private MissPiggy invoker; - public String oArcTarget = "dlc2.psarc"; // which psarc to rebuild the assets in + JFrame frame = new JFrame(); + private JPanel frameContainer; + private JTextArea consoleDisplay; + private JScrollPane scrollPane; + public boolean data0; + public boolean data1; + public boolean data2; + public boolean dlc1; + public boolean dlc2; + private MissPiggy invoker; + public String oArcTarget = "dlc2.psarc"; // which psarc to rebuild the assets in - // TODO 1.3: Implement requires boolean[] from Main.Mod - // Rework system to choose the last PSARC and then add more before it when called by requires[] - // Instead of the current system where it simply grabs them all and bloats the file. - // - // EDIT: requires[] is now an arraylist of booleans[], each a supported minimum combination of PSARCs. - // if any one of them is met, gonzo may continue - // for example: - // [false, true, false, false], [true, false, false, false] // user only needs either base psarc or patches PSARC, one or the other (having both is OK) - // [true, true, false, false] // user needs both base and patches - // [false, false, true, true] // user needs the HD DLC and the Fury DLC - // - // if none is found, assume "new boolean[]{false, false, false, false}" (no PSARCs required) - // (at least one of any 4 psarcs will already be checked for by MissPiggy so this is an okay way to implement it.) + // TODO 1.3: Implement requires boolean[] from Main.Mod + // Rework system to choose the last PSARC and then add more before it when called by requires[] + // Instead of the current system where it simply grabs them all and bloats the file. + // + // EDIT: requires[] is now an arraylist of booleans[], each a supported minimum combination of PSARCs. + // if any one of them is met, gonzo may continue + // for example: + // [false, true, false, false], [true, false, false, false] // user only needs either base psarc or patches PSARC, one or the other (having both is OK) + // [true, true, false, false] // user needs both base and patches + // [false, false, true, true] // user needs the HD DLC and the Fury DLC + // + // if none is found, assume "new boolean[]{false, false, false, false}" (no PSARCs required) + // (at least one of any 4 psarcs will already be checked for by MissPiggy so this is an okay way to implement it.) - public void DeployMods(MissPiggy inv) { - invoker = inv; - System.out.println("\n\nStarting mod deployment\n\n"); + public void DeployMods(MissPiggy inv) { + invoker = inv; + System.out.println("\n\nStarting mod deployment\n\n"); - frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA + frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA - frame.setIconImage(Main.windowIcon); - frame.setSize(800, 400); - frame.setMinimumSize(new Dimension(600,400)); - frame.setTitle("Mod Installation"); - frame.setResizable(false); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(inv.frame); - frame.setAlwaysOnTop(true); - frame.setVisible(true); + frame.setIconImage(Main.windowIcon); + frame.setSize(800, 400); + frame.setMinimumSize(new Dimension(600,400)); + frame.setTitle("Mod Installation"); + frame.setResizable(false); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(inv.frame); + frame.setAlwaysOnTop(true); + frame.setVisible(true); - File psarcHandle = new File(Main.inpath + "data.psarc"); - data0 = psarcHandle.isFile(); - psarcHandle = new File(Main.inpath + "data1.psarc"); - data1 = psarcHandle.isFile(); - psarcHandle = new File(Main.inpath + "data2.psarc"); - data2 = psarcHandle.isFile(); - psarcHandle = new File(Main.inpath + "dlc1.psarc"); - dlc1 = psarcHandle.isFile(); - psarcHandle = new File(Main.inpath + "dlc2.psarc"); - dlc2 = psarcHandle.isFile(); + File psarcHandle = new File(Main.inpath + "data.psarc"); + data0 = psarcHandle.isFile(); + psarcHandle = new File(Main.inpath + "data1.psarc"); + data1 = psarcHandle.isFile(); + psarcHandle = new File(Main.inpath + "data2.psarc"); + data2 = psarcHandle.isFile(); + psarcHandle = new File(Main.inpath + "dlc1.psarc"); + dlc1 = psarcHandle.isFile(); + psarcHandle = new File(Main.inpath + "dlc2.psarc"); + dlc2 = psarcHandle.isFile(); - System.out.println("Source files discovered: data " + data0 + ", data1 " + data1 + ", data2 " + data2 + ", dlc1 " + dlc1 + ", dlc2 " + dlc2); + System.out.println("Source files discovered: data " + data0 + ", data1 " + data1 + ", data2 " + data2 + ", dlc1 " + dlc1 + ", dlc2 " + dlc2); - final Thread managerThread = new Thread() { - @Override - public void run() { - if (/*Main.repatch*/true) { //todo implement fast mode correctly or remove - CompatibilityRoutine(); - } else { - FastRoutine(); - } - } - }; - managerThread.start(); - } - - private void CompatibilityRoutine() { - // create temporary working area for asset dump - new File(System.getProperty("user.home") + "/.firestar/temp/").mkdirs(); - - // decide which files to dump - List dumpThese = new ArrayList(); - if (data0) {dumpThese.add("data.psarc");oArcTarget = "data.psarc";} - if (data1) {dumpThese.add("data1.psarc");oArcTarget = "data1.psarc";} - if (data2) {dumpThese.add("data2.psarc");oArcTarget = "data2.psarc";} - if (dlc1) {dumpThese.add("dlc1.psarc");oArcTarget = "dlc1.psarc";} - if (dlc2) {dumpThese.add("dlc2.psarc");oArcTarget = "dlc2.psarc";} - - // dump all assets to working area - for (String s : dumpThese) { - try { - System.out.println("Firestar is extracting " + s); - consoleDisplay.append("Firestar is extracting " + s + "\n"); - //Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","aplay /home/bonkyboo/kittens_loop.wav"}); // DEBUG - Process p = Main.exec(new String[]{"../psp2psarc.exe", "extract", "-y", "../"+s}, System.getProperty("user.home") + "/.firestar/temp/"); - final Thread ioThread = new Thread() { - @Override - public void run() { - try { - final BufferedReader reader = new BufferedReader( - new InputStreamReader(p.getInputStream())); - String line = null; - while ((line = reader.readLine()) != null) { - System.out.println(line); - consoleDisplay.append(line + "\n"); - try {scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum());} - catch (Exception e) {System.out.println("WARNING: Swing failed to paint window due to race condition. You can safely ignore this.\n" + e.getMessage());} - } - reader.close(); - } catch (final Exception e) { - e.printStackTrace(); // will probably definitely absolutely for sure hang firestar unless we do something. Too bad! - } - } - }; - ioThread.start(); - p.waitFor(); - } catch (IOException | InterruptedException e) { - System.out.println(e.getMessage()); - consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); - JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - AllowExit(); - return; - } - } - - // overwrite assets with custom ones from each mod and/or perform operations as specified in mod's delete list - // todo: implement RegEx functions after delete.txt - for (Main.Mod m : Main.Mods) { - if (m.enabled) { - try { - System.out.println("Firestar is extracting " + m.friendlyName + " by " + m.author); - consoleDisplay.append("Firestar is extracting " + m.friendlyName + " by " + m.author + "\n"); - new ZipFile(System.getProperty("user.home") + "/.firestar/mods/" + m.path).extractAll(System.getProperty("user.home") + "/.firestar/temp/"); - - File fscript = new File(Main.inpath + "temp/fscript"); - if (fscript.exists()) { - new Rizzo(new FileInputStream(fscript), Main.inpath + "temp/"); // Lets rizz this mod up - fscript.delete(); - } - - if (new File(System.getProperty("user.home") + "/.firestar/temp/delete.txt").isFile()) { - System.out.println("Firestar is deleting files that conflict with " + m.friendlyName + " by " + m.author); - consoleDisplay.append("Firestar is deleting files that conflict with " + m.friendlyName + " by " + m.author + "\n"); - - String deleteQueue = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/temp/delete.txt"))); - if (Main.windows) {deleteQueue = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "\\.firestar\\temp\\delete.txt")));} // might be unnecessary - String[] dQarray = deleteQueue.split("\n"); - Arrays.sort(dQarray); - System.out.println("The deletion queue is " + dQarray.length + " files long!"); //debug - - for (String file : dQarray) { - if(file.contains("..")) { //todo: is this safe enough? - System.out.println("WARNING: Firestar skipped a potentially dangerous delete command. Please ensure the mod you're installing is from someone you trust!"); - consoleDisplay.append("WARNING: Firestar skipped a potentially dangerous delete command. Please ensure the mod you're installing is from someone you trust!\n"); - } else { - if (!Main.windows) { - System.out.println("Deleting " + System.getProperty("user.home") + "/.firestar/temp/data/" + file); - consoleDisplay.append("Deleting " + System.getProperty("user.home") + "/.firestar/temp/data/" + file + "\n"); - new File(System.getProperty("user.home") + "/.firestar/temp/data" + file).delete();} - else { - System.out.println("Deleting " + new String(System.getProperty("user.home") + "\\.firestar\\temp\\data" + file).replace("/", "\\")); - consoleDisplay.append("Deleting " + new String(System.getProperty("user.home") + "\\.firestar\\temp\\data" + file).replace("/", "\\") + "\n"); - new File(new String(System.getProperty("user.home") + "\\.firestar\\temp\\data" + file).replace("/", "\\")).delete(); - } - } - } - - // cleanup so we don't run it again for the next mod unless needed - // this is not necessary but good practice - new File(System.getProperty("user.home") + "/.firestar/temp/delete.txt").delete(); - } - } catch (Exception e) { - System.out.println(e.getMessage()); - consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); - JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - AllowExit(); - return; - } - } - } - - // Post fscript changes - try (InputStream is = Main.class.getResourceAsStream("/post.fscript")) { - new Rizzo(is, Main.inpath + "temp/"); - } catch (IOException | FirescriptFormatException e) { - System.out.println(e.getMessage()); - consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); - JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - AllowExit(); - return; + final Thread managerThread = new Thread() { + @Override + public void run() { + if (/*Main.repatch*/true) { //todo implement fast mode correctly or remove + CompatibilityRoutine(); + } else { + FastRoutine(); + } + } + }; + managerThread.start(); } - // create a list of the contents of data/ for psp2psarc.exe to read from - List oFilesList = new ArrayList(); - List oFilesList2 = new ArrayList(); - try { - listAllFiles(Paths.get(System.getProperty("user.home") + "/.firestar/temp/data/"), oFilesList); - for (String p : oFilesList) { - // We need to clean up the path here on Linux to avoid psp2psarc getting confused about where the hell "/" is. - // In WINE it should see it as Z: by default, but if it's somewhere else then I don't have an elegant way of knowing what drive letter it's on, so - // relative paths are kind of the only choice here. This can be extended to Windows too as it works there, though completely unnecessary. - if (!Main.windows) {oFilesList2.add(p.replace("\\", "/").split(new String(System.getProperty("user.home") + "/.firestar/temp/"))[1]);} - else {oFilesList2.add(p.split(new String(System.getProperty("user.home") + "\\.firestar\\temp\\").replace("\\", "\\\\"))[1]);} // path wont match regex unless adjusted for windows here - } - //oFilesList2.forEach(System.out::println); //debug - File oFilesListO = new File(System.getProperty("user.home") + "/.firestar/temp/list.txt"); - if (oFilesListO.isFile()) {oFilesListO.delete();} - FileWriter oFilesListWr = new FileWriter(oFilesListO, true); - int i = 0; - for (String p : oFilesList2) { - oFilesListWr.append(p); - if (i != oFilesList2.size()) { - oFilesListWr.append("\n"); - } - i++; - } - oFilesListWr.close(); - } catch (Exception e) { - System.out.println(e.getMessage()); - consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); - JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - AllowExit(); - return; - } + private void CompatibilityRoutine() { + // create temporary working area for asset dump + new File(System.getProperty("user.home") + "/.firestar/temp/").mkdirs(); - // invoke psp2psarc.exe one final time to reconstruct the assets - try { - System.out.println("Firestar is compiling the final build"); - consoleDisplay.append("Firestar is compiling the final build" + "\n"); - Process p = Main.exec(new String[]{"../psp2psarc.exe", "create", "--skip-missing-files", "-j12", "-a", "-i", "-y", "--input-file=list.txt", "-o" + oArcTarget}, System.getProperty("user.home") + "/.firestar/temp/"); - final Thread ioThread = new Thread() { - @Override - public void run() { - try { - final BufferedReader reader = new BufferedReader( - new InputStreamReader(p.getInputStream())); - String line = null; - while ((line = reader.readLine()) != null) { - System.out.println(line); - consoleDisplay.append(line + "\n"); - try {scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum());} - catch (Exception e) {System.out.println("WARNING: Swing failed to paint window due to race condition.\n" + e.getMessage());} - } - reader.close(); - } catch (final Exception e) { - e.printStackTrace(); // will probably definitely absolutely for sure hang firestar unless we do something. Too bad! - } - } - }; - ioThread.start(); - p.waitFor(); - } catch (IOException | InterruptedException e) { - System.out.println(e.getMessage()); - consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); - JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - AllowExit(); - return; - } + // decide which files to dump + List dumpThese = new ArrayList(); + if (data0) {dumpThese.add("data.psarc");oArcTarget = "data.psarc";} + if (data1) {dumpThese.add("data1.psarc");oArcTarget = "data1.psarc";} + if (data2) {dumpThese.add("data2.psarc");oArcTarget = "data2.psarc";} + if (dlc1) {dumpThese.add("dlc1.psarc");oArcTarget = "dlc1.psarc";} + if (dlc2) {dumpThese.add("dlc2.psarc");oArcTarget = "dlc2.psarc";} - // cleanup - boolean one = new File(Main.outpath).mkdirs(); - boolean two; - System.out.println("created export folder: " + one); - if (new File(Main.outpath + oArcTarget).exists()) {System.out.println("deleting existing file: " + Main.outpath + oArcTarget); new File(Main.outpath + oArcTarget).delete();} //hackjob - if (!Main.windows) {two = new File(System.getProperty("user.home") + "/.firestar/temp/" + oArcTarget).renameTo(new File(Main.outpath + oArcTarget));} - else {two = new File(System.getProperty("user.home") + "\\.firestar\\temp\\" + oArcTarget).renameTo(new File(Main.outpath + oArcTarget));} - System.out.println("moved file to destination: " + two); - if (two) {System.out.println("file should be located at " + Main.outpath + oArcTarget);} else { - System.out.println("CRITICAL FAILURE: Please check that your output path is correct and that you have write permissions!"); - consoleDisplay.append("CRITICAL FAILURE: Please check that your output path is correct and that you have write permissions!"); - JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: Please check that your output path is correct and that you have write permissions!", "Fatal Error", JOptionPane.ERROR_MESSAGE); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - AllowExit(); - return; - } - try { - File tmp = new File(System.getProperty("user.home") + "/.firestar/temp/"); - Main.deleteDir(tmp); - } catch (Exception e) { - System.out.println("WARNING: Temporary files may not have been properly cleared.\n" + e.getMessage()); - consoleDisplay.append("WARNING: Temporary files may not have been properly cleared.\n" + e.getMessage()); - } + // dump all assets to working area + for (String s : dumpThese) { + try { + System.out.println("Firestar is extracting " + s); + consoleDisplay.append("Firestar is extracting " + s + "\n"); + //Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","aplay /home/bonkyboo/kittens_loop.wav"}); // DEBUG + Process p = Main.exec(new String[]{"../psp2psarc.exe", "extract", "-y", "../"+s}, System.getProperty("user.home") + "/.firestar/temp/"); + final Thread ioThread = new Thread() { + @Override + public void run() { + try { + final BufferedReader reader = new BufferedReader( + new InputStreamReader(p.getInputStream())); + String line = null; + while ((line = reader.readLine()) != null) { + System.out.println(line); + consoleDisplay.append(line + "\n"); + try {scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum());} + catch (Exception e) {System.out.println("WARNING: Swing failed to paint window due to race condition. You can safely ignore this.\n" + e.getMessage());} + } + reader.close(); + } catch (final Exception e) { + e.printStackTrace(); // will probably definitely absolutely for sure hang firestar unless we do something. Too bad! + } + } + }; + ioThread.start(); + p.waitFor(); + } catch (IOException | InterruptedException e) { + System.out.println(e.getMessage()); + consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); + JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + AllowExit(); + return; + } + } - // done! - try { - TimeUnit.SECONDS.sleep(1); // avoid race condition when logging - } catch (InterruptedException e) { - //ignore - } + // overwrite assets with custom ones from each mod and/or perform operations as specified in mod's delete list + // todo: implement RegEx functions after delete.txt + for (Main.Mod m : Main.Mods) { + if (m.enabled) { + try { + System.out.println("Firestar is extracting " + m.friendlyName + " by " + m.author); + consoleDisplay.append("Firestar is extracting " + m.friendlyName + " by " + m.author + "\n"); + new ZipFile(System.getProperty("user.home") + "/.firestar/mods/" + m.path).extractAll(System.getProperty("user.home") + "/.firestar/temp/"); - ((TitledBorder)scrollPane.getBorder()).setTitle("DONE! Close this pop-up to continue."); - scrollPane.repaint(); + File fscript = new File(Main.inpath + "temp/fscript"); + if (fscript.exists()) { + new Rizzo(new FileInputStream(fscript), Main.inpath + "temp/"); // Lets rizz this mod up + fscript.delete(); + } + + if (new File(System.getProperty("user.home") + "/.firestar/temp/delete.txt").isFile()) { + System.out.println("Firestar is deleting files that conflict with " + m.friendlyName + " by " + m.author); + consoleDisplay.append("Firestar is deleting files that conflict with " + m.friendlyName + " by " + m.author + "\n"); + + String deleteQueue = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/temp/delete.txt"))); + if (Main.windows) {deleteQueue = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "\\.firestar\\temp\\delete.txt")));} // might be unnecessary + String[] dQarray = deleteQueue.split("\n"); + Arrays.sort(dQarray); + System.out.println("The deletion queue is " + dQarray.length + " files long!"); //debug - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - AllowExit(); - } + for (String file : dQarray) { + if(file.contains("..")) { //todo: is this safe enough? + System.out.println("WARNING: Firestar skipped a potentially dangerous delete command. Please ensure the mod you're installing is from someone you trust!"); + consoleDisplay.append("WARNING: Firestar skipped a potentially dangerous delete command. Please ensure the mod you're installing is from someone you trust!\n"); + } else { + if (!Main.windows) { + System.out.println("Deleting " + System.getProperty("user.home") + "/.firestar/temp/data/" + file); + consoleDisplay.append("Deleting " + System.getProperty("user.home") + "/.firestar/temp/data/" + file + "\n"); + new File(System.getProperty("user.home") + "/.firestar/temp/data" + file).delete();} + else { + System.out.println("Deleting " + new String(System.getProperty("user.home") + "\\.firestar\\temp\\data" + file).replace("/", "\\")); + consoleDisplay.append("Deleting " + new String(System.getProperty("user.home") + "\\.firestar\\temp\\data" + file).replace("/", "\\") + "\n"); + new File(new String(System.getProperty("user.home") + "\\.firestar\\temp\\data" + file).replace("/", "\\")).delete(); + } + } + } - private void FastRoutine() { + // cleanup so we don't run it again for the next mod unless needed + // this is not necessary but good practice + new File(System.getProperty("user.home") + "/.firestar/temp/delete.txt").delete(); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); + JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + AllowExit(); + return; + } + } + } + + // Post fscript changes + try (InputStream is = Main.class.getResourceAsStream("/post.fscript")) { + new Rizzo(is, Main.inpath + "temp/"); + } catch (IOException | FirescriptFormatException e) { + System.out.println(e.getMessage()); + consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); + JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + AllowExit(); + return; + } - } + // create a list of the contents of data/ for psp2psarc.exe to read from + List oFilesList = new ArrayList(); + List oFilesList2 = new ArrayList(); + try { + listAllFiles(Paths.get(System.getProperty("user.home") + "/.firestar/temp/data/"), oFilesList); + for (String p : oFilesList) { + // We need to clean up the path here on Linux to avoid psp2psarc getting confused about where the hell "/" is. + // In WINE it should see it as Z: by default, but if it's somewhere else then I don't have an elegant way of knowing what drive letter it's on, so + // relative paths are kind of the only choice here. This can be extended to Windows too as it works there, though completely unnecessary. + if (!Main.windows) {oFilesList2.add(p.replace("\\", "/").split(new String(System.getProperty("user.home") + "/.firestar/temp/"))[1]);} + else {oFilesList2.add(p.split(new String(System.getProperty("user.home") + "\\.firestar\\temp\\").replace("\\", "\\\\"))[1]);} // path wont match regex unless adjusted for windows here + } + //oFilesList2.forEach(System.out::println); //debug + File oFilesListO = new File(System.getProperty("user.home") + "/.firestar/temp/list.txt"); + if (oFilesListO.isFile()) {oFilesListO.delete();} + FileWriter oFilesListWr = new FileWriter(oFilesListO, true); + int i = 0; + for (String p : oFilesList2) { + oFilesListWr.append(p); + if (i != oFilesList2.size()) { + oFilesListWr.append("\n"); + } + i++; + } + oFilesListWr.close(); + } catch (Exception e) { + System.out.println(e.getMessage()); + consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); + JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + AllowExit(); + return; + } - public void AllowExit() { - System.out.println("\n\nYou may now close the pop-up window."); - consoleDisplay.append("\n\n\nYou may now close the pop-up window."); - try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {} //ignore - scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum()); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) - { - invoker.wrapUpDeployment(); - e.getWindow().dispose(); - } - }); - } + // invoke psp2psarc.exe one final time to reconstruct the assets + try { + System.out.println("Firestar is compiling the final build"); + consoleDisplay.append("Firestar is compiling the final build" + "\n"); + Process p = Main.exec(new String[]{"../psp2psarc.exe", "create", "--skip-missing-files", "-j12", "-a", "-i", "-y", "--input-file=list.txt", "-o" + oArcTarget}, System.getProperty("user.home") + "/.firestar/temp/"); + final Thread ioThread = new Thread() { + @Override + public void run() { + try { + final BufferedReader reader = new BufferedReader( + new InputStreamReader(p.getInputStream())); + String line = null; + while ((line = reader.readLine()) != null) { + System.out.println(line); + consoleDisplay.append(line + "\n"); + try {scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum());} + catch (Exception e) {System.out.println("WARNING: Swing failed to paint window due to race condition.\n" + e.getMessage());} + } + reader.close(); + } catch (final Exception e) { + e.printStackTrace(); // will probably definitely absolutely for sure hang firestar unless we do something. Too bad! + } + } + }; + ioThread.start(); + p.waitFor(); + } catch (IOException | InterruptedException e) { + System.out.println(e.getMessage()); + consoleDisplay.append("CRITICAL FAILURE: " + e.getMessage()); + JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: " + e.getMessage(), "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + AllowExit(); + return; + } - private static void listAllFiles(Path currentPath, List allFiles) - throws IOException - { - try (DirectoryStream stream = Files.newDirectoryStream(currentPath)) - { - for (Path entry : stream) { - if (Files.isDirectory(entry)) { - listAllFiles(entry, allFiles); - } else { - allFiles.add(entry.toString()); - } - } - } - } + // cleanup + boolean one = new File(Main.outpath).mkdirs(); + boolean two; + System.out.println("created export folder: " + one); + if (new File(Main.outpath + oArcTarget).exists()) {System.out.println("deleting existing file: " + Main.outpath + oArcTarget); new File(Main.outpath + oArcTarget).delete();} //hackjob + if (!Main.windows) {two = new File(System.getProperty("user.home") + "/.firestar/temp/" + oArcTarget).renameTo(new File(Main.outpath + oArcTarget));} + else {two = new File(System.getProperty("user.home") + "\\.firestar\\temp\\" + oArcTarget).renameTo(new File(Main.outpath + oArcTarget));} + System.out.println("moved file to destination: " + two); + if (two) {System.out.println("file should be located at " + Main.outpath + oArcTarget);} else { + System.out.println("CRITICAL FAILURE: Please check that your output path is correct and that you have write permissions!"); + consoleDisplay.append("CRITICAL FAILURE: Please check that your output path is correct and that you have write permissions!"); + JOptionPane.showMessageDialog(this.frame, "CRITICAL FAILURE: Please check that your output path is correct and that you have write permissions!", "Fatal Error", JOptionPane.ERROR_MESSAGE); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + AllowExit(); + return; + } + try { + File tmp = new File(System.getProperty("user.home") + "/.firestar/temp/"); + Main.deleteDir(tmp); + } catch (Exception e) { + System.out.println("WARNING: Temporary files may not have been properly cleared.\n" + e.getMessage()); + consoleDisplay.append("WARNING: Temporary files may not have been properly cleared.\n" + e.getMessage()); + } + + // done! + try { + TimeUnit.SECONDS.sleep(1); // avoid race condition when logging + } catch (InterruptedException e) { + //ignore + } + + ((TitledBorder)scrollPane.getBorder()).setTitle("DONE! Close this pop-up to continue."); + scrollPane.repaint(); + + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + AllowExit(); + } + + private void FastRoutine() { + + } + + public void AllowExit() { + System.out.println("\n\nYou may now close the pop-up window."); + consoleDisplay.append("\n\n\nYou may now close the pop-up window."); + try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {} //ignore + scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum()); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) + { + invoker.wrapUpDeployment(); + e.getWindow().dispose(); + } + }); + } + + private static void listAllFiles(Path currentPath, List allFiles) throws IOException { + try (DirectoryStream stream = Files.newDirectoryStream(currentPath)) { + for (Path entry : stream) { + if (Files.isDirectory(entry)) { + listAllFiles(entry, allFiles); + } else { + allFiles.add(entry.toString()); + } + } + } + } } diff --git a/firestar/src/main/java/Main.java b/firestar/src/main/java/Main.java index 32c2de3..cdc6a39 100644 --- a/firestar/src/main/java/Main.java +++ b/firestar/src/main/java/Main.java @@ -30,224 +30,224 @@ import javax.imageio.ImageIO; import javax.swing.*; public class Main { - // Build Information - public static final String vstr = "Release 1.3"; - public static final String vcode = "Tetsuo"; - public static final String vtag = "tetsuo-1.3"; // set to dekka-1.1 for testing - public static final int vint = 1; + // Build Information + public static final String vstr = "Release 1.3"; + public static final String vcode = "Tetsuo"; + public static final String vtag = "tetsuo-1.3"; // set to dekka-1.1 for testing + public static final int vint = 1; - // User Settings - public static String outpath = System.getProperty("user.home") + "/.firestar/out/"; //game assets location - public final static String inpath = System.getProperty("user.home") + "/.firestar/"; //firestar folder -- do not change this - public static boolean repatch; //are we in compat mode? - public static boolean windows; //True = windows - public static int confvint = vint; - public static boolean checkUpdates = true; - //public static String psarc; //sdk location + // User Settings + public static String outpath = System.getProperty("user.home") + "/.firestar/out/"; //game assets location + public final static String inpath = System.getProperty("user.home") + "/.firestar/"; //firestar folder -- do not change this + public static boolean repatch; //are we in compat mode? + public static boolean windows; //True = windows + public static int confvint = vint; + public static boolean checkUpdates = true; + //public static String psarc; //sdk location - public enum ArcTarget { // install target for 2048, type used by downloader - BASE("http://zeus.dl.playstation.net/cdn/UP9000/PCSA00015_00/NYEoaBGfiWymSEVZKxoyrKyBFsZNoFqxdyAIpZayZYuLLbCAArYrYXjPNhKCfXcONmhIZzZEeArycSrjiJOuNMWuWsDONUxMIQtMk.pkg"), - LATEST("http://gs.ww.np.dl.playstation.net/ppkg/np/PCSA00015/PCSA00015_T5/a4b7d9e35ed56e86/UP9000-PCSA00015_00-WIPEOUT2048BASE0-A0104-V0100-059564fcab8ce66d19b5a563e92677e581313205-PE.pkg"), - ADDON_HD("http://zeus.dl.playstation.net/cdn/UP9000/PCSA00015_00/JYMqGNXUKqHEyNLjbOgrWcJdnQJUMzgadRFWekbWFBXAwMeGikOyiHkXKogKIfqGhtNwKgmNWwwcrJORmRUTDzylBPwjGVnVjyDfh.pkg"), - ADDON_HD_FURY("http://zeus.dl.playstation.net/cdn/UP9000/PCSA00015_00/IAoJQaDpySenBmQCKiqecEPMzSdPfPcdXupxZXLTYYTuRgtsdTaHxbeejwGKRQpjJOKBdMMFzSoeEhsHYxNUasQrEzkZPeBxUEqnp.pkg"); + public enum ArcTarget { // install target for 2048, type used by downloader + BASE("http://zeus.dl.playstation.net/cdn/UP9000/PCSA00015_00/NYEoaBGfiWymSEVZKxoyrKyBFsZNoFqxdyAIpZayZYuLLbCAArYrYXjPNhKCfXcONmhIZzZEeArycSrjiJOuNMWuWsDONUxMIQtMk.pkg"), + LATEST("http://gs.ww.np.dl.playstation.net/ppkg/np/PCSA00015/PCSA00015_T5/a4b7d9e35ed56e86/UP9000-PCSA00015_00-WIPEOUT2048BASE0-A0104-V0100-059564fcab8ce66d19b5a563e92677e581313205-PE.pkg"), + ADDON_HD("http://zeus.dl.playstation.net/cdn/UP9000/PCSA00015_00/JYMqGNXUKqHEyNLjbOgrWcJdnQJUMzgadRFWekbWFBXAwMeGikOyiHkXKogKIfqGhtNwKgmNWwwcrJORmRUTDzylBPwjGVnVjyDfh.pkg"), + ADDON_HD_FURY("http://zeus.dl.playstation.net/cdn/UP9000/PCSA00015_00/IAoJQaDpySenBmQCKiqecEPMzSdPfPcdXupxZXLTYYTuRgtsdTaHxbeejwGKRQpjJOKBdMMFzSoeEhsHYxNUasQrEzkZPeBxUEqnp.pkg"); - private final String value; - ArcTarget(final String value) {this.value = value;} + private final String value; + ArcTarget(final String value) {this.value = value;} - @Override - public String toString() { - return value; - } - } - - public enum ArcKey { // decryption keys for 2048, type used by downloader - BASE("KO5ifR1dQ+eHBlgi6TI0Bdkf7hng6h8aYmRgYuHkCLQNn/9ufV+01fmzjNSmwuVHnO4dEBuN8cENACqVFcgA"), - LATEST("KO5ifR1dQ+eHBlgi6TI0Bdkf7hng6h8aYmRgYuHkCLQNn/9ufV+01fmzjNSmwuVHnO4dEBuN8cENACqVFcgA"), - ADDON_HD("KO5ifR1dQ+eHBlgi6TI0Bdnv4uNsGG5kYGIR4Ojs7ejuis9/anXfuudVNvzgdu+9z1z+asJojA9uAACgRhTl"), - ADDON_HD_FURY("KO5ifR1dQ+eHBlgi6TI0Bdnv4uNsFG5kYGIR4Ojs7ejuis9/3fydBRm3eCJX7biz/vVTm/2jMT64AQCCYhVy"); - - private final String value; - ArcKey(final String value) {this.value = value;} - - @Override - public String toString() { - return value; - } - } - - public class Mod { - public String path; // file name - public int version = 1; - public int priority = 0; //unused - public String friendlyName; - public String description = ""; - public String game; //TODO for multi game support - public int loaderversion = 0; //minimum required vint or feature level from Firestar - public String author; // if null, "Author is unknown." - public boolean enabled = true; - public List requires = new ArrayList<>(); // TODO: load optional "requires" array from mod meta if it exists. it will be base, patches, hd dlc, and fury dlc in that order. - // TODO: save 'false true false false' in ost gen if necessary (patches change localization) - } - - // Mods - public static List Mods = new ArrayList(); - - // UI Global Assets - public static Font fExo2; - public static BufferedImage windowIcon; - - public static void main(String[] args) { - // license string - System.out.printf("FIRESTAR MOD MANAGER for WipEout 2048\nversion " + vstr + " (codename " + vcode + ") major " + vint + "\n" + - "JVM host appears to be " + System.getProperty("os.name") + - "\nRunning from " + System.getProperty("user.dir") + - "\nCopyright (C) 2024 bonkmaykr\n\nThis program is free software: you can redistribute it and/or modify\n" + - "it under the terms of the GNU General Public License as published by\n" + - "the Free Software Foundation, either version 3 of the License, or\n" + - "(at your option) any later version.\n" + - "\n" + - "This program is distributed in the hope that it will be useful,\n" + - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + - "GNU General Public License for more details.\n" + - "\n" + - "You should have received a copy of the GNU General Public License\n" + - "along with this program. If not, see https://www.gnu.org/licenses/.\n\n\n\n"); - - //begin - // load global assets - try { - fExo2 = Font.createFont(Font.TRUETYPE_FONT, Main.class.getResourceAsStream("/exo2.ttf")); - } catch (Exception e) { - System.out.println("Font \"Exo 2\" is missing!"); - fExo2 = new Font("Arial", Font.PLAIN, 12); - } - - // load global window icon - try { - windowIcon = ImageIO.read(Main.class.getResourceAsStream("/titleIcon.png")); - } catch (IOException e) { - System.out.println("ERROR: Failed to find titleIcon.png. Window will not have an icon."); - } - - // check and load configs - File fConf = new File(System.getProperty("user.home") + "/.firestar/firestar.conf"); - if (!fConf.isFile()) { - System.out.println("No configuration was found. Starting the initial setup"); - new WilkinsCoffee().setup(); - } else { - new MissPiggy().Action(); // Quick! Start singing Firework by Katy Perry! (or open the main window i guess...) - } - } - - public static void writeConf(){ - JSONObject container = new JSONObject(); - container.put("version", vint); - container.put("2048path", outpath); - container.put("HDpath", "TODO"); // proposed hd/fury support for ps3, will use very simplified Fast Mode due to less difficulty installing - container.put("safemode", repatch); - container.put("isWin32", windows); - container.put("checkUpdates", checkUpdates); - container.put("currentPlaylist", "TODO"); // proposed feature: store separate mod lists in lists/ to load/save later? - - try { - Files.write(Paths.get(System.getProperty("user.home") + "/.firestar/firestar.conf"), container.toString().getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static void loadConf(){ - try { - JSONObject container = new JSONObject(new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/firestar.conf")))); - System.out.println(container.toString()); // debug - confvint = (int) container.get("version"); // used for converting configs between program versions later down the line - outpath = container.get("2048path").toString(); - repatch = (boolean) container.get("safemode"); - windows = (boolean) container.get("isWin32"); - try { - checkUpdates = (boolean) container.get("checkUpdates"); - } catch (JSONException e) { - checkUpdates = true; - } - } catch (IOException e) { - System.out.println("ERROR: Failed to load firestar.conf"); - System.out.println(e.getMessage()); - } - } - - public static void loadConf(MissPiggy w){ - try { - JSONObject container = new JSONObject(new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/firestar.conf")))); - System.out.println(container.toString()); // debug - confvint = (int) container.get("version"); // used for converting configs between program versions later down the line - outpath = container.get("2048path").toString(); - repatch = (boolean) container.get("safemode"); - windows = (boolean) container.get("isWin32"); - try { - checkUpdates = (boolean) container.get("checkUpdates"); - } catch (JSONException e) { - checkUpdates = true; - } - } catch (Exception e) { - JOptionPane.showMessageDialog(w.frame, "Firestar couldn't load your config file. Tread lightly.\n\n" + e.getMessage(), "Critical Error", JOptionPane.ERROR_MESSAGE); - System.out.println("ERROR: Failed to load firestar.conf"); - System.out.println(e.getMessage()); - } - } - - public static void deleteDir(File file) { // https://stackoverflow.com/a/29175213/9259829 - File[] contents = file.listFiles(); - if (contents != null) { - for (File f : contents) { - if (! Files.isSymbolicLink(f.toPath())) { - deleteDir(f); - } - } - } - file.delete(); - } - - public static void downloadDependenciesBeforeSetVisible(JFrame invoker) { - invoker.setVisible(false); - Main.downloadDependencies(); - invoker.setVisible(true); - confvint = vint; - Main.writeConf(); - } - - public static boolean downloadDependencies () { // todo: CHECKSUM!!!! THESE ARE EXECUTABLES!!!!!!!!!!! DON'T ALLOW MALWARE!!!! - boolean downloader = new Fozzie().DownloadFile("https://bonkmaykr.worlio.com/http/firestar/firesdk.zip", System.getProperty("user.home") + "/.firestar/", "firesdk.zip"); - if (!downloader) {return false;} - - ZipFile sdk = new ZipFile(System.getProperty("user.home") + "/.firestar/firesdk.zip"); - try { - sdk.extractAll(System.getProperty("user.home") + "/.firestar/"); - } catch (ZipException e) { - JOptionPane.showMessageDialog(new JFrame(), e.getMessage(), "Critical Error", JOptionPane.ERROR_MESSAGE); - System.out.println(e.getMessage()); - return false; - } - sdk.getFile().delete(); // cleanup - - return true; - } - - public static boolean callDownloaderStatically (String url, String folder, String name) { - return new Fozzie().DownloadFile(url, folder, name); - } - - public static Process exec(String[] cmd, String cwd) throws IOException { - Process p; - String[] pcmd; - if (!Main.windows) { - pcmd = new String[cmd.length + 1]; - pcmd[0] = "wine"; - System.arraycopy(cmd, 0, pcmd, 1, cmd.length); - p = Runtime.getRuntime().exec(pcmd, null, new File(cwd)); - } else { - p = Runtime.getRuntime().exec(cmd, null, new File(cwd.replace("/", "\\"))); + @Override + public String toString() { + return value; + } + } + + public enum ArcKey { // decryption keys for 2048, type used by downloader + BASE("KO5ifR1dQ+eHBlgi6TI0Bdkf7hng6h8aYmRgYuHkCLQNn/9ufV+01fmzjNSmwuVHnO4dEBuN8cENACqVFcgA"), + LATEST("KO5ifR1dQ+eHBlgi6TI0Bdkf7hng6h8aYmRgYuHkCLQNn/9ufV+01fmzjNSmwuVHnO4dEBuN8cENACqVFcgA"), + ADDON_HD("KO5ifR1dQ+eHBlgi6TI0Bdnv4uNsGG5kYGIR4Ojs7ejuis9/anXfuudVNvzgdu+9z1z+asJojA9uAACgRhTl"), + ADDON_HD_FURY("KO5ifR1dQ+eHBlgi6TI0Bdnv4uNsFG5kYGIR4Ojs7ejuis9/3fydBRm3eCJX7biz/vVTm/2jMT64AQCCYhVy"); + + private final String value; + ArcKey(final String value) {this.value = value;} + + @Override + public String toString() { + return value; + } + } + + public class Mod { + public String path; // file name + public int version = 1; + public int priority = 0; //unused + public String friendlyName; + public String description = ""; + public String game; //TODO for multi game support + public int loaderversion = 0; //minimum required vint or feature level from Firestar + public String author; // if null, "Author is unknown." + public boolean enabled = true; + public List requires = new ArrayList<>(); // TODO: load optional "requires" array from mod meta if it exists. it will be base, patches, hd dlc, and fury dlc in that order. + // TODO: save 'false true false false' in ost gen if necessary (patches change localization) + } + + // Mods + public static List Mods = new ArrayList(); + + // UI Global Assets + public static Font fExo2; + public static BufferedImage windowIcon; + + public static void main(String[] args) { + // license string + System.out.printf("FIRESTAR MOD MANAGER for WipEout 2048\nversion " + vstr + " (codename " + vcode + ") major " + vint + "\n" + + "JVM host appears to be " + System.getProperty("os.name") + + "\nRunning from " + System.getProperty("user.dir") + + "\nCopyright (C) 2024 bonkmaykr\n\nThis program is free software: you can redistribute it and/or modify\n" + + "it under the terms of the GNU General Public License as published by\n" + + "the Free Software Foundation, either version 3 of the License, or\n" + + "(at your option) any later version.\n" + + "\n" + + "This program is distributed in the hope that it will be useful,\n" + + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + + "GNU General Public License for more details.\n" + + "\n" + + "You should have received a copy of the GNU General Public License\n" + + "along with this program. If not, see https://www.gnu.org/licenses/.\n\n\n\n"); + + //begin + // load global assets + try { + fExo2 = Font.createFont(Font.TRUETYPE_FONT, Main.class.getResourceAsStream("/exo2.ttf")); + } catch (Exception e) { + System.out.println("Font \"Exo 2\" is missing!"); + fExo2 = new Font("Arial", Font.PLAIN, 12); + } + + // load global window icon + try { + windowIcon = ImageIO.read(Main.class.getResourceAsStream("/titleIcon.png")); + } catch (IOException e) { + System.out.println("ERROR: Failed to find titleIcon.png. Window will not have an icon."); + } + + // check and load configs + File fConf = new File(System.getProperty("user.home") + "/.firestar/firestar.conf"); + if (!fConf.isFile()) { + System.out.println("No configuration was found. Starting the initial setup"); + new WilkinsCoffee().setup(); + } else { + new MissPiggy().Action(); // Quick! Start singing Firework by Katy Perry! (or open the main window i guess...) + } + } + + public static void writeConf(){ + JSONObject container = new JSONObject(); + container.put("version", vint); + container.put("2048path", outpath); + container.put("HDpath", "TODO"); // proposed hd/fury support for ps3, will use very simplified Fast Mode due to less difficulty installing + container.put("safemode", repatch); + container.put("isWin32", windows); + container.put("checkUpdates", checkUpdates); + container.put("currentPlaylist", "TODO"); // proposed feature: store separate mod lists in lists/ to load/save later? + + try { + Files.write(Paths.get(System.getProperty("user.home") + "/.firestar/firestar.conf"), container.toString().getBytes()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void loadConf(){ + try { + JSONObject container = new JSONObject(new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/firestar.conf")))); + System.out.println(container.toString()); // debug + confvint = (int) container.get("version"); // used for converting configs between program versions later down the line + outpath = container.get("2048path").toString(); + repatch = (boolean) container.get("safemode"); + windows = (boolean) container.get("isWin32"); + try { + checkUpdates = (boolean) container.get("checkUpdates"); + } catch (JSONException e) { + checkUpdates = true; + } + } catch (IOException e) { + System.out.println("ERROR: Failed to load firestar.conf"); + System.out.println(e.getMessage()); + } + } + + public static void loadConf(MissPiggy w){ + try { + JSONObject container = new JSONObject(new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/firestar.conf")))); + System.out.println(container.toString()); // debug + confvint = (int) container.get("version"); // used for converting configs between program versions later down the line + outpath = container.get("2048path").toString(); + repatch = (boolean) container.get("safemode"); + windows = (boolean) container.get("isWin32"); + try { + checkUpdates = (boolean) container.get("checkUpdates"); + } catch (JSONException e) { + checkUpdates = true; + } + } catch (Exception e) { + JOptionPane.showMessageDialog(w.frame, "Firestar couldn't load your config file. Tread lightly.\n\n" + e.getMessage(), "Critical Error", JOptionPane.ERROR_MESSAGE); + System.out.println("ERROR: Failed to load firestar.conf"); + System.out.println(e.getMessage()); + } + } + + public static void deleteDir(File file) { // https://stackoverflow.com/a/29175213/9259829 + File[] contents = file.listFiles(); + if (contents != null) { + for (File f : contents) { + if (! Files.isSymbolicLink(f.toPath())) { + deleteDir(f); + } + } + } + file.delete(); + } + + public static void downloadDependenciesBeforeSetVisible(JFrame invoker) { + invoker.setVisible(false); + Main.downloadDependencies(); + invoker.setVisible(true); + confvint = vint; + Main.writeConf(); + } + + public static boolean downloadDependencies () { // todo: CHECKSUM!!!! THESE ARE EXECUTABLES!!!!!!!!!!! DON'T ALLOW MALWARE!!!! + boolean downloader = new Fozzie().DownloadFile("https://bonkmaykr.worlio.com/http/firestar/firesdk.zip", System.getProperty("user.home") + "/.firestar/", "firesdk.zip"); + if (!downloader) {return false;} + + ZipFile sdk = new ZipFile(System.getProperty("user.home") + "/.firestar/firesdk.zip"); + try { + sdk.extractAll(System.getProperty("user.home") + "/.firestar/"); + } catch (ZipException e) { + JOptionPane.showMessageDialog(new JFrame(), e.getMessage(), "Critical Error", JOptionPane.ERROR_MESSAGE); + System.out.println(e.getMessage()); + return false; + } + sdk.getFile().delete(); // cleanup + + return true; + } + + public static boolean callDownloaderStatically (String url, String folder, String name) { + return new Fozzie().DownloadFile(url, folder, name); + } + + public static Process exec(String[] cmd, String cwd) throws IOException { + Process p; + String[] pcmd; + if (!Main.windows) { + pcmd = new String[cmd.length + 1]; + pcmd[0] = "wine"; + System.arraycopy(cmd, 0, pcmd, 1, cmd.length); + p = Runtime.getRuntime().exec(pcmd, null, new File(cwd)); + } else { + p = Runtime.getRuntime().exec(cmd, null, new File(cwd.replace("/", "\\"))); + } + return p; } - return p; - } } \ No newline at end of file diff --git a/firestar/src/main/java/MissPiggy.java b/firestar/src/main/java/MissPiggy.java index 97e11b5..79e04a0 100644 --- a/firestar/src/main/java/MissPiggy.java +++ b/firestar/src/main/java/MissPiggy.java @@ -40,623 +40,623 @@ import org.json.JSONObject; import static javax.swing.WindowConstants.EXIT_ON_CLOSE; public class MissPiggy implements ActionListener { - JFrame frame = new JFrame(); - JPanel frameContainer; - JPanel actionsContainer; - JPanel descriptionContainer; + JFrame frame = new JFrame(); + JPanel frameContainer; + JPanel actionsContainer; + JPanel descriptionContainer; - //JPanel menuBarContainerPanel = new JPanel(); - public JMenuBar menuBar; - public JMenu fileMenu; - public JMenu toolsMenu; - public JMenu helpMenu; - //JMenuItem menuItem; + //JPanel menuBarContainerPanel = new JPanel(); + public JMenuBar menuBar; + public JMenu fileMenu; + public JMenu toolsMenu; + public JMenu helpMenu; + //JMenuItem menuItem; - JScrollPane modListScrollContainer; - public JList modList; - private JButton toggleButton; - private JButton moveUpButton; - private JButton deleteButton1; - private JButton moveDownButton; - private JButton optionsButton; - private JButton importButton; - private JButton deployButton; - private JTextPane descriptionField; - private JScrollPane descriptionScroller; + JScrollPane modListScrollContainer; + public JList modList; + private JButton toggleButton; + private JButton moveUpButton; + private JButton deleteButton1; + private JButton moveDownButton; + private JButton optionsButton; + private JButton importButton; + private JButton deployButton; + private JTextPane descriptionField; + private JScrollPane descriptionScroller; - //private int selectedItem; + //private int selectedItem; - public String priorityList; - public String blackList; + public String priorityList; + public String blackList; - public boolean listenersAlreadySet = false; // was written to troubleshoot a bug but this wasn't actually the cause + public boolean listenersAlreadySet = false; // was written to troubleshoot a bug but this wasn't actually the cause - public void Action() { - Action(false); - } + public void Action() { + Action(false); + } - // Initialize the main window - public void Action(boolean forceNag) { - System.out.println("Main window created"); - System.out.println("Loading program configuration"); - Main.loadConf(this); + // Initialize the main window + public void Action(boolean forceNag) { + System.out.println("Main window created"); + System.out.println("Loading program configuration"); + Main.loadConf(this); - // populate menu bar - menuBar = new JMenuBar(); - fileMenu = new JMenu("File"); - toolsMenu = new JMenu("Tools"); - helpMenu = new JMenu("Help"); + // populate menu bar + menuBar = new JMenuBar(); + fileMenu = new JMenu("File"); + toolsMenu = new JMenu("Tools"); + helpMenu = new JMenu("Help"); - fileMenu.add(new JMenuItem("Deploy Mods")); - fileMenu.add(new JMenuItem("Import Mod from File")); - //fileMenu.add(new JSeparator()); - fileMenu.add(new JMenuItem("Delete All")); - fileMenu.add(new JSeparator()); - fileMenu.add(new JMenuItem("Options")); - fileMenu.add(new JMenuItem("Quit")); + fileMenu.add(new JMenuItem("Deploy Mods")); + fileMenu.add(new JMenuItem("Import Mod from File")); + //fileMenu.add(new JSeparator()); + fileMenu.add(new JMenuItem("Delete All")); + fileMenu.add(new JSeparator()); + fileMenu.add(new JMenuItem("Options")); + fileMenu.add(new JMenuItem("Quit")); - toolsMenu.add(new JMenuItem("Edit Metadata")); // disabled if a mod is not selected from the list - toolsMenu.add(new JMenuItem("Generate New Mod from Folder...")); - toolsMenu.add(new JMenuItem("Create Soundtrack Mod...")); - //toolsMenu.add(new JMenuItem("Download Mod from URL")); // TODO: implement. move option to File menu. should be ez + toolsMenu.add(new JMenuItem("Edit Metadata")); // disabled if a mod is not selected from the list + toolsMenu.add(new JMenuItem("Generate New Mod from Folder...")); + toolsMenu.add(new JMenuItem("Create Soundtrack Mod...")); + //toolsMenu.add(new JMenuItem("Download Mod from URL")); // TODO: implement. move option to File menu. should be ez - helpMenu.add(new JMenuItem("Manual")); - helpMenu.add(new JSeparator()); - helpMenu.add(new JMenuItem("Source Code")); //replace with Website 'screwgravity.net' and 'Issue Tracker' gitea later - helpMenu.add(new JMenuItem("License")); - helpMenu.add(new JSeparator()); - helpMenu.add(new JMenuItem("Check for Updates")); - helpMenu.add(new JMenuItem("About Firestar")); + helpMenu.add(new JMenuItem("Manual")); + helpMenu.add(new JSeparator()); + helpMenu.add(new JMenuItem("Source Code")); //replace with Website 'screwgravity.net' and 'Issue Tracker' gitea later + helpMenu.add(new JMenuItem("License")); + helpMenu.add(new JSeparator()); + helpMenu.add(new JMenuItem("Check for Updates")); + helpMenu.add(new JMenuItem("About Firestar")); - menuBar.add(fileMenu); - menuBar.add(toolsMenu); - menuBar.add(helpMenu); - menuBar.setVisible(true); - frame.setJMenuBar(menuBar); + menuBar.add(fileMenu); + menuBar.add(toolsMenu); + menuBar.add(helpMenu); + menuBar.setVisible(true); + frame.setJMenuBar(menuBar); - frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA + frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA - InitializeModListStructure(); - InitializeModListInGUI(); // present mod list + InitializeModListStructure(); + InitializeModListInGUI(); // present mod list - fileMenu.getItem(0).addActionListener(this); - fileMenu.getItem(1).addActionListener(this); - fileMenu.getItem(2).addActionListener(this); - fileMenu.getItem(4).addActionListener(this); - fileMenu.getItem(5).addActionListener(this); - toolsMenu.getItem(0).addActionListener(this); - toolsMenu.getItem(1).addActionListener(this); - toolsMenu.getItem(2).addActionListener(this); - helpMenu.getItem(0).addActionListener(this); - helpMenu.getItem(2).addActionListener(this); - helpMenu.getItem(3).addActionListener(this); - helpMenu.getItem(5).addActionListener(this); - helpMenu.getItem(6).addActionListener(this); + fileMenu.getItem(0).addActionListener(this); + fileMenu.getItem(1).addActionListener(this); + fileMenu.getItem(2).addActionListener(this); + fileMenu.getItem(4).addActionListener(this); + fileMenu.getItem(5).addActionListener(this); + toolsMenu.getItem(0).addActionListener(this); + toolsMenu.getItem(1).addActionListener(this); + toolsMenu.getItem(2).addActionListener(this); + helpMenu.getItem(0).addActionListener(this); + helpMenu.getItem(2).addActionListener(this); + helpMenu.getItem(3).addActionListener(this); + helpMenu.getItem(5).addActionListener(this); + helpMenu.getItem(6).addActionListener(this); - deployButton.addActionListener(this); - importButton.addActionListener(this); - deleteButton1.addActionListener(this); - optionsButton.addActionListener(this); - moveUpButton.addActionListener(this); - moveDownButton.addActionListener(this); - toggleButton.addActionListener(this); + deployButton.addActionListener(this); + importButton.addActionListener(this); + deleteButton1.addActionListener(this); + optionsButton.addActionListener(this); + moveUpButton.addActionListener(this); + moveDownButton.addActionListener(this); + toggleButton.addActionListener(this); - descriptionField.getDocument().putProperty("filterNewlines", Boolean.FALSE); + descriptionField.getDocument().putProperty("filterNewlines", Boolean.FALSE); - // display window - frame.setIconImage(Main.windowIcon); + // display window + frame.setIconImage(Main.windowIcon); - menuBar.setBackground(new Color(25, 41, 93)); - fileMenu.setForeground(new Color(255, 255, 255)); - fileMenu.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - toolsMenu.setForeground(new Color(255, 255, 255)); - toolsMenu.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - helpMenu.setForeground(new Color(255, 255, 255)); - helpMenu.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + menuBar.setBackground(new Color(25, 41, 93)); + fileMenu.setForeground(new Color(255, 255, 255)); + fileMenu.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + toolsMenu.setForeground(new Color(255, 255, 255)); + toolsMenu.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + helpMenu.setForeground(new Color(255, 255, 255)); + helpMenu.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - toggleButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - deleteButton1.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - moveDownButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - moveUpButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - optionsButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - importButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - deployButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + toggleButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + deleteButton1.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + moveDownButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + moveUpButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + optionsButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + importButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + deployButton.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - ((DefaultCaret)descriptionField.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE); // prevent automatically scrolling to the bottom when mod details exceed window size + ((DefaultCaret)descriptionField.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE); // prevent automatically scrolling to the bottom when mod details exceed window size - frame.setSize(800, 600); // 1280 800 - frame.setMinimumSize(new Dimension(640,480)); - frame.setTitle("Firestar Mod Manager"); - frame.setResizable(true); - frame.setDefaultCloseOperation(EXIT_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(null); + frame.setSize(800, 600); // 1280 800 + frame.setMinimumSize(new Dimension(640,480)); + frame.setTitle("Firestar Mod Manager"); + frame.setResizable(true); + frame.setDefaultCloseOperation(EXIT_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(null); - if (Main.checkUpdates) { StartErnie(); } + if (Main.checkUpdates) { StartErnie(); } - frame.setVisible(true); - } + frame.setVisible(true); + } - public void InitializeModListStructure() { - // cleanup - Main.Mods.clear(); + public void InitializeModListStructure() { + // cleanup + Main.Mods.clear(); - // get current list of mods from file - try { - priorityList = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/mods/index"))); - } catch (IOException e) { - File priorityListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/index"); - new File(System.getProperty("user.home") + "/.firestar/mods/").mkdirs(); - if(!priorityListFileHandle.isFile()){ - try { - priorityListFileHandle.createNewFile(); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - priorityList = ""; - } + // get current list of mods from file + try { + priorityList = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/mods/index"))); + } catch (IOException e) { + File priorityListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/index"); + new File(System.getProperty("user.home") + "/.firestar/mods/").mkdirs(); + if(!priorityListFileHandle.isFile()){ + try { + priorityListFileHandle.createNewFile(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + priorityList = ""; + } - // initialize data structures from each list entry - String[] pListArray = priorityList.split("\n"); - Arrays.sort(pListArray); - System.out.println("Initializing modList from file with length of " + pListArray.length + " units"); //debug - for (String s : pListArray) { - /* - Do nothing if the index number is not valid. - there probably is not a practical reason to do this, but I want to eliminate any undefined behaviors while we're here. - we'll also eliminate any syntax errors caused by the lack of a = sign + // initialize data structures from each list entry + String[] pListArray = priorityList.split("\n"); + Arrays.sort(pListArray); + System.out.println("Initializing modList from file with length of " + pListArray.length + " units"); //debug + for (String s : pListArray) { + /* + Do nothing if the index number is not valid. + there probably is not a practical reason to do this, but I want to eliminate any undefined behaviors while we're here. + we'll also eliminate any syntax errors caused by the lack of a = sign - 06/29/24 - also skip files that were manually removed but remain in the list - */ + 06/29/24 - also skip files that were manually removed but remain in the list + */ - File mod = new File(System.getProperty("user.home") + "/.firestar/mods/" + s.substring(s.indexOf("=") + 1).trim()); + File mod = new File(System.getProperty("user.home") + "/.firestar/mods/" + s.substring(s.indexOf("=") + 1).trim()); - if (s.split("=")[0].matches("[0-9]+=*") && - mod.exists()) { - //append mod to list from substring - Main.Mod m = new Main().new Mod(); - m.path = s.substring(s.indexOf("=") + 1).trim(); - System.out.println("found file " + m.path); + if (s.split("=")[0].matches("[0-9]+=*") && + mod.exists()) { + //append mod to list from substring + Main.Mod m = new Main().new Mod(); + m.path = s.substring(s.indexOf("=") + 1).trim(); + System.out.println("found file " + m.path); - //get json metadata from zip comment - JSONObject metadata; - try { - metadata = new JSONObject(new ZipFile(System.getProperty("user.home") + "/.firestar/mods/" + m.path).getComment()); - if (metadata.has("friendlyName")) {m.friendlyName = metadata.get("friendlyName").toString();} else {m.friendlyName = m.path;} - if (metadata.has("description")) {m.description = metadata.get("description").toString();} - if (metadata.has("version")) {m.version = Integer.parseInt(metadata.get("version").toString());} - if (metadata.has("author")) {m.author = metadata.get("author").toString();} - if (metadata.has("loaderversion")) {m.loaderversion = Integer.parseInt(metadata.get("loaderversion").toString());} - if (metadata.has("game")) {m.game = metadata.get("game").toString();} + //get json metadata from zip comment + JSONObject metadata; + try { + metadata = new JSONObject(new ZipFile(System.getProperty("user.home") + "/.firestar/mods/" + m.path).getComment()); + if (metadata.has("friendlyName")) {m.friendlyName = metadata.get("friendlyName").toString();} else {m.friendlyName = m.path;} + if (metadata.has("description")) {m.description = metadata.get("description").toString();} + if (metadata.has("version")) {m.version = Integer.parseInt(metadata.get("version").toString());} + if (metadata.has("author")) {m.author = metadata.get("author").toString();} + if (metadata.has("loaderversion")) {m.loaderversion = Integer.parseInt(metadata.get("loaderversion").toString());} + if (metadata.has("game")) {m.game = metadata.get("game").toString();} - //send to list - Main.Mods.add(m); - } catch (Exception e) { - System.out.println("WARNING: mod entry for " + s + " was found but does not contain valid JSON metadata. skipping"); - System.out.println(e.getMessage()); - } - } else { - if (!s.isEmpty()) {System.out.println("WARNING: mod entry for " + s + " doesn't actually exist. skipping");} - } - } + //send to list + Main.Mods.add(m); + } catch (Exception e) { + System.out.println("WARNING: mod entry for " + s + " was found but does not contain valid JSON metadata. skipping"); + System.out.println(e.getMessage()); + } + } else { + if (!s.isEmpty()) {System.out.println("WARNING: mod entry for " + s + " doesn't actually exist. skipping");} + } + } - try { - blackList = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/mods/blacklist"))); - } catch (IOException e) { - File blackListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/blacklist"); - new File(System.getProperty("user.home") + "/.firestar/mods/").mkdirs(); - if(!blackListFileHandle.isFile()){ - try { - blackListFileHandle.createNewFile(); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - blackList = ""; - } + try { + blackList = new String(Files.readAllBytes(Paths.get(System.getProperty("user.home") + "/.firestar/mods/blacklist"))); + } catch (IOException e) { + File blackListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/blacklist"); + new File(System.getProperty("user.home") + "/.firestar/mods/").mkdirs(); + if(!blackListFileHandle.isFile()){ + try { + blackListFileHandle.createNewFile(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + blackList = ""; + } - // initialize data structures from each list entry - String[] bListArray = blackList.split("\n"); - //Arrays.sort(bListArray); - System.out.println("Initializing blacklist from file with length of " + bListArray.length + " units"); //debug - for (String s : bListArray) { - for (Main.Mod m : Main.Mods) { - if (s.trim().equals(m.path)) { - m.enabled = false; - } - } - } - } + // initialize data structures from each list entry + String[] bListArray = blackList.split("\n"); + //Arrays.sort(bListArray); + System.out.println("Initializing blacklist from file with length of " + bListArray.length + " units"); //debug + for (String s : bListArray) { + for (Main.Mod m : Main.Mods) { + if (s.trim().equals(m.path)) { + m.enabled = false; + } + } + } + } - public void InitializeModListInGUI() { - // cleanup - if (listenersAlreadySet) {modList.removeListSelectionListener(modList.getListSelectionListeners()[0]);} // was written to troubleshoot a bug but this wasn't actually the cause - descriptionField.setText("Select a mod from the list on the right to view more details, or to make changes to your installation."); - modList.clearSelection(); - modList.removeAll(); - modList.setVisibleRowCount(Main.Mods.size()); - modList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + public void InitializeModListInGUI() { + // cleanup + if (listenersAlreadySet) {modList.removeListSelectionListener(modList.getListSelectionListeners()[0]);} // was written to troubleshoot a bug but this wasn't actually the cause + descriptionField.setText("Select a mod from the list on the right to view more details, or to make changes to your installation."); + modList.clearSelection(); + modList.removeAll(); + modList.setVisibleRowCount(Main.Mods.size()); + modList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - // add text entry for each - int i = 0; - /*JLabel[]*/String[] contents = new String[Main.Mods.size()]; - System.out.println("Initializing modList to GUI with length of " + Main.Mods.size() + " units"); //debug - while (i < Main.Mods.size()) { - if (Main.Mods.get(i).friendlyName == null || Main.Mods.get(i).friendlyName.isEmpty()) - {Main.Mods.get(i).friendlyName = Main.Mods.get(i).path;} - if (Main.Mods.get(i).enabled) {contents[i] = Main.Mods.get(i).friendlyName;} - else {contents[i] = Main.Mods.get(i).friendlyName + " (Disabled)";} + // add text entry for each + int i = 0; + /*JLabel[]*/String[] contents = new String[Main.Mods.size()]; + System.out.println("Initializing modList to GUI with length of " + Main.Mods.size() + " units"); //debug + while (i < Main.Mods.size()) { + if (Main.Mods.get(i).friendlyName == null || Main.Mods.get(i).friendlyName.isEmpty()) + Main.Mods.get(i).friendlyName = Main.Mods.get(i).path; + if (Main.Mods.get(i).enabled) {contents[i] = Main.Mods.get(i).friendlyName;} + else {contents[i] = Main.Mods.get(i).friendlyName + " (Disabled)";} - //debug - String authorDisplay; - if (Main.Mods.get(i).author == null || Main.Mods.get(i).author.isEmpty()) {authorDisplay = "Anonymous";} else {authorDisplay = "\"" + Main.Mods.get(i).author + "\"";} - System.out.println("Added " + Main.Mods.get(i).friendlyName + " by " + authorDisplay); + //debug + String authorDisplay; + if (Main.Mods.get(i).author == null || Main.Mods.get(i).author.isEmpty()) {authorDisplay = "Anonymous";} + else {authorDisplay = "\"" + Main.Mods.get(i).author + "\"";} + System.out.println("Added " + Main.Mods.get(i).friendlyName + " by " + authorDisplay); - i++; - } - modList.setListData(contents); - createSelectionEventListener(); - } - - private void StartErnie() { - new Thread(new Runnable() { - @Override - public void run() { - new Ernie(frame); // changed away from runnable in order to pass params to constructor -bonk - } - }).start(); - } + i++; + } + modList.setListData(contents); + createSelectionEventListener(); + } + + private void StartErnie() { + new Thread(new Runnable() { + @Override + public void run() { + new Ernie(frame); // changed away from runnable in order to pass params to constructor -bonk + } + }).start(); + } - private ListSelectionListener whenItemSelected() { - return null; - } + private ListSelectionListener whenItemSelected() { + return null; + } - @Override - public void actionPerformed(ActionEvent actionEvent) { - if (actionEvent.getSource() == fileMenu.getItem(5)) {System.exit(0);} else - if (actionEvent.getSource() == fileMenu.getItem(0)) {deployModGUI();} else - if (actionEvent.getSource() == deployButton) {deployModGUI();} else - if (actionEvent.getSource() == importButton) {importModGUI();} else - if (actionEvent.getSource() == fileMenu.getItem(1)) {importModGUI();} else - if (actionEvent.getSource() == fileMenu.getItem(2)) {removeAllGUI();} else - if (actionEvent.getSource() == optionsButton) {optionsGUI();} else - if (actionEvent.getSource() == fileMenu.getItem(4)) {optionsGUI();} else + @Override + public void actionPerformed(ActionEvent actionEvent) { + if (actionEvent.getSource() == fileMenu.getItem(5)) {System.exit(0);} else + if (actionEvent.getSource() == fileMenu.getItem(0)) {deployModGUI();} else + if (actionEvent.getSource() == deployButton) {deployModGUI();} else + if (actionEvent.getSource() == importButton) {importModGUI();} else + if (actionEvent.getSource() == fileMenu.getItem(1)) {importModGUI();} else + if (actionEvent.getSource() == fileMenu.getItem(2)) {removeAllGUI();} else + if (actionEvent.getSource() == optionsButton) {optionsGUI();} else + if (actionEvent.getSource() == fileMenu.getItem(4)) {optionsGUI();} else - if (actionEvent.getSource() == moveUpButton) {moveUp(modList.getSelectedIndex());} else - if (actionEvent.getSource() == moveDownButton) {moveDown(modList.getSelectedIndex());} else + if (actionEvent.getSource() == moveUpButton) {moveUp(modList.getSelectedIndex());} else + if (actionEvent.getSource() == moveDownButton) {moveDown(modList.getSelectedIndex());} else - if (actionEvent.getSource() == toggleButton) {toggleSelected(modList.getSelectedIndex());} else - if (actionEvent.getSource() == deleteButton1) {deleteSelected();} else + if (actionEvent.getSource() == toggleButton) {toggleSelected(modList.getSelectedIndex());} else + if (actionEvent.getSource() == deleteButton1) {deleteSelected();} else - if (actionEvent.getSource() == toolsMenu.getItem(0)) {metaEditorGUI(modList.getSelectedIndex());} else - if (actionEvent.getSource() == toolsMenu.getItem(1)) {generatorGUI();} else - if (actionEvent.getSource() == toolsMenu.getItem(2)) {new Suggs(frame);} else + if (actionEvent.getSource() == toolsMenu.getItem(0)) {metaEditorGUI(modList.getSelectedIndex());} else + if (actionEvent.getSource() == toolsMenu.getItem(1)) {generatorGUI();} else + if (actionEvent.getSource() == toolsMenu.getItem(2)) {new Suggs(frame);} else - if (actionEvent.getSource() == helpMenu.getItem(0)) { - try { - Desktop.getDesktop().browse(new URI("https://git.worlio.com/bonkmaykr/firestar/wiki/")); - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - } else - if (actionEvent.getSource() == helpMenu.getItem(2)) { - try { - Desktop.getDesktop().browse(new URI("https://git.worlio.com/bonkmaykr/firestar")); - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - } else - if (actionEvent.getSource() == helpMenu.getItem(3)) { - try { - Desktop.getDesktop().browse(new URI("https://www.gnu.org/licenses/gpl-3.0.en.html")); - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - } else - if (actionEvent.getSource() == helpMenu.getItem(5)) {StartErnie();} else - if (actionEvent.getSource() == helpMenu.getItem(6)) {new Rowlf(frame);} - } + if (actionEvent.getSource() == helpMenu.getItem(0)) { + try { + Desktop.getDesktop().browse(new URI("https://git.worlio.com/bonkmaykr/firestar/wiki/")); + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } else + if (actionEvent.getSource() == helpMenu.getItem(2)) { + try { + Desktop.getDesktop().browse(new URI("https://git.worlio.com/bonkmaykr/firestar")); + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } else + if (actionEvent.getSource() == helpMenu.getItem(3)) { + try { + Desktop.getDesktop().browse(new URI("https://www.gnu.org/licenses/gpl-3.0.en.html")); + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } else + if (actionEvent.getSource() == helpMenu.getItem(5)) {StartErnie();} else + if (actionEvent.getSource() == helpMenu.getItem(6)) {new Rowlf(frame);} + } - // Will likely split the below functions into separate classes to work with intellij GUI designer. + // Will likely split the below functions into separate classes to work with intellij GUI designer. - public void deployModGUI() { - int i = 0; - for (Main.Mod m : Main.Mods) { - if (m.enabled) {i++;} - } + public void deployModGUI() { + int i = 0; + for (Main.Mod m : Main.Mods) { + if (m.enabled) {i++;} + } - if (i > 0) { - int result = JOptionPane.showConfirmDialog(frame, "A new PSARC will be generated. This can take several minutes.\nDuring this time, your computer may be very busy or slow.\n\nIt will be placed in: " + Main.outpath + "\n\nAre you sure you want to continue?", "Deploy Mods", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - if (result == JOptionPane.YES_OPTION) { - // prevent interruptions - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setEnabled(false); + if (i > 0) { + int result = JOptionPane.showConfirmDialog(frame, "A new PSARC will be generated. This can take several minutes.\nDuring this time, your computer may be very busy or slow.\n\nIt will be placed in: " + Main.outpath + "\n\nAre you sure you want to continue?", "Deploy Mods", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (result == JOptionPane.YES_OPTION) { + // prevent interruptions + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setEnabled(false); - if (!new File(Main.inpath + "psp2psarc.exe").exists()) { - JOptionPane.showMessageDialog(frame, "psp2psarc is missing.\nPlease select \"Get Dependencies\" in the Options menu.", "Error", JOptionPane.ERROR_MESSAGE); - wrapUpDeployment(); - return; - } + if (!new File(Main.inpath + "psp2psarc.exe").exists()) { + JOptionPane.showMessageDialog(frame, "psp2psarc is missing.\nPlease select \"Get Dependencies\" in the Options menu.", "Error", JOptionPane.ERROR_MESSAGE); + wrapUpDeployment(); + return; + } - if (!new File(Main.inpath + "data.psarc").exists() && - !new File(Main.inpath + "data1.psarc").exists() && - !new File(Main.inpath + "data2.psarc").exists() && - !new File(Main.inpath + "dlc1.psarc").exists() && - !new File(Main.inpath + "dlc2.psarc").exists()) { - JOptionPane.showMessageDialog(frame, "You have no PSARCs.\nPlease dump your copy of WipEout 2048 or download a PSARC from the Options menu.", "Error", JOptionPane.ERROR_MESSAGE); - wrapUpDeployment(); - return; - } + if (!new File(Main.inpath + "data.psarc").exists() && + !new File(Main.inpath + "data1.psarc").exists() && + !new File(Main.inpath + "data2.psarc").exists() && + !new File(Main.inpath + "dlc1.psarc").exists() && + !new File(Main.inpath + "dlc2.psarc").exists()) { + JOptionPane.showMessageDialog(frame, "You have no PSARCs.\nPlease dump your copy of WipEout 2048 or download a PSARC from the Options menu.", "Error", JOptionPane.ERROR_MESSAGE); + wrapUpDeployment(); + return; + } - // start - new Gonzo().DeployMods(this); - } - } else { - JOptionPane.showMessageDialog(frame, "Please add at least one mod file to continue.", "Error", JOptionPane.ERROR_MESSAGE); - } - } + // start + new Gonzo().DeployMods(this); + } + } else { + JOptionPane.showMessageDialog(frame, "Please add at least one mod file to continue.", "Error", JOptionPane.ERROR_MESSAGE); + } + } - public void wrapUpDeployment() { - // restore functionality to main window - frame.setDefaultCloseOperation(EXIT_ON_CLOSE); - frame.setEnabled(true); - } + public void wrapUpDeployment() { + // restore functionality to main window + frame.setDefaultCloseOperation(EXIT_ON_CLOSE); + frame.setEnabled(true); + } - public void importModGUI() { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setCurrentDirectory(new File(System.getProperty("user.home"))); - //fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("All", "zip", "agr", "agrc", "agrf", "fstar")); - fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("ZIP Archive", "zip")); - fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Firestar Mod Package", "fstar")); + public void importModGUI() { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setCurrentDirectory(new File(System.getProperty("user.home"))); + //fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("All", "zip", "agr", "agrc", "agrf", "fstar")); + fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("ZIP Archive", "zip")); + fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Firestar Mod Package", "fstar")); - int result = fileChooser.showOpenDialog(frame); + int result = fileChooser.showOpenDialog(frame); - if (result == JFileChooser.APPROVE_OPTION) { - File selectedFile = fileChooser.getSelectedFile(); - System.out.println("Importing selected mod file \"" + selectedFile.getName() + "\""); + if (result == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + System.out.println("Importing selected mod file \"" + selectedFile.getName() + "\""); - ZipFile zipImporterHandler = new ZipFile(selectedFile.getAbsolutePath()); - if (zipImporterHandler.isValidZipFile()) { - try { - JSONObject json = new JSONObject(new ZipFile(selectedFile.getAbsolutePath()).getComment()); // intentionally trigger exception if file is random BS - if ((int)json.get("loaderversion") <= Main.vint) { - int min=0, max=9; - int rand_int = (int)(Math.random()*((max-min)+1))+min; - int rand_int2 = (int)(Math.random()*((max-min)+1))+min; - int rand_int3 = (int)(Math.random()*((max-min)+1))+min; - Path importDestination = Paths.get(System.getProperty("user.home") + "/.firestar/mods/" - + selectedFile.getName() + "_" + rand_int + rand_int2 + rand_int3 + System.currentTimeMillis() + ".zip"); - Files.copy(Paths.get(selectedFile.getPath()), importDestination, StandardCopyOption.REPLACE_EXISTING); - String importDestinationName = importDestination.toFile().getName(); + ZipFile zipImporterHandler = new ZipFile(selectedFile.getAbsolutePath()); + if (zipImporterHandler.isValidZipFile()) { + try { + JSONObject json = new JSONObject(new ZipFile(selectedFile.getAbsolutePath()).getComment()); // intentionally trigger exception if file is random BS + if ((int)json.get("loaderversion") <= Main.vint) { + int min=0, max=9; + int rand_int = (int)(Math.random()*((max-min)+1))+min; + int rand_int2 = (int)(Math.random()*((max-min)+1))+min; + int rand_int3 = (int)(Math.random()*((max-min)+1))+min; + Path importDestination = Paths.get(System.getProperty("user.home") + "/.firestar/mods/" + + selectedFile.getName() + "_" + rand_int + rand_int2 + rand_int3 + System.currentTimeMillis() + ".zip"); + Files.copy(Paths.get(selectedFile.getPath()), importDestination, StandardCopyOption.REPLACE_EXISTING); + String importDestinationName = importDestination.toFile().getName(); - BufferedWriter bw = new BufferedWriter(new FileWriter(System.getProperty("user.home") + "/.firestar/mods/index", true)); - bw.write(Main.Mods.size() + "=" + importDestinationName); - bw.newLine(); - bw.close(); + BufferedWriter bw = new BufferedWriter(new FileWriter(System.getProperty("user.home") + "/.firestar/mods/index", true)); + bw.write(Main.Mods.size() + "=" + importDestinationName); + bw.newLine(); + bw.close(); - InitializeModListStructure(); - InitializeModListInGUI(); - } else { - System.out.println("ERROR: This mod requires feature level " + json.get("loaderversion").toString() + ", but you have level " + Main.vint + "."); - JOptionPane.showMessageDialog(frame, "This mod requires feature level " + json.get("loaderversion").toString() + ", but you have level " + Main.vint + ".\nPlease update Firestar to the latest version.", "Error", JOptionPane.ERROR_MESSAGE); - } - } catch (JSONException e) { - System.out.println("ERROR: File is not a valid ZIP archive with mod data. Aborting."); - JOptionPane.showMessageDialog(frame, "Whoops, that's not a valid mod file.", "Error", JOptionPane.ERROR_MESSAGE); - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - } else { - System.out.println("ERROR: File is not a valid ZIP archive with mod data. Aborting."); - JOptionPane.showMessageDialog(frame, "Whoops, that's not a valid mod file.", "Error", JOptionPane.ERROR_MESSAGE); - } - } - } + InitializeModListStructure(); + InitializeModListInGUI(); + } else { + System.out.println("ERROR: This mod requires feature level " + json.get("loaderversion").toString() + ", but you have level " + Main.vint + "."); + JOptionPane.showMessageDialog(frame, "This mod requires feature level " + json.get("loaderversion").toString() + ", but you have level " + Main.vint + ".\nPlease update Firestar to the latest version.", "Error", JOptionPane.ERROR_MESSAGE); + } + } catch (JSONException e) { + System.out.println("ERROR: File is not a valid ZIP archive with mod data. Aborting."); + JOptionPane.showMessageDialog(frame, "Whoops, that's not a valid mod file.", "Error", JOptionPane.ERROR_MESSAGE); + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } else { + System.out.println("ERROR: File is not a valid ZIP archive with mod data. Aborting."); + JOptionPane.showMessageDialog(frame, "Whoops, that's not a valid mod file.", "Error", JOptionPane.ERROR_MESSAGE); + } + } + } - public void removeAllGUI() { - // todo warning dialog that nukes list when Yes is clicked - int result = JOptionPane.showConfirmDialog(frame, "Do you really want to delete all mods?", "Remove All", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); + public void removeAllGUI() { + // todo warning dialog that nukes list when Yes is clicked + int result = JOptionPane.showConfirmDialog(frame, "Do you really want to delete all mods?", "Remove All", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); - if (result == JOptionPane.YES_OPTION) { - Main.deleteDir(new File(System.getProperty("user.home") + "/.firestar/mods/")); - Main.Mods.clear(); + if (result == JOptionPane.YES_OPTION) { + Main.deleteDir(new File(System.getProperty("user.home") + "/.firestar/mods/")); + Main.Mods.clear(); - InitializeModListStructure(); - InitializeModListInGUI(); - } - } + InitializeModListStructure(); + InitializeModListInGUI(); + } + } - public void optionsGUI() { - new Waldorf().Action(this); - frame.setEnabled(false); - } + public void optionsGUI() { + new Waldorf().Action(this); + frame.setEnabled(false); + } - public void deleteSelected() { - if (modList.getSelectedIndex() >= 0) { - File file = new File(System.getProperty("user.home") + "/.firestar/mods/" + Main.Mods.get(modList.getSelectedIndex()).path); - file.delete(); - System.out.println("Deleted " + Main.Mods.get(modList.getSelectedIndex()).friendlyName); //debug - Main.Mods.remove(modList.getSelectedIndex()); - regenerateModBlacklist(false); - regenerateModIndex(true); - } else { - JOptionPane.showMessageDialog(frame, "Please select a mod to delete first.", "Error", JOptionPane.ERROR_MESSAGE); - } - } + public void deleteSelected() { + if (modList.getSelectedIndex() >= 0) { + File file = new File(System.getProperty("user.home") + "/.firestar/mods/" + Main.Mods.get(modList.getSelectedIndex()).path); + file.delete(); + System.out.println("Deleted " + Main.Mods.get(modList.getSelectedIndex()).friendlyName); //debug + Main.Mods.remove(modList.getSelectedIndex()); + regenerateModBlacklist(false); + regenerateModIndex(true); + } else { + JOptionPane.showMessageDialog(frame, "Please select a mod to delete first.", "Error", JOptionPane.ERROR_MESSAGE); + } + } - public void generatorGUI() { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - int result = fileChooser.showOpenDialog(frame); - if (result == JFileChooser.APPROVE_OPTION) { - if (fileChooser.getSelectedFile().isDirectory() - && new File(fileChooser.getSelectedFile().getAbsolutePath() + "/data").isDirectory()) { - File file = fileChooser.getSelectedFile(); - new Clifford().Action(this, file); - frame.setEnabled(false); - } else { - JOptionPane.showMessageDialog(frame, "You must select a folder containing a \"data\" directory with game assets.", "Error", JOptionPane.ERROR_MESSAGE); - } - } - } + public void generatorGUI() { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int result = fileChooser.showOpenDialog(frame); + if (result == JFileChooser.APPROVE_OPTION) { + if (fileChooser.getSelectedFile().isDirectory() + && new File(fileChooser.getSelectedFile().getAbsolutePath() + "/data").isDirectory()) { + File file = fileChooser.getSelectedFile(); + new Clifford().Action(this, file); + frame.setEnabled(false); + } else { + JOptionPane.showMessageDialog(frame, "You must select a folder containing a \"data\" directory with game assets.", "Error", JOptionPane.ERROR_MESSAGE); + } + } + } - public void metaEditorGUI(int index) { - if (index >= 0) { - new Clifford().Action(this, index); - frame.setEnabled(false); - } else { - JOptionPane.showMessageDialog(frame, "Please select a mod to edit first.", "Error", JOptionPane.ERROR_MESSAGE); - } - } + public void metaEditorGUI(int index) { + if (index >= 0) { + new Clifford().Action(this, index); + frame.setEnabled(false); + } else { + JOptionPane.showMessageDialog(frame, "Please select a mod to edit first.", "Error", JOptionPane.ERROR_MESSAGE); + } + } - private void moveUp(int index) { - if (index > 0) { - Collections.swap(Main.Mods, index, index - 1); - System.out.println("Items moved, redeploying list"); - InitializeModListInGUI(); - regenerateModIndex(false); - } - } + private void moveUp(int index) { + if (index > 0) { + Collections.swap(Main.Mods, index, index - 1); + System.out.println("Items moved, redeploying list"); + InitializeModListInGUI(); + regenerateModIndex(false); + } + } - private void moveDown(int index) { - if (index < (Main.Mods.size() - 1)) { - Collections.swap(Main.Mods, index, index + 1); - System.out.println("Items moved, redeploying list"); - InitializeModListInGUI(); - regenerateModIndex(false); - } - } + private void moveDown(int index) { + if (index < (Main.Mods.size() - 1)) { + Collections.swap(Main.Mods, index, index + 1); + System.out.println("Items moved, redeploying list"); + InitializeModListInGUI(); + regenerateModIndex(false); + } + } - private void toggleSelected(int index) { - if (index >= 0) { - Main.Mods.get(index).enabled = !Main.Mods.get(index).enabled; - regenerateModBlacklist(true); - } else { - JOptionPane.showMessageDialog(frame, "Please select a mod to toggle first.", "Error", JOptionPane.ERROR_MESSAGE); - } - } + private void toggleSelected(int index) { + if (index >= 0) { + Main.Mods.get(index).enabled = !Main.Mods.get(index).enabled; + regenerateModBlacklist(true); + } else { + JOptionPane.showMessageDialog(frame, "Please select a mod to toggle first.", "Error", JOptionPane.ERROR_MESSAGE); + } + } - public void throwUnimplemented() { - JOptionPane.showMessageDialog(frame, "This feature is unimplemented and will be coming soon.\nSee README at https://git.worlio.com/bonkmaykr/firestar", "Unimplemented", JOptionPane.INFORMATION_MESSAGE); - } + public void throwUnimplemented() { + JOptionPane.showMessageDialog(frame, "This feature is unimplemented and will be coming soon.\nSee README at https://git.worlio.com/bonkmaykr/firestar", "Unimplemented", JOptionPane.INFORMATION_MESSAGE); + } - public void createSelectionEventListener() { // moved incase needs to be removed and re-added - listenersAlreadySet = true; // was written to troubleshoot a bug but this wasn't actually the cause - modList.addListSelectionListener(e -> { - if (modList.getSelectedIndex() >= 0 && modList.getModel().getSize() >= 1) { // avoid race OOB when reinitializing mod list - String authorDisplay; + public void createSelectionEventListener() { // moved incase needs to be removed and re-added + listenersAlreadySet = true; // was written to troubleshoot a bug but this wasn't actually the cause + modList.addListSelectionListener(e -> { + if (modList.getSelectedIndex() >= 0 && modList.getModel().getSize() >= 1) { // avoid race OOB when reinitializing mod list + String authorDisplay; - try { //debug + try { //debug - File pathReference = new File(System.getProperty("user.home") + "/.firestar/mods/" + Main.Mods.get(modList.getSelectedIndex()).path); - DecimalFormat df = new DecimalFormat("##.##"); - df.setRoundingMode(RoundingMode.UP); - float modFileSize = pathReference.length(); //precise units - String modFileSizeStr = String.valueOf(modFileSize); - String modFileSizeUnits = "bytes"; //todo: don't show decimals for bytes - if (pathReference.length() >= 1024) { - modFileSizeStr = String.valueOf(df.format(modFileSize / 1024)); - modFileSizeUnits = "Kilobytes"; - } - if (pathReference.length() >= 1024 * 1024) { - modFileSizeStr = String.valueOf(df.format(modFileSize / (1024 * 1024))); - modFileSizeUnits = "Megabytes"; - } - if (pathReference.length() >= 1024 * 1024 * 1024) { - modFileSizeStr = String.valueOf(df.format(modFileSize / (1024 * 1024 * 1024))); - modFileSizeUnits = "Gigabytes"; - } - if (Main.Mods.get(modList.getSelectedIndex()).author == null || Main.Mods.get(modList.getSelectedIndex()).author.isEmpty()) { - authorDisplay = "an Unknown Author"; - } else { - authorDisplay = Main.Mods.get(modList.getSelectedIndex()).author; - } - descriptionField.setText( - "\"" + Main.Mods.get(modList.getSelectedIndex()).friendlyName + "\"\n" + - "by " + authorDisplay + "\n\n" + - "Version " + Main.Mods.get(modList.getSelectedIndex()).version + "\n" + - modFileSizeStr + " " + modFileSizeUnits + " in size" + - "\n\n" + Main.Mods.get(modList.getSelectedIndex()).description - );} + File pathReference = new File(System.getProperty("user.home") + "/.firestar/mods/" + Main.Mods.get(modList.getSelectedIndex()).path); + DecimalFormat df = new DecimalFormat("##.##"); + df.setRoundingMode(RoundingMode.UP); + float modFileSize = pathReference.length(); //precise units + String modFileSizeStr = String.valueOf(modFileSize); + String modFileSizeUnits = "bytes"; //todo: don't show decimals for bytes + if (pathReference.length() >= 1024) { + modFileSizeStr = String.valueOf(df.format(modFileSize / 1024)); + modFileSizeUnits = "Kilobytes"; + } + if (pathReference.length() >= 1024 * 1024) { + modFileSizeStr = String.valueOf(df.format(modFileSize / (1024 * 1024))); + modFileSizeUnits = "Megabytes"; + } + if (pathReference.length() >= 1024 * 1024 * 1024) { + modFileSizeStr = String.valueOf(df.format(modFileSize / (1024 * 1024 * 1024))); + modFileSizeUnits = "Gigabytes"; + } + if (Main.Mods.get(modList.getSelectedIndex()).author == null || Main.Mods.get(modList.getSelectedIndex()).author.isEmpty()) { + authorDisplay = "an Unknown Author"; + } else { + authorDisplay = Main.Mods.get(modList.getSelectedIndex()).author; + } + descriptionField.setText( + "\"" + Main.Mods.get(modList.getSelectedIndex()).friendlyName + "\"\n" + + "by " + authorDisplay + "\n\n" + + "Version " + Main.Mods.get(modList.getSelectedIndex()).version + "\n" + + modFileSizeStr + " " + modFileSizeUnits + " in size" + + "\n\n" + Main.Mods.get(modList.getSelectedIndex()).description + );} - catch (IndexOutOfBoundsException ex) { - System.out.println(ex.getMessage()); - System.out.println("mods " + Main.Mods.size()); - System.out.println("mod display " + modList.getModel().getSize()); - System.out.println("selection index " + modList.getSelectedIndex()); + catch (IndexOutOfBoundsException ex) { + System.out.println(ex.getMessage()); + System.out.println("mods " + Main.Mods.size()); + System.out.println("mod display " + modList.getModel().getSize()); + System.out.println("selection index " + modList.getSelectedIndex()); - int result = JOptionPane.showConfirmDialog(frame, "Firestar encountered an internal error.\n" + ex.getMessage(), "Fatal Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); - if (result == JOptionPane.OK_OPTION) {System.exit(1);} //user safety - } + int result = JOptionPane.showConfirmDialog(frame, "Firestar encountered an internal error.\n" + ex.getMessage(), "Fatal Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); + if (result == JOptionPane.OK_OPTION) {System.exit(1);} //user safety + } + } + }); + } - } - }); - } + public void regenerateModIndex(boolean reload) { + try { + System.out.println("Regenerating index..."); //debug - public void regenerateModIndex(boolean reload) { - try { - System.out.println("Regenerating index..."); //debug + new File(System.getProperty("user.home") + "/.firestar/mods/index").delete(); + File priorityListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/index"); + priorityListFileHandle.createNewFile(); - new File(System.getProperty("user.home") + "/.firestar/mods/index").delete(); - File priorityListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/index"); - priorityListFileHandle.createNewFile(); + BufferedWriter bw = new BufferedWriter(new FileWriter(System.getProperty("user.home") + "/.firestar/mods/index", true)); + int i = 0; + for (Main.Mod m : Main.Mods) { + bw.write(i + "=" + m.path); + bw.newLine(); + i++; + } + bw.close(); + System.out.println("Mod index file regenerated."); - BufferedWriter bw = new BufferedWriter(new FileWriter(System.getProperty("user.home") + "/.firestar/mods/index", true)); - int i = 0; - for (Main.Mod m : Main.Mods) { - bw.write(i + "=" + m.path); - bw.newLine(); - i++; - } - bw.close(); - System.out.println("Mod index file regenerated."); + if(reload) { + Main.Mods.clear(); //cleanup + priorityList = ""; + InitializeModListStructure(); + InitializeModListInGUI(); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } - if(reload) { - Main.Mods.clear(); //cleanup - priorityList = ""; - InitializeModListStructure(); - InitializeModListInGUI(); - } - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - } + public void regenerateModBlacklist(boolean reload) { + try { + System.out.println("Regenerating blacklist..."); //debug - public void regenerateModBlacklist(boolean reload) { - try { - System.out.println("Regenerating blacklist..."); //debug + new File(System.getProperty("user.home") + "/.firestar/mods/blacklist").delete(); + File blackListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/blacklist"); + blackListFileHandle.createNewFile(); - new File(System.getProperty("user.home") + "/.firestar/mods/blacklist").delete(); - File blackListFileHandle = new File(System.getProperty("user.home") + "/.firestar/mods/blacklist"); - blackListFileHandle.createNewFile(); + BufferedWriter bw2 = new BufferedWriter(new FileWriter(System.getProperty("user.home") + "/.firestar/mods/blacklist", true)); + int i2 = 0; + for (Main.Mod m : Main.Mods) { + if (!m.enabled) { + bw2.write(m.path); + bw2.newLine(); + i2++; + } + } + bw2.close(); + System.out.println("Mod blacklist file regenerated."); - BufferedWriter bw2 = new BufferedWriter(new FileWriter(System.getProperty("user.home") + "/.firestar/mods/blacklist", true)); - int i2 = 0; - for (Main.Mod m : Main.Mods) { - if (!m.enabled) { - bw2.write(m.path); - bw2.newLine(); - i2++; - } - } - bw2.close(); - System.out.println("Mod blacklist file regenerated."); - - if(reload) { - Main.Mods.clear(); //cleanup - blackList = ""; - InitializeModListStructure(); - InitializeModListInGUI(); - } - } catch (Exception e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - } + if(reload) { + Main.Mods.clear(); //cleanup + blackList = ""; + InitializeModListStructure(); + InitializeModListInGUI(); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } } diff --git a/firestar/src/main/java/ReplacingInputStream.java b/firestar/src/main/java/ReplacingInputStream.java index 8771d03..7e50132 100644 --- a/firestar/src/main/java/ReplacingInputStream.java +++ b/firestar/src/main/java/ReplacingInputStream.java @@ -5,133 +5,132 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.Queue; -/** - * Created by simon on 8/29/17. - * Copyright 2017 Simon Haoran Liang +/* + * Created by simon on 8/29/17. + * Copyright 2017 Simon Haoran Liang * - * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and - * associated documentation files (the "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the - * following conditions: + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the + * following conditions: * - * The above copyright notice and this permission notice shall be included in all copies or substantial - * portions of the Software. + * The above copyright notice and this permission notice shall be included in all copies or substantial + * portions of the Software. * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT - * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT + * LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ public class ReplacingInputStream extends FilterInputStream { - private Queue inQueue, outQueue; - private final byte[] search, replacement; - private boolean caseSensitive = true; - - public ReplacingInputStream(InputStream in, String search, String replacement) { - super(in); + private Queue inQueue, outQueue; + private final byte[] search, replacement; + private boolean caseSensitive = true; + + public ReplacingInputStream(InputStream in, String search, String replacement) { + super(in); - this.inQueue = new LinkedList<>(); - this.outQueue = new LinkedList<>(); + this.inQueue = new LinkedList<>(); + this.outQueue = new LinkedList<>(); - this.search = search.getBytes(); - this.replacement = replacement.getBytes(); - } + this.search = search.getBytes(); + this.replacement = replacement.getBytes(); + } - public ReplacingInputStream(InputStream in, String search, String replacement, boolean caseSensitive) { - super(in); + public ReplacingInputStream(InputStream in, String search, String replacement, boolean caseSensitive) { + super(in); - this.inQueue = new LinkedList<>(); - this.outQueue = new LinkedList<>(); + this.inQueue = new LinkedList<>(); + this.outQueue = new LinkedList<>(); - this.search = search.getBytes(); - this.replacement = replacement.getBytes(); - this.caseSensitive = caseSensitive; - } + this.search = search.getBytes(); + this.replacement = replacement.getBytes(); + this.caseSensitive = caseSensitive; + } - private boolean isMatchFound() { - Iterator iterator = inQueue.iterator(); + private boolean isMatchFound() { + Iterator iterator = inQueue.iterator(); - for (byte b : search) { - if (!iterator.hasNext()) return false; - Integer i = iterator.next(); - if (caseSensitive && b != i) return false; - else if (Character.toLowerCase(b) != Character.toLowerCase(i.byteValue())) return false; - } + for (byte b : search) { + if (!iterator.hasNext()) return false; + Integer i = iterator.next(); + if (caseSensitive && b != i) return false; + else if (Character.toLowerCase(b) != Character.toLowerCase(i.byteValue())) return false; + } - return true; - } + return true; + } - private void readAhead() throws IOException { - // Work up some look-ahead. - while (inQueue.size() < search.length) { - int next = super.read(); - inQueue.offer(next); + private void readAhead() throws IOException { + // Work up some look-ahead. + while (inQueue.size() < search.length) { + int next = super.read(); + inQueue.offer(next); - if (next == -1) { - break; - } - } - } + if (next == -1) { + break; + } + } + } - @Override - public int read() throws IOException { - // Next byte already determined. + @Override + public int read() throws IOException { + // Next byte already determined. - while (outQueue.isEmpty()) { - readAhead(); + while (outQueue.isEmpty()) { + readAhead(); - if (isMatchFound()) { - for (byte a : search) { - inQueue.remove(); - } + if (isMatchFound()) { + for (byte a : search) { + inQueue.remove(); + } - for (byte b : replacement) { - outQueue.offer((int) b); - } - } else { - outQueue.add(inQueue.remove()); - } - } + for (byte b : replacement) { + outQueue.offer((int) b); + } + } else { + outQueue.add(inQueue.remove()); + } + } - return outQueue.remove(); - } + return outQueue.remove(); + } - @Override - public int read(byte b[]) throws IOException { - return read(b, 0, b.length); - } + @Override + public int read(byte b[]) throws IOException { + return read(b, 0, b.length); + } - // copied straight from InputStream inplementation, just needed to to use `read()` from this class - @Override - public int read(byte b[], int off, int len) throws IOException { - if (b == null) { - throw new NullPointerException(); - } else if (off < 0 || len < 0 || len > b.length - off) { - throw new IndexOutOfBoundsException(); - } else if (len == 0) { - return 0; - } + // copied straight from InputStream inplementation, just needed to to use `read()` from this class + @Override + public int read(byte b[], int off, int len) throws IOException { + if (b == null) { + throw new NullPointerException(); + } else if (off < 0 || len < 0 || len > b.length - off) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return 0; + } - int c = read(); - if (c == -1) { - return -1; - } - b[off] = (byte)c; + int c = read(); + if (c == -1) { + return -1; + } + b[off] = (byte)c; - int i = 1; - try { - for (; i < len ; i++) { - c = read(); - if (c == -1) { - break; - } - b[off + i] = (byte)c; - } - } catch (IOException ee) { - } - return i; - } + int i = 1; + try { + for (; i < len ; i++) { + c = read(); + if (c == -1) { + break; + } + b[off + i] = (byte)c; + } + } catch (IOException ee) { } + return i; + } } \ No newline at end of file diff --git a/firestar/src/main/java/Rizzo.java b/firestar/src/main/java/Rizzo.java index 36be464..fed2154 100644 --- a/firestar/src/main/java/Rizzo.java +++ b/firestar/src/main/java/Rizzo.java @@ -56,397 +56,397 @@ import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class Rizzo { - private Scanner scanner; - private final int maxVer = 1; - private int ver = 1; - private String workingDir; - - public Rizzo(InputStream infile, String workingDir) throws FileNotFoundException, FirescriptFormatException { - if (!workingDir.endsWith("/")) this.workingDir = workingDir + "/"; - else this.workingDir = workingDir; - scanner = new Scanner(infile); - parseScript(null); - } - - private void parseScript(Object context) throws FirescriptFormatException { - while (scanner.hasNextLine()) { - String line = scanner.nextLine().trim(); - if (line.startsWith("#") || line.length() < 1) continue; - if (!parseArgs(translateCommandline(line), context)) break; + private Scanner scanner; + private final int maxVer = 1; + private int ver = 1; + private String workingDir; + + public Rizzo(InputStream infile, String workingDir) throws FileNotFoundException, FirescriptFormatException { + if (!workingDir.endsWith("/")) this.workingDir = workingDir + "/"; + else this.workingDir = workingDir; + scanner = new Scanner(infile); + parseScript(null); } - } - - private boolean parseArgs(String[] args, Object context) throws FirescriptFormatException { - System.out.println("Parsing Command: " + Arrays.toString(args)); - if (args.length > 0) { - if (context == null) { - if (args[0].equalsIgnoreCase("fscript")) { - ver = Integer.parseInt(args[1]); // We'll do shit with this later - if (ver > maxVer) throw new FirescriptFormatException(args[0], "script too new"); - } else if (args[0].equalsIgnoreCase("file")) { - File newCtx = new File(workingDir + args[1]); - System.out.println("Calling new parse: " + Arrays.toString(Arrays.copyOfRange(args, 2, args.length))); - parseArgs(Arrays.copyOfRange(args, 2, args.length), newCtx); - } else throw new FirescriptFormatException("fscript", "unknown command '" + args[0] + "'"); - } else { - System.out.println("Using context: " + context.getClass().getName() + "@" + context.hashCode()); - if (args[0].equals("{")) { - System.out.println("New context block: " + context.getClass().getName() + "@" + context.hashCode()); - parseScript(context); - } else if (args[0].equals("}")) { - System.out.println("Ending context block: " + context.getClass().getName() + "@" + context.hashCode()); - return false; - } else if (context instanceof File file) { - if (file.exists()) { - if (args[0].equalsIgnoreCase("delete")) { - System.out.println("Deleting: " + file.getPath()); - if (file.getAbsolutePath().startsWith(workingDir)) { - if (file.isDirectory()) Main.deleteDir(file); - else file.delete(); - } - } else if (args[0].equalsIgnoreCase("xml")) { - try { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - // Mmmm, love me some INVALID XML corrections. - ReplacingInputStream ris = new ReplacingInputStream(new ReplacingInputStream(new ReplacingInputStream(new FileInputStream(file), "\r\n", ""), "&", "&"), "\n", " "); - Document doc = docBuilder.parse(ris); - parseArgs(Arrays.copyOfRange(args, 1, args.length), doc); - try { - FileOutputStream output = new FileOutputStream(file); - Transformer transformer = TransformerFactory.newInstance().newTransformer(); + + private void parseScript(Object context) throws FirescriptFormatException { + while (scanner.hasNextLine()) { + String line = scanner.nextLine().trim(); + if (line.startsWith("#") || line.length() < 1) continue; + if (!parseArgs(translateCommandline(line), context)) break; + } + } + + private boolean parseArgs(String[] args, Object context) throws FirescriptFormatException { + System.out.println("Parsing Command: " + Arrays.toString(args)); + if (args.length > 0) { + if (context == null) { + if (args[0].equalsIgnoreCase("fscript")) { + ver = Integer.parseInt(args[1]); // We'll do shit with this later + if (ver > maxVer) throw new FirescriptFormatException(args[0], "script too new"); + } else if (args[0].equalsIgnoreCase("file")) { + File newCtx = new File(workingDir + args[1]); + System.out.println("Calling new parse: " + Arrays.toString(Arrays.copyOfRange(args, 2, args.length))); + parseArgs(Arrays.copyOfRange(args, 2, args.length), newCtx); + } else throw new FirescriptFormatException("fscript", "unknown command '" + args[0] + "'"); + } else { + System.out.println("Using context: " + context.getClass().getName() + "@" + context.hashCode()); + if (args[0].equals("{")) { + System.out.println("New context block: " + context.getClass().getName() + "@" + context.hashCode()); + parseScript(context); + } else if (args[0].equals("}")) { + System.out.println("Ending context block: " + context.getClass().getName() + "@" + context.hashCode()); + return false; + } else if (context instanceof File file) { + if (file.exists()) { + if (args[0].equalsIgnoreCase("delete")) { + System.out.println("Deleting: " + file.getPath()); + if (file.getAbsolutePath().startsWith(workingDir)) { + if (file.isDirectory()) Main.deleteDir(file); + else file.delete(); + } + } else if (args[0].equalsIgnoreCase("xml")) { + try { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + // Mmmm, love me some INVALID XML corrections. + ReplacingInputStream ris = new ReplacingInputStream(new ReplacingInputStream(new ReplacingInputStream(new FileInputStream(file), "\r\n", ""), "&", "&"), "\n", " "); + Document doc = docBuilder.parse(ris); + parseArgs(Arrays.copyOfRange(args, 1, args.length), doc); + try { + FileOutputStream output = new FileOutputStream(file); + Transformer transformer = TransformerFactory.newInstance().newTransformer(); - StreamResult result = new StreamResult(new StringWriter()); - DOMSource source = new DOMSource(doc); + StreamResult result = new StreamResult(new StringWriter()); + DOMSource source = new DOMSource(doc); - transformer.transform(source, result); - // Look ma, I'm breaking XML standards! - String xmlString = result.getWriter().toString() - .replace("&", "&") - .replace(" ", "\t") - .replace("", "\b") - .replace(" ", "\n") - .replace(" ", "\r") - .replace(" ", "\f"); - try (PrintStream ps = new PrintStream(output)) { - ps.print(xmlString); - } - } catch (TransformerException ex) { - Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); - } - } catch (SAXException | IOException | ParserConfigurationException ex) { - Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); - } - } else if (args[0].equalsIgnoreCase("str") || args[0].equalsIgnoreCase("xstr")) { - try { - FileInputStream fis = new FileInputStream(file); - ByteArrayInputStream bais = new ByteArrayInputStream(fis.readAllBytes()); - fis.close(); - FileOutputStream fos = new FileOutputStream(file); - if (args[1].equalsIgnoreCase("append")) { - bais.transferTo(fos); - for (int s = 0; s < args[2].length(); s++) { - char c = args[2].charAt(s); - fos.write(c); - } - } else if (args[1].equalsIgnoreCase("replace") || args[1].equalsIgnoreCase("delete")) { - String replacement = ""; - if (args[1].equalsIgnoreCase("replace")) replacement = args[3]; - ReplacingInputStream ris; - if (args[0].equalsIgnoreCase("xstr")) ris = new ReplacingInputStream(bais, args[2], replacement, false); - else ris = new ReplacingInputStream(bais, args[2], replacement); - ris.transferTo(fos); - ris.close(); - } - fos.flush(); - fos.close(); - } catch (IOException ex) { - Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); - } - } else if (args[0].equalsIgnoreCase("binedit")) { - int offset = Integer.parseInt(args[1]); - String bytes = args[2]; - if (bytes.length() % 2 != 0) throw new FirescriptFormatException(args[0], "invalid length of bytes"); - try { - byte[] ba; - try (FileInputStream fis = new FileInputStream(file)) { - ba = fis.readAllBytes(); - } - if (offset >= ba.length) throw new FirescriptFormatException(args[0], "offset is larger than file size"); - else { - byte[] in = HexFormat.of().parseHex(bytes); - System.arraycopy(in, 0, ba, offset, in.length); - try (FileOutputStream fos = new FileOutputStream(file)) { - fos.write(ba); - fos.flush(); - } - } - } catch (IOException ex) { - Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); - } - } else if (args[0].equalsIgnoreCase("patch")) { - try { - List original = Files.readAllLines(file.toPath()); - File patchFile = new File(workingDir + args[1]); - if (!patchFile.exists()) throw new FirescriptFormatException(args[0], "patch file doesn't exist"); - List patched = Files.readAllLines(patchFile.toPath()); + transformer.transform(source, result); + // Look ma, I'm breaking XML standards! + String xmlString = result.getWriter().toString() + .replace("&", "&") + .replace(" ", "\t") + .replace("", "\b") + .replace(" ", "\n") + .replace(" ", "\r") + .replace(" ", "\f"); + try (PrintStream ps = new PrintStream(output)) { + ps.print(xmlString); + } + } catch (TransformerException ex) { + Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); + } + } catch (SAXException | IOException | ParserConfigurationException ex) { + Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); + } + } else if (args[0].equalsIgnoreCase("str") || args[0].equalsIgnoreCase("xstr")) { + try { + FileInputStream fis = new FileInputStream(file); + ByteArrayInputStream bais = new ByteArrayInputStream(fis.readAllBytes()); + fis.close(); + FileOutputStream fos = new FileOutputStream(file); + if (args[1].equalsIgnoreCase("append")) { + bais.transferTo(fos); + for (int s = 0; s < args[2].length(); s++) { + char c = args[2].charAt(s); + fos.write(c); + } + } else if (args[1].equalsIgnoreCase("replace") || args[1].equalsIgnoreCase("delete")) { + String replacement = ""; + if (args[1].equalsIgnoreCase("replace")) replacement = args[3]; + ReplacingInputStream ris; + if (args[0].equalsIgnoreCase("xstr")) ris = new ReplacingInputStream(bais, args[2], replacement, false); + else ris = new ReplacingInputStream(bais, args[2], replacement); + ris.transferTo(fos); + ris.close(); + } + fos.flush(); + fos.close(); + } catch (IOException ex) { + Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); + } + } else if (args[0].equalsIgnoreCase("binedit")) { + int offset = Integer.parseInt(args[1]); + String bytes = args[2]; + if (bytes.length() % 2 != 0) throw new FirescriptFormatException(args[0], "invalid length of bytes"); + try { + byte[] ba; + try (FileInputStream fis = new FileInputStream(file)) { + ba = fis.readAllBytes(); + } + if (offset >= ba.length) throw new FirescriptFormatException(args[0], "offset is larger than file size"); + else { + byte[] in = HexFormat.of().parseHex(bytes); + System.arraycopy(in, 0, ba, offset, in.length); + try (FileOutputStream fos = new FileOutputStream(file)) { + fos.write(ba); + fos.flush(); + } + } + } catch (IOException ex) { + Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); + } + } else if (args[0].equalsIgnoreCase("patch")) { + try { + List original = Files.readAllLines(file.toPath()); + File patchFile = new File(workingDir + args[1]); + if (!patchFile.exists()) throw new FirescriptFormatException(args[0], "patch file doesn't exist"); + List patched = Files.readAllLines(patchFile.toPath()); - Patch patch = UnifiedDiffUtils.parseUnifiedDiff(patched); - List result = DiffUtils.patch(original, patch); + Patch patch = UnifiedDiffUtils.parseUnifiedDiff(patched); + List result = DiffUtils.patch(original, patch); - try (FileWriter fileWriter = new FileWriter(file)) { - for (String str : result) { - fileWriter.write(str + "\r\n"); - } - } - } catch (FirescriptFormatException | PatchFailedException | IOException ex) { - Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); - } - } else throw new FirescriptFormatException("file", "unknown command '" + args[0] + "'"); - } else System.out.println("fscript: file context not found, skipping."); - } else if (context instanceof Document document) { - if (args[0].equalsIgnoreCase("modify")) { - Element elem = (Element)traverse(document, args[1]); - parseArgs(Arrays.copyOfRange(args, 2, args.length), elem); - } else if (args[0].equalsIgnoreCase("create")) { - String newTag = args[1].substring(args[1].lastIndexOf(".")+1); - String newID = ""; - if (newTag.contains("#")) { - newID = newTag.substring(newTag.indexOf("#")+1); - newTag = newTag.substring(0, newTag.indexOf("#")); + try (FileWriter fileWriter = new FileWriter(file)) { + for (String str : result) { + fileWriter.write(str + "\r\n"); + } + } + } catch (FirescriptFormatException | PatchFailedException | IOException ex) { + Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); + } + } else throw new FirescriptFormatException("file", "unknown command '" + args[0] + "'"); + } else System.out.println("fscript: file context not found, skipping."); + } else if (context instanceof Document document) { + if (args[0].equalsIgnoreCase("modify")) { + Element elem = (Element)traverse(document, args[1]); + parseArgs(Arrays.copyOfRange(args, 2, args.length), elem); + } else if (args[0].equalsIgnoreCase("create")) { + String newTag = args[1].substring(args[1].lastIndexOf(".")+1); + String newID = ""; + if (newTag.contains("#")) { + newID = newTag.substring(newTag.indexOf("#")+1); + newTag = newTag.substring(0, newTag.indexOf("#")); + } + Element newElem = document.createElement(newTag); + if (newID != null && newID.length() > 0) newElem.setAttribute("id", newID); + traverse(document, args[1].substring(0, args[1].lastIndexOf("."))).appendChild(newElem); + parseArgs(Arrays.copyOfRange(args, 2, args.length), newElem); + } else if (args[0].equalsIgnoreCase("delete")) { + Element elem = (Element)traverse(document, args[1]); + elem.getParentNode().removeChild(elem); + } else if (args[0].equalsIgnoreCase("merge")) { + // We're basically copying the file context xml command but with another xml document. + try { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + ReplacingInputStream ris = new ReplacingInputStream(new ReplacingInputStream(new ReplacingInputStream(new FileInputStream(new File(workingDir + args[1])), "\r\n", ""), "&", "&"), "\n", " "); + Document outDoc = docBuilder.parse(ris); + + NamedNodeMap nnm = outDoc.getDocumentElement().getAttributes(); + for (int x = 0; x < nnm.getLength(); x++) { + Attr importedNode = (Attr) document.importNode(nnm.item(x), true); + document.getDocumentElement().setAttributeNodeNS(importedNode); + } + + NodeList cn = outDoc.getDocumentElement().getChildNodes(); + for (int x = 0; x < cn.getLength(); x++) { + Node importedNode = document.importNode(cn.item(x), true); + document.getDocumentElement().appendChild(importedNode); + } + } catch (SAXException | IOException | ParserConfigurationException ex) { + Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); + } + } else throw new FirescriptFormatException("xml", "unknown command '" + args[0] + "'"); + } else if (context instanceof Element element) { + if (args[0].equalsIgnoreCase("set")) { + if (args[1].equalsIgnoreCase("attribute")) + // We replace newlines on XML write. + element.setAttribute(args[2], args[3].replace("\\n", " ")); + else if (args[1].equalsIgnoreCase("value")) + element.setNodeValue(args[2]); + } else if (args[0].equalsIgnoreCase("create")) { + String finalTag = args[1]; + String path = ""; + if (finalTag.lastIndexOf(".") > 0) { + path = args[1].substring(0, finalTag.lastIndexOf(".")); + finalTag = args[1].substring(finalTag.lastIndexOf(".")+1); + } + String id = ""; + String name = ""; + if (finalTag.contains("#")) { + id = finalTag.substring(finalTag.indexOf("#")+1); + finalTag = finalTag.substring(0, finalTag.indexOf("#")); + } else if (finalTag.contains("$")) { + name = finalTag.substring(finalTag.indexOf("$")+1); + finalTag = finalTag.substring(0, finalTag.indexOf("$")); + } + Element finalElem = element.getOwnerDocument().createElement(finalTag); + if (id != null && id.length() > 0) finalElem.setAttribute("id", id); + if (name != null && name.length() > 0) finalElem.setAttribute("name", name); + traverse(element, path).appendChild(finalElem); + parseArgs(Arrays.copyOfRange(args, 2, args.length), finalElem); + } else if (args[0].equalsIgnoreCase("create-at")) { + int index = Integer.parseInt(args[1]); + String finalTag = args[2]; + String id = ""; + String name = ""; + if (finalTag.contains("#")) { + id = finalTag.substring(finalTag.indexOf("#")+1); + finalTag = finalTag.substring(0, finalTag.indexOf("#")); + } else if (finalTag.contains("$")) { + name = finalTag.substring(finalTag.indexOf("$")+1); + finalTag = finalTag.substring(0, finalTag.indexOf("$")); + } + Element finalElem = element.getOwnerDocument().createElement(finalTag); + if (id != null && id.length() > 0) finalElem.setAttribute("id", id); + if (name != null && name.length() > 0) finalElem.setAttribute("name", name); + element.insertBefore(finalElem, element.getChildNodes().item(index)); + parseArgs(Arrays.copyOfRange(args, 3, args.length), finalElem); + } else throw new FirescriptFormatException("xml", "unknown element command '" + args[0] + "'"); + } else throw new FirescriptFormatException("context is unknown"); } - Element newElem = document.createElement(newTag); - if (newID != null && newID.length() > 0) newElem.setAttribute("id", newID); - traverse(document, args[1].substring(0, args[1].lastIndexOf("."))).appendChild(newElem); - parseArgs(Arrays.copyOfRange(args, 2, args.length), newElem); - } else if (args[0].equalsIgnoreCase("delete")) { - Element elem = (Element)traverse(document, args[1]); - elem.getParentNode().removeChild(elem); - } else if (args[0].equalsIgnoreCase("merge")) { - // We're basically copying the file context xml command but with another xml document. - try { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); - ReplacingInputStream ris = new ReplacingInputStream(new ReplacingInputStream(new ReplacingInputStream(new FileInputStream(new File(workingDir + args[1])), "\r\n", ""), "&", "&"), "\n", " "); - Document outDoc = docBuilder.parse(ris); - - NamedNodeMap nnm = outDoc.getDocumentElement().getAttributes(); - for (int x = 0; x < nnm.getLength(); x++) { - Attr importedNode = (Attr) document.importNode(nnm.item(x), true); - document.getDocumentElement().setAttributeNodeNS(importedNode); - } - - NodeList cn = outDoc.getDocumentElement().getChildNodes(); - for (int x = 0; x < cn.getLength(); x++) { - Node importedNode = document.importNode(cn.item(x), true); - document.getDocumentElement().appendChild(importedNode); - } - } catch (SAXException | IOException | ParserConfigurationException ex) { - Logger.getLogger(Rizzo.class.getName()).log(Level.SEVERE, null, ex); - } - } else throw new FirescriptFormatException("xml", "unknown command '" + args[0] + "'"); - } else if (context instanceof Element element) { - if (args[0].equalsIgnoreCase("set")) { - if (args[1].equalsIgnoreCase("attribute")) - // We replace newlines on XML write. - element.setAttribute(args[2], args[3].replace("\\n", " ")); - else if (args[1].equalsIgnoreCase("value")) - element.setNodeValue(args[2]); - } else if (args[0].equalsIgnoreCase("create")) { - String finalTag = args[1]; - String path = ""; - if (finalTag.lastIndexOf(".") > 0) { - path = args[1].substring(0, finalTag.lastIndexOf(".")); - finalTag = args[1].substring(finalTag.lastIndexOf(".")+1); + } + return true; + } + + private Node traverse(Node owner, String selector) throws FirescriptFormatException { + if (selector == null || selector.length() == 0 || owner == null) { + return owner; + } + String[] elems = selector.split("\\."); + Node parent = owner; + for (String tag : elems) { + Node newParent = null; + int index = 0; + if (tag.contains("[")) { + index = Integer.parseInt(tag.substring(tag.indexOf("[")+1, tag.lastIndexOf("]"))); + tag = tag.substring(0, tag.indexOf("[")); } + String id = ""; + if (tag.contains("#")) { + id = tag.substring(tag.indexOf("#")+1); + tag = tag.substring(0, tag.indexOf("#")); + } String name = ""; - if (finalTag.contains("#")) { - id = finalTag.substring(finalTag.indexOf("#")+1); - finalTag = finalTag.substring(0, finalTag.indexOf("#")); - } else if (finalTag.contains("$")) { - name = finalTag.substring(finalTag.indexOf("$")+1); - finalTag = finalTag.substring(0, finalTag.indexOf("$")); + if (tag.contains("$")) { + name = tag.substring(tag.indexOf("$")+1); + tag = tag.substring(0, tag.indexOf("$")); } - Element finalElem = element.getOwnerDocument().createElement(finalTag); - if (id != null && id.length() > 0) finalElem.setAttribute("id", id); - if (name != null && name.length() > 0) finalElem.setAttribute("name", name); - traverse(element, path).appendChild(finalElem); - parseArgs(Arrays.copyOfRange(args, 2, args.length), finalElem); - } else if (args[0].equalsIgnoreCase("create-at")) { - int index = Integer.parseInt(args[1]); - String finalTag = args[2]; - String id = ""; - String name = ""; - if (finalTag.contains("#")) { - id = finalTag.substring(finalTag.indexOf("#")+1); - finalTag = finalTag.substring(0, finalTag.indexOf("#")); - } else if (finalTag.contains("$")) { - name = finalTag.substring(finalTag.indexOf("$")+1); - finalTag = finalTag.substring(0, finalTag.indexOf("$")); + if (id.length() > 0) { + NodeList ns; + if (parent instanceof Document document) + ns = document.getElementsByTagName(tag); + else + ns = ((Element)parent).getElementsByTagName(tag); + for (int i = 0; i < ns.getLength(); i++) { + Node n = ns.item(i); + if (n.getNodeName().equals("#text")) continue; + if (((Element)n).getAttribute("id").equals(id)) { + newParent = (Element)n; + break; + } + } + } else if (name.length() > 0) { + NodeList ns; + if (parent instanceof Document document) + ns = document.getChildNodes(); + else + ns = ((Element)parent).getChildNodes(); + for (int i = 0; i < ns.getLength(); i++) { + Node n = ns.item(i); + if (n.getNodeName().equals("#text")) continue; + if (((Element)n).getAttribute("name").equals(name)) { + newParent = (Element)n; + break; + } + } + } else { + if (parent instanceof Document document) + newParent = document.getElementsByTagName(tag).item(index); + else + newParent = ((Element)parent).getElementsByTagName(tag).item(index); } - Element finalElem = element.getOwnerDocument().createElement(finalTag); - if (id != null && id.length() > 0) finalElem.setAttribute("id", id); - if (name != null && name.length() > 0) finalElem.setAttribute("name", name); - element.insertBefore(finalElem, element.getChildNodes().item(index)); - parseArgs(Arrays.copyOfRange(args, 3, args.length), finalElem); - } else throw new FirescriptFormatException("xml", "unknown element command '" + args[0] + "'"); - } else throw new FirescriptFormatException("context is unknown"); - } - } - return true; - } - - private Node traverse(Node owner, String selector) throws FirescriptFormatException { - if (selector == null || selector.length() == 0 || owner == null) { - return owner; - } - String[] elems = selector.split("\\."); - Node parent = owner; - for (String tag : elems) { - Node newParent = null; - int index = 0; - if (tag.contains("[")) { - index = Integer.parseInt(tag.substring(tag.indexOf("[")+1, tag.lastIndexOf("]"))); - tag = tag.substring(0, tag.indexOf("[")); - } - - String id = ""; - if (tag.contains("#")) { - id = tag.substring(tag.indexOf("#")+1); - tag = tag.substring(0, tag.indexOf("#")); - } - String name = ""; - if (tag.contains("$")) { - name = tag.substring(tag.indexOf("$")+1); - tag = tag.substring(0, tag.indexOf("$")); - } - if (id.length() > 0) { - NodeList ns; - if (parent instanceof Document document) - ns = document.getElementsByTagName(tag); - else - ns = ((Element)parent).getElementsByTagName(tag); - for (int i = 0; i < ns.getLength(); i++) { - Node n = ns.item(i); - if (n.getNodeName().equals("#text")) continue; - if (((Element)n).getAttribute("id").equals(id)) { - newParent = (Element)n; - break; - } + if (newParent == null) throw new FirescriptFormatException("xml: selector is invalid"); + else parent = newParent; } - } else if (name.length() > 0) { - NodeList ns; - if (parent instanceof Document document) - ns = document.getChildNodes(); - else - ns = ((Element)parent).getChildNodes(); - for (int i = 0; i < ns.getLength(); i++) { - Node n = ns.item(i); - if (n.getNodeName().equals("#text")) continue; - if (((Element)n).getAttribute("name").equals(name)) { - newParent = (Element)n; - break; - } + return parent; + } + + private static String[] translateCommandline(String line) throws FirescriptFormatException { + if (line == null || line.length() == 0) { + return new String[0]; } - } else { - if (parent instanceof Document document) - newParent = document.getElementsByTagName(tag).item(index); - else - newParent = ((Element)parent).getElementsByTagName(tag).item(index); - } - if (newParent == null) throw new FirescriptFormatException("xml: selector is invalid"); - else parent = newParent; - } - return parent; - } - - private static String[] translateCommandline(String line) throws FirescriptFormatException { - if (line == null || line.length() == 0) { - return new String[0]; - } - final int normal = 0; - final int inQuote = 1; - final int inDoubleQuote = 2; - int state = normal; - final ArrayList result = new ArrayList(); - final StringBuilder current = new StringBuilder(); - boolean lastTokenHasBeenQuoted = false; - boolean lastTokenWasEscaped = false; + final int normal = 0; + final int inQuote = 1; + final int inDoubleQuote = 2; + int state = normal; + final ArrayList result = new ArrayList(); + final StringBuilder current = new StringBuilder(); + boolean lastTokenHasBeenQuoted = false; + boolean lastTokenWasEscaped = false; - for (int i = 0; i < line.length(); i++) { - char nextTok = line.charAt(i); - switch (state) { - case inQuote -> { - if (nextTok == '\\') { - lastTokenWasEscaped = true; - } else if (nextTok == '\'' && !lastTokenWasEscaped) { - lastTokenHasBeenQuoted = true; - state = normal; - } else { - if (lastTokenWasEscaped) { - if (nextTok == 't') nextTok = '\t'; - if (nextTok == 'b') nextTok = '\b'; - if (nextTok == 'n') nextTok = '\n'; - if (nextTok == 'r') nextTok = '\r'; - if (nextTok == 'f') nextTok = '\f'; + for (int i = 0; i < line.length(); i++) { + char nextTok = line.charAt(i); + switch (state) { + case inQuote -> { + if (nextTok == '\\') { + lastTokenWasEscaped = true; + } else if (nextTok == '\'' && !lastTokenWasEscaped) { + lastTokenHasBeenQuoted = true; + state = normal; + } else { + if (lastTokenWasEscaped) { + if (nextTok == 't') nextTok = '\t'; + if (nextTok == 'b') nextTok = '\b'; + if (nextTok == 'n') nextTok = '\n'; + if (nextTok == 'r') nextTok = '\r'; + if (nextTok == 'f') nextTok = '\f'; + } + current.append(nextTok); + lastTokenWasEscaped = false; + } + } + case inDoubleQuote -> { + if (nextTok == '\\') { + lastTokenWasEscaped = true; + } else if (nextTok == '\"' && !lastTokenWasEscaped) { + lastTokenHasBeenQuoted = true; + state = normal; + } else { + if (lastTokenWasEscaped) { + if (nextTok == 't') nextTok = '\t'; + if (nextTok == 'b') nextTok = '\b'; + if (nextTok == 'n') nextTok = '\n'; + if (nextTok == 'r') nextTok = '\r'; + if (nextTok == 'f') nextTok = '\f'; + } + current.append(nextTok); + lastTokenWasEscaped = false; + } + } + default -> { + switch (nextTok) { + case '\\' -> lastTokenWasEscaped = true; + case '\'' -> state = inQuote; + case '\"' -> state = inDoubleQuote; + case ' ' -> { + if (!lastTokenWasEscaped && (lastTokenHasBeenQuoted || current.length() != 0)) { + result.add(current.toString()); + current.setLength(0); + } + } + default -> { + if (lastTokenWasEscaped) { + if (nextTok == 't') nextTok = '\t'; + if (nextTok == 'b') nextTok = '\b'; + if (nextTok == 'n') nextTok = '\n'; + if (nextTok == 'r') nextTok = '\r'; + if (nextTok == 'f') nextTok = '\f'; + lastTokenWasEscaped = false; + } + current.append(nextTok); + } + } + lastTokenHasBeenQuoted = false; + } } - current.append(nextTok); - lastTokenWasEscaped = false; - } } - case inDoubleQuote -> { - if (nextTok == '\\') { - lastTokenWasEscaped = true; - } else if (nextTok == '\"' && !lastTokenWasEscaped) { - lastTokenHasBeenQuoted = true; - state = normal; - } else { - if (lastTokenWasEscaped) { - if (nextTok == 't') nextTok = '\t'; - if (nextTok == 'b') nextTok = '\b'; - if (nextTok == 'n') nextTok = '\n'; - if (nextTok == 'r') nextTok = '\r'; - if (nextTok == 'f') nextTok = '\f'; - } - current.append(nextTok); - lastTokenWasEscaped = false; - } + if (lastTokenHasBeenQuoted || current.length() != 0) { + result.add(current.toString()); } - default -> { - switch (nextTok) { - case '\\' -> lastTokenWasEscaped = true; - case '\'' -> state = inQuote; - case '\"' -> state = inDoubleQuote; - case ' ' -> { - if (!lastTokenWasEscaped && (lastTokenHasBeenQuoted || current.length() != 0)) { - result.add(current.toString()); - current.setLength(0); - } - } - default -> { - if (lastTokenWasEscaped) { - if (nextTok == 't') nextTok = '\t'; - if (nextTok == 'b') nextTok = '\b'; - if (nextTok == 'n') nextTok = '\n'; - if (nextTok == 'r') nextTok = '\r'; - if (nextTok == 'f') nextTok = '\f'; - lastTokenWasEscaped = false; - } - current.append(nextTok); - } - } - lastTokenHasBeenQuoted = false; + if (state == inQuote || state == inDoubleQuote) { + throw new FirescriptFormatException("unbalanced quotes in " + line); } - } + return result.toArray(new String[result.size()]); } - if (lastTokenHasBeenQuoted || current.length() != 0) { - result.add(current.toString()); - } - if (state == inQuote || state == inDoubleQuote) { - throw new FirescriptFormatException("unbalanced quotes in " + line); - } - return result.toArray(new String[result.size()]); - } } \ No newline at end of file diff --git a/firestar/src/main/java/Rowlf.java b/firestar/src/main/java/Rowlf.java index fa9ec99..37dc6e8 100644 --- a/firestar/src/main/java/Rowlf.java +++ b/firestar/src/main/java/Rowlf.java @@ -24,51 +24,51 @@ import java.io.IOException; import static javax.swing.WindowConstants.DISPOSE_ON_CLOSE; public class Rowlf { - JFrame frame = new JFrame(); - JPanel frameContainer; - Image logo; - JLabel picLabel; - private JTextField informationText; - private JLabel versionLabel; - private JLabel environmentLabel; + JFrame frame = new JFrame(); + JPanel frameContainer; + Image logo; + JLabel picLabel; + private JTextField informationText; + private JLabel versionLabel; + private JLabel environmentLabel; - public Rowlf(JFrame parent) { - try { - logo = ImageIO.read(Main.class.getResourceAsStream("/logo.png")).getScaledInstance(333, 100, Image.SCALE_SMOOTH); - } catch (IOException e) { - System.out.println("ERROR: Failed to open About screen because we couldn't find an image needed to display the page."); - throw new RuntimeException(e); - } - frame.setIconImage(Main.windowIcon); + public Rowlf(JFrame parent) { + try { + logo = ImageIO.read(Main.class.getResourceAsStream("/logo.png")).getScaledInstance(333, 100, Image.SCALE_SMOOTH); + } catch (IOException e) { + System.out.println("ERROR: Failed to open About screen because we couldn't find an image needed to display the page."); + throw new RuntimeException(e); + } + frame.setIconImage(Main.windowIcon); - //frame.add(picLabel); - frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA - picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); + //frame.add(picLabel); + frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA + picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); - informationText.getDocument().putProperty("filterNewlines", Boolean.FALSE); - informationText.setHorizontalAlignment(JTextField.CENTER); - informationText.setText("Created by bonkmaykr, a.k.a. \"Downforce Agent\"\n" + - "\n" + - "Special thanks to:\n" + - "ThatOneBonk, for Thallium and for modding help\n" + - "Wirlaburla, for web hosting and code assistance\n" + - "Psygnosis, for making our favorite game ever\n" + - "and to all the PSVita hackers who made this possible"); - informationText.setHighlighter(null); - informationText.getCaret().setVisible(false); - informationText.setFocusable(false); + informationText.getDocument().putProperty("filterNewlines", Boolean.FALSE); + informationText.setHorizontalAlignment(JTextField.CENTER); + informationText.setText("Created by bonkmaykr, a.k.a. \"Downforce Agent\"\n" + + "\n" + + "Special thanks to:\n" + + "ThatOneBonk, for Thallium and for modding help\n" + + "Wirlaburla, for web hosting and code assistance\n" + + "Psygnosis, for making our favorite game ever\n" + + "and to all the PSVita hackers who made this possible"); + informationText.setHighlighter(null); + informationText.getCaret().setVisible(false); + informationText.setFocusable(false); - versionLabel.setText("Version " + Main.vstr + " (" + Main.vcode + ")"); - environmentLabel.setText("Running on Java " + System.getProperty("java.version") + " for " + System.getProperty("os.name")); + versionLabel.setText("Version " + Main.vstr + " (" + Main.vcode + ")"); + environmentLabel.setText("Running on Java " + System.getProperty("java.version") + " for " + System.getProperty("os.name")); - // display window - frame.setSize(400, 320); - frame.setTitle("About Firestar"); - frame.setResizable(false); - frame.setAlwaysOnTop(true); - frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(parent); - frame.setVisible(true); - } + // display window + frame.setSize(400, 320); + frame.setTitle("About Firestar"); + frame.setResizable(false); + frame.setAlwaysOnTop(true); + frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(parent); + frame.setVisible(true); + } } diff --git a/firestar/src/main/java/Scooter.java b/firestar/src/main/java/Scooter.java index bee295b..fa3d9c9 100644 --- a/firestar/src/main/java/Scooter.java +++ b/firestar/src/main/java/Scooter.java @@ -20,57 +20,57 @@ import javax.swing.*; import java.awt.*; public class Scooter { - private JFrame frame = new JFrame(); - public JProgressBar progressBar; - private JPanel frameContainer; - private JLabel label; + private JFrame frame = new JFrame(); + public JProgressBar progressBar; + private JPanel frameContainer; + private JLabel label; - public void showDialog(String title) { - frame.add(frameContainer); - frame.setSize(300, 100); - frame.setTitle(title); - frame.setResizable(false); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(null); - frame.setAlwaysOnTop(true); - frame.setIconImage(Main.windowIcon); + public void showDialog(String title) { + frame.add(frameContainer); + frame.setSize(300, 100); + frame.setTitle(title); + frame.setResizable(false); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(null); + frame.setAlwaysOnTop(true); + frame.setIconImage(Main.windowIcon); - progressBar.setStringPainted(true); + progressBar.setStringPainted(true); - frame.setVisible(true); - } - - public void setProgressMin(int i) { - progressBar.setMinimum(i); - } - - public void setProgressValue(int i) { - progressBar.setValue(i); - } - - public void setProgressMax(int i) { - progressBar.setMaximum(i); - } - - public int getProgressMin() { - return progressBar.getMinimum(); - } - - public int getProgressValue() { - return progressBar.getValue(); - } - - public int getProgressMax() { - return progressBar.getMaximum(); - } + frame.setVisible(true); + } + + public void setProgressMin(int i) { + progressBar.setMinimum(i); + } + + public void setProgressValue(int i) { + progressBar.setValue(i); + } + + public void setProgressMax(int i) { + progressBar.setMaximum(i); + } + + public int getProgressMin() { + return progressBar.getMinimum(); + } + + public int getProgressValue() { + return progressBar.getValue(); + } + + public int getProgressMax() { + return progressBar.getMaximum(); + } - public void setText(String text) { - label.setText(text); - } + public void setText(String text) { + label.setText(text); + } - public void destroyDialog() { - frame.setVisible(false); - frame.dispose(); - } + public void destroyDialog() { + frame.setVisible(false); + frame.dispose(); + } } diff --git a/firestar/src/main/java/Suggs.java b/firestar/src/main/java/Suggs.java index e6d5c8c..f316ad7 100644 --- a/firestar/src/main/java/Suggs.java +++ b/firestar/src/main/java/Suggs.java @@ -51,45 +51,45 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; public class Suggs implements ActionListener, ListSelectionListener { - public JFrame frame = new JFrame(); - private JPanel frameContainer; - private JList dSongList; - private JButton moveDownBtn; - private JButton saveBtn; - private JButton cancelBtn; - private JTextField fTitle; - private JTextField fArtist; - private JLabel dTrackNo; - private JLabel dFileSize; - private JButton frontendDemoChooseBtn; - private JButton frontendMainChooseBtn; - private JButton deleteSongBtn; - private JButton addSongBtn; - private JButton moveUpBtn; - private JLabel dSTitle; - private JLabel dMTitle; - private JLabel dSSize; - private JLabel dMSize; - private JCheckBox checkAdditive; + public JFrame frame = new JFrame(); + private JPanel frameContainer; + private JList dSongList; + private JButton moveDownBtn; + private JButton saveBtn; + private JButton cancelBtn; + private JTextField fTitle; + private JTextField fArtist; + private JLabel dTrackNo; + private JLabel dFileSize; + private JButton frontendDemoChooseBtn; + private JButton frontendMainChooseBtn; + private JButton deleteSongBtn; + private JButton addSongBtn; + private JButton moveUpBtn; + private JLabel dSTitle; + private JLabel dMTitle; + private JLabel dSSize; + private JLabel dMSize; + private JCheckBox checkAdditive; private JButton spDeleteBtn; private JButton mpDeleteBtn; private JCheckBox checkNormalize; private Scooter progressDialog; - - JFrame parent; - int curIndex = -1; + + JFrame parent; + int curIndex = -1; boolean normalizeVolumes = false; - - public class AudioTrack { - public File path; // file name - public String title; // audio title - public String artist; // audio artist - public long size; // file size in bytes - public boolean noConvert; - } - private List tracklist = new ArrayList(); - private File sptrack; - private File mptrack; + + public class AudioTrack { + public File path; // file name + public String title; // audio title + public String artist; // audio artist + public long size; // file size in bytes + public boolean noConvert; + } + private List tracklist = new ArrayList(); + private File sptrack; + private File mptrack; DocumentListener id3TagEditorHandler = new DocumentListener() { @Override @@ -108,48 +108,48 @@ public class Suggs implements ActionListener, ListSelectionListener { } }; - public Suggs(JFrame parent) { + public Suggs(JFrame parent) { this.parent = parent; - parent.setEnabled(false); + parent.setEnabled(false); - frame.setIconImage(Main.windowIcon); - frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA + frame.setIconImage(Main.windowIcon); + frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA - frame.setSize(700, 400); - frame.setMinimumSize(new Dimension(700,400)); - frame.setTitle("Soundtrack Mod Generator"); - frame.setResizable(true); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(parent); - frame.setAlwaysOnTop(true); + frame.setSize(700, 400); + frame.setMinimumSize(new Dimension(700,400)); + frame.setTitle("Soundtrack Mod Generator"); + frame.setResizable(true); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(parent); + frame.setAlwaysOnTop(true); - cancelBtn.addActionListener(this); - saveBtn.addActionListener(this); - addSongBtn.addActionListener(this); // file picker - deleteSongBtn.addActionListener(this); // delete from list - moveUpBtn.addActionListener(this); - moveDownBtn.addActionListener(this); - fTitle.addActionListener(this); // automatically change selected item when changed & - fArtist.addActionListener(this); // also update field when new item selected - frontendMainChooseBtn.addActionListener(this); // file picker for singleplayer campaign grid music - frontendDemoChooseBtn.addActionListener(this); // file picker for multiplayer lobby music + cancelBtn.addActionListener(this); + saveBtn.addActionListener(this); + addSongBtn.addActionListener(this); // file picker + deleteSongBtn.addActionListener(this); // delete from list + moveUpBtn.addActionListener(this); + moveDownBtn.addActionListener(this); + fTitle.addActionListener(this); // automatically change selected item when changed & + fArtist.addActionListener(this); // also update field when new item selected + frontendMainChooseBtn.addActionListener(this); // file picker for singleplayer campaign grid music + frontendDemoChooseBtn.addActionListener(this); // file picker for multiplayer lobby music spDeleteBtn.addActionListener(this); mpDeleteBtn.addActionListener(this); - dSongList.addListSelectionListener(this); + dSongList.addListSelectionListener(this); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) - { + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) + { if (!tracklist.isEmpty() || sptrack != null || mptrack != null) { int result = JOptionPane.showConfirmDialog(frame, "Are you sure?\nAll unsaved changes will be lost.", "Soundtrack Mod Generator", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (result == JOptionPane.NO_OPTION) {return;} } parent.setEnabled(true); e.getWindow().dispose(); - } - }); + } + }); fTitle.setText(""); fArtist.setText(""); @@ -161,53 +161,53 @@ public class Suggs implements ActionListener, ListSelectionListener { fTitle.getDocument().addDocumentListener(id3TagEditorHandler); fArtist.getDocument().addDocumentListener(id3TagEditorHandler); - frame.setVisible(true); - } + frame.setVisible(true); + } - private void haveSeggs() { // kill yourself + private void haveSeggs() { // kill yourself - } + } - @Override - public void actionPerformed(ActionEvent actionEvent) { - if (actionEvent.getSource() == cancelBtn) { - if (!tracklist.isEmpty() || sptrack != null || mptrack != null) { - int result = JOptionPane.showConfirmDialog(frame, "Are you sure?\nAll unsaved changes will be lost.", "Soundtrack Mod Generator", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); - if (result == JOptionPane.NO_OPTION) {return;} - } - parent.setEnabled(true); - frame.dispose(); - } else - if (actionEvent.getSource() == addSongBtn) {addSong();} else - if (actionEvent.getSource() == deleteSongBtn) {remove(curIndex);} else - if (actionEvent.getSource() == moveUpBtn) {moveUp(curIndex);} else - if (actionEvent.getSource() == moveDownBtn) {moveDown(curIndex);} else - if (actionEvent.getSource() == frontendMainChooseBtn) {setSPMusic();} else - if (actionEvent.getSource() == frontendDemoChooseBtn) {setMPMusic();} else - if (actionEvent.getSource() == saveBtn) { - if (tracklist.isEmpty() && sptrack == null && mptrack == null) { - JOptionPane.showMessageDialog(frame, "Please add at least one song to the playlist.", "Error", JOptionPane.ERROR_MESSAGE); - return; - } else { - String deets; - if (tracklist.isEmpty()) { - deets = "no songs"; + @Override + public void actionPerformed(ActionEvent actionEvent) { + if (actionEvent.getSource() == cancelBtn) { + if (!tracklist.isEmpty() || sptrack != null || mptrack != null) { + int result = JOptionPane.showConfirmDialog(frame, "Are you sure?\nAll unsaved changes will be lost.", "Soundtrack Mod Generator", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); + if (result == JOptionPane.NO_OPTION) {return;} + } + parent.setEnabled(true); + frame.dispose(); + } else + if (actionEvent.getSource() == addSongBtn) {addSong();} else + if (actionEvent.getSource() == deleteSongBtn) {remove(curIndex);} else + if (actionEvent.getSource() == moveUpBtn) {moveUp(curIndex);} else + if (actionEvent.getSource() == moveDownBtn) {moveDown(curIndex);} else + if (actionEvent.getSource() == frontendMainChooseBtn) {setSPMusic();} else + if (actionEvent.getSource() == frontendDemoChooseBtn) {setMPMusic();} else + if (actionEvent.getSource() == saveBtn) { + if (tracklist.isEmpty() && sptrack == null && mptrack == null) { + JOptionPane.showMessageDialog(frame, "Please add at least one song to the playlist.", "Error", JOptionPane.ERROR_MESSAGE); + return; } else { - deets = tracklist.size() + " songs"; + String deets; + if (tracklist.isEmpty()) { + deets = "no songs"; + } else { + deets = tracklist.size() + " songs"; + } + if (sptrack != null && mptrack == null) { + deets = deets + " and a custom campaign menu track"; + } else if (mptrack != null && sptrack == null) { + deets = deets + " and a custom lobby menu track"; + } else if (mptrack != null && sptrack != null) { + deets = deets + ", a custom campaign menu track, and a custom lobby menu track"; + } + int result = JOptionPane.showConfirmDialog(frame, "Your custom playlist with " + deets + " will be generated.\nPress YES to continue, or NO to continue editing.", "Soundtrack Mod Generator", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (result == JOptionPane.YES_OPTION) { + save(); + } } - if (sptrack != null && mptrack == null) { - deets = deets + " and a custom campaign menu track"; - } else if (mptrack != null && sptrack == null) { - deets = deets + " and a custom lobby menu track"; - } else if (mptrack != null && sptrack != null) { - deets = deets + ", a custom campaign menu track, and a custom lobby menu track"; - } - int result = JOptionPane.showConfirmDialog(frame, "Your custom playlist with " + deets + " will be generated.\nPress YES to continue, or NO to continue editing.", "Soundtrack Mod Generator", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - if (result == JOptionPane.YES_OPTION) { - save(); - } - } - } else + } else if (actionEvent.getSource() == spDeleteBtn) { dSTitle.setText("no track"); dSSize.setText("no size"); @@ -220,40 +220,40 @@ public class Suggs implements ActionListener, ListSelectionListener { mptrack = null; mpDeleteBtn.setVisible(false); } - } + } - @Override - public void valueChanged(ListSelectionEvent listSelectionEvent) { + @Override + public void valueChanged(ListSelectionEvent listSelectionEvent) { fTitle.getDocument().removeDocumentListener(id3TagEditorHandler); fArtist.getDocument().removeDocumentListener(id3TagEditorHandler); - curIndex = dSongList.getSelectedIndex(); - if (curIndex >= 0) { - fTitle.setEnabled(true); - fArtist.setEnabled(true); - AudioTrack at = tracklist.get(curIndex); - fTitle.setText(at.title); - fArtist.setText(at.artist); - dTrackNo.setText(String.format("MT_%02d", curIndex+1)); - dFileSize.setText(at.size + " B"); - if (at.size > 1023) { - dFileSize.setText((at.size / 1024) + " KB"); + curIndex = dSongList.getSelectedIndex(); + if (curIndex >= 0) { + fTitle.setEnabled(true); + fArtist.setEnabled(true); + AudioTrack at = tracklist.get(curIndex); + fTitle.setText(at.title); + fArtist.setText(at.artist); + dTrackNo.setText(String.format("MT_%02d", curIndex+1)); + dFileSize.setText(at.size + " B"); + if (at.size > 1023) { + dFileSize.setText((at.size / 1024) + " KB"); + } + if (at.size > 1048575) { + dFileSize.setText((at.size / 1048576) + " MB"); + } + fTitle.getDocument().addDocumentListener(id3TagEditorHandler); + fArtist.getDocument().addDocumentListener(id3TagEditorHandler); + } else { + fTitle.setEnabled(false); + fArtist.setEnabled(false); + fTitle.setText(""); + fArtist.setText(""); + dTrackNo.setText("\u200E"); + dFileSize.setText("\u200E"); + fTitle.getDocument().addDocumentListener(id3TagEditorHandler); + fArtist.getDocument().addDocumentListener(id3TagEditorHandler); } - if (at.size > 1048575) { - dFileSize.setText((at.size / 1048576) + " MB"); - } - fTitle.getDocument().addDocumentListener(id3TagEditorHandler); - fArtist.getDocument().addDocumentListener(id3TagEditorHandler); - } else { - fTitle.setEnabled(false); - fArtist.setEnabled(false); - fTitle.setText(""); - fArtist.setText(""); - dTrackNo.setText("\u200E"); - dFileSize.setText("\u200E"); - fTitle.getDocument().addDocumentListener(id3TagEditorHandler); - fArtist.getDocument().addDocumentListener(id3TagEditorHandler); } - } private void updateSelectionToMatchTextFields() { tracklist.get(curIndex).title = fTitle.getText(); @@ -261,53 +261,57 @@ public class Suggs implements ActionListener, ListSelectionListener { InitializeSongListInGUI(); dSongList.setSelectedIndex(curIndex); } - - private void remove(int index) { - if (index >= 0) { - tracklist.remove(index); - InitializeSongListInGUI(); - } - } - - private void moveUp(int index) { - if (index > 0) { - Collections.swap(tracklist, index, index - 1); - InitializeSongListInGUI(); - } - } + + private void remove(int index) { + if (index >= 0) { + tracklist.remove(index); + InitializeSongListInGUI(); + } + } + + private void moveUp(int index) { + if (index > 0) { + Collections.swap(tracklist, index, index - 1); + InitializeSongListInGUI(); + } + } - private void moveDown(int index) { - if (index < (tracklist.size() - 1)) { - Collections.swap(tracklist, index, index + 1); - InitializeSongListInGUI(); - } - } - - private void InitializeSongListInGUI() { + private void moveDown(int index) { + if (index < (tracklist.size() - 1)) { + Collections.swap(tracklist, index, index + 1); + InitializeSongListInGUI(); + } + } + + private void InitializeSongListInGUI() { dSongList.removeListSelectionListener(this); // prevent weird bullshit - dSongList.clearSelection(); - dSongList.removeAll(); - dSongList.setVisibleRowCount(tracklist.size()); - dSongList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + dSongList.clearSelection(); + dSongList.removeAll(); + dSongList.setVisibleRowCount(tracklist.size()); + dSongList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - // add text entry for each - int i = 0; - String[] contents = new String[tracklist.size()]; - while (i < tracklist.size()) { + // add text entry for each + int i = 0; + String[] contents = new String[tracklist.size()]; + while (i < tracklist.size()) { String dTitleInList; // avoid editing the actual list String dArtistInList; // otherwise we cause weird JTextField behavior - if (tracklist.get(i).title == null || tracklist.get(i).title.isEmpty()) - {dTitleInList = tracklist.get(i).path.getName();} else {dTitleInList = tracklist.get(i).title;} - if (tracklist.get(i).artist == null || tracklist.get(i).artist.isEmpty()) - {dArtistInList = "Unknown Artist";} else {dArtistInList = tracklist.get(i).artist;} - contents[i] = dArtistInList + " - " + dTitleInList; + if (tracklist.get(i).title == null || tracklist.get(i).title.isEmpty()) + dTitleInList = tracklist.get(i).path.getName(); + else + dTitleInList = tracklist.get(i).title; + if (tracklist.get(i).artist == null || tracklist.get(i).artist.isEmpty()) + dArtistInList = "Unknown Artist"; + else + dArtistInList = tracklist.get(i).artist; + contents[i] = dArtistInList + " - " + dTitleInList; - i++; - } - dSongList.setListData(contents); + i++; + } + dSongList.setListData(contents); dSongList.setSelectedIndex(curIndex); dSongList.addListSelectionListener(this); - } + } private JFileChooser commonSoundFilePicker(boolean multiselect) { JFileChooser fileChooser = new JFileChooser(); @@ -324,14 +328,14 @@ public class Suggs implements ActionListener, ListSelectionListener { fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Sony ATRAC9", "at9")); return fileChooser; } - - private void setSPMusic() { + + private void setSPMusic() { JFileChooser fileChooser = commonSoundFilePicker(false); - int result = fileChooser.showOpenDialog(frame); + int result = fileChooser.showOpenDialog(frame); if (result == JFileChooser.APPROVE_OPTION) { - File selectedFile = fileChooser.getSelectedFile(); - sptrack = selectedFile; - dSTitle.setText(selectedFile.getName()); + File selectedFile = fileChooser.getSelectedFile(); + sptrack = selectedFile; + dSTitle.setText(selectedFile.getName()); dSSize.setText(selectedFile.length() + " B"); if (selectedFile.length() > 1023) { dSSize.setText((selectedFile.length() / 1024) + " KB"); @@ -340,267 +344,267 @@ public class Suggs implements ActionListener, ListSelectionListener { dSSize.setText((selectedFile.length() / 1048576) + " MB"); } spDeleteBtn.setVisible(true); - } - } - - private void setMPMusic() { + } + } + + private void setMPMusic() { JFileChooser fileChooser = commonSoundFilePicker(false); - int result = fileChooser.showOpenDialog(frame); - if (result == JFileChooser.APPROVE_OPTION) { - File selectedFile = fileChooser.getSelectedFile(); - mptrack = selectedFile; - dMTitle.setText(selectedFile.getName()); - dMSize.setText(selectedFile.length() + " B"); - if (selectedFile.length() > 1023) { - dMSize.setText((selectedFile.length() / 1024) + " KB"); - } - if (selectedFile.length() > 1048575) { - dMSize.setText((selectedFile.length() / 1048576) + " MB"); - } - mpDeleteBtn.setVisible(true); - } - } - - private void addSong() { - JFileChooser fileChooser = commonSoundFilePicker(true); - - int result = fileChooser.showOpenDialog(frame); - if (result == JFileChooser.APPROVE_OPTION) { - File[] selectedFiles = fileChooser.getSelectedFiles(); - for (File f : selectedFiles) { - if (f.exists()) { - System.out.println("Importing audio file \"" + f.getName() + "\""); - AudioTrack track = new AudioTrack(); - track.path = f; - String fname = f.getName(); - if (fname.contains(" - ")) { - track.title = fname.substring(fname.indexOf(" - ")+3, fname.lastIndexOf(".")); - track.artist = fname.substring(0, fname.indexOf(" - ")); - } else track.title = fname; - track.size = f.length(); - tracklist.add(track); - } - } - InitializeSongListInGUI(); - } - } - - private void save() { - frame.setEnabled(false); - frame.setAlwaysOnTop(false); - normalizeVolumes = checkNormalize.isSelected(); - Main.deleteDir(new File(System.getProperty("user.home") + "/.firestar/temp/")); // starts with clean temp - new Thread(() -> { - int progressSize = tracklist.size()+(sptrack != null?1:0)+(mptrack != null?1:0)+1; // Accounting for processes - - progressDialog = new Scooter(); - progressDialog.showDialog("Soundtrack Mod Generator"); - progressDialog.setText("Generating audio files..."); - progressDialog.setProgressMax(progressSize); - progressDialog.setProgressValue(0); - progressDialog.progressBar.setStringPainted(false); - - try { - new File(Main.inpath + "temp/data/audio/music").mkdirs(); - FileOutputStream fos = new FileOutputStream(new File(Main.inpath + "temp/fscript")); - PrintStream ps = new PrintStream(fos); - ps.println("fscript 1"); - ps.println("# AUTOGENERATED BY FIRESTAR"); - new File(Main.inpath + "temp/ffmpeg/").mkdirs(); - for (int i = 0; i < tracklist.size(); i++) { - AudioTrack at = tracklist.get(i); - String trackno = String.format("%02d", i+1); - String oTitle; - if (at.title == null) {oTitle = "";} else {oTitle = at.title;} - String oArtist; - if (at.artist == null) {oArtist = "";} else {oArtist = at.artist;} - new File(Main.inpath + "temp/data/audio/music/" + trackno).mkdirs(); - if (at.path.getName().endsWith(".at9")) { - progressDialog.setText("Copying track " + (i+1) + " out of " + tracklist.size() + "..."); - try { - // Assume whoever made the AT9s knows what they're doing - System.out.println("Copying track #" + (i+1) + " \"" + at.artist + " - " + at.title + "\"..."); - Files.copy(at.path.toPath(), Paths.get(Main.inpath + "temp/data/audio/music/" + trackno + "/music_stereo.at9"), StandardCopyOption.REPLACE_EXISTING); - } catch (IOException ex) { - Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); + int result = fileChooser.showOpenDialog(frame); + if (result == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + mptrack = selectedFile; + dMTitle.setText(selectedFile.getName()); + dMSize.setText(selectedFile.length() + " B"); + if (selectedFile.length() > 1023) { + dMSize.setText((selectedFile.length() / 1024) + " KB"); } - } else { - progressDialog.setText("Encoding track " + (i+1) + " out of " + tracklist.size() + "..."); - try { - System.out.println("Encoding track #" + (i+1) + " \"" + oArtist + " - " + oTitle + "\"..."); - if (!at.path.getName().endsWith(".wav") && !at.path.getName().endsWith(".wave")) { // convert to WAV first if it's not readable by at9tool yet - Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", at.path.getPath(), "ffmpeg/" + at.path.getName() + ".wav"}, Main.inpath + "temp/"); - p.waitFor(); - at.path = new File(Main.inpath + "temp/ffmpeg/" + at.path.getName() + ".wav"); + if (selectedFile.length() > 1048575) { + dMSize.setText((selectedFile.length() / 1048576) + " MB"); + } + mpDeleteBtn.setVisible(true); + } + } + + private void addSong() { + JFileChooser fileChooser = commonSoundFilePicker(true); + + int result = fileChooser.showOpenDialog(frame); + if (result == JFileChooser.APPROVE_OPTION) { + File[] selectedFiles = fileChooser.getSelectedFiles(); + for (File f : selectedFiles) { + if (f.exists()) { + System.out.println("Importing audio file \"" + f.getName() + "\""); + AudioTrack track = new AudioTrack(); + track.path = f; + String fname = f.getName(); + if (fname.contains(" - ")) { + track.title = fname.substring(fname.indexOf(" - ")+3, fname.lastIndexOf(".")); + track.artist = fname.substring(0, fname.indexOf(" - ")); + } else track.title = fname; + track.size = f.length(); + tracklist.add(track); } - if (normalizeVolumes) { // normalize tracks - Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", at.path.getPath(), "-filter", "loudnorm=linear=true:i=-5.0:lra=7.0:tp=0.0", /* force sample rate to prevent Random Stupid Bullshit™ */"-ar", "44100", "ffmpeg/" + at.path.getName() + "_normalized.wav"}, Main.inpath + "temp/"); - p.waitFor(); - at.path = new File(Main.inpath + "temp/ffmpeg/" + at.path.getName() + "_normalized.wav"); + } + InitializeSongListInGUI(); + } + } + + private void save() { + frame.setEnabled(false); + frame.setAlwaysOnTop(false); + normalizeVolumes = checkNormalize.isSelected(); + Main.deleteDir(new File(System.getProperty("user.home") + "/.firestar/temp/")); // starts with clean temp + new Thread(() -> { + int progressSize = tracklist.size()+(sptrack != null?1:0)+(mptrack != null?1:0)+1; // Accounting for processes + + progressDialog = new Scooter(); + progressDialog.showDialog("Soundtrack Mod Generator"); + progressDialog.setText("Generating audio files..."); + progressDialog.setProgressMax(progressSize); + progressDialog.setProgressValue(0); + progressDialog.progressBar.setStringPainted(false); + + try { + new File(Main.inpath + "temp/data/audio/music").mkdirs(); + FileOutputStream fos = new FileOutputStream(new File(Main.inpath + "temp/fscript")); + PrintStream ps = new PrintStream(fos); + ps.println("fscript 1"); + ps.println("# AUTOGENERATED BY FIRESTAR"); + new File(Main.inpath + "temp/ffmpeg/").mkdirs(); + for (int i = 0; i < tracklist.size(); i++) { + AudioTrack at = tracklist.get(i); + String trackno = String.format("%02d", i+1); + String oTitle; + if (at.title == null) {oTitle = "";} else {oTitle = at.title;} + String oArtist; + if (at.artist == null) {oArtist = "";} else {oArtist = at.artist;} + new File(Main.inpath + "temp/data/audio/music/" + trackno).mkdirs(); + if (at.path.getName().endsWith(".at9")) { + progressDialog.setText("Copying track " + (i+1) + " out of " + tracklist.size() + "..."); + try { + // Assume whoever made the AT9s knows what they're doing + System.out.println("Copying track #" + (i+1) + " \"" + at.artist + " - " + at.title + "\"..."); + Files.copy(at.path.toPath(), Paths.get(Main.inpath + "temp/data/audio/music/" + trackno + "/music_stereo.at9"), StandardCopyOption.REPLACE_EXISTING); + } catch (IOException ex) { + Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); } - Process p = Main.exec(new String[]{Main.inpath + "at9tool.exe", "-e", "-br", "144", at.path.getPath(), "data/audio/music/" + trackno + "/music_stereo.at9"}, Main.inpath + "temp/"); - p.waitFor(); - } catch (IOException | InterruptedException ex) { - Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); - } - } - String ocmd = "modify"; - if (i >= 12) ocmd = "create"; - String oArtistLine; - if (!oArtist.isEmpty()) { - oArtistLine = oArtist.replace("\"", "\\\"")+"\\n"; - } else { - oArtistLine = ""; - } - int i2 = 0; - while (i2 < 15 /*17 languages*/) { - String language = "INTERNAL_ERROR"; - switch (i2) { - case 0 -> language = "american"; - case 1 -> language = "danish"; - case 2 -> language = "dutch"; - case 3 -> language = "english"; - case 4 -> language = "finnish"; - case 5 -> language = "french"; - case 6 -> language = "german"; - case 7 -> language = "italian"; - case 8 -> language = "japanese"; - case 9 -> language = "norwegian"; - case 10 -> language = "polish"; - case 11 -> language = "portuguese"; - case 12 -> language = "russian"; - case 13 -> language = "spanish"; - case 14 -> language = "swedish"; - default -> { - int result = JOptionPane.showConfirmDialog(frame, "Firestar encountered an internal error.\nString 'language' exported to FSCRIPT was blank.", "Fatal Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); - if (result == JOptionPane.OK_OPTION) {System.exit(1);} //user safety + } else { + progressDialog.setText("Encoding track " + (i+1) + " out of " + tracklist.size() + "..."); + try { + System.out.println("Encoding track #" + (i+1) + " \"" + oArtist + " - " + oTitle + "\"..."); + if (!at.path.getName().endsWith(".wav") && !at.path.getName().endsWith(".wave")) { // convert to WAV first if it's not readable by at9tool yet + Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", at.path.getPath(), "ffmpeg/" + at.path.getName() + ".wav"}, Main.inpath + "temp/"); + p.waitFor(); + at.path = new File(Main.inpath + "temp/ffmpeg/" + at.path.getName() + ".wav"); } + if (normalizeVolumes) { // normalize tracks + Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", at.path.getPath(), "-filter", "loudnorm=linear=true:i=-5.0:lra=7.0:tp=0.0", /* force sample rate to prevent Random Stupid Bullshit™ */"-ar", "44100", "ffmpeg/" + at.path.getName() + "_normalized.wav"}, Main.inpath + "temp/"); + p.waitFor(); + at.path = new File(Main.inpath + "temp/ffmpeg/" + at.path.getName() + "_normalized.wav"); + } + Process p = Main.exec(new String[]{Main.inpath + "at9tool.exe", "-e", "-br", "144", at.path.getPath(), "data/audio/music/" + trackno + "/music_stereo.at9"}, Main.inpath + "temp/"); + p.waitFor(); + } catch (IOException | InterruptedException ex) { + Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); } - //case 9: language = "korean"; break; - //case 16: language = "traditionalchinese"; break; - ps.println("file \"data/plugins/languages/"+language+"/entries.xml\" xml "+ocmd+" StringTable.entry#MT_"+trackno+" set attribute \"string\" \""+oArtistLine+oTitle.replace("\"", "\\\"")+"\""); - i2++; + } + String ocmd = "modify"; + if (i >= 12) ocmd = "create"; + String oArtistLine; + if (!oArtist.isEmpty()) { + oArtistLine = oArtist.replace("\"", "\\\"")+"\\n"; + } else { + oArtistLine = ""; + } + int i2 = 0; + while (i2 < 15 /*17 languages*/) { + String language = "INTERNAL_ERROR"; + switch (i2) { + case 0 -> language = "american"; + case 1 -> language = "danish"; + case 2 -> language = "dutch"; + case 3 -> language = "english"; + case 4 -> language = "finnish"; + case 5 -> language = "french"; + case 6 -> language = "german"; + case 7 -> language = "italian"; + case 8 -> language = "japanese"; + case 9 -> language = "norwegian"; + case 10 -> language = "polish"; + case 11 -> language = "portuguese"; + case 12 -> language = "russian"; + case 13 -> language = "spanish"; + case 14 -> language = "swedish"; + default -> { + int result = JOptionPane.showConfirmDialog(frame, "Firestar encountered an internal error.\nString 'language' exported to FSCRIPT was blank.", "Fatal Error", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); + if (result == JOptionPane.OK_OPTION) {System.exit(1);} //user safety + } + } + //case 9: language = "korean"; break; + //case 16: language = "traditionalchinese"; break; + ps.println("file \"data/plugins/languages/"+language+"/entries.xml\" xml "+ocmd+" StringTable.entry#MT_"+trackno+" set attribute \"string\" \""+oArtistLine+oTitle.replace("\"", "\\\"")+"\""); + i2++; + } + ps.println("file \"data/audio/music/"+trackno+"/music_stereo.fft\" delete"); + progressDialog.setProgressValue(i+1); } - ps.println("file \"data/audio/music/"+trackno+"/music_stereo.fft\" delete"); - progressDialog.setProgressValue(i+1); - } - for (int s = tracklist.size(); s < 12; s++) { - ps.println("file \"data/audio/music/"+String.format("%02d", s+1)+"/music_stereo.fft\" delete"); - } - if (sptrack != null) { - progressDialog.setText("Encoding singleplayer frontend track..."); - if (sptrack.exists()) { + for (int s = tracklist.size(); s < 12; s++) { + ps.println("file \"data/audio/music/"+String.format("%02d", s+1)+"/music_stereo.fft\" delete"); + } + if (sptrack != null) { + progressDialog.setText("Encoding singleplayer frontend track..."); + if (sptrack.exists()) { + try { + System.out.println("Encoding singleplayer frontend track..."); + if (!sptrack.getName().endsWith(".wav") && !sptrack.getName().endsWith(".wave")) { // convert to WAV first if it's not readable by at9tool yet + Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", sptrack.getPath(), "ffmpeg/" + sptrack.getName() + ".wav"}, Main.inpath + "temp/"); + p.waitFor(); + sptrack = new File(Main.inpath + "temp/ffmpeg/" + sptrack.getName() + ".wav"); + } + if (normalizeVolumes) { // normalize tracks + Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", sptrack.getPath(), "-filter", "loudnorm=linear=true:i=-10.0:lra=12.0:tp=-2.0", /* force sample rate to prevent Random Stupid Bullshit™ */"-ar", "44100", "ffmpeg/" + sptrack.getName() + "_normalized.wav"}, Main.inpath + "temp/"); + p.waitFor(); + sptrack = new File(Main.inpath + "temp/ffmpeg/" + sptrack.getName() + "_normalized.wav"); + } + new File(Main.inpath + "temp/data/audio/music/FEMusic").mkdirs(); + Process p = Main.exec(new String[]{Main.inpath + "at9tool.exe", "-e", "-br", "144", sptrack.getPath(), "data/audio/music/FEMusic/frontend_stereo.at9"}, System.getProperty("user.home") + "/.firestar/temp/"); + p.waitFor(); + } catch (IOException | InterruptedException ex) { + Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); + } + } + ps.println("file \"data/audio/music/FEMusic/frontend_stereo.fft\" delete"); + progressDialog.setProgressValue(progressDialog.getProgressValue()+1); + } + if (mptrack != null) { + progressDialog.setText("Encoding multiplayer frontend track..."); + try { + assert(mptrack.exists()); + System.out.println("Encoding multiplayer frontend track..."); + if (!mptrack.getName().endsWith(".wav") && !mptrack.getName().endsWith(".wave")) { // convert to WAV first if it's not readable by at9tool yet + Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", mptrack.getPath(), "ffmpeg/" + mptrack.getName() + ".wav"}, Main.inpath + "temp/"); + p.waitFor(); + mptrack = new File(Main.inpath + "temp/ffmpeg/" + mptrack.getName() + ".wav"); + } + if (normalizeVolumes) { // normalize tracks + Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", mptrack.getPath(), "-filter", "loudnorm=linear=true:i=-10.0:lra=12.0:tp=-2.0", /* force sample rate to prevent Random Stupid Bullshit™ */"-ar", "44100", "ffmpeg/" + mptrack.getName() + "_normalized.wav"}, Main.inpath + "temp/"); + p.waitFor(); + mptrack = new File(Main.inpath + "temp/ffmpeg/" + mptrack.getName() + "_normalized.wav"); + } + new File(Main.inpath + "temp/data/audio/music/FEDemoMusic").mkdirs(); + Process p = Main.exec(new String[]{Main.inpath + "at9tool.exe", "-e", "-br", "144", mptrack.getPath(), "data/audio/music/FEDemoMusic/frontend_stereo.at9"}, System.getProperty("user.home") + "/.firestar/temp/"); + p.waitFor(); + } catch (IOException | InterruptedException ex) { + Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); + } + ps.println("file \"data/audio/music/FEDemoMusic/frontend_stereo.fft\" delete"); + progressDialog.setProgressValue(progressDialog.getProgressValue()+1); + } + System.out.println("Finished encoding."); + + progressDialog.setText("Generating Music Definitions..."); try { - System.out.println("Encoding singleplayer frontend track..."); - if (!sptrack.getName().endsWith(".wav") && !sptrack.getName().endsWith(".wave")) { // convert to WAV first if it's not readable by at9tool yet - Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", sptrack.getPath(), "ffmpeg/" + sptrack.getName() + ".wav"}, Main.inpath + "temp/"); - p.waitFor(); - sptrack = new File(Main.inpath + "temp/ffmpeg/" + sptrack.getName() + ".wav"); + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + + Document defDoc = docBuilder.newDocument(); + Element docScreen = defDoc.createElement("Screen"); + docScreen.setAttribute("name", "Top"); + for (int i = 0; i < tracklist.size(); i++) { // TODO: support for additive + AudioTrack at = tracklist.get(i); + String trackno = String.format("%02d", i+1); + + Element trackElem = defDoc.createElement("PI_Music"); + trackElem.setAttribute("name", trackno); + + Element pathElem = defDoc.createElement("Values"); + pathElem.setAttribute("location", "data\\audio\\music\\"+trackno); + trackElem.appendChild(pathElem); + + Element artistElem = defDoc.createElement("Entry"); + artistElem.setAttribute("Artist", at.artist); + trackElem.appendChild(artistElem); + + Element titleElem = defDoc.createElement("Entry"); + titleElem.setAttribute("Label", at.title); + trackElem.appendChild(titleElem); + + docScreen.appendChild(trackElem); + System.out.println("Adding \"" + trackno + ". " + at.artist + " - " + at.title + "\" to Definition.xml"); } - if (normalizeVolumes) { // normalize tracks - Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", sptrack.getPath(), "-filter", "loudnorm=linear=true:i=-10.0:lra=12.0:tp=-2.0", /* force sample rate to prevent Random Stupid Bullshit™ */"-ar", "44100", "ffmpeg/" + sptrack.getName() + "_normalized.wav"}, Main.inpath + "temp/"); - p.waitFor(); - sptrack = new File(Main.inpath + "temp/ffmpeg/" + sptrack.getName() + "_normalized.wav"); - } - new File(Main.inpath + "temp/data/audio/music/FEMusic").mkdirs(); - Process p = Main.exec(new String[]{Main.inpath + "at9tool.exe", "-e", "-br", "144", sptrack.getPath(), "data/audio/music/FEMusic/frontend_stereo.at9"}, System.getProperty("user.home") + "/.firestar/temp/"); - p.waitFor(); - } catch (IOException | InterruptedException ex) { - Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); + defDoc.appendChild(docScreen); + + new File(Main.inpath + "temp/data/plugins/music/").mkdirs(); + FileOutputStream output = new FileOutputStream(Main.inpath + "temp/data/plugins/music/Definition.xml"); + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + DOMSource source = new DOMSource(defDoc); + StreamResult result = new StreamResult(output); + + transformer.transform(source, result); + } catch (IOException | ParserConfigurationException | TransformerException ex) { + Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); } - } - ps.println("file \"data/audio/music/FEMusic/frontend_stereo.fft\" delete"); - progressDialog.setProgressValue(progressDialog.getProgressValue()+1); - } - if (mptrack != null) { - progressDialog.setText("Encoding multiplayer frontend track..."); - try { - assert(mptrack.exists()); - System.out.println("Encoding multiplayer frontend track..."); - if (!mptrack.getName().endsWith(".wav") && !mptrack.getName().endsWith(".wave")) { // convert to WAV first if it's not readable by at9tool yet - Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", mptrack.getPath(), "ffmpeg/" + mptrack.getName() + ".wav"}, Main.inpath + "temp/"); - p.waitFor(); - mptrack = new File(Main.inpath + "temp/ffmpeg/" + mptrack.getName() + ".wav"); - } - if (normalizeVolumes) { // normalize tracks - Process p = Main.exec(new String[]{Main.inpath + "ffmpeg.exe", "-y", "-i", mptrack.getPath(), "-filter", "loudnorm=linear=true:i=-10.0:lra=12.0:tp=-2.0", /* force sample rate to prevent Random Stupid Bullshit™ */"-ar", "44100", "ffmpeg/" + mptrack.getName() + "_normalized.wav"}, Main.inpath + "temp/"); - p.waitFor(); - mptrack = new File(Main.inpath + "temp/ffmpeg/" + mptrack.getName() + "_normalized.wav"); - } - new File(Main.inpath + "temp/data/audio/music/FEDemoMusic").mkdirs(); - Process p = Main.exec(new String[]{Main.inpath + "at9tool.exe", "-e", "-br", "144", mptrack.getPath(), "data/audio/music/FEDemoMusic/frontend_stereo.at9"}, System.getProperty("user.home") + "/.firestar/temp/"); - p.waitFor(); - } catch (IOException | InterruptedException ex) { + progressDialog.setProgressValue(progressDialog.getProgressValue()+1); + + progressDialog.setText("Finalizing script..."); + System.out.println("Finalizing Fscript..."); + ps.println("# END FIRESTAR AUTOGENERATION"); + ps.close(); + fos.close(); + } catch (IOException ex) { Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); - } - ps.println("file \"data/audio/music/FEDemoMusic/frontend_stereo.fft\" delete"); - progressDialog.setProgressValue(progressDialog.getProgressValue()+1); - } - System.out.println("Finished encoding."); + } - progressDialog.setText("Generating Music Definitions..."); - try { - DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + progressDialog.setProgressValue(progressDialog.getProgressValue()+1); - Document defDoc = docBuilder.newDocument(); - Element docScreen = defDoc.createElement("Screen"); - docScreen.setAttribute("name", "Top"); - for (int i = 0; i < tracklist.size(); i++) { // TODO: support for additive - AudioTrack at = tracklist.get(i); - String trackno = String.format("%02d", i+1); - - Element trackElem = defDoc.createElement("PI_Music"); - trackElem.setAttribute("name", trackno); - - Element pathElem = defDoc.createElement("Values"); - pathElem.setAttribute("location", "data\\audio\\music\\"+trackno); - trackElem.appendChild(pathElem); - - Element artistElem = defDoc.createElement("Entry"); - artistElem.setAttribute("Artist", at.artist); - trackElem.appendChild(artistElem); - - Element titleElem = defDoc.createElement("Entry"); - titleElem.setAttribute("Label", at.title); - trackElem.appendChild(titleElem); - - docScreen.appendChild(trackElem); - System.out.println("Adding \"" + trackno + ". " + at.artist + " - " + at.title + "\" to Definition.xml"); - } - defDoc.appendChild(docScreen); - - new File(Main.inpath + "temp/data/plugins/music/").mkdirs(); - FileOutputStream output = new FileOutputStream(Main.inpath + "temp/data/plugins/music/Definition.xml"); - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - DOMSource source = new DOMSource(defDoc); - StreamResult result = new StreamResult(output); - - transformer.transform(source, result); - } catch (IOException | ParserConfigurationException | TransformerException ex) { - Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); - } - progressDialog.setProgressValue(progressDialog.getProgressValue()+1); - - progressDialog.setText("Finalizing script..."); - System.out.println("Finalizing Fscript..."); - ps.println("# END FIRESTAR AUTOGENERATION"); - ps.close(); - fos.close(); - } catch (IOException ex) { - Logger.getLogger(Suggs.class.getName()).log(Level.SEVERE, null, ex); - } - - progressDialog.setProgressValue(progressDialog.getProgressValue()+1); - - progressDialog.destroyDialog(); - frame.dispose(); - Main.deleteDir(new File(Main.inpath + "temp/ffmpeg/")); - Clifford saveDialog = new Clifford(); - saveDialog.isSoundtrack = true; - saveDialog.Action(frame, new File(Main.inpath + "temp/")); - parent.setEnabled(true); - }).start(); - } + progressDialog.destroyDialog(); + frame.dispose(); + Main.deleteDir(new File(Main.inpath + "temp/ffmpeg/")); + Clifford saveDialog = new Clifford(); + saveDialog.isSoundtrack = true; + saveDialog.Action(frame, new File(Main.inpath + "temp/")); + parent.setEnabled(true); + }).start(); + } } diff --git a/firestar/src/main/java/Waldorf.java b/firestar/src/main/java/Waldorf.java index b93a4af..318f03d 100644 --- a/firestar/src/main/java/Waldorf.java +++ b/firestar/src/main/java/Waldorf.java @@ -28,128 +28,128 @@ import java.io.IOException; import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE; public class Waldorf implements ActionListener { - private JFrame frame = new JFrame(); - private JPanel frameContainer; - private JButton okbtn; - private JButton cancelbtn; - private JLabel fOutpath; - private JButton resetbtn; - private JButton bOpenFolder; - private JButton dwnSDKbtn; - private JButton dwnARCbtn; - private JButton fOutpathChangebtn; - private JCheckBox checkUpdatesToggle; - private JButton bDelArcs; + private JFrame frame = new JFrame(); + private JPanel frameContainer; + private JButton okbtn; + private JButton cancelbtn; + private JLabel fOutpath; + private JButton resetbtn; + private JButton bOpenFolder; + private JButton dwnSDKbtn; + private JButton dwnARCbtn; + private JButton fOutpathChangebtn; + private JCheckBox checkUpdatesToggle; + private JButton bDelArcs; - MissPiggy invoker; - private String tOutPath = Main.outpath; + MissPiggy invoker; + private String tOutPath = Main.outpath; - public void Action(MissPiggy inv) { - invoker = inv; + public void Action(MissPiggy inv) { + invoker = inv; - frame.add(frameContainer); - frame.setIconImage(Main.windowIcon); - frame.setSize(600, 300); // 1280 800 - frame.setMinimumSize(new Dimension(200,100)); - frame.setTitle("Options"); - frame.setResizable(false); - frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(inv.frame); - frame.setAlwaysOnTop(true); + frame.add(frameContainer); + frame.setIconImage(Main.windowIcon); + frame.setSize(600, 300); // 1280 800 + frame.setMinimumSize(new Dimension(200,100)); + frame.setTitle("Options"); + frame.setResizable(false); + frame.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(inv.frame); + frame.setAlwaysOnTop(true); - cancelbtn.addActionListener(this); - okbtn.addActionListener(this); - resetbtn.addActionListener(this); - bOpenFolder.addActionListener(this); - bDelArcs.addActionListener(this); - dwnARCbtn.addActionListener(this); - dwnSDKbtn.addActionListener(this); - fOutpathChangebtn.addActionListener(this); + cancelbtn.addActionListener(this); + okbtn.addActionListener(this); + resetbtn.addActionListener(this); + bOpenFolder.addActionListener(this); + bDelArcs.addActionListener(this); + dwnARCbtn.addActionListener(this); + dwnSDKbtn.addActionListener(this); + fOutpathChangebtn.addActionListener(this); - fOutpath.setText(Main.outpath); - checkUpdatesToggle.setSelected(Main.checkUpdates); + fOutpath.setText(Main.outpath); + checkUpdatesToggle.setSelected(Main.checkUpdates); - frame.setVisible(true); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) - { - invoker.frame.setEnabled(true); - e.getWindow().dispose(); - } - }); - } + frame.setVisible(true); + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) + { + invoker.frame.setEnabled(true); + e.getWindow().dispose(); + } + }); + } - @Override - public void actionPerformed(ActionEvent actionEvent) { - if (actionEvent.getSource() == cancelbtn) { - invoker.frame.setEnabled(true); - frame.dispose(); - } else - if (actionEvent.getSource() == okbtn) { - Main.outpath = tOutPath; - Main.checkUpdates = checkUpdatesToggle.isSelected(); - Main.writeConf(); - Main.loadConf(); + @Override + public void actionPerformed(ActionEvent actionEvent) { + if (actionEvent.getSource() == cancelbtn) { + invoker.frame.setEnabled(true); + frame.dispose(); + } else + if (actionEvent.getSource() == okbtn) { + Main.outpath = tOutPath; + Main.checkUpdates = checkUpdatesToggle.isSelected(); + Main.writeConf(); + Main.loadConf(); - invoker.frame.setEnabled(true); - frame.dispose(); - } else - if (actionEvent.getSource() == resetbtn) { - int result = JOptionPane.showConfirmDialog(frame,"Are you sure you want to redo the initial setup?", "Restore Default Settings", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); - if (result == JOptionPane.YES_OPTION) { - System.out.println("Restoring default settings"); - new File(System.getProperty("user.home") + "/.firestar/firestar.conf").delete(); - int result2 = JOptionPane.showConfirmDialog(frame,"Firestar will now close.", "Restore Default Settings", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE); - if (result2 == JOptionPane.OK_OPTION) { - System.exit(0); - } - } - } else - if (actionEvent.getSource() == bOpenFolder) { - try { - Desktop.getDesktop().open(new File(Main.inpath)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } else - if (actionEvent.getSource() == bDelArcs) { - int result = JOptionPane.showConfirmDialog(frame, "All existing PSARC dumps will be deleted.\nDo you want to continue?", "Delete PSARCs", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); - if (result == JOptionPane.NO_OPTION) {return;} - System.out.println("User requested arc wipe, deleting existing PSARCs"); - new File(Main.inpath + "data.psarc").delete(); - new File(Main.inpath + "data1.psarc").delete(); - new File(Main.inpath + "data2.psarc").delete(); - new File(Main.inpath + "dlc1.psarc").delete(); - new File(Main.inpath + "dlc2.psarc").delete(); - JOptionPane.showMessageDialog(frame, "PSARC files purged.", "Delete PSARCs", JOptionPane.INFORMATION_MESSAGE); - } else - if (actionEvent.getSource() == dwnARCbtn) { - new Bert(invoker.frame); - frame.dispose(); - } else - if (actionEvent.getSource() == dwnSDKbtn) { - Thread downloaderPopupThread = new Thread(new Runnable() { - @Override - public void run() { - Main.downloadDependenciesBeforeSetVisible(invoker.frame); - invoker.frame.setEnabled(true); - } - }); - downloaderPopupThread.start(); - frame.dispose(); - } else - if (actionEvent.getSource() == fOutpathChangebtn) { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - int result = fileChooser.showOpenDialog(frame); - if (result == JFileChooser.APPROVE_OPTION) { - if (fileChooser.getSelectedFile().isDirectory()) { - tOutPath = fileChooser.getSelectedFile().getAbsolutePath()+"/"; - fOutpath.setText(tOutPath); - } - } - } - } + invoker.frame.setEnabled(true); + frame.dispose(); + } else + if (actionEvent.getSource() == resetbtn) { + int result = JOptionPane.showConfirmDialog(frame,"Are you sure you want to redo the initial setup?", "Restore Default Settings", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); + if (result == JOptionPane.YES_OPTION) { + System.out.println("Restoring default settings"); + new File(System.getProperty("user.home") + "/.firestar/firestar.conf").delete(); + int result2 = JOptionPane.showConfirmDialog(frame,"Firestar will now close.", "Restore Default Settings", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE); + if (result2 == JOptionPane.OK_OPTION) { + System.exit(0); + } + } + } else + if (actionEvent.getSource() == bOpenFolder) { + try { + Desktop.getDesktop().open(new File(Main.inpath)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } else + if (actionEvent.getSource() == bDelArcs) { + int result = JOptionPane.showConfirmDialog(frame, "All existing PSARC dumps will be deleted.\nDo you want to continue?", "Delete PSARCs", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); + if (result == JOptionPane.NO_OPTION) {return;} + System.out.println("User requested arc wipe, deleting existing PSARCs"); + new File(Main.inpath + "data.psarc").delete(); + new File(Main.inpath + "data1.psarc").delete(); + new File(Main.inpath + "data2.psarc").delete(); + new File(Main.inpath + "dlc1.psarc").delete(); + new File(Main.inpath + "dlc2.psarc").delete(); + JOptionPane.showMessageDialog(frame, "PSARC files purged.", "Delete PSARCs", JOptionPane.INFORMATION_MESSAGE); + } else + if (actionEvent.getSource() == dwnARCbtn) { + new Bert(invoker.frame); + frame.dispose(); + } else + if (actionEvent.getSource() == dwnSDKbtn) { + Thread downloaderPopupThread = new Thread(new Runnable() { + @Override + public void run() { + Main.downloadDependenciesBeforeSetVisible(invoker.frame); + invoker.frame.setEnabled(true); + } + }); + downloaderPopupThread.start(); + frame.dispose(); + } else + if (actionEvent.getSource() == fOutpathChangebtn) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int result = fileChooser.showOpenDialog(frame); + if (result == JFileChooser.APPROVE_OPTION) { + if (fileChooser.getSelectedFile().isDirectory()) { + tOutPath = fileChooser.getSelectedFile().getAbsolutePath()+"/"; + fOutpath.setText(tOutPath); + } + } + } + } } diff --git a/firestar/src/main/java/WilkinsCoffee.java b/firestar/src/main/java/WilkinsCoffee.java index 1893696..a2bba56 100644 --- a/firestar/src/main/java/WilkinsCoffee.java +++ b/firestar/src/main/java/WilkinsCoffee.java @@ -31,176 +31,176 @@ import java.nio.file.Files; import static javax.swing.WindowConstants.EXIT_ON_CLOSE; public class WilkinsCoffee implements ActionListener { - Image logo; - public Pages page; - public JFrame frame = new JFrame(); - private JPanel frameContainer; - private JLabel picLabel; - private JEditorPane instructions; - private JButton contBtn; - private JPanel inputContainer; - private JButton PSARC_downBtn; - private JButton PSARC_impBtn; - private JPanel inputContainer2; - private JButton EXPORT_openFolderBtn; - private JLabel pathDisplay; - private JPanel checklistContainer; - private JLabel checklistFury; - private JLabel checklistHD; - private JLabel checklistPatch2; - private JLabel checklistPatch1; - private JLabel checklistBase; + Image logo; + public Pages page; + public JFrame frame = new JFrame(); + private JPanel frameContainer; + private JLabel picLabel; + private JEditorPane instructions; + private JButton contBtn; + private JPanel inputContainer; + private JButton PSARC_downBtn; + private JButton PSARC_impBtn; + private JPanel inputContainer2; + private JButton EXPORT_openFolderBtn; + private JLabel pathDisplay; + private JPanel checklistContainer; + private JLabel checklistFury; + private JLabel checklistHD; + private JLabel checklistPatch2; + private JLabel checklistPatch1; + private JLabel checklistBase; - public enum Pages { - INTRO(0), - PSARC(1), - EXPORT_LOCATION(2), - DONE(3); + public enum Pages { + INTRO(0), + PSARC(1), + EXPORT_LOCATION(2), + DONE(3); - public final int value; + public final int value; - private Pages(int i) { - this.value = i; - } - } + private Pages(int i) { + this.value = i; + } + } - private String outPathTemp = System.getProperty("user.home") + "/Documents/"; - private boolean sdkInstalled = false; + private String outPathTemp = System.getProperty("user.home") + "/Documents/"; + private boolean sdkInstalled = false; - public void setup() { - page = Pages.INTRO; - inputContainer.setVisible(false); - checklistContainer.setVisible(false); - inputContainer2.setVisible(false); + public void setup() { + page = Pages.INTRO; + inputContainer.setVisible(false); + checklistContainer.setVisible(false); + inputContainer2.setVisible(false); - // check if this is windows or not - if(System.getProperty("os.name").contains("Windows")) {Main.windows = true;System.out.println("Assuming we should NOT use WINE based on known system variables.");} - else {Main.windows = false;System.out.println("Assuming we should use WINE based on known system variables.");} + // check if this is windows or not + if(System.getProperty("os.name").contains("Windows")) {Main.windows = true;System.out.println("Assuming we should NOT use WINE based on known system variables.");} + else {Main.windows = false;System.out.println("Assuming we should use WINE based on known system variables.");} - // reformat path slightly for windows - if (Main.windows) {outPathTemp.replace("/", "\\");} + // reformat path slightly for windows + if (Main.windows) {outPathTemp.replace("/", "\\");} - frame.setIconImage(Main.windowIcon); - try { - logo = ImageIO.read(Main.class.getResourceAsStream("/programIcon.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); - picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); - } catch (IOException e) { - System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); - picLabel.setText(""); - } + frame.setIconImage(Main.windowIcon); + try { + logo = ImageIO.read(Main.class.getResourceAsStream("/programIcon.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); + picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); + } catch (IOException e) { + System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); + picLabel.setText(""); + } - String bodyRule = "html, body {margin:0px;} p#first-p {margin-top:-13px;} p {margin-left:-20px;}"; - ((HTMLDocument)instructions.getDocument()).getStyleSheet().addRule(bodyRule); - instructions.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); // makes text smaller than joe biden's windmill if font set manually. wtf?? - contBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - PSARC_downBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - PSARC_impBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - EXPORT_openFolderBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + String bodyRule = "html, body {margin:0px;} p#first-p {margin-top:-13px;} p {margin-left:-20px;}"; + ((HTMLDocument)instructions.getDocument()).getStyleSheet().addRule(bodyRule); + instructions.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); // makes text smaller than joe biden's windmill if font set manually. wtf?? + contBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + PSARC_downBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + PSARC_impBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); + EXPORT_openFolderBtn.setFont(Main.fExo2.deriveFont(Font.BOLD).deriveFont(12f)); - frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA + frame.add(frameContainer); // initialize window contents -- will be handled by IntelliJ IDEA - contBtn.addActionListener(this); - PSARC_downBtn.addActionListener(this); - PSARC_impBtn.addActionListener(this); - EXPORT_openFolderBtn.addActionListener(this); + contBtn.addActionListener(this); + PSARC_downBtn.addActionListener(this); + PSARC_impBtn.addActionListener(this); + EXPORT_openFolderBtn.addActionListener(this); - frame.setSize(400, 400); - frame.setTitle("Firestar Setup"); - frame.setResizable(false); - frame.setDefaultCloseOperation(EXIT_ON_CLOSE); - frame.setLayout(new GridLayout()); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - } + frame.setSize(400, 400); + frame.setTitle("Firestar Setup"); + frame.setResizable(false); + frame.setDefaultCloseOperation(EXIT_ON_CLOSE); + frame.setLayout(new GridLayout()); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } - @Override - public void actionPerformed(ActionEvent actionEvent) { - WilkinsCoffee threadParent = this; - if (actionEvent.getSource() == PSARC_downBtn) { - Thread waiterThread = new Thread(new Runnable() {@Override - public void run() { - if (new Bert(frame).reportWhenDownloaded(threadParent)) { - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange + @Override + public void actionPerformed(ActionEvent actionEvent) { + WilkinsCoffee threadParent = this; + if (actionEvent.getSource() == PSARC_downBtn) { + Thread waiterThread = new Thread(new Runnable() {@Override + public void run() { + if (new Bert(frame).reportWhenDownloaded(threadParent)) { + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange - refreshChecklist(); - } - }}); - waiterThread.start(); - } else - if (actionEvent.getSource() == PSARC_impBtn) { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - FileFilter fileChooserFilter = new FileNameExtensionFilter("Sony Playstation Archive File", "psarc"); - fileChooser.setFileFilter(fileChooserFilter); - int result = fileChooser.showOpenDialog(frame); - if (result == JFileChooser.APPROVE_OPTION) { - try { - Files.copy(fileChooser.getSelectedFile().toPath(), new File(Main.inpath + fileChooser.getSelectedFile().getName()).toPath()); - refreshChecklist(); - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange - } catch (IOException e) { - System.out.println(e.getMessage()); - JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - } - } else - if (actionEvent.getSource() == EXPORT_openFolderBtn) { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - int result = fileChooser.showOpenDialog(frame); - if (result == JFileChooser.APPROVE_OPTION) { - if (fileChooser.getSelectedFile().isDirectory()) { - outPathTemp = fileChooser.getSelectedFile().getAbsolutePath()+"/"; - pathDisplay.setText("Export path: " + outPathTemp); - } - } - } else - if (actionEvent.getSource() == contBtn) { - switch (page) { - case INTRO: - if (!new File(Main.inpath + "psp2psarc.exe").exists()) { // we may have been here before // nag - frame.setEnabled(false); - int result = JOptionPane.showConfirmDialog(frame, "Firestar needs to download additional software to function. Setup is automatic and will only take a few minutes.\nIf you select NO, you will have to download additional dependencies later on.\n\nContinue?", "Firestar Setup", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - if (result == JOptionPane.YES_OPTION) { - sdkInstalled = true; - Thread downloaderPopupThread = new Thread(new Runnable() { - @Override - public void run() { - Main.downloadDependenciesBeforeSetVisible(frame); - frame.setEnabled(true); - } - }); - downloaderPopupThread.start(); - } else { - frame.setEnabled(true); - } - } else { - sdkInstalled = true; - } + refreshChecklist(); + } + }}); + waiterThread.start(); + } else + if (actionEvent.getSource() == PSARC_impBtn) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + FileFilter fileChooserFilter = new FileNameExtensionFilter("Sony Playstation Archive File", "psarc"); + fileChooser.setFileFilter(fileChooserFilter); + int result = fileChooser.showOpenDialog(frame); + if (result == JFileChooser.APPROVE_OPTION) { + try { + Files.copy(fileChooser.getSelectedFile().toPath(), new File(Main.inpath + fileChooser.getSelectedFile().getName()).toPath()); + refreshChecklist(); + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange + } catch (IOException e) { + System.out.println(e.getMessage()); + JOptionPane.showMessageDialog(frame, "An error has occured.\n" + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + } + } else + if (actionEvent.getSource() == EXPORT_openFolderBtn) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int result = fileChooser.showOpenDialog(frame); + if (result == JFileChooser.APPROVE_OPTION) { + if (fileChooser.getSelectedFile().isDirectory()) { + outPathTemp = fileChooser.getSelectedFile().getAbsolutePath()+"/"; + pathDisplay.setText("Export path: " + outPathTemp); + } + } + } else + if (actionEvent.getSource() == contBtn) { + switch (page) { + case INTRO: + if (!new File(Main.inpath + "psp2psarc.exe").exists()) { // we may have been here before // nag + frame.setEnabled(false); + int result = JOptionPane.showConfirmDialog(frame, "Firestar needs to download additional software to function. Setup is automatic and will only take a few minutes.\nIf you select NO, you will have to download additional dependencies later on.\n\nContinue?", "Firestar Setup", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + if (result == JOptionPane.YES_OPTION) { + sdkInstalled = true; + Thread downloaderPopupThread = new Thread(new Runnable() { + @Override + public void run() { + Main.downloadDependenciesBeforeSetVisible(frame); + frame.setEnabled(true); + } + }); + downloaderPopupThread.start(); + } else { + frame.setEnabled(true); + } + } else { + sdkInstalled = true; + } - page = Pages.PSARC; - try { - logo = ImageIO.read(Main.class.getResourceAsStream("/setupIconPSARC.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); - picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); - } catch (IOException e) { - System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); - picLabel.setText(""); - } + page = Pages.PSARC; + try { + logo = ImageIO.read(Main.class.getResourceAsStream("/setupIconPSARC.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); + picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); + } catch (IOException e) { + System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); + picLabel.setText(""); + } - contBtn.setEnabled(false); - contBtn.setBackground(new Color(102, 74, 58)); //brown - refreshChecklist(); - inputContainer.setVisible(true); - checklistContainer.setVisible(true); - if (!sdkInstalled) { - PSARC_downBtn.setEnabled(false); - PSARC_downBtn.setBackground(new Color(102, 74, 58)); //brown - } + contBtn.setEnabled(false); + contBtn.setBackground(new Color(102, 74, 58)); //brown + refreshChecklist(); + inputContainer.setVisible(true); + checklistContainer.setVisible(true); + if (!sdkInstalled) { + PSARC_downBtn.setEnabled(false); + PSARC_downBtn.setBackground(new Color(102, 74, 58)); //brown + } - instructions.setText("\n" + - " \n" + + instructions.setText("\n" + + " \n" + " \n" + " \n" + " \n" + @@ -213,24 +213,24 @@ public class WilkinsCoffee implements ActionListener { " \n" + "\n"); - break; - case PSARC: - page = Pages.EXPORT_LOCATION; - try { - logo = ImageIO.read(Main.class.getResourceAsStream("/setupIconEXPORT.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); - picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); - } catch (IOException e) { - System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); - picLabel.setText(""); - } - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange - inputContainer.setVisible(false); - checklistContainer.setVisible(false); - inputContainer2.setVisible(true); + break; + case PSARC: + page = Pages.EXPORT_LOCATION; + try { + logo = ImageIO.read(Main.class.getResourceAsStream("/setupIconEXPORT.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); + picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); + } catch (IOException e) { + System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); + picLabel.setText(""); + } + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange + inputContainer.setVisible(false); + checklistContainer.setVisible(false); + inputContainer2.setVisible(true); - instructions.setText("\n" + - " \n" + + instructions.setText("\n" + + " \n" + " \n" + " \n" + " \n" + @@ -243,25 +243,25 @@ public class WilkinsCoffee implements ActionListener { " \n" + "\n"); - pathDisplay.setText("Export path: " + outPathTemp); + pathDisplay.setText("Export path: " + outPathTemp); - break; - case EXPORT_LOCATION: - page = Pages.DONE; - try { - logo = ImageIO.read(Main.class.getResourceAsStream("/setupIconDONE.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); - picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); - } catch (IOException e) { - System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); - picLabel.setText(""); - } - inputContainer2.setVisible(false); - Main.outpath = outPathTemp; - Main.repatch = true; - Main.writeConf(); + break; + case EXPORT_LOCATION: + page = Pages.DONE; + try { + logo = ImageIO.read(Main.class.getResourceAsStream("/setupIconDONE.png")).getScaledInstance(96, 96, Image.SCALE_SMOOTH); + picLabel.setIcon(new ImageIcon(logo));picLabel.setText(""); + } catch (IOException e) { + System.out.println("ERROR: Missing resource in Wilkins. Page will be without images."); + picLabel.setText(""); + } + inputContainer2.setVisible(false); + Main.outpath = outPathTemp; + Main.repatch = true; + Main.writeConf(); - instructions.setText("\n" + - " \n" + + instructions.setText("\n" + + " \n" + " \n" + " \n" + " \n" + @@ -271,48 +271,48 @@ public class WilkinsCoffee implements ActionListener { " \n" + "\n"); - break; - case DONE: - frame.dispose(); - new MissPiggy().Action(); - break; - default: - throw new UnsupportedOperationException("ERROR: Setup page-flip event listener didn't drink any Wilkins Coffee. Get a programmer!"); - } - } - } + break; + case DONE: + frame.dispose(); + new MissPiggy().Action(); + break; + default: + throw new UnsupportedOperationException("ERROR: Setup page-flip event listener didn't drink any Wilkins Coffee. Get a programmer!"); + } + } + } - private void refreshChecklist() { - ImageIcon positive = new ImageIcon(Main.class.getResource("/lightPositive.png")); - ImageIcon negative = new ImageIcon(Main.class.getResource("/lightNegative.png")); + private void refreshChecklist() { + ImageIcon positive = new ImageIcon(Main.class.getResource("/lightPositive.png")); + ImageIcon negative = new ImageIcon(Main.class.getResource("/lightNegative.png")); - // enabling the continue button here leaves the previous one redundant, - // but it's needed to ensure we don't force a redownload if the setup is interrupted + // enabling the continue button here leaves the previous one redundant, + // but it's needed to ensure we don't force a redownload if the setup is interrupted - if(new File(Main.inpath + "data.psarc").exists()) { - checklistBase.setIcon(positive); - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange - } else {checklistBase.setIcon(negative);} - if(new File(Main.inpath + "data1.psarc").exists()) { - checklistPatch1.setIcon(positive); - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange - } else {checklistPatch1.setIcon(negative);} - if(new File(Main.inpath + "data2.psarc").exists()) { - checklistPatch2.setIcon(positive); - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange - } else {checklistPatch2.setIcon(negative);} - if(new File(Main.inpath + "dlc1.psarc").exists()) { - checklistHD.setIcon(positive); - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange - } else {checklistHD.setIcon(negative);} - if(new File(Main.inpath + "dlc2.psarc").exists()) { - checklistFury.setIcon(positive); - contBtn.setEnabled(true); - contBtn.setBackground(new Color(221, 88, 11)); //orange - } else {checklistFury.setIcon(negative);} - } + if(new File(Main.inpath + "data.psarc").exists()) { + checklistBase.setIcon(positive); + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange + } else {checklistBase.setIcon(negative);} + if(new File(Main.inpath + "data1.psarc").exists()) { + checklistPatch1.setIcon(positive); + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange + } else {checklistPatch1.setIcon(negative);} + if(new File(Main.inpath + "data2.psarc").exists()) { + checklistPatch2.setIcon(positive); + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange + } else {checklistPatch2.setIcon(negative);} + if(new File(Main.inpath + "dlc1.psarc").exists()) { + checklistHD.setIcon(positive); + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange + } else {checklistHD.setIcon(negative);} + if(new File(Main.inpath + "dlc2.psarc").exists()) { + checklistFury.setIcon(positive); + contBtn.setEnabled(true); + contBtn.setBackground(new Color(221, 88, 11)); //orange + } else {checklistFury.setIcon(negative);} + } }