diff --git a/.classpath b/.classpath
index 5f705dd..95e5a7c 100644
--- a/.classpath
+++ b/.classpath
@@ -1,8 +1,13 @@
-
+
+
+
+
+
+
diff --git a/bin/goblincave/gitea/nes/AudioExtractor$1.class b/bin/goblincave/gitea/nes/AudioExtractor$1.class
index f007380..b028e08 100644
Binary files a/bin/goblincave/gitea/nes/AudioExtractor$1.class and b/bin/goblincave/gitea/nes/AudioExtractor$1.class differ
diff --git a/bin/goblincave/gitea/nes/AudioExtractor$2.class b/bin/goblincave/gitea/nes/AudioExtractor$2.class
index d5456f9..a5bab2e 100644
Binary files a/bin/goblincave/gitea/nes/AudioExtractor$2.class and b/bin/goblincave/gitea/nes/AudioExtractor$2.class differ
diff --git a/bin/goblincave/gitea/nes/AudioExtractor$3.class b/bin/goblincave/gitea/nes/AudioExtractor$3.class
new file mode 100644
index 0000000..e17ad79
Binary files /dev/null and b/bin/goblincave/gitea/nes/AudioExtractor$3.class differ
diff --git a/bin/goblincave/gitea/nes/AudioExtractor$4.class b/bin/goblincave/gitea/nes/AudioExtractor$4.class
new file mode 100644
index 0000000..3c5f2fa
Binary files /dev/null and b/bin/goblincave/gitea/nes/AudioExtractor$4.class differ
diff --git a/bin/goblincave/gitea/nes/AudioExtractor.class b/bin/goblincave/gitea/nes/AudioExtractor.class
index a37d8fb..fbc439e 100644
Binary files a/bin/goblincave/gitea/nes/AudioExtractor.class and b/bin/goblincave/gitea/nes/AudioExtractor.class differ
diff --git a/src/goblincave/gitea/nes/AudioExtractor.java b/src/goblincave/gitea/nes/AudioExtractor.java
index 5bba95d..a64aada 100644
--- a/src/goblincave/gitea/nes/AudioExtractor.java
+++ b/src/goblincave/gitea/nes/AudioExtractor.java
@@ -1,11 +1,13 @@
package goblincave.gitea.nes;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
+import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.net.URISyntaxException;
import java.nio.file.Files;
@@ -13,9 +15,12 @@ import java.nio.file.Path;
import java.util.LinkedHashMap;
import java.util.Set;
+import javaFlacEncoder.FLAC_FileEncoder;
+
import org.apache.commons.io.FilenameUtils;
-import javaFlacEncoder.*;
+import com.diogonunes.jcolor.Ansi;
+import com.diogonunes.jcolor.Attribute;
/**
* Ridge Racer 6 Audio Extractor
@@ -24,6 +29,13 @@ import javaFlacEncoder.*;
*/
public class AudioExtractor {
+ /**
+ * ANSI code to go up one line, followed by a carriage return.
+ * Useful for overwriting user input
+ */
+ private final static String RETURN_UP = "\033[F\r";
+ private final static String PALE_YELLOW = "\u001B[93m";
+
/**
* BIN files must first be extracted from game disk to use this program.
* By default uses program directory for I/O and saves audio as WAV.
@@ -40,6 +52,154 @@ public class AudioExtractor {
*/
public static void main(String[] args) throws URISyntaxException {
+ System.out.println(Ansi.colorize(logoFormat("Ridge Racer 6"), Attribute.BRIGHT_RED_TEXT()));
+ System.out.println(Ansi.colorize(logoFormat("Audio Extractor", true, 8), Attribute.YELLOW_TEXT()));
+ System.out.println("Program:\tRidge Racer 6 Audio Extractor " + Ansi.colorize("v1.0", Attribute.BRIGHT_GREEN_TEXT()) + " by " + Ansi.colorize("Nes", Attribute.TEXT_COLOR(252, 42, 124)));
+ System.out.println("Repository:\t" + Ansi.colorize("https://gitea.goblincave.synology.me/Nes/RR6AudioExtractor", Attribute.CYAN_TEXT()));
+
+ if(args.length > 0) {
+ System.out.println("Arguments\t:");
+ for(int i = 0; i < args.length; i++)
+ System.out.print(Ansi.colorize(args[i] + ' ', Attribute.BRIGHT_GREEN_TEXT()));
+ }
+
+ if(args.length == 0) { // no arguments provided
+
+ // determine which operation to execute
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+ String prompt = "\n" + Ansi.colorize("Operations", Attribute.BRIGHT_YELLOW_TEXT(), Attribute.BOLD()) + ":\n"
+ + "- " + Ansi.colorize("Extract", Attribute.BRIGHT_RED_TEXT()) + " audio tracks from package\n"
+ + "- " + Ansi.colorize("Package", Attribute.YELLOW_TEXT()) + " audio tracks into package\n"
+ + "- " + Ansi.colorize("Patch", Attribute.BRIGHT_GREEN_TEXT()) + " audio track to loop indefinitely\n"
+ + "- " + Ansi.colorize("Print", Attribute.BRIGHT_BLUE_TEXT()) + " Ridge Racer 6 logo style ASCII text\n"
+ + "- " + Ansi.colorize("Exit", Attribute.BRIGHT_MAGENTA_TEXT()) + " program\n"
+ + "\nPlease select an operation:" + PALE_YELLOW + " ";
+ String input;
+ {
+ String[] values = {"extract", "package", "patch", "print", "exit"};
+ input = retrieveInput(reader, prompt, values);
+ }
+
+ int operation = -1;
+ switch(input.toLowerCase()) {
+ case "extract":
+ operation = 0;
+ System.out.println(RETURN_UP + Ansi.colorize("Please select an operation: ") + Ansi.colorize(input, Attribute.BRIGHT_RED_TEXT()));
+ break;
+ case "pack":
+ case "package":
+ operation = 1;
+ System.out.println(RETURN_UP + Ansi.colorize("Please select an operation: ") + Ansi.colorize(input, Attribute.YELLOW_TEXT()));
+ break;
+ case "patch":
+ operation = 2;
+ System.out.println(RETURN_UP + Ansi.colorize("Please select an operation: ") + Ansi.colorize(input, Attribute.BRIGHT_GREEN_TEXT()));
+ break;
+ case "logo":
+ case "print":
+ operation = 3;
+ System.out.println(RETURN_UP + Ansi.colorize("Please select an operation: ") + Ansi.colorize(input, Attribute.BRIGHT_BLUE_TEXT()));
+ break;
+ case "quit":
+ case "exit":
+ operation = 4;
+ System.out.println(RETURN_UP + Ansi.colorize("Please select an operation: ") + Ansi.colorize(input, Attribute.BRIGHT_MAGENTA_TEXT()));
+ break;
+ }
+
+ switch(operation) {
+ case 0: // extract
+ // Determine package directory
+ File currentDir = new File(new File(AudioExtractor.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent());
+ boolean packDirFound = false;
+ do {
+ System.out.println(Ansi.colorize("\nPackage Directory:", Attribute.BOLD(), Attribute.CYAN_TEXT()));
+ System.out.println("- " + Ansi.colorize("Current", Attribute.BRIGHT_RED_TEXT()) + " directory:\t" + Ansi.colorize(currentDir.getPath(), Attribute.BRIGHT_CYAN_TEXT()));
+
+ } while(!packDirFound);
+ break;
+ case 1: // pack
+ break;
+ case 2: // patch
+ break;
+ case 3: // print
+ prompt = "\nCommand parameters: " + Ansi.colorize("Print", Attribute.BRIGHT_BLUE_TEXT()) + Ansi.colorize(" [color]", Attribute.BRIGHT_YELLOW_TEXT()) + Ansi.colorize(" [message]", Attribute.BRIGHT_RED_TEXT())
+ + "\n"
+ + "\n" + Ansi.colorize("Colors", Attribute.BRIGHT_YELLOW_TEXT(), Attribute.BOLD()) + ":"
+ + "\n- " + Ansi.colorize("Default", Attribute.CLEAR())
+ + "\n- " + Ansi.colorize("Black", Attribute.BLACK_TEXT()) + ", " + Ansi.colorize("Gray", Attribute.BRIGHT_BLACK_TEXT()) + ", " + Ansi.colorize("White", Attribute.BRIGHT_WHITE_TEXT())
+ + "\n- " + Ansi.colorize("Indigo", Attribute.TEXT_COLOR(0x7D, 0x1A, 0xFF)) + ", " + Ansi.colorize("Purple", Attribute.BRIGHT_MAGENTA_TEXT()) + ", " + Ansi.colorize("Violet", Attribute.TEXT_COLOR(0xEE, 0x82, 0xEE))
+ + "\n- " + Ansi.colorize("Red", Attribute.RED_TEXT()) + ", " + Ansi.colorize("Cinnabar", Attribute.BRIGHT_RED_TEXT()) + ", " + Ansi.colorize("Pink", Attribute.TEXT_COLOR(0xFF, 0xC0, 0xCB))
+ + "\n- " + Ansi.colorize("Orange", Attribute.TEXT_COLOR(0xFF, 0x68, 0x1F)) + ", " + Ansi.colorize("Gold", Attribute.YELLOW_TEXT()) + ", " + Ansi.colorize("Yellow", Attribute.TEXT_COLOR(0xFF, 0xEA, 0x00))
+ + "\n- " + Ansi.colorize("Green", Attribute.BRIGHT_GREEN_TEXT()) + ", " + Ansi.colorize("Chartreuse", Attribute.TEXT_COLOR(0xD1, 0xEB, 0x27)) + ", " + Ansi.colorize("Beige", Attribute.BRIGHT_YELLOW_TEXT())
+ + "\n- " + Ansi.colorize("Blue", Attribute.BRIGHT_BLUE_TEXT()) + ", " + Ansi.colorize("Teal", Attribute.TEXT_COLOR(0x00, 0x93, 0xCF)) + ", " + Ansi.colorize("Cyan", Attribute.BRIGHT_CYAN_TEXT())
+ + "\n"
+ + "\n" + Ansi.colorize("Please select a color:") + PALE_YELLOW + " ";
+ String[] values = {"Default", "Black", "Gray", "White",
+ "Indigo", "Purple", "Violet", "Red", "Cinnabar", "Pink",
+ "Orange", "Gold", "Yellow", "Green", "Chartreuse", "Beige",
+ "Blue", "Teal", "Cyan"};
+ input = retrieveInput(reader, prompt, values);
+ Attribute color = null;
+ switch(input.toLowerCase()) {
+ case "default": color = Attribute.CLEAR(); break;
+ case "black": color = Attribute.BLACK_TEXT(); break;
+ case "gray": color = Attribute.BRIGHT_BLACK_TEXT(); break;
+ case "white": color = Attribute.BRIGHT_WHITE_TEXT(); break;
+ case "indigo": color = Attribute.TEXT_COLOR(0x7D, 0x1A, 0xFF); break;
+ case "purple": color = Attribute.BRIGHT_MAGENTA_TEXT(); break;
+ case "violet": color = Attribute.TEXT_COLOR(0xEE, 0x82, 0xEE); break;
+ case "red": color = Attribute.RED_TEXT(); break;
+ case "cinnabar": color = Attribute.BRIGHT_RED_TEXT(); break;
+ case "pink": color = Attribute.TEXT_COLOR(0xFF, 0xC0, 0xCB); break;
+ case "green": color = Attribute.BRIGHT_GREEN_TEXT(); break;
+ case "chartreuse": color = Attribute.TEXT_COLOR(0xD1, 0xEB, 0x27); break;
+ case "beige": color = Attribute.BRIGHT_YELLOW_TEXT(); break;
+ case "blue": color = Attribute.BRIGHT_BLUE_TEXT(); break;
+ case "teal": color = Attribute.TEXT_COLOR(0x00, 0x93, 0xCF); break;
+ case "cyan": color = Attribute.BRIGHT_CYAN_TEXT(); break;
+ }
+ System.out.println(RETURN_UP + Ansi.colorize("Please select a color: ") + Ansi.colorize(input, color));
+ break;
+ case 4: // exit
+ System.out.println("Program closed.");
+ System.exit(0);
+ break;
+ }
+
+ }
+ System.exit(0);
+
+ if(args.length > 0) {
+ switch(args[0]) {
+
+ case "help":
+ if(args.length > 1)
+ switch(args[1]) {
+ case "extract":
+
+ break;
+ case "pack":
+ break;
+ case "print":
+ break;
+ }
+ System.out.println("java -jar RR6AudioExtractor.jar [operation] [package] [extract] [option]");
+ break;
+
+ case "extract":
+ // TODO
+ break;
+
+ case "pack":
+ // TODO
+ break;
+
+ }
+
+ }
+
// Confirm input/output mode
boolean packMode = false;
if(args.length > 0)
@@ -80,13 +240,66 @@ public class AudioExtractor {
}
+ /**
+ * Prompts the user for input and validates that the input matches one of the provided values.
+ *
+ * @param reader
+ * @param prompt
+ * @param values
+ * @return input
+ */
+ private static String retrieveInput(BufferedReader reader, String prompt, String[] values) {
+
+ String input = null;
+ boolean valid = false;
+ do {
+ System.out.print(prompt);
+ try {
+ input = reader.readLine();
+ for(int i = 0; i < values.length; i++)
+ if(input.equalsIgnoreCase(values[i])) {
+ valid = true;
+ break;
+ }
+ if(!valid)
+ System.out.println(Ansi.colorize("Invalid selection."));
+ } catch (IOException e) {
+ System.out.println(Ansi.colorize("Invalid selection."));
+ }
+ } while(!valid);
+
+ return input;
+
+ }
+
private static void pack(File packDirectory, File extractDirectory) {
- // 1. Compile list of WAV files in extracted directories
- // 2. Check if pack files already exist in package directory
- // 3. If pack file already exists, insert WAV files into existing file.
- // 4. If pack file doesn't exist, create new file then insert WAV files.
+ // Identify extracted folders
+ File[] packages = new File(extractDirectory.toString()).listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.toLowerCase().startsWith("pack_") && !name.toLowerCase().endsWith(".bin");
+ }
+ });
+
+ for(int i = 0; i < packages.length; i++)
+ System.out.println(packages[i].getName());
+ for(File packDir : packages) {
+
+ // 1. Compile list of WAV files in extracted directories
+ File[] audioTracks = new File(packDir.toString()).listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.toLowerCase().endsWith(".wav");
+ }
+ });
+
+ // 2. Check if pack files already exist in package directory
+ File pack = new File(packDir.getPath() + ".bin");
+ if(pack.exists());
+
+ // 3. If pack file already exists, insert WAV files into existing file.
+ // 4. If pack file doesn't exist, create new file then insert WAV files.
+ }
// Hypothesis 1: Does Ridge Racer 6 use a predetermined address list for reading tracks from package?
// Test 1: Try changing the address of a track and see if the game can handle it successfully.
@@ -264,5 +477,858 @@ public class AudioExtractor {
return tracklist;
}
+
+ /**
+ * Creates an ASCII logo in RR6 style using the provided text.
+ * Supports alphanumeric text with spaces only.
+ *
+ * @param text
+ * @param italicize logo
+ * @return logo formatted text
+ */
+ public static String logoFormat(String text) {
+ return logoFormat(text, true, 10);
+ }
+
+ /**
+ * Creates an ASCII logo in RR6 style using the provided text.
+ * Supports alphanumeric text with spaces only.
+ *
+ * @param text
+ * @param height
+ * @param italicize logo
+ * @return logo formatted text
+ */
+ public static String logoFormat(String text, boolean italic, int height) {
+
+ // Initialize logo lines
+ String[] logo = new String[10];
+ for(int i = 0; i < logo.length; i++)
+ logo[i] = new String();
+
+ boolean spaced = false;
+ for(int i = 0; i < text.length(); i++) {
+ char c = text.charAt(i);
+ // Add space from previous character
+ if(i > 0) {
+ if(c != ' ' && c!= ':' && !spaced) {
+ for(int line = 0; line < logo.length - 1; line++)
+ logo[line] += " ";
+ logo[9] += "███";
+ }
+ spaced = false;
+ }
+
+ // Add character to logo
+ switch(c) {
+
+ // Space
+ case ':':
+ case ' ':
+ for(int line = 0; line < logo.length; line++)
+ logo[line] += " ";
+ spaced = true;
+ break;
+
+ // Numbers
+ case '0':
+ if(logo[0].length() > 0)
+ for(int x = 0; x < logo.length; x++)
+ logo[x] = logo[x].substring(0, logo[x].length() - 1);
+ logo[0] += " ██████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ████████ ";
+ logo[3] += "████████ ████████ ";
+ logo[4] += "████████ ████████ ";
+ logo[5] += "████████ ████████ ";
+ logo[6] += "████████ ████████ ";
+ logo[7] += "████████ ████████ ";
+ logo[8] += "████████████████████████ ";
+ logo[9] += " ██████████████████████ ";
+ spaced = true;
+ break;
+ case '1':
+ logo[0] += " ███████████████ ";
+ logo[1] += "████████████████ ";
+ logo[2] += " ████████ ";
+ logo[3] += " ████████ ";
+ logo[4] += " ████████ ";
+ logo[5] += " ████████ ";
+ logo[6] += " ████████ ";
+ logo[7] += " ████████ ";
+ logo[8] += " ████████ ";
+ logo[9] += " ████████ ";
+ spaced = true;
+ break;
+ case '2':
+ logo[0] += " ███████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ████████ ";
+ logo[3] += " ████████ ";
+ logo[4] += " ██████████████████████ ";
+ logo[5] += "████████████████████████ ";
+ logo[6] += "████████ ";
+ logo[7] += "████████ ";
+ logo[8] += "████████████████████████ ";
+ logo[9] += "███████████████████████ ";
+ spaced = true;
+ break;
+ case '3':
+ logo[0] += " ██████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ████████ ";
+ logo[3] += " ████████ ";
+ logo[4] += " ███████████████ ";
+ logo[5] += " ██████████████ ";
+ logo[6] += " ████████ ";
+ logo[7] += "████████ ████████ ";
+ logo[8] += "████████████████████████ ";
+ logo[9] += " ██████████████████████ ";
+ spaced = true;
+ break;
+ case '4':
+ logo[0] += " █████████████ ";
+ logo[1] += " ███████████████ ";
+ logo[2] += " ████ ██████ ";
+ logo[3] += " ██████ ██████ ";
+ logo[4] += " ███████████████████████ ";
+ logo[5] += "████████████████████████ ";
+ logo[6] += " ██████ ";
+ logo[7] += " ██████ ";
+ logo[8] += " ██████ ";
+ logo[9] += " ██████ ";
+ spaced = true;
+ break;
+ case '5':
+ logo[0] += " ███████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ";
+ logo[3] += "████████ ";
+ logo[4] += "████████████████████████ ";
+ logo[5] += "████████████████████████ ";
+ logo[6] += " ████████ ";
+ logo[7] += " ████████ ";
+ logo[8] += "████████████████████████ ";
+ logo[9] += "███████████████████████ ";
+ spaced = true;
+ break;
+ case '6':
+ logo[0] += " ███████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ";
+ logo[3] += "████████ ";
+ logo[4] += "████████████████████████ ";
+ logo[5] += "████████████████████████ ";
+ logo[6] += "████████ ████████ ";
+ logo[7] += "████████ ████████ ";
+ logo[8] += "████████████████████████ ";
+ logo[9] += "███████████████████████ ";
+ spaced = true;
+ break;
+ case '7':
+ logo[0] += " ███████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ████████ ";
+ logo[3] += " ████████ ";
+ logo[4] += " ████████ ";
+ logo[5] += " ████████ ";
+ logo[6] += " ████████ ";
+ logo[7] += " ████████ ";
+ logo[8] += " ████████ ";
+ logo[9] += " ████████ ";
+ spaced = true;
+ break;
+ case '8':
+ logo[0] += " ██████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ████████ ";
+ logo[3] += "████████ ████████ ";
+ logo[4] += " █████████████████████ ";
+ logo[5] += " █████████████████████ ";
+ logo[6] += "████████ ████████ ";
+ logo[7] += "████████ ████████ ";
+ logo[8] += "████████████████████████ ";
+ logo[9] += " ██████████████████████ ";
+ spaced = true;
+ break;
+ case '9':
+ logo[0] += " ██████████████████████ ";
+ logo[1] += "████████████████████████ ";
+ logo[2] += "████████ ████████ ";
+ logo[3] += "████████ ████████ ";
+ logo[4] += " ███████████████████████ ";
+ logo[5] += " █████████████████████ ";
+ logo[6] += " ████████ ";
+ logo[7] += " ████████ ";
+ logo[8] += " ████████ ";
+ logo[9] += " ████████ ";
+ spaced = true;
+ break;
+
+ // Capital letters
+ case 'A':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████████████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'B':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "███████████ ";
+ logo[6] += "████ ████";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'C':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ";
+ logo[4] += "████ ";
+ logo[5] += "████ ";
+ logo[6] += "████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'D':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'E':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ";
+ logo[4] += "████ ";
+ logo[5] += "████████████";
+ logo[6] += "████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'F':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ";
+ logo[4] += "████ ";
+ logo[5] += "████████████";
+ logo[6] += "████ ";
+ logo[7] += "████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'G':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ";
+ logo[4] += "████ ";
+ logo[5] += "████ ██████";
+ logo[6] += "████ ████";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'H':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████████████";
+ logo[6] += "████ ████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'I':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████";
+ logo[3] += "████";
+ logo[4] += "████";
+ logo[5] += "████";
+ logo[6] += "████";
+ logo[7] += "████";
+ logo[8] += " ";
+ logo[9] += "████";
+ break;
+ case 'J':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ██████";
+ logo[3] += " ████";
+ logo[4] += " ████";
+ logo[5] += " ████";
+ logo[6] += " ████";
+ logo[7] += "████████";
+ logo[8] += " ";
+ logo[9] += "████████";
+ break;
+ case 'K':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████ ";
+ logo[3] += "████ ████ ";
+ logo[4] += "████ ████ ";
+ logo[5] += "████ ████ ";
+ logo[6] += "████████ ";
+ logo[7] += "████ █████ ";
+ logo[8] += " █████";
+ logo[9] += "███████ ███";
+ spaced = true;
+ break;
+ case 'L':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ";
+ logo[3] += "████ ";
+ logo[4] += "████ ";
+ logo[5] += "████ ";
+ logo[6] += "████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'M':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "██████ ██████";
+ logo[4] += "████ ████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "██████████████";
+ break;
+ case 'N':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "██████ ████";
+ logo[4] += "███████ ████";
+ logo[5] += "████ ███████";
+ logo[6] += "████ ██████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'O':
+ if(logo[0].length() > 0)
+ for(int x = 0; x < logo.length; x++)
+ logo[x] = logo[x].substring(0, logo[x].length() - 1);
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ██████████ ";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += " ██████████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'P':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████████████";
+ logo[7] += "████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'Q':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ███████████ ";
+ logo[3] += "████ ████ ";
+ logo[4] += "████ ████ ";
+ logo[5] += "████ ████ ";
+ logo[6] += "████ ████ ";
+ logo[7] += "████████████ ";
+ logo[8] += " ████ ";
+ logo[9] += "█████████ ███";
+ spaced = true;
+ break;
+ case 'R':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████ ";
+ logo[3] += "████ ████ ";
+ logo[4] += "████ ████ ";
+ logo[5] += "████ ████ ";
+ logo[6] += "███████████ ";
+ logo[7] += "█████ █████ ";
+ logo[8] += " █████";
+ logo[9] += "█████████ ███";
+ spaced = true;
+ break;
+ case 'S':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += "████ ████";
+ logo[4] += " ████ ";
+ logo[5] += " ████ ";
+ logo[6] += "████ ████";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'T':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += " ████ ";
+ logo[4] += " ████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████ ";
+ logo[7] += " ████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'U':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'V':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += " ████████ ";
+ logo[7] += " ████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'W':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████ ████";
+ logo[6] += "██████ ██████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "██████████████";
+ break;
+ case 'X':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "████ ████";
+ logo[4] += " ████ ████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████ ████ ";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'Y':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████ ████";
+ logo[3] += "████ ████";
+ logo[4] += " ████ ████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████ ";
+ logo[7] += " ████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'Z':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += "████████████";
+ logo[3] += " ████";
+ logo[4] += " ████ ";
+ logo[5] += " ████ ";
+ logo[6] += "████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+
+ // Lowercase letters
+ case 'a':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ███████████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████████████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'b':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████████████";
+ logo[4] += "████ ████";
+ logo[5] += "██████████ ";
+ logo[6] += "████ ████";
+ logo[7] += "███████████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'c':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ███████████";
+ logo[4] += "████ ";
+ logo[5] += "████ ";
+ logo[6] += "████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'd':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████████████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += "███████████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'e':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ███████████";
+ logo[4] += "████ ";
+ logo[5] += "████████████";
+ logo[6] += "████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'f':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ███████████";
+ logo[4] += "████ ";
+ logo[5] += "████████████";
+ logo[6] += "████ ";
+ logo[7] += "████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'g':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ███████████";
+ logo[4] += "████ ";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += "███████████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'h':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████████████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'i':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████";
+ logo[4] += "████";
+ logo[5] += "████";
+ logo[6] += "████";
+ logo[7] += "████";
+ logo[8] += " ";
+ logo[9] += "████";
+ break;
+ case 'j':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ██████";
+ logo[4] += " ████";
+ logo[5] += " ████";
+ logo[6] += " ████";
+ logo[7] += "████████";
+ logo[8] += " ";
+ logo[9] += "████████";
+ break;
+ case 'k':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████ ";
+ logo[5] += "████████ ";
+ logo[6] += "████ ████ ";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'l':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ";
+ logo[4] += "████ ";
+ logo[5] += "████ ";
+ logo[6] += "████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'm':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ █████";
+ logo[4] += "█████ ██████";
+ logo[5] += "████ ██ ████";
+ logo[6] += "████ ████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'n':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ████";
+ logo[4] += "█████ ████";
+ logo[5] += "████ ██ ████";
+ logo[6] += "████ █████";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'o':
+ if(logo[0].length() > 0)
+ for(int x = 0; x < logo.length; x++)
+ logo[x] = logo[x].substring(0, logo[x].length() - 1);
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ██████████ ";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += " ██████████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'p':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████████████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "██████████ ";
+ logo[7] += "████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'q':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += " ███████████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += " ██████████";
+ logo[7] += " ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'r':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████████████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "██████████ ";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 's':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████████████";
+ logo[4] += "████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 't':
+ if(logo[0].length() > 0)
+ for(int x = 0; x < logo.length; x++)
+ logo[x] = logo[x].substring(0, logo[x].length() - 1);
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████████████";
+ logo[4] += " ████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████ ";
+ logo[7] += " ████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'u':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += "████ ████";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'v':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ████";
+ logo[4] += "████ ████";
+ logo[5] += "████ ████";
+ logo[6] += " ████ ████";
+ logo[7] += " █████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'w':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "███ ███ ███";
+ logo[4] += "███ ███ ███";
+ logo[5] += "███ ███ ███";
+ logo[6] += " ██ ████ ███";
+ logo[7] += " ████ ████ ";
+ logo[8] += " ";
+ logo[9] += "███████████████";
+ break;
+ case 'x':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ████";
+ logo[4] += " ████ ████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████ ████ ";
+ logo[7] += "████ ████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'y':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████ ████";
+ logo[4] += " ████ ████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████ ";
+ logo[7] += " ████ ";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ case 'z':
+ logo[0] += " ";
+ logo[1] += " ";
+ logo[2] += " ";
+ logo[3] += "████████████";
+ logo[4] += " ████ ";
+ logo[5] += " ████ ";
+ logo[6] += " ████ ";
+ logo[7] += "████████████";
+ logo[8] += " ";
+ logo[9] += "████████████";
+ break;
+ default:
+ System.out.println("Unable to convert character '" + c + "'");
+ break;
+ }
+ }
+
+ // Italicize logo
+ if(italic) {
+ for(int i = 0; i < logo.length; i++) {
+ // i = 0 -> 9
+ for(int x = logo.length - (i + 1); x > 0; x--)
+ // x = 10 - (i + 1)
+ logo[i] = " " + logo[i]; // line 0 gets 10 spaces, line 1 gets 9 spaces... line 9 gets 0 spaces
+ }
+ }
+
+ // Compile logo into single text element
+ StringBuilder logoText = new StringBuilder();
+ for(int i = logo.length - height; i < logo.length; i++) {
+ logoText.append(logo[i] + "\n");
+ }
+
+ return logoText.toString();
+
+ }
+
}