Skip to content

Commit e4398a7

Browse files
committed
refactor: rough work on level0 file parsing for modifying in future, attempts to abstract shared logic with sharedAssets (not yet applied on the latter)
1 parent 5b7b3d3 commit e4398a7

18 files changed

Lines changed: 469 additions & 230 deletions

src/level0.split3

1 MB
Binary file not shown.

src/level0.split4

572 KB
Binary file not shown.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package model;
2+
3+
import util.Helpers;
4+
5+
/*
6+
Can be used for:
7+
- shared assets card data bases (each season is one record)
8+
- level0 in-game card data (each row in table is one record)
9+
- probably other locations
10+
*/
11+
public abstract class AbstractDropmixDataRecord {
12+
int startIdx;
13+
int dataStartIdx;
14+
int dataLength;
15+
int dataSpace; // the space occupied by the data (does not include the specifier before the data, does include whitespace at end)
16+
byte[] raw;// everything including the 32 bit length specifier and whitespace
17+
byte[] recordData; //
18+
boolean iOS;
19+
public AbstractDropmixDataRecord(byte[] data, int startIdx, boolean iOS) {
20+
this.startIdx = startIdx;
21+
this.dataStartIdx = startIdx + 4;
22+
this.dataLength = Helpers.intFromByteArray(Helpers.getNRange(data, startIdx, 4));
23+
int remainder = (dataLength) % 4;
24+
this.dataSpace = dataLength + (remainder == 0 ? 0 : 4 - remainder);
25+
this.raw = Helpers.getNRange(data, startIdx, dataSpace + 4);
26+
this.recordData = Helpers.getNRange(data, startIdx + 4, dataLength);
27+
this.iOS = iOS;
28+
}
29+
30+
public String toString() {
31+
return Helpers.byteArrayToString(Helpers.getNRange(raw, 4, dataLength));
32+
}
33+
34+
public boolean validateUpdatedData(byte[] newData) {
35+
if (
36+
newData.length != dataLength
37+
) {
38+
return false;
39+
}
40+
return true;
41+
}
42+
43+
public static int getStartIndex(byte[] rawData, byte[] startSequence) {
44+
outer:
45+
for (int i = 0; i < rawData.length; i++) {
46+
if (rawData[i] == startSequence[0]) {
47+
inner:
48+
for (int j = 1; j < startSequence.length && (j+i) < rawData.length; j++ ) {
49+
if (rawData[i + j] != startSequence[j]) {
50+
continue outer;
51+
}
52+
}
53+
return i + startSequence.length;
54+
}
55+
}
56+
return -1;
57+
}
58+
59+
public abstract String[] getHeadings();
60+
}

src/model/AppState.java

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
import se.vidstige.jadb.JadbDevice;
44
import ui.UIMain;
55

6-
import javax.swing.*;
76
import java.io.File;
87
import java.io.IOException;
98
import java.nio.file.Files;
10-
import java.nio.file.Path;
119
import java.nio.file.Paths;
1210
import java.util.*;
1311

