From 09632306c7f1e00002868e130c47638360784173 Mon Sep 17 00:00:00 2001 From: Brian Rivas Date: Thu, 13 Jun 2024 13:08:25 -0700 Subject: [PATCH] added trial chamber exclusion --- .../dungeon/layout/ExclusionZones.java | 15 +++---- .../dungeon/layout/LayoutManager.java | 4 +- .../roguelike/util/StructureLocator.java | 39 ++++++------------- .../roguelike/util/StructureLocatorTest.java | 39 +++++++++++++++++++ 4 files changed, 57 insertions(+), 40 deletions(-) create mode 100644 src/test/com/greymerk/roguelike/util/StructureLocatorTest.java diff --git a/src/main/java/com/greymerk/roguelike/dungeon/layout/ExclusionZones.java b/src/main/java/com/greymerk/roguelike/dungeon/layout/ExclusionZones.java index f247f6e53..951b8cf16 100644 --- a/src/main/java/com/greymerk/roguelike/dungeon/layout/ExclusionZones.java +++ b/src/main/java/com/greymerk/roguelike/dungeon/layout/ExclusionZones.java @@ -4,11 +4,13 @@ import java.util.List; import java.util.Set; +import com.greymerk.roguelike.debug.Debug; import com.greymerk.roguelike.editor.Cardinal; import com.greymerk.roguelike.editor.Coord; import com.greymerk.roguelike.editor.IWorldEditor; import com.greymerk.roguelike.editor.boundingbox.BoundingBox; import com.greymerk.roguelike.editor.boundingbox.IBounded; +import com.greymerk.roguelike.util.StructureLocator; public class ExclusionZones { @@ -32,15 +34,10 @@ public boolean collides(IBounded room) { } public void scan(IWorldEditor editor, Coord pos, int range) { - /* - ChunkSet chunks = new ChunkSet(pos, range); - chunks.forEach(cpos -> { - if(StructureLocator.hasVillage(editor.getSeed(), cpos)) { - Coord village = Coord.of(cpos.getCenterAtY(0)); - this.add(village, 128); - Debug.info("village @: " + village); - } + Set trialChambers = StructureLocator.scan(editor.getSeed(), pos, StructureLocator.TRIAL_CHAMBER, range); + trialChambers.forEach(c -> { + this.add(c, 200); + Debug.info("Chamber @" + c); }); - */ } } diff --git a/src/main/java/com/greymerk/roguelike/dungeon/layout/LayoutManager.java b/src/main/java/com/greymerk/roguelike/dungeon/layout/LayoutManager.java index a7646aba1..1a8d811e2 100644 --- a/src/main/java/com/greymerk/roguelike/dungeon/layout/LayoutManager.java +++ b/src/main/java/com/greymerk/roguelike/dungeon/layout/LayoutManager.java @@ -7,7 +7,6 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.greymerk.roguelike.config.Config; -import com.greymerk.roguelike.debug.Debug; import com.greymerk.roguelike.debug.DebugLayout; import com.greymerk.roguelike.dungeon.Dungeon; import com.greymerk.roguelike.dungeon.Floor; @@ -38,7 +37,6 @@ public LayoutManager(Coord origin) { this.floors = createFloors(); this.settings = new DungeonSettingsDefault(); this.zones = new ExclusionZones(); - //this.zones.add(BoundingBox.of(new Coord(-150, 0, 50)).grow(Cardinal.all, 200)); } public void generate(IWorldEditor editor) { @@ -89,7 +87,7 @@ private void placeRoom(IRoom room, Random rand, Floor floor) { for(Cardinal dir : dirs) { Coord wp = potential.getWorldPos(floor.getOrigin()); if(zones.collides(room.getBoundingBox(wp, dir))) { - Debug.info("colliding at " + wp); + //Debug.info("colliding at " + wp); continue; } CellManager rcm = room.getCells(dir); diff --git a/src/main/java/com/greymerk/roguelike/util/StructureLocator.java b/src/main/java/com/greymerk/roguelike/util/StructureLocator.java index e3c1a1b17..0478b885f 100644 --- a/src/main/java/com/greymerk/roguelike/util/StructureLocator.java +++ b/src/main/java/com/greymerk/roguelike/util/StructureLocator.java @@ -1,13 +1,9 @@ package com.greymerk.roguelike.util; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.HashSet; +import java.util.Set; -import com.greymerk.roguelike.editor.Cardinal; import com.greymerk.roguelike.editor.Coord; -import com.greymerk.roguelike.editor.IWorldEditor; -import com.greymerk.roguelike.editor.boundingbox.BoundingBox; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.random.CheckedRandom; @@ -16,11 +12,7 @@ public enum StructureLocator { - VILLAGE; - - public static Coord locate(IWorldEditor editor, StructureLocator type, Coord pos, int radius) { - return search(editor.getSeed(), VILLAGE, pos, radius); - } + VILLAGE, TRIAL_CHAMBER; public static boolean hasVillage(long seed, ChunkPos cpos) { return hasStructure(seed, VILLAGE, cpos); @@ -29,6 +21,7 @@ public static boolean hasVillage(long seed, ChunkPos cpos) { public static boolean hasStructure(long seed, StructureLocator type, ChunkPos cpos) { switch(type) { case VILLAGE: return hasRandomScatteredStructure(seed, cpos, 34, 8, SpreadType.LINEAR, 10387312); + case TRIAL_CHAMBER: return hasRandomScatteredStructure(seed, cpos, 34, 12, SpreadType.LINEAR, 94251327); default: return false; } } @@ -49,26 +42,16 @@ public static boolean hasConcentricRingStructure(long seed, ChunkPos cpos) { return false; } - public static Coord search(long seed, StructureLocator type, Coord pos, int radius) { - ChunkPos cpos = pos.getChunkPos(); - - List locations = new ArrayList(); - - BoundingBox.of(new Coord(cpos.x, 0, cpos.z)) - .grow(Cardinal.directions, radius) - .forEach(c -> { - ChunkPos cp = new ChunkPos(c.getX(), c.getZ()); - if(hasStructure(seed, type, cp)) { - locations.add(Coord.of(cp)); - } - }); + public static Set scan(long seed, Coord origin, StructureLocator type, int range) { + Set locations = new HashSet(); - locations.sort(new Comparator() { - public int compare(Coord a, Coord b) { - return (int)a.distance(pos) - (int)b.distance(pos); + ChunkSet chunks = new ChunkSet(origin, range); + chunks.forEach(cpos -> { + if(hasStructure(seed, type, cpos)) { + locations.add(Coord.of(cpos.getCenterAtY(0))); } }); - return locations.getFirst(); + return locations; } } diff --git a/src/test/com/greymerk/roguelike/util/StructureLocatorTest.java b/src/test/com/greymerk/roguelike/util/StructureLocatorTest.java new file mode 100644 index 000000000..7e1cb5ee3 --- /dev/null +++ b/src/test/com/greymerk/roguelike/util/StructureLocatorTest.java @@ -0,0 +1,39 @@ +package com.greymerk.roguelike.util; + +import java.util.Set; + +import org.junit.jupiter.api.Test; + +import com.greymerk.roguelike.editor.Coord; + +class StructureLocatorTest { + + @Test + void testHasStructure() { + + long seed = 118167; + + assert(StructureLocator.hasStructure(seed, StructureLocator.VILLAGE, new Coord(112, 0, 48).getChunkPos())); + + assert(!StructureLocator.hasStructure(seed, StructureLocator.VILLAGE, new Coord(150, 0, 48).getChunkPos())); + + assert(StructureLocator.hasStructure(seed, StructureLocator.TRIAL_CHAMBER, new Coord(336, 0, 336).getChunkPos())); + + assert(!StructureLocator.hasStructure(seed, StructureLocator.TRIAL_CHAMBER, new Coord(300, 0, 336).getChunkPos())); + } + + @Test + void testScan() { + long seed = 118167; + + Coord origin = new Coord(336, 0 , 336).freeze(); + + Set locations = StructureLocator.scan(seed, origin, StructureLocator.TRIAL_CHAMBER, 100); + + locations.forEach(pos -> { + System.out.println(pos); + }); + + assert(locations.contains(Coord.of(origin.getChunkPos().getCenterAtY(0)))); + } +}