Partial Dungeon Pack and Configurable Dungeon Chain Implementation #67

Merged
SenseiKiwi merged 9 commits from DungeonPacks into master 2013-08-18 15:24:50 +00:00
2 changed files with 53 additions and 13 deletions
Showing only changes of commit dc7289a048 - Show all commits

View File

@@ -42,16 +42,9 @@ public class SchematicLoader
if (dimList.get(destDimID).dungeonGenerator == null) if (dimList.get(destDimID).dungeonGenerator == null)
{ {
//The following initialization code is based on code from ChunkProviderGenerate.
//It makes our generation depend on the world seed. We have an additional seed here
//to prevent correlations between the selected dungeons and the locations of gateways.
//TODO: We should centralize RNG initialization and world-seed modifiers for each specific application. //TODO: We should centralize RNG initialization and world-seed modifiers for each specific application.
final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L ^ computeDestinationHash(link);
final long localSeed = world.getSeed() ^ 0x2F50DB9B4A8057E4L; final Random random = new Random(localSeed);
final Random random = new Random();
final long factorA = random.nextLong() / 2L * 2L + 1L;
final long factorB = random.nextLong() / 2L * 2L + 1L;
random.setSeed((link.destXCoord >> 4) * factorA + (link.destZCoord >> 4) * factorB ^ localSeed);
dungeonHelper.generateDungeonLink(link, dungeonHelper.RuinsPack, random); dungeonHelper.generateDungeonLink(link, dungeonHelper.RuinsPack, random);
} }
@@ -160,4 +153,44 @@ public class SchematicLoader
} }
return dungeon; return dungeon;
} }
private static long computeDestinationHash(LinkData link)
{
//Time for some witchcraft.
//The code here is inspired by a discussion on Stack Overflow regarding hash codes for 3D.
//Source: http://stackoverflow.com/questions/9858376/hashcode-for-3d-integer-coordinates-with-high-spatial-coherence
//Use 8 bits from Y and 24 bits from X and Z. Mix in 8 bits from the destination dim ID too - that means
//even if you aligned two doors perfectly between two pockets, it's unlikely they would lead to the same dungeon.
int bit;
int index;
long hash;
int w = link.destDimID;
int x = link.destXCoord;
int y = link.destYCoord;
int z = link.destZCoord;
hash = 0;
index = 0;
for (bit = 0; bit < 8; bit++)
{
hash |= ((w >> bit) & 1) << index;
index++;
hash |= ((x >> bit) & 1) << index;
index++;
hash |= ((y >> bit) & 1) << index;
index++;
hash |= ((z >> bit) & 1) << index;
index++;
}
for (; bit < 24; bit++)
{
hash |= ((x >> bit) & 1) << index;
index++;
hash |= ((z >> bit) & 1) << index;
index++;
}
return hash;
}
} }

View File

@@ -114,10 +114,17 @@ public class DungeonHelper
//It'll be removed later when we read dungeon configurations from files. //It'll be removed later when we read dungeon configurations from files.
ArrayList<DungeonChainRuleDefinition> rules = new ArrayList<DungeonChainRuleDefinition>(); ArrayList<DungeonChainRuleDefinition> rules = new ArrayList<DungeonChainRuleDefinition>();
rules.add(parseDefinitionUnsafe("? ? ? -> DeadEnd Exit"));
rules.add(parseDefinitionUnsafe("Trap -> ?")); rules.add(parseDefinitionUnsafe("? ? ? ? ? ? ? ? -> Trap#20 SimpleHall#40 ComplexHall#10 Exit#20 DeadEnd#10"));
rules.add(parseDefinitionUnsafe("Hub -> Trap"));
rules.add(parseDefinitionUnsafe("? -> Hub")); rules.add(parseDefinitionUnsafe("? ? ? ? -> Trap#18 SimpleHall#40 ComplexHall#10 Exit#18 DeadEnd#10 Hub#4"));
rules.add(parseDefinitionUnsafe("? ? ? -> ComplexHall Hub Trap SimpleHall Maze"));
rules.add(parseDefinitionUnsafe("? ? -> ComplexHall Hub Trap SimpleHall Maze"));
rules.add(parseDefinitionUnsafe("? -> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10"));
rules.add(parseDefinitionUnsafe("-> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10")); rules.add(parseDefinitionUnsafe("-> ComplexHall#40 Hub#30 Trap#10 SimpleHall#10 Maze#10"));
String[] typeNames = "Hub Trap Maze Exit DeadEnd SimpleHall ComplexHall".toUpperCase().split(" "); String[] typeNames = "Hub Trap Maze Exit DeadEnd SimpleHall ComplexHall".toUpperCase().split(" ");