@@ -24,6 +22,7 @@ public class AppState {
2422
public Process currentProcess = Process.NONE;
2523
public UIMain appFrame; // for forcing refreshes
2624
public boolean isNestedLog;
25+
public boolean iOS = false;
2726
private AppState() {
2827
}
2928
public static AppState getInstance() {
@@ -45,38 +44,38 @@ public void setData(byte[] fileData) {
4544
this.assetsHandler = new DropmixSharedAssets(fileData);
4645
}
4746

48-
public CardDetail[] getCards() {
49-
ArrayList<CardDetail> cards = new ArrayList<CardDetail>();
47+
public DropmixSharedAssetsCard[] getCards() {
48+
ArrayList<DropmixSharedAssetsCard> cards = new ArrayList<DropmixSharedAssetsCard>();
5049
try {
5150
int seasonIdx = 0;
52-
SeasonTable season = this.assetsHandler.seasons.get(seasonIdx++);
51+
DropmixSharedAssetsSeason season = this.assetsHandler.seasons.get(seasonIdx++);
5352
while (season != null) {
5453
cards.addAll(Arrays.asList(season.cards));
5554
season = this.assetsHandler.seasons.get(seasonIdx++);
5655
}
57-
return cards.toArray(new CardDetail[0]);
56+
return cards.toArray(new DropmixSharedAssetsCard[0]);
5857
} catch (Exception e) {
5958
e.printStackTrace();
60-
return new CardDetail[0];
59+
return new DropmixSharedAssetsCard[0];
6160
}
6261
}
63-
public PlaylistDetail[] getPlaylists() {
62+
public DropmixSharedAssetsPlaylist[] getPlaylists() {
6463
Set<String> playlistNames = new HashSet<String>();
65-
for (CardDetail c: AppState.getInstance().getCards()) {
66-
playlistNames.add(c.cardData.get(CardDetail.SeriesIcon));
64+
for (DropmixSharedAssetsCard c: AppState.getInstance().getCards()) {
65+
playlistNames.add(c.data.get(DropmixSharedAssetsCard.SeriesIcon));
6766
}
6867
String[] playlistNamesArray = playlistNames.toArray(new String[0]);
6968

7069

71-
ArrayList<PlaylistDetail> seasons = new ArrayList<>();
70+
ArrayList<DropmixSharedAssetsPlaylist> seasons = new ArrayList<>();
7271

7372
for (int i=0; i < playlistNames.size(); i++) {
74-
PlaylistDetail playlist = new PlaylistDetail(playlistNamesArray[i]);
73+
DropmixSharedAssetsPlaylist playlist = new DropmixSharedAssetsPlaylist(playlistNamesArray[i]);
7574
seasons.add(playlist);
7675
}
7776
// this is required to sort the playlists in the common order
78-
Collections.sort(seasons, new Comparator<PlaylistDetail>(){
79-
public int compare(PlaylistDetail o1, PlaylistDetail o2)
77+
Collections.sort(seasons, new Comparator<DropmixSharedAssetsPlaylist>(){
78+
public int compare(DropmixSharedAssetsPlaylist o1, DropmixSharedAssetsPlaylist o2)
8079
{
8180
int val = o1.season.compareTo(o2.season);
8281
if (val == 0) {
@@ -94,7 +93,7 @@ public int compare(PlaylistDetail o1, PlaylistDetail o2)
9493
return val;
9594
}
9695
});
97-
return seasons.toArray(new PlaylistDetail[0]);
96+
return seasons.toArray(new DropmixSharedAssetsPlaylist[0]);
9897
}
9998
byte[] loadFile() {
10099
if (rawData != null) {
@@ -128,7 +127,7 @@ public void setPlaylistSwap(String p1, String p2) throws Exception {
128127
if (this.playlistSwap.containsValue(p1) || this.playlistSwap.containsValue(p2)) {
129128
throw new Exception("value-in-use");
130129
}
131-
for(PlaylistDetail pl : this.getPlaylists()) {
130+
for(DropmixSharedAssetsPlaylist pl : this.getPlaylists()) {
132131
if (pl.name == p1 || pl.name == p2) {
133132
if (pl.playlistCount != 15) {
134133
throw new Exception("invalid-playlist");
@@ -204,16 +203,16 @@ public static TreeMap<String, String> getCardSwapFromPlaylist(TreeMap<String, St
204203
}
205204
}
206205
String[] playlistNames = plSwap.keySet().toArray(new String[0]);
207-
PlaylistDetail[] playlists = getInstance().getPlaylists();
208-
TreeMap<String, PlaylistDetail> playlistDetailTreeMap = new TreeMap<String, PlaylistDetail>();
206+
DropmixSharedAssetsPlaylist[] playlists = getInstance().getPlaylists();
207+
TreeMap<String, DropmixSharedAssetsPlaylist> dropmixSharedAssetsPlaylistTreeMap = new TreeMap<String, DropmixSharedAssetsPlaylist>();
209208
TreeMap<String, String> generatedCardSwap = new TreeMap<>();
210209
Set<String> alreadySwappedPlaylists = new HashSet<>();
211-
for (PlaylistDetail pl: playlists) {
212-
playlistDetailTreeMap.put(pl.name, pl);
210+
for (DropmixSharedAssetsPlaylist pl: playlists) {
211+
dropmixSharedAssetsPlaylistTreeMap.put(pl.name, pl);
213212
}
214213
for (String playlist: playlistNames) {
215-
PlaylistDetail srcPl = playlistDetailTreeMap.get(playlist);
216-
PlaylistDetail swapPl = playlistDetailTreeMap.get(plSwap.get(playlist));
214+
DropmixSharedAssetsPlaylist srcPl = dropmixSharedAssetsPlaylistTreeMap.get(playlist);
215+
DropmixSharedAssetsPlaylist swapPl = dropmixSharedAssetsPlaylistTreeMap.get(plSwap.get(playlist));
217216
if (alreadySwappedPlaylists.contains(swapPl.name)) {
218217
continue;
219218
}

src/model/DataRow.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package model;
2+
3+
import java.util.ArrayList;
4+
import java.util.Set;
5+
import java.util.TreeMap;
6+
7+
public class DataRow {
8+
public String[] headings;
9+
public TreeMap<String, String> data = new TreeMap<String, String>();
10+
boolean iOS;
11+
boolean keepQuotesOnAllStrings;
12+
static int dataStartIdx = 0;
13+
String[] src;
14+
Set<String> forceStringFields;
15+
16+
public DataRow(String[] data, String[] headings, Set<String> forceStringFields) {
17+
this.src = data;
18+
this.headings = headings;
19+
this.forceStringFields = forceStringFields;
20+
this.parseDataRow();
21+
}
22+
public void parseDataRow() {
23+
ArrayList<String> finalEntry = new ArrayList<>();
24+
this.data = new TreeMap<String, String>();
25+
for (int i = 0; i < src.length; i++) {
26+
if (i >= (headings.length - 1)) {
27+
if (i == headings.length - 1 || i == src.length - 1) {
28+
finalEntry.add(src[i].replaceAll("\"", ""));
29+
} else {
30+
finalEntry.add(src[i]);
31+
}
32+
} else {
33+
data.put(headings[i], src[i].replaceAll("\"", ""));
34+
}
35+
}
36+
data.put(headings[headings.length - 1], String.join(",", finalEntry.toArray(new String[0])).replaceAll("\n", ""));
37+
};
38+
public String writeDataRow() {
39+
ArrayList<String> row = new ArrayList<>();
40+
for (int i = 0; i < headings.length; i++) {
41+
if (forceStringFields.contains(headings[i])) {
42+
row.add("\"" + data.get(headings[i]) + "\"");
43+
continue;
44+
}
45+
try {
46+
Integer.parseInt(this.data.get(i));
47+
row.add(this.data.get(i));
48+
} catch(Exception e) {
49+
row.add(this.data.get(i));
50+
}
51+
}
52+
return String.join(",", row);
53+
};
54+
public String[] getHeadings() {
55+
return new String[]{};
56+
};
57+
}

src/model/DropmixLevel0.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package model;
2+
3+
import util.Helpers;
4+
5+
import java.util.HashSet;
6+
7+
public class DropmixLevel0 {
8+
public byte[] raw;
9+
public int startIdx;
10+
public static String preData = "\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000Ä\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0002\u0000\u0000\u0000µ\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000Á\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000Å\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000¹\u0001\u0000\u0000";
11+
//public static byte[] header = {7,73,68,44,65,114,116,105,115,116,44,78,97,109,101,44,65,117,100,105,111,44,73,108,108,117,115,116,114,97,116,111,114,44,73,109,97,103,101,44,84,121,112,101,44,78,117,109,32,66,97,114,115,44,84,101,115,116,32,80,111,119,101,114,44,73,110,115,116,114,117,109,101,110,116,44,73,110,115,116,114,117,109,101,110,116,32,50,44,73,110,115,116,114,117,109,101,110,116,32,51,44,73,110,115,116,114,117,109,101,110,116,32,52,44,71,101,110,114,101,44,89,101,97,114,44,83,111,117,114,99,101,44,65,98,105,108,105,116,121,44,83,99,114,101,101,110,32,84,101,120,116,44,77,117,115,105,99,32,69,102,102,101,99,116,44,84,101,109,112,111,44,75,101,121,44,77,111,100,101,44,84,114,97,110,115,105,116,105,111,110,44,87,105,108,100,32,66,101,97,116,32,72,97,115,32,75,101,121,44,65,114,116,32,67,114,111,112,32,67,101,110,116,101,114,44,67,44,68,98,44,68,44,69,98,44,69,44,70,44,71,98,44,71,44,65,98,44,65,44,66,98,44,66,44,67,114,101,100,105,116,115};
12+
public DropmixLevel0Card[] cards = new DropmixLevel0Card[440];
13+
public int dataLength;
14+
public boolean iOS = false;
15+
16+
public DropmixLevel0(byte[] raw) {
17+
byte[] header = new byte[preData.length()];
18+
int i = 0;
19+
for (char c : preData.toCharArray()) {
20+
header[i] = (byte) c;
21+
i++;
22+
}
23+
this.startIdx = AbstractDropmixDataRecord.getStartIndex(raw, header);
24+
this.raw = raw;
25+
DropmixLevel0Card headingRow = new DropmixLevel0Card(raw, this.startIdx, new HashSet<String>(), this.iOS);
26+
for (String h: DropmixLevel0Card.headings) {
27+
if (!h.equals(headingRow.card.data.get(h))) {
28+
throw new RuntimeException("db-corrupt:bad-heading:"+ h);
29+
}
30+
}
31+
32+
int currentStart = headingRow.startIdx + headingRow.raw.length;
33+
int counter = 0;
34+
while (counter < 440) {
35+
DropmixLevel0Card newCard = new DropmixLevel0Card(raw, currentStart, new HashSet<String>(), this.iOS);
36+
currentStart = newCard.startIdx + newCard.raw.length;
37+
cards[counter] = newCard;
38+
counter++;
39+
}
40+
this.dataLength = currentStart - startIdx;
41+
}
42+
43+
public byte[] backToByteArray() {
44+
byte[] rawCopy = this.raw.clone();
45+
for (DropmixLevel0Card card: this.cards) {
46+
byte[] cardData = card.backToByteArray();
47+
for (int i = 0; i < card.dataLength; i++) {
48+
rawCopy[card.startIdx + i] = cardData[i];
49+
}
50+
}
51+
return rawCopy;
52+
}
53+
}

0 commit comments

Comments
 (0)