Various Updates #144
@@ -123,7 +123,7 @@ public class DungeonPack
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public DungeonData getNextDungeon(NewDimData dimension, Random random)
|
public DungeonData getNextDungeon(NewDimData parent, Random random)
|
||||||
{
|
{
|
||||||
if (allDungeons.isEmpty())
|
if (allDungeons.isEmpty())
|
||||||
{
|
{
|
||||||
@@ -136,13 +136,13 @@ public class DungeonPack
|
|||||||
//for dungeon packs that can extend arbitrarily deep. We should probably set a reasonable limit anyway.
|
//for dungeon packs that can extend arbitrarily deep. We should probably set a reasonable limit anyway.
|
||||||
|
|
||||||
int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : MAX_HISTORY_LENGTH;
|
int maxSearchLength = config.allowDuplicatesInChain() ? maxRuleLength : MAX_HISTORY_LENGTH;
|
||||||
ArrayList<DungeonData> history = DungeonHelper.getDungeonChainHistory(dimension, this, maxSearchLength);
|
ArrayList<DungeonData> history = DungeonHelper.getDungeonChainHistory(parent, this, maxSearchLength);
|
||||||
|
|
||||||
ArrayList<DungeonData> subtreeHistory;
|
ArrayList<DungeonData> subtreeHistory;
|
||||||
/*if (config.getDuplicateSearchLevels() > 0)
|
/*if (config.getDuplicateSearchLevels() > 0)
|
||||||
{
|
{
|
||||||
subtreeHistory = DungeonHelper.getFlatDungeonTree(
|
subtreeHistory = DungeonHelper.getFlatDungeonTree(
|
||||||
DungeonHelper.getAncestor(dimension, config.getDuplicateSearchLevels()),
|
DungeonHelper.getAncestor(parent, config.getDuplicateSearchLevels()),
|
||||||
MAX_SUBTREE_LIST_SIZE);
|
MAX_SUBTREE_LIST_SIZE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -231,10 +231,13 @@ public class DungeonHelper
|
|||||||
return dungeonPackMapping.get(name.toUpperCase());
|
return dungeonPackMapping.get(name.toUpperCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
private DungeonPack getDimDungeonPack(NewDimData data)
|
private DungeonPack getDimDungeonPack(NewDimData dimension)
|
||||||
{
|
{
|
||||||
|
// TODO: Drop support for dim-based packs and switch to embedding the pack
|
||||||
|
// in the link data itself. That would solve the dungeon pre-generation issue.
|
||||||
|
|
||||||
DungeonPack pack;
|
DungeonPack pack;
|
||||||
DungeonData dungeon = data.dungeon();
|
DungeonData dungeon = dimension.dungeon();
|
||||||
if (dungeon != null)
|
if (dungeon != null)
|
||||||
{
|
{
|
||||||
pack = dungeon.dungeonType().Owner;
|
pack = dungeon.dungeonType().Owner;
|
||||||
@@ -247,7 +250,7 @@ public class DungeonHelper
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (data.id() == NETHER_DIMENSION_ID)
|
if (dimension.id() == NETHER_DIMENSION_ID)
|
||||||
{
|
{
|
||||||
pack = NetherPack;
|
pack = NetherPack;
|
||||||
}
|
}
|
||||||
@@ -500,9 +503,9 @@ public class DungeonHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public DungeonData selectDungeon(NewDimData dimension, Random random)
|
public DungeonData selectNextDungeon(NewDimData parent, Random random)
|
||||||
{
|
{
|
||||||
DungeonPack pack = getDimDungeonPack(dimension.parent());
|
DungeonPack pack = getDimDungeonPack(parent);
|
||||||
DungeonData selection;
|
DungeonData selection;
|
||||||
DungeonPackConfig config;
|
DungeonPackConfig config;
|
||||||
DungeonPack selectedPack;
|
DungeonPack selectedPack;
|
||||||
@@ -517,13 +520,13 @@ public class DungeonHelper
|
|||||||
{
|
{
|
||||||
// Calculate the chance of switching to a different pack type
|
// Calculate the chance of switching to a different pack type
|
||||||
int packSwitchChance;
|
int packSwitchChance;
|
||||||
if (dimension.depth() == 1)
|
if (parent.isPocketDimension())
|
||||||
{
|
{
|
||||||
packSwitchChance = START_PACK_SWITCH_CHANCE;
|
packSwitchChance = MIN_PACK_SWITCH_CHANCE + parent.packDepth() * PACK_SWITCH_CHANCE_PER_LEVEL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
packSwitchChance = MIN_PACK_SWITCH_CHANCE + dimension.parent().packDepth() * PACK_SWITCH_CHANCE_PER_LEVEL;
|
packSwitchChance = START_PACK_SWITCH_CHANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decide randomly whether to switch packs or not
|
// Decide randomly whether to switch packs or not
|
||||||
@@ -535,7 +538,7 @@ public class DungeonHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Pick the next dungeon
|
//Pick the next dungeon
|
||||||
selection = selectedPack.getNextDungeon(dimension, random);
|
selection = selectedPack.getNextDungeon(parent, random);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -609,34 +612,42 @@ public class DungeonHelper
|
|||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<DungeonData> getDungeonChainHistory(NewDimData dimension, DungeonPack pack, int maxSize)
|
/**
|
||||||
|
* Lists all of the dungeons found by iterating through a dimension's ancestors. The search stops when a non-dungeon dimension is found or when the pack of a dungeon differs from the specified pack.
|
||||||
|
* @param start - the first dimension to include in the history
|
||||||
|
* @param pack - the pack to which any dungeons must belong in order to be listed
|
||||||
|
* @param maxSize - the maximum number of dungeons that can be listed
|
||||||
|
* @return a list of dungeons used in a given chain
|
||||||
|
*/
|
||||||
|
public static ArrayList<DungeonData> getDungeonChainHistory(NewDimData start, DungeonPack pack, int maxSize)
|
||||||
{
|
{
|
||||||
if (dimension == null)
|
if (start == null)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("dimension cannot be null.");
|
throw new IllegalArgumentException("dimension cannot be null.");
|
||||||
}
|
}
|
||||||
if (dimension.parent() == null)
|
|
||||||
{
|
|
||||||
return new ArrayList<DungeonData>();
|
|
||||||
}
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
NewDimData tail = dimension.parent();
|
NewDimData current = start;
|
||||||
DungeonData dungeon = tail.dungeon();
|
DungeonData dungeon = current.dungeon();
|
||||||
ArrayList<DungeonData> history = new ArrayList<DungeonData>();
|
ArrayList<DungeonData> history = new ArrayList<DungeonData>();
|
||||||
|
|
||||||
while (count < maxSize && dungeon != null && dungeon.dungeonType().Owner == pack)
|
while (count < maxSize && dungeon != null && dungeon.dungeonType().Owner == pack)
|
||||||
{
|
{
|
||||||
history.add(dungeon);
|
history.add(dungeon);
|
||||||
tail = tail.parent();
|
current = current.parent();
|
||||||
dungeon = tail.dungeon();
|
dungeon = current.dungeon();
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
return history;
|
return history;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<DungeonData> getFlatDungeonTree(NewDimData dimension, int maxSize)
|
/**
|
||||||
|
* Performs a breadth-first listing of all dungeons rooted at a specified dimension. Only dungeons from the same pack as the root will be included.
|
||||||
|
* @param root - the pocket dimension that serves as the root for the dungeon tree
|
||||||
|
* @param maxSize - the maximum number of dungeons that can be listed
|
||||||
|
* @return a list of the dungeons used in a given dungeon tree
|
||||||
|
*/
|
||||||
|
public static ArrayList<DungeonData> listDungeonsInTree(NewDimData root, int maxSize)
|
||||||
{
|
{
|
||||||
NewDimData root = dimension;
|
|
||||||
ArrayList<DungeonData> dungeons = new ArrayList<DungeonData>();
|
ArrayList<DungeonData> dungeons = new ArrayList<DungeonData>();
|
||||||
Queue<NewDimData> pendingDimensions = new LinkedList<NewDimData>();
|
Queue<NewDimData> pendingDimensions = new LinkedList<NewDimData>();
|
||||||
|
|
||||||
|
|||||||
@@ -186,7 +186,6 @@ public class PocketBuilder
|
|||||||
schematic = loadAndValidateDungeon(dungeon, properties);
|
schematic = loadAndValidateDungeon(dungeon, properties);
|
||||||
|
|
||||||
return PocketBuilder.buildDungeonPocket(dungeon, dimension, link, schematic, world, properties);
|
return PocketBuilder.buildDungeonPocket(dungeon, dimension, link, schematic, world, properties);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -206,10 +205,18 @@ public class PocketBuilder
|
|||||||
throw new IllegalArgumentException("link cannot have a destination assigned already.");
|
throw new IllegalArgumentException("link cannot have a destination assigned already.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Choose a dungeon to generate
|
||||||
|
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
||||||
|
Pair<DungeonData, DungeonSchematic> pair = selectNextDungeon(parent, random, properties);
|
||||||
|
if (pair == null)
|
||||||
|
{
|
||||||
|
System.err.println("Could not select a dungeon for generation!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DungeonData dungeon = pair.getFirst();
|
||||||
|
DungeonSchematic schematic = pair.getSecond();
|
||||||
|
|
||||||
//Register a new dimension
|
//Register a new dimension
|
||||||
NewDimData parent = PocketManager.getDimensionData(link.source().getDimension());
|
|
||||||
NewDimData dimension = PocketManager.registerPocket(parent, true);
|
NewDimData dimension = PocketManager.registerPocket(parent, true);
|
||||||
|
|
||||||
//Load a world
|
//Load a world
|
||||||
@@ -221,16 +228,6 @@ public class PocketBuilder
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Choose a dungeon to generate
|
|
||||||
Pair<DungeonData, DungeonSchematic> pair = selectDungeon(dimension, random, properties);
|
|
||||||
if (pair == null)
|
|
||||||
{
|
|
||||||
System.err.println("Could not select a dungeon for generation!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
DungeonData dungeon = pair.getFirst();
|
|
||||||
DungeonSchematic schematic = pair.getSecond();
|
|
||||||
|
|
||||||
return buildDungeonPocket(dungeon, dimension, link, schematic, world, properties);
|
return buildDungeonPocket(dungeon, dimension, link, schematic, world, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,18 +248,12 @@ public class PocketBuilder
|
|||||||
return linkDestination;
|
return linkDestination;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Pair<DungeonData, DungeonSchematic> selectDungeon(NewDimData dimension, Random random, DDProperties properties)
|
private static Pair<DungeonData, DungeonSchematic> selectNextDungeon(NewDimData parent, Random random, DDProperties properties)
|
||||||
{
|
{
|
||||||
//We assume the dimension doesn't have a dungeon assigned
|
|
||||||
if (dimension.dungeon() != null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("dimension cannot have a dungeon assigned already.");
|
|
||||||
}
|
|
||||||
|
|
||||||
DungeonData dungeon = null;
|
DungeonData dungeon = null;
|
||||||
DungeonSchematic schematic = null;
|
DungeonSchematic schematic = null;
|
||||||
|
|
||||||
dungeon = DungeonHelper.instance().selectDungeon(dimension, random);
|
dungeon = DungeonHelper.instance().selectNextDungeon(parent, random);
|
||||||
|
|
||||||
if (dungeon != null)
|
if (dungeon != null)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user