Skip to content
This repository was archived by the owner on Jan 8, 2023. It is now read-only.

Commit 9c413f4

Browse files
committed
Changes the way of state extraction
StateExtractor won't override duplicate state so dmi slurping will produce result similar to byond variant.
1 parent bd94eb2 commit 9c413f4

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

src/main/java/io/github/spair/byond/dmi/slurper/StateExtractor.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.github.spair.byond.dmi.DmiMetaEntry;
66
import io.github.spair.byond.dmi.DmiSprite;
77
import io.github.spair.byond.dmi.SpriteDir;
8+
import lombok.val;
89

910
import java.awt.Graphics;
1011
import java.awt.image.BufferedImage;
@@ -31,6 +32,13 @@ static Map<String, DmiState> extractStates(final BufferedImage dmiImage, final D
3132
Map<String, DmiState> dmiStates = new HashMap<>();
3233

3334
for (DmiMetaEntry metaEntry : dmiMeta.getMetas()) {
35+
val stateName = metaEntry.getName();
36+
37+
if (dmiStates.containsKey(stateName)) {
38+
dmiStates.get(stateName).setDuplicate(true);
39+
continue;
40+
}
41+
3442
List<DmiSprite> allSprites = new ArrayList<>();
3543

3644
for (int frameNumber = 1; frameNumber <= metaEntry.getFrames(); frameNumber++) {
@@ -50,13 +58,12 @@ static Map<String, DmiState> extractStates(final BufferedImage dmiImage, final D
5058
}
5159
}
5260

53-
DmiState dmiState = new DmiState();
61+
val dmiState = new DmiState();
5462

5563
dmiState.setMeta(metaEntry);
5664
dmiState.setSprites(distributeAllSpritesInMap(allSprites));
57-
dmiState.setDuplicate(dmiStates.containsKey(metaEntry.getName()));
5865

59-
dmiStates.put(metaEntry.getName(), dmiState);
66+
dmiStates.put(stateName, dmiState);
6067
}
6168

6269
return dmiStates;

src/test/java/io/github/spair/byond/dmi/slurper/StateExtractorTest.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
import org.junit.Test;
88

99
import javax.imageio.ImageIO;
10+
import java.awt.image.BufferedImage;
1011
import java.io.File;
1112
import java.util.Arrays;
1213
import java.util.Map;
1314

1415
import static org.junit.Assert.assertEquals;
16+
import static org.junit.Assert.assertTrue;
1517

18+
@SuppressWarnings("OptionalGetWithoutIsPresent")
1619
public class StateExtractorTest {
1720

1821
@Test
@@ -28,7 +31,8 @@ public void testExtractStates() throws Exception {
2831
)
2932
);
3033

31-
Map<String, DmiState> states = StateExtractor.extractStates(ImageIO.read(new File("src/test/resources/rollerbed_with_move.dmi")), meta);
34+
BufferedImage img = ImageIO.read(new File("src/test/resources/rollerbed_with_move.dmi"));
35+
Map<String, DmiState> states = StateExtractor.extractStates(img, meta);
3236

3337
assertEquals(meta.getMetas().get(0), states.get("down").getMeta());
3438
assertEquals(meta.getMetas().get(1), states.get("down (M)").getMeta());
@@ -41,4 +45,25 @@ public void testExtractStates() throws Exception {
4145

4246
assertEquals(states.get("down").getSprite(SpriteDir.SOUTH), states.get("down (M)").getSprite(SpriteDir.SOUTH));
4347
}
48+
49+
@Test
50+
public void testExtractStatesWithDuplicates() throws Exception {
51+
DmiMeta meta = new DmiMeta();
52+
meta.setSpritesHeight(32);
53+
meta.setSpritesWidth(32);
54+
55+
meta.setMetas(
56+
Arrays.asList(
57+
new DmiMetaEntry("down", 1, 1, null, false, false, false, null),
58+
new DmiMetaEntry("down", 4, 1, null, false, false, false, null)
59+
)
60+
);
61+
62+
BufferedImage img = ImageIO.read(new File("src/test/resources/rollerbed_duplicate_states.dmi"));
63+
Map<String, DmiState> states = StateExtractor.extractStates(img, meta);
64+
65+
assertEquals(1, states.size());
66+
assertEquals("state extractor should consider first met state as main", 1, states.get("down").getMeta().getDirs());
67+
assertTrue(states.get("down").isDuplicate());
68+
}
4469
}
-1.21 KB
Binary file not shown.

0 commit comments

Comments
 (0)