WIP: adding save data
Some checks failed
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing

This commit is contained in:
Debucquoy 2023-03-23 12:38:12 +01:00
parent 1771fd1d42
commit e54fab4c2f
Signed by: tonitch
GPG Key ID: A78D6421F083D42E
6 changed files with 108 additions and 4 deletions

View File

@ -31,6 +31,9 @@ level data at the top of the file.
- 4 first bits : width - 4 first bits : width
- 4 last bits: height - 4 last bits: height
- next bytes -> Width * Height (+1 if Width * Height % 8 is not 0) - next bytes -> Width * Height (+1 if Width * Height % 8 is not 0)
- Position ( only for saved file )
- 'F' if the piece is in float state ( not placed)
- x and y on 2 bytes for position if the piece is placed
## Known Limitation ## Known Limitation

View File

@ -54,4 +54,8 @@ public class Map extends Shape{
} }
return used; return used;
} }
public ArrayList<Piece> getPieces() {
return pieces;
}
} }

View File

@ -10,9 +10,14 @@ import java.util.Arrays;
public class BinaryParser implements FileParser { public class BinaryParser implements FileParser {
@Override
public Map getSavedData(File file) {
return null;
}
@Override @Override
public void saveLevelData(File file, Map levelData) throws IOException { public void saveLevelData(File file, Map levelData) throws IOException {
// TODO: 3/20/23
} }
/** /**
@ -20,7 +25,6 @@ public class BinaryParser implements FileParser {
* @return true if it is a binary File * @return true if it is a binary File
*/ */
public static boolean isBinaryFile(File file) throws IOException { public static boolean isBinaryFile(File file) throws IOException {
// TODO: 3/20/23 Need more testing
if (Files.probeContentType(file.toPath()) != null) if (Files.probeContentType(file.toPath()) != null)
return false ; return false ;
@ -42,6 +46,7 @@ public class BinaryParser implements FileParser {
return false; return false;
} }
@Override
public Map getLevel(File file) throws IOException { public Map getLevel(File file) throws IOException {
Map ret; Map ret;
@ -57,6 +62,11 @@ public class BinaryParser implements FileParser {
return ret; return ret;
} }
@Override
public void saveLevel(File file, Map levelData) throws FileNotFoundException {
// byte[] data = new byte[];
}
/** /**
* Extract Level data from file content * Extract Level data from file content
* @param fileStream file stream to read extract data from * @param fileStream file stream to read extract data from
@ -147,4 +157,28 @@ public class BinaryParser implements FileParser {
} }
return ret; return ret;
} }
/**
* give the amount of byte needed to store the given Map
* following the binary file format
* @param level the map to check
* @param data should add save data or only level data
* @return integer of the ammount of byte needed
*/
public static int getByteSizeForMap(Map level, boolean data){
int ret = 6; // header + footer
ret += 2; //size of the piece
ret += ((level.getWidth() * level.getHeight()) / 8); // size of the map
ret += level.getHeight() * level.getWidth() % 8 == 0 ? 0 : 1; // Add 1 if the size of map is not a mult of 8
ret += 1; // amount of pieces
for(Piece p: level.getPieces()){
ret += 1; // size of the piece
ret += p.getHeight() * p.getWidth() / 8;
ret += p.getHeight() * p.getWidth() % 8 == 0 ? 0 : 1; // add 1 if the size of the piece is not mult of 8
if(data){
ret += p.getPosition() != null ? 2: 1; // if the piece is not placed, only one byte else 2
}
}
return ret;
}
} }

View File

@ -10,13 +10,21 @@ public interface FileParser {
/** /**
* Parse the file and create a Map with its shape and pieces setup * Parse the file and create a Map with its shape and pieces setup
* Ignore the rest of the file! (ie: save data)
* *
* @param file file to parse * @param file file to parse
* @param saved_data does the saved data should be added to the map
* @return Map Object parsed with file data * @return Map Object parsed with file data
* @see "TODO: Add Specification when done" * @see "TODO: Add Specification when done"
*/ */
Map getLevel(File file) throws IOException; Map getLevel(File file, boolean saved_data) throws IOException;
/**
* Save Map to a file without all it's data
* Could be used for generating level file. might not be used in game.
* @param file the file where to save
* @param levelData the map to save
*/
void saveLevel(File file, Map levelData) throws FileNotFoundException;
/** /**
* Save Map to a file with all it's data * Save Map to a file with all it's data
@ -25,6 +33,8 @@ public interface FileParser {
*/ */
void saveLevelData(File file, Map levelData) throws IOException; void saveLevelData(File file, Map levelData) throws IOException;
// TODO: 3/18/23 tonitch: Add getSavedData, for when piece could be added to map file // TODO: 3/18/23 tonitch: Add getSavedData, for when piece could be added to map file
} }

View File

@ -7,6 +7,16 @@ import java.nio.file.Files;
public class JsonParser implements FileParser{ public class JsonParser implements FileParser{
@Override
public Map getSavedData(File file) {
return null;
}
@Override
public void saveLevel(File file, Map levelData) throws FileNotFoundException {
}
@Override @Override
public void saveLevelData(File file, Map levelData) throws IOException { public void saveLevelData(File file, Map levelData) throws IOException {
FileOutputStream fileStream = new FileOutputStream(file); FileOutputStream fileStream = new FileOutputStream(file);

View File

@ -0,0 +1,43 @@
package school_project.Parsers;
import org.junit.jupiter.api.Test;
import school_project.Map;
import school_project.Piece;
import school_project.Vec2;
import static org.junit.jupiter.api.Assertions.*;
class BinaryParserTest {
@Test
void getByteSizeForMap() {
boolean[][] map_shape = {
{ true, true, true },
{ true, false, true },
{ true, true, true },
};
boolean[][] piece1_shape = {
{ true, true },
{ true, false },
{ true, true },
};
boolean[][] piece2_shape = {
{ true },
{ true },
{ true },
};
Map map = new Map(map_shape);
Piece piece1 = new Piece(piece1_shape);
Piece piece2 = new Piece(piece2_shape);
map.addPiece(new Piece[]{piece1, piece2});
piece2.setPosition(new Vec2(0, 2));
assertEquals(15, BinaryParser.getByteSizeForMap(map, false));
assertEquals(18, BinaryParser.getByteSizeForMap(map, true));
}
}