diff --git a/core/src/main/java/com/openeggbert/entity/common/SpriteAnimation.java b/core/src/main/java/com/openeggbert/entity/sprites/SpriteAnimation.java similarity index 96% rename from core/src/main/java/com/openeggbert/entity/common/SpriteAnimation.java rename to core/src/main/java/com/openeggbert/entity/sprites/SpriteAnimation.java index 591ed60..3ad725e 100644 --- a/core/src/main/java/com/openeggbert/entity/common/SpriteAnimation.java +++ b/core/src/main/java/com/openeggbert/entity/sprites/SpriteAnimation.java @@ -19,7 +19,7 @@ /////////////////////////////////////////////////////////////////////////////////////////////// -package com.openeggbert.entity.common; +package com.openeggbert.entity.sprites; /** * diff --git a/core/src/main/java/com/openeggbert/entity/common/SpriteGroup.java b/core/src/main/java/com/openeggbert/entity/sprites/SpriteGroup.java similarity index 94% rename from core/src/main/java/com/openeggbert/entity/common/SpriteGroup.java rename to core/src/main/java/com/openeggbert/entity/sprites/SpriteGroup.java index 1a446ba..0ffd011 100644 --- a/core/src/main/java/com/openeggbert/entity/common/SpriteGroup.java +++ b/core/src/main/java/com/openeggbert/entity/sprites/SpriteGroup.java @@ -19,7 +19,7 @@ /////////////////////////////////////////////////////////////////////////////////////////////// -package com.openeggbert.entity.common; +package com.openeggbert.entity.sprites; import com.openeggbert.compatibility.ReleaseVersion; import lombok.Getter; @@ -29,7 +29,7 @@ import lombok.Getter; * @author robertvokac */ public enum SpriteGroup { - AAA(ReleaseVersion.ONE); + YELLOW_EGGBERT_BORN(ReleaseVersion.ONE); @Getter private ReleaseVersion releaseVersion; SpriteGroup(ReleaseVersion releaseVersion) { diff --git a/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheet.java b/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheet.java new file mode 100644 index 0000000..8035570 --- /dev/null +++ b/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheet.java @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////////////////////// +// Open Eggbert: Free recreation of the computer game Speedy Eggbert. +// Copyright (C) 2024 the original author or authors. +// +// This program is free software: you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation, either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see +// or write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +/////////////////////////////////////////////////////////////////////////////////////////////// +package com.openeggbert.entity.sprites; + +import com.openeggbert.entity.common.OpenEggbertException; +import com.openeggbert.utils.OpenEggbertUtils; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * + * @author robertvokac + */ +public class SpriteSheet { + + public static final String DELIMITER = ";"; + + private final Map columnIndexesForNames = new HashMap<>(); + private final Map rowMap = new HashMap<>(); + + public SpriteSheet(String csv) { + //List rows = new ArrayList<>(); + List lines = Arrays.asList(csv.split("\n")); + + String[] header = lines.get(0).split(DELIMITER); + for (int i = 0; i < header.length; i++) { + String columnName = header[i]; + if (columnIndexesForNames.containsKey(columnName)) { + throw new OpenEggbertException("Invalid sprite sheet. It has invalid the first row (column names). Column is more than once: " + columnName); + } + Optional optionalSpriteSheetRowColumn = Arrays.asList(com.openeggbert.entity.sprites.SpriteSheetRowColumn.values()).stream().filter(r -> r.getColumnName().equals(columnName)).findFirst(); + if (!optionalSpriteSheetRowColumn.isPresent()) { + continue; + } + columnIndexesForNames.put(columnName, i); + } + + lines.stream().skip(1) + .forEach(line -> { + SpriteSheetRow row = new SpriteSheetRow(line, columnIndexesForNames); + //rows.add(row); + rowMap.put(row.createId(), row); + }); + } + public SpriteSheetRow findSpriteSheetRow(SpriteGroup group, int numberInGroup) { + String id = SpriteSheetRow.createId(group.name(), numberInGroup); + SpriteSheetRow row = rowMap.get(id); + + return row; + } +} diff --git a/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheetRow.java b/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheetRow.java new file mode 100644 index 0000000..2f9a08d --- /dev/null +++ b/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheetRow.java @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////////////////////////// +// Open Eggbert: Free recreation of the computer game Speedy Eggbert. +// Copyright (C) 2024 the original author or authors. +// +// This program is free software: you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation, either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see +// or write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +/////////////////////////////////////////////////////////////////////////////////////////////// +package com.openeggbert.entity.sprites; + +import com.openeggbert.entity.common.OpenEggbertException; +import com.openeggbert.utils.OpenEggbertUtils; +import java.util.Map; +import java.util.function.Function; +import lombok.Getter; + +/** + * + * @author robertvokac + */ +@Getter +public class SpriteSheetRow { + + private static final String COLONCOLON = ";;"; + + private String file; + private String group; + private int numberInGroup; + private int row; + private int column; + private int x; + private int y; + private int width; + private int height; + private String notes; + private String tags; + private int numberPerSheet; + + public static String createId(SpriteSheetRow row) { + return createId(row.getGroup(), row.getNumberInGroup()); + } + + public static String createId(String group, int numberInGroup) { + return group + COLONCOLON + numberInGroup; + } + + public String createId() { + return createId(this); + } + + public SpriteSheetRow(String line, Map columnIndexesForNames) { + String[] columns = line.split(SpriteSheet.DELIMITER); + Function findString = c -> columnIndexesForNames.containsKey(c.getColumnName()) ? columns[columnIndexesForNames.get(c.getColumnName())] : ""; + Function findInt = c -> { + String s = findString.apply(c); + if (s.isEmpty()) { + throw new OpenEggbertException("Missing value for column: " + c.getColumnName()); + }; + return Integer.valueOf(s); + }; + + file = findString.apply(SpriteSheetRowColumn.FILE); + group = findString.apply(SpriteSheetRowColumn.GROUP); + numberInGroup = findInt.apply(SpriteSheetRowColumn.NUMBER_IN_GROUP); + row = findInt.apply(SpriteSheetRowColumn.ROW); + column = findInt.apply(SpriteSheetRowColumn.COLUMN); + x = findInt.apply(SpriteSheetRowColumn.X); + y = findInt.apply(SpriteSheetRowColumn.Y); + width = findInt.apply(SpriteSheetRowColumn.WIDTH); + height = findInt.apply(SpriteSheetRowColumn.HEIGHT); + notes = findString.apply(SpriteSheetRowColumn.NOTES); + tags = findString.apply(SpriteSheetRowColumn.TAGS); + int numberPerSheet = findInt.apply(SpriteSheetRowColumn.FILE); + if (file.isEmpty()) { + throw new OpenEggbertException("Missing mandatory value for column: " + SpriteSheetRowColumn.FILE); + } + if (group.isEmpty()) { + throw new OpenEggbertException("Missing mandatory value for column: " + SpriteSheetRowColumn.GROUP); + } + } +} diff --git a/core/src/main/java/com/openeggbert/entity/common/SpriteSheet.java b/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheetRowColumn.java similarity index 63% rename from core/src/main/java/com/openeggbert/entity/common/SpriteSheet.java rename to core/src/main/java/com/openeggbert/entity/sprites/SpriteSheetRowColumn.java index 541663c..aeaa4f1 100644 --- a/core/src/main/java/com/openeggbert/entity/common/SpriteSheet.java +++ b/core/src/main/java/com/openeggbert/entity/sprites/SpriteSheetRowColumn.java @@ -17,14 +17,32 @@ // or write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. /////////////////////////////////////////////////////////////////////////////////////////////// +package com.openeggbert.entity.sprites; - -package com.openeggbert.entity.common; +import lombok.Getter; /** - * + * Represents a row in a sprite sheet. + * This class is responsible for parsing and serializing sprite sheet rows from/to CSV format. + * * @author robertvokac */ -public class SpriteSheet { - +public enum SpriteSheetRowColumn { + FILE("File"), + GROUP("Group"), + NUMBER_IN_GROUP("Number in Group"), + ROW("Row"), + COLUMN("Column"), + X("X"), + Y("Y"), + WIDTH("Width"), + HEIGHT("Height"), + NOTES("Notes"), + TAGS("Tags"), + NUMBER_PER_FILE("Number per file"); + @Getter + private final String columnName; + SpriteSheetRowColumn(String columnName) { + this.columnName = columnName; + } }