Добавить production-состояния тел

This commit is contained in:
2026-08-19 06:34:40 +03:00
parent dc2ebcbf8c
commit 19bb64edfb
21 changed files with 580 additions and 31 deletions
@@ -68,4 +68,34 @@ public final class CorpseManagerTest {
CorpseManager.Body foreign = new CorpseManager(1).register("SAW", 0f, 0f);
assertFalse(manager.transform(foreign, CorpseManager.Transformation.FROZEN));
}
@Test
public void burnedBodyRemainsPhysicalButCannotActivatePressureMechanisms() {
CorpseManager manager = new CorpseManager(2);
CorpseManager.Body body = manager.register("FIRE", 10f, 20f);
assertTrue(manager.transform(body, CorpseManager.Transformation.BURNED));
assertTrue(body.burned());
assertFalse(body.crushed());
assertFalse(body.activatesPressure());
assertTrue(manager.bodies().contains(body));
}
@Test
public void crushedBodyKeepsOtherTransformationsAndExposesItsLowProfile() {
CorpseManager manager = new CorpseManager(2);
CorpseManager.Body body = manager.register("CRUSH", 10f, 20f)
.size(140f, 24f);
assertTrue(manager.transform(body, CorpseManager.Transformation.PINNED));
assertTrue(manager.transform(body, CorpseManager.Transformation.CRUSHED));
assertTrue(body.crushed());
assertFalse(body.burned());
assertTrue(body.pinned());
assertTrue(body.activatesPressure());
assertEquals(140f, body.width(), 0f);
assertEquals(24f, body.height(), 0f);
}
}
@@ -12,9 +12,9 @@ import java.util.Set;
public final class LevelCatalogTest {
@Test
public void productionCatalogContainsFourHazardTeachingLevelsAfterTheVerticalSlice() {
public void productionCatalogContainsHazardsAndTwoCorpseStateTeachingLevels() {
List<LevelDefinition> levels = LevelCatalog.all();
assertEquals(14, levels.size());
assertEquals(16, levels.size());
Set<String> titles = new HashSet<>();
for (int i = 0; i < levels.size(); i++) {
LevelDefinition level = levels.get(i);
@@ -26,6 +26,9 @@ public final class LevelCatalogTest {
assertTrue(levels.get(11).containsMechanic(LevelDefinition.HazardType.FIRE));
assertTrue(levels.get(12).containsMechanic(LevelDefinition.HazardType.PROJECTILE));
assertTrue(levels.get(13).containsMechanic(LevelDefinition.HazardType.EXPLOSION));
assertTrue(levels.get(14).containsMechanic(LevelDefinition.HazardType.CRUSHER));
assertTrue(levels.get(15).containsMechanic(LevelDefinition.HazardType.FIRE));
assertFalse(levels.get(15).platforms.get(1).controlId.isEmpty());
}
@Test
@@ -8,8 +8,8 @@ import org.junit.Test;
public final class LevelPageTest {
@Test
public void fourteenLevelsUseTwoBoundedTenCardPages() {
LevelPage page = new LevelPage(14, 10);
public void sixteenLevelsUseTwoBoundedTenCardPages() {
LevelPage page = new LevelPage(16, 10);
assertEquals(2, page.pageCount());
assertEquals(0, page.firstIndex());
@@ -19,7 +19,7 @@ public final class LevelPageTest {
page.next();
assertEquals(10, page.firstIndex());
assertEquals(14, page.endExclusive());
assertEquals(16, page.endExclusive());
assertTrue(page.hasPrevious());
assertFalse(page.hasNext());
@@ -27,7 +27,7 @@ public final class LevelPageTest {
assertEquals(1, page.pageIndex());
page.selectIndex(3);
assertEquals(0, page.pageIndex());
page.selectIndex(13);
page.selectIndex(15);
assertEquals(1, page.pageIndex());
}
}
@@ -27,6 +27,8 @@ public final class VersionedSessionCodecTest {
assertEquals(2, restored.bodies().size());
assertTrue(restored.bodies().get(0).pinned());
assertTrue(restored.bodies().get(1).conductive());
assertTrue(restored.bodies().get(0).crushed());
assertTrue(restored.bodies().get(1).burned());
assertEquals(Arrays.asList(1.25f, 3.5f), restored.platformMotionTimes());
assertTrue(restored.toggleSignals().get("gate"));
assertEquals(2.25f, restored.timedSignals().get("clock"), 0f);
@@ -43,6 +45,19 @@ public final class VersionedSessionCodecTest {
decoded.snapshot().saveVersion());
assertTrue(decoded.snapshot().previousSwitchContacts().isEmpty());
assertEquals(2, decoded.snapshot().bodies().size());
assertFalse(decoded.snapshot().bodies().get(0).crushed());
assertFalse(decoded.snapshot().bodies().get(1).burned());
}
@Test
public void legacyV2MigratesWithSafeDefaultCorpseStates() {
VersionedSessionCodec.DecodeResult decoded = VersionedSessionCodec.decode(
VersionedSessionCodec.encodeLegacyV2(sampleSnapshot()));
assertEquals(VersionedSessionCodec.Status.MIGRATED, decoded.status());
assertTrue(decoded.snapshot().previousSwitchContacts().get("gate@420.0"));
assertFalse(decoded.snapshot().bodies().get(0).crushed());
assertFalse(decoded.snapshot().bodies().get(1).burned());
}
@Test
@@ -84,10 +99,12 @@ public final class VersionedSessionCodecTest {
0.1f, 0.08f, -1, -1))
.addBody(new GameSessionSnapshot.BodyData(
500f, 826f, 72f, 54f, 0f, 0f,
false, false, true, true, -1, "SPIKE"))
false, false, true, true, true, false,
-1, "CRUSH"))
.addBody(new GameSessionSnapshot.BodyData(
720f, 826f, 72f, 54f, 0f, 0f,
false, true, true, true, -1, "ELECTRIC"))
false, true, true, true, false, true,
-1, "FIRE"))
.platformMotionTimes(Arrays.asList(1.25f, 3.5f))
.toggleSignal("gate", true)
.timedSignal("clock", 2.25f)