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(); + + } + }