|
@@ -6,103 +6,113 @@ import java.util.LinkedList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
|
public class SplitSecondArkSplitter {
|
|
public class SplitSecondArkSplitter {
|
|
- public static void main(String[] args) {
|
|
|
|
- HashMap<String,String> filehashes = new HashMap<>();
|
|
|
|
- try (BufferedReader br = new BufferedReader(new FileReader("D:\\LOA\\000014\\filenames_preprocessed.txt"))) {
|
|
|
|
- br.lines().forEach((line)->
|
|
|
|
- {
|
|
|
|
- filehashes.put(SplitSecondChecksumCheck.wiggleChecksum(line)+"",line);
|
|
|
|
- });
|
|
|
|
- } catch (FileNotFoundException e) {
|
|
|
|
- e.printStackTrace();
|
|
|
|
- } catch (IOException e) {
|
|
|
|
- e.printStackTrace();
|
|
|
|
- }
|
|
|
|
|
|
+ public static boolean HACK = true;
|
|
|
|
|
|
- String[] levelbases = {"airport_test_03","docks","downtown","end_sequence",
|
|
|
|
- "graveyard","nem_downtown","nem_graveyard","nem_storm","nem_training","nem_warehouse","powerplant"};
|
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
+ HashMap<String, String> filehashes = new HashMap<>();
|
|
|
|
+ try (PrintWriter bw = new PrintWriter(new FileWriter("D:\\LOA\\000014\\filenames_debugdump.txt",true))) {
|
|
|
|
|
|
- //synthesizing a few patterned names
|
|
|
|
- for(int i=0;i<1000;i++)
|
|
|
|
- {
|
|
|
|
- String prefix = String.format("%03d", i);;
|
|
|
|
- for(int j=0;j<5;j++)
|
|
|
|
- {
|
|
|
|
- filehashes.put(SplitSecondChecksumCheck.wiggleChecksum("q"+prefix+"_rig"+j+"MD.model.stream")+"","q"+prefix+"_rig"+j+"MD.model.stream");
|
|
|
|
- filehashes.put(SplitSecondChecksumCheck.wiggleChecksum("q"+prefix+"_rig"+j+"L.model.stream")+"","q"+prefix+"_rig"+j+"L.model.stream");
|
|
|
|
|
|
+ try (BufferedReader br = new BufferedReader(new FileReader("D:\\LOA\\000014\\filenames_preprocessed.txt"))) {
|
|
|
|
+ br.lines().forEach((line) ->
|
|
|
|
+ {
|
|
|
|
+ long wiggled = SplitSecondChecksumCheck.wiggleChecksum(line);
|
|
|
|
+ filehashes.put(wiggled + "", line);
|
|
|
|
+ if(HACK)
|
|
|
|
+ bw.println(Long.toHexString(wiggled) + "|" + line);
|
|
|
|
+ });
|
|
|
|
+ } catch (FileNotFoundException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
+ if (HACK)
|
|
|
|
+ return;
|
|
|
|
+ String[] levelbases = {"airport_test_03", "docks", "downtown", "end_sequence",
|
|
|
|
+ "graveyard", "nem_downtown", "nem_graveyard", "nem_storm", "nem_training", "nem_warehouse", "powerplant"};
|
|
|
|
|
|
- for(String base:levelbases)
|
|
|
|
- filehashes.put(SplitSecondChecksumCheck.wiggleChecksum("airport_test_03.streamtex."+prefix)+"","airport_test_03.streamtex."+prefix);
|
|
|
|
- }
|
|
|
|
|
|
+ //synthesizing a few patterned names
|
|
|
|
+ for (int i = 0; i < 1000; i++) {
|
|
|
|
+ String prefix = String.format("%03d", i);
|
|
|
|
+ ;
|
|
|
|
+ for (int j = 0; j < 5; j++) {
|
|
|
|
+ filehashes.put(SplitSecondChecksumCheck.wiggleChecksum("q" + prefix + "_rig" + j + "MD.model.stream") + "", "q" + prefix + "_rig" + j + "MD.model.stream");
|
|
|
|
+ filehashes.put(SplitSecondChecksumCheck.wiggleChecksum("q" + prefix + "_rig" + j + "L.model.stream") + "", "q" + prefix + "_rig" + j + "L.model.stream");
|
|
|
|
+ }
|
|
|
|
|
|
- try {
|
|
|
|
- RandomAccessFile f = new RandomAccessFile("O:\\splitsecond\\data\\environments\\levels\\nem_training\\sectors\\nem_training.stream.ark","r");
|
|
|
|
- f.readInt();
|
|
|
|
- f.readInt();
|
|
|
|
- int files = Integer.reverseBytes(f.readInt());
|
|
|
|
- System.out.println(files);
|
|
|
|
- f.readInt();
|
|
|
|
- f.readInt();
|
|
|
|
- f.readInt(); //some bullshit;
|
|
|
|
- List<FileMetaData> fileslst = new LinkedList<>();
|
|
|
|
- for(int i=0;i<files;i++)
|
|
|
|
- {
|
|
|
|
- FileMetaData fmd = new FileMetaData();
|
|
|
|
- fmd.zipped = f.readInt() != 0;
|
|
|
|
- fmd.offset = Integer.reverseBytes(f.readInt());
|
|
|
|
- fmd.zsize = Integer.reverseBytes(f.readInt());
|
|
|
|
- fmd.size = Integer.reverseBytes(f.readInt());
|
|
|
|
- byte[] csum = new byte[4];
|
|
|
|
- f.read(csum);
|
|
|
|
- long csum2 =
|
|
|
|
- (((long)csum[0])&0xFFL)
|
|
|
|
- +((((long)csum[1])&0xFFL)<<8)
|
|
|
|
- +((((long)csum[2])&0xFFL)<<16)
|
|
|
|
- +((((long)csum[3])&0xFFL)<<24);
|
|
|
|
- csum2 = csum2&0xFFFFFFFFL;
|
|
|
|
- String filename = filehashes.get(""+csum2);
|
|
|
|
- System.out.println(filename);
|
|
|
|
- System.out.println(Long.toHexString(csum2));
|
|
|
|
- fmd.filename=filename!=null?filename:"UNKNOWN_"+csum2;
|
|
|
|
- fmd.checksum=csum2;
|
|
|
|
- fileslst.add(fmd);
|
|
|
|
|
|
+ for (String base : levelbases) {
|
|
|
|
+ filehashes.put(SplitSecondChecksumCheck.wiggleChecksum(base + ".streamtex." + prefix) + "", base + ".streamtex." + prefix);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- for(FileMetaData fmd:fileslst)
|
|
|
|
- {
|
|
|
|
- String realresult = "D:\\LOA\\000014\\result\\"+fmd.filename;
|
|
|
|
- File dst = new File(realresult);
|
|
|
|
- dst.getParentFile().mkdirs();
|
|
|
|
-
|
|
|
|
- if(fmd.zipped)
|
|
|
|
- {
|
|
|
|
|
|
|
|
- String outfile = "D:\\LOA\\000014\\scratch\\out.dat";
|
|
|
|
- File of = new File(outfile);
|
|
|
|
- of.delete(); //zapping old file leftovers
|
|
|
|
- byte[] compressed = new byte[fmd.zsize-4];
|
|
|
|
- f.seek(fmd.offset);
|
|
|
|
- int size = Integer.reverseBytes(f.readInt());
|
|
|
|
- f.read(compressed);
|
|
|
|
- RandomAccessFile rof = new RandomAccessFile(of,"rw");
|
|
|
|
- rof.writeInt(fmd.zsize-4);
|
|
|
|
- rof.writeInt(size);
|
|
|
|
- rof.write(compressed);
|
|
|
|
- rof.close();
|
|
|
|
- File workdir = new File("D:\\LOA\\000014\\scratch");
|
|
|
|
- runTool(workdir,"D:\\LOA\\000014\\quickbms.exe","-R","D:\\LOA\\000014\\helper.bms",outfile);
|
|
|
|
- String transferfile = "D:\\LOA\\000014\\scratch\\result.dat";
|
|
|
|
- new File(transferfile).renameTo(dst);
|
|
|
|
|
|
+ try {
|
|
|
|
+ RandomAccessFile f = new RandomAccessFile(args[0], "r");
|
|
|
|
+ f.readInt();
|
|
|
|
+ f.readInt();
|
|
|
|
+ int files = Integer.reverseBytes(f.readInt());
|
|
|
|
+ System.out.println(files);
|
|
|
|
+ f.readInt();
|
|
|
|
+ f.readInt();
|
|
|
|
+ f.readInt(); //some bullshit;
|
|
|
|
+ List<FileMetaData> fileslst = new LinkedList<>();
|
|
|
|
+ for (int i = 0; i < files; i++) {
|
|
|
|
+ FileMetaData fmd = new FileMetaData();
|
|
|
|
+ fmd.zipped = f.readInt() != 0;
|
|
|
|
+ fmd.offset = Integer.reverseBytes(f.readInt());
|
|
|
|
+ fmd.zsize = Integer.reverseBytes(f.readInt());
|
|
|
|
+ fmd.size = Integer.reverseBytes(f.readInt());
|
|
|
|
+ byte[] csum = new byte[4];
|
|
|
|
+ f.read(csum);
|
|
|
|
+ long csum2 =
|
|
|
|
+ (((long) csum[0]) & 0xFFL)
|
|
|
|
+ + ((((long) csum[1]) & 0xFFL) << 8)
|
|
|
|
+ + ((((long) csum[2]) & 0xFFL) << 16)
|
|
|
|
+ + ((((long) csum[3]) & 0xFFL) << 24);
|
|
|
|
+ csum2 = csum2 & 0xFFFFFFFFL;
|
|
|
|
+ String filename = filehashes.get("" + csum2);
|
|
|
|
+ System.out.println(filename);
|
|
|
|
+ System.out.println(Long.toHexString(csum2));
|
|
|
|
+ fmd.filename = filename != null ? filename : "UNKNOWN_" + csum2;
|
|
|
|
+ fmd.checksum = csum2;
|
|
|
|
+ fileslst.add(fmd);
|
|
}
|
|
}
|
|
- else
|
|
|
|
- {
|
|
|
|
- byte[] compressed = new byte[fmd.zsize];
|
|
|
|
- f.seek(fmd.offset);
|
|
|
|
- f.read(compressed);
|
|
|
|
- RandomAccessFile rof = new RandomAccessFile(dst,"rw");
|
|
|
|
- rof.write(compressed);
|
|
|
|
- rof.close();
|
|
|
|
|
|
+ for (FileMetaData fmd : fileslst) {
|
|
|
|
+ String arkbasename = new File(args[0]).getName();
|
|
|
|
+ String realresult = "Q:\\LOA\\000014\\result\\" + arkbasename + "\\" + fmd.filename;
|
|
|
|
+ File dst = new File(realresult);
|
|
|
|
+ dst.getParentFile().mkdirs();
|
|
|
|
+ bw.println(">>"+arkbasename+"||"+Long.toHexString(fmd.checksum)+"||"+fmd.filename);
|
|
|
|
+ if (fmd.zipped) {
|
|
|
|
+
|
|
|
|
+ String outfile = "Q:\\LOA\\000014\\scratch\\out.dat";
|
|
|
|
+ File of = new File(outfile);
|
|
|
|
+ of.getParentFile().mkdirs();
|
|
|
|
+ of.delete(); //zapping old file leftovers
|
|
|
|
+ byte[] compressed = new byte[fmd.zsize - 4];
|
|
|
|
+ f.seek(fmd.offset);
|
|
|
|
+ int size = Integer.reverseBytes(f.readInt());
|
|
|
|
+ f.read(compressed);
|
|
|
|
+ RandomAccessFile rof = new RandomAccessFile(of, "rw");
|
|
|
|
+ rof.writeInt(fmd.zsize - 4);
|
|
|
|
+ rof.writeInt(size);
|
|
|
|
+ rof.write(compressed);
|
|
|
|
+ rof.close();
|
|
|
|
+ File workdir = new File("D:\\LOA\\000014\\scratch");
|
|
|
|
+ runTool(workdir, "D:\\LOA\\000014\\quickbms.exe", "-R", "D:\\LOA\\000014\\helper.bms", outfile);
|
|
|
|
+ String transferfile = "D:\\LOA\\000014\\scratch\\result.dat";
|
|
|
|
+ new File(transferfile).renameTo(dst);
|
|
|
|
+ } else {
|
|
|
|
+ byte[] compressed = new byte[fmd.zsize];
|
|
|
|
+ f.seek(fmd.offset);
|
|
|
|
+ f.read(compressed);
|
|
|
|
+ RandomAccessFile rof = new RandomAccessFile(dst, "rw");
|
|
|
|
+ rof.write(compressed);
|
|
|
|
+ rof.close();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ } catch (FileNotFoundException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
} catch (FileNotFoundException e) {
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
@@ -111,8 +121,7 @@ public class SplitSecondArkSplitter {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- static class FileMetaData
|
|
|
|
- {
|
|
|
|
|
|
+ static class FileMetaData {
|
|
int size;
|
|
int size;
|
|
int zsize;
|
|
int zsize;
|
|
int offset;
|
|
int offset;
|
|
@@ -124,16 +133,14 @@ public class SplitSecondArkSplitter {
|
|
|
|
|
|
public static void runTool(String... args) throws IOException {
|
|
public static void runTool(String... args) throws IOException {
|
|
|
|
|
|
- runTool(null,args);
|
|
|
|
|
|
+ runTool(null, args);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
public static void runTool(File workdir, String... args) throws IOException {
|
|
public static void runTool(File workdir, String... args) throws IOException {
|
|
ProcessBuilder pb = new ProcessBuilder();
|
|
ProcessBuilder pb = new ProcessBuilder();
|
|
pb.command(args);
|
|
pb.command(args);
|
|
- if(workdir !=null&&workdir.isDirectory())
|
|
|
|
- {
|
|
|
|
|
|
+ if (workdir != null && workdir.isDirectory()) {
|
|
pb.directory(workdir);
|
|
pb.directory(workdir);
|
|
}
|
|
}
|
|
pb.redirectOutput(new File("D:\\LOA\\000014\\scratch\\out.txt"));
|
|
pb.redirectOutput(new File("D:\\LOA\\000014\\scratch\\out.txt"));
|