/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package tools; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.LinkedList; import java.util.List; import provider.MapleDataDirectoryEntry; import provider.MapleDataFileEntry; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; /** * * @author Itzik */ public class HairFaceDump { public static void main(String[] args) throws IOException { MapleDataProvider data; data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz/Hair")); MapleDataDirectoryEntry root; StringBuilder sb = new StringBuilder(); FileOutputStream out; out = new FileOutputStream("Styler.js", false); List<Integer> maleHair1 = new LinkedList<>(); List<Integer> maleHair2 = new LinkedList<>(); List<Integer> maleHair3 = new LinkedList<>(); List<Integer> femaleHair1 = new LinkedList<>(); List<Integer> femaleHair2 = new LinkedList<>(); List<Integer> femaleHair3 = new LinkedList<>(); System.out.println("Loading Hairs"); root = data.getRoot(); for (MapleDataFileEntry topDir : root.getFiles()) { int id = Integer.parseInt(topDir.getName().substring(0, 8)); if (isMaleHair(id)) { if (maleHair1.size() < 0x7F) { maleHair1.add(id); } else { if (maleHair2.size() < 0x7F) { maleHair2.add(id); } else { maleHair3.add(id); } } } } if (maleHair2.isEmpty()) { maleHair2 = maleHair1; maleHair3 = maleHair1; } else if (maleHair3.isEmpty()) { maleHair3 = maleHair1; } for (MapleDataFileEntry topDir : root.getFiles()) { int id = Integer.parseInt(topDir.getName().substring(0, 8)); if (isFemaleHair(id)) { if (femaleHair1.size() < 0x7F) { femaleHair1.add(id); } else { if (femaleHair2.size() < 0x7F) { femaleHair2.add(id); } else { femaleHair3.add(id); } } } } if (femaleHair2.isEmpty()) { femaleHair2 = femaleHair1; femaleHair3 = femaleHair1; } else if (femaleHair3.isEmpty()) { femaleHair3 = femaleHair1; } List<Integer> hairList = new LinkedList<>(); for (MapleDataFileEntry topDir : root.getFiles()) { hairList.add(Integer.parseInt(topDir.getName().substring(0, 8))); } List<Integer> maleFace = new LinkedList<>(); List<Integer> femaleFace = new LinkedList<>(); System.out.println("Loading Faces"); data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz/Face")); root = data.getRoot(); for (MapleDataFileEntry topDir : root.getFiles()) { int id = Integer.parseInt(topDir.getName().substring(0, 8)); if (isMaleFace(id)) { maleFace.add(id); } } for (MapleDataFileEntry topDir : root.getFiles()) { int id = Integer.parseInt(topDir.getName().substring(0, 8)); if (isFemaleFace(id)) { femaleFace.add(id); } } if (maleHair1.isEmpty() || maleHair2.isEmpty() || maleHair3.isEmpty() || femaleHair1.isEmpty() || femaleHair2.isEmpty() || femaleHair3.isEmpty() || maleFace.isEmpty() || femaleFace.isEmpty()) { System.out.println("Could not find any hairs/faces in an array."); System.exit(0); return; } List<Integer> faceList = new LinkedList<>(); for (MapleDataFileEntry topDir : root.getFiles()) { faceList.add(Integer.parseInt(topDir.getName().substring(0, 8))); } sb.append(createStyler(maleHair1, maleHair2, maleHair3, femaleHair1, femaleHair2, femaleHair3, maleFace, femaleFace, hairList, faceList)); out.write(sb.toString().getBytes()); } public static boolean isMaleHair(int id) { if (id % 10 != 0) { return false; } if (id == 33030 || id == 33160 || id == 33590) { return false; } if (id / 1000 == 30 || id / 1000 == 33 || (id / 1000 == 32 && id >= 32370) || id / 1000 == 36 || (id / 1000 == 37 && id >= 37160 && id <= 37170)) { return true; } switch (id) { case 32160: case 32330: case 34740: return true; } return false; } public static boolean isFemaleHair(int id) { if (id % 10 != 0) { return false; } if (id == 32160 || id == 32330 || id == 34740) { return false; } if (id / 1000 == 31 || id / 1000 == 34 || (id / 1000 == 32 && id < 32370) || (id / 1000 == 37 && id < 37160)) { return true; } switch (id) { case 33030: case 33160: case 33590: return true; } return false; //return !isMaleHair(id); } public static boolean isMaleFace(int id) { if (id % 1000 >= 100) { return false; } return id / 1000 == 20; } public static boolean isFemaleFace(int id) { if (id % 1000 >= 100) { return false; } return id / 1000 == 21; } public static boolean hairExists(int hair) { MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz/Hair")); final MapleDataDirectoryEntry root = data.getRoot(); for (MapleDataFileEntry topDir : root.getFiles()) { int id = Integer.parseInt(topDir.getName().substring(0, 8)); if (id == hair) { return true; } } return false; } public static boolean faceExists(int face) { MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz/Face")); final MapleDataDirectoryEntry root = data.getRoot(); for (MapleDataFileEntry topDir : root.getFiles()) { int id = Integer.parseInt(topDir.getName().substring(0, 8)); if (id == face) { return true; } } return false; } public static String createStyler(List<Integer> maleHair1, List<Integer> maleHair2, List<Integer> maleHair3, List<Integer> femaleHair1, List<Integer> femaleHair2, List<Integer> femaleHair3, List<Integer> maleFace, List<Integer> femaleFace, List<Integer> hairList, List<Integer> faceList) { StringBuilder sb = new StringBuilder(); addLine(sb, "var v1;"); addLine(sb, "var v2;"); addLine(sb, "var v3;"); addLine(sb, "var v4;"); addLine(sb, "var v5;"); addLine(sb, "var v6;"); addLine(sb, "var v7;"); addLine(sb, "var v8;"); addLine(sb, "var v9;"); addLine(sb, "var v10;"); addLine(sb, "var v11;"); addLine(sb, "var v12;"); addLine(sb, "var v13;"); addLine(sb, "var v14;"); addLine(sb, "var v15;"); addLine(sb, "var v16;"); addLine(sb, "var v17;"); addLine(sb, "var v18;"); addLine(sb, "var v19;"); addLine(sb, "var v20;"); addLine(sb, "var v21;"); addLine(sb, "var v22;"); addLine(sb, "var v23;"); addLine(sb, "var v24;"); addLine(sb, "var v25;"); addLine(sb, "var v26;"); addLine(sb, "var v27;"); addLine(sb, ""); addLine(sb, "function start() {"); addLine(sb, " v1 = 1;"); addLine(sb, " v2 = Array();"); addLine(sb, " v3 = Array();"); addLine(sb, " v4 = Array();"); addLine(sb, " v5 = Array();"); addLine(sb, " v6 = [0, 1, 2, 3, 4, 5, 9, 10];"); addLine(sb, " v7 = " + maleHair1.toString() + ";"); addLine(sb, " v8 = " + femaleHair1.toString() + ";"); addLine(sb, " v9 = " + maleHair2.toString() + ";"); addLine(sb, " v10 = " + femaleHair2.toString() + ";"); addLine(sb, " v11 = " + maleHair3.toString() + ";"); addLine(sb, " v12 = " + femaleHair3.toString() + ";"); addLine(sb, " v13 = cm.getPlayerStat(\"GENDER\");"); addLine(sb, " v18 = 0;"); addLine(sb, " v19 = " + maleFace.toString() + ";"); addLine(sb, " v20 = " + femaleFace.toString() + ";"); addLine(sb, " v21 = 0;"); addLine(sb, " v22 = cm.getPlayer().getHair();"); addLine(sb, " v23 = cm.getPlayer().getFace();"); addLine(sb, " v25 = 0;"); addLine(sb, " v26 = " + hairList.toString() + ";"); addLine(sb, " v27 = " + faceList.toString() + ";"); addLine(sb, " cm.sendSimple(\"Time for make-up!\\r\\n#L0#Skin#l\\r\\n#L1#Haircut#l\" + (v13 == 0 ? ((\"\" + v7 != v9 ? \"\\r\\n#L2#Haircut2#l\" : \"\") + (\"\" + v7 != v11 ? \"\\r\\n#L3#Haircut3#l\" : \"\")) : ((\"\" + v8 != v10 ? \"\\r\\n#L2#Haircut2#l\" : \"\") + (\"\" + v8 != v12 ? \"\\r\\n#L3#Haircut3#l\" : \"\"))) + \"\\r\\n#L4#Hair Color#l\\r\\n#L5#Face#l\\r\\n#L6#Eye Color#l\");"); addLine(sb, "}"); addLine(sb, ""); addLine(sb, "function action(mode, type, selection) {"); addLine(sb, " if (mode != 1) {"); addLine(sb, " cm.dispose();"); addLine(sb, " return;"); addLine(sb, " }"); addLine(sb, " switch (v1) {"); addLine(sb, " case 1:"); addLine(sb, " v14 = selection;"); addLine(sb, " switch (v14) {"); addLine(sb, " case 0:"); addLine(sb, " sendStyle(v6);"); addLine(sb, " break;"); addLine(sb, " case 1:"); addLine(sb, " for each(v15 in v13 == 0 ? v7 : v8)"); addLine(sb, " if (hairExists(v15))"); addLine(sb, " v2.push(v15);"); addLine(sb, " sendStyle(v2);"); addLine(sb, " break;"); addLine(sb, " case 2:"); addLine(sb, " for each(v15 in v13 == 0 ? v9 : v10)"); addLine(sb, " if (hairExists(v15))"); addLine(sb, " v2.push(v15);"); addLine(sb, " sendStyle(v2);"); addLine(sb, " break;"); addLine(sb, " case 3:"); addLine(sb, " for each(v15 in v13 == 0 ? v11 : v12)"); addLine(sb, " if (hairExists(v15))"); addLine(sb, " v2.push(v15);"); addLine(sb, " sendStyle(v2);"); addLine(sb, " break;"); addLine(sb, " case 4:"); addLine(sb, " for (v18; v18 < 8; v18++)"); addLine(sb, " if (hairExists(v22 + v18))"); addLine(sb, " v3.push(v22 + v18);"); addLine(sb, " sendStyle(v3);"); addLine(sb, " break;"); addLine(sb, " case 5:"); addLine(sb, " for each(v15 in v13 == 0 ? v19 : v20)"); addLine(sb, " if (faceExists(v15))"); addLine(sb, " v4.push(v15);"); addLine(sb, " sendStyle(v4);"); addLine(sb, " break;"); addLine(sb, " case 6:"); addLine(sb, " for(v21; v21 < 9; v21++)"); addLine(sb, " if (faceExists(v23 + (v21 * 100)))"); addLine(sb, " v5.push(v23 + (v21 * 100));"); addLine(sb, " sendStyle(v5);"); addLine(sb, " break;"); addLine(sb, " }"); addLine(sb, " v1 = 2;"); addLine(sb, " break;"); addLine(sb, " case 2:"); addLine(sb, " v24 = selection;"); addLine(sb, " switch (v14) {"); addLine(sb, " case 0:"); addLine(sb, " cm.setSkin(v6[v24]);"); addLine(sb, " break;"); addLine(sb, " case 1:"); addLine(sb, " case 2:"); addLine(sb, " case 3:"); addLine(sb, " cm.setHair(v2[v24]);"); addLine(sb, " break;"); addLine(sb, " case 4:"); addLine(sb, " cm.setHair(v3[v24]);"); addLine(sb, " break;"); addLine(sb, " case 5:"); addLine(sb, " cm.setFace(v4[v24]);"); addLine(sb, " break;"); addLine(sb, " case 6:"); addLine(sb, " cm.setFace(v5[v24]);"); addLine(sb, " break;"); addLine(sb, " }"); addLine(sb, " cm.dispose();"); addLine(sb, " break;"); addLine(sb, " default:"); addLine(sb, " cm.dispose();"); addLine(sb, " return;"); addLine(sb, " }"); addLine(sb, "}"); addLine(sb, ""); addLine(sb, "function sendStyle(array) {"); addLine(sb, " v17 = array;"); addLine(sb, " cm.sendStyle(\"Pick your favorite\", v17);"); addLine(sb, "}"); addLine(sb, ""); addLine(sb, "function hairExists(hair) {"); addLine(sb, " for (v25; v25 < v26.length; v25++)"); addLine(sb, " if (v26[v25] == hair) {"); addLine(sb, " return true;"); addLine(sb, " break;"); addLine(sb, " }"); addLine(sb, " return false;"); addLine(sb, "}"); addLine(sb, ""); addLine(sb, "function faceExists(face) {"); addLine(sb, " for (v25; v25 < v27.length; v25++)"); addLine(sb, " if (v27[v25] == face) {"); addLine(sb, " return true;"); addLine(sb, " break;"); addLine(sb, " }"); addLine(sb, " return false;"); addLine(sb, "}"); return sb.toString(); } public static void addLine(StringBuilder sb, String string) { sb.append(string).append("\r\n"); } }