Improved DungeonHelper

Completed changes so that our code uses registerDungeon() (formerly
registerCustomDungeons() ) to register all dungeons, both bundled with
the mod and custom ones. Made some changes to the code to hide
implementation details from other classes. Also, I had some problems
with old dungeons being mixed into the renamed ones. I had to remove
fallingTNThall from the schematics folder and deleted the WIP folder
because I think we have completed versions of those schematics already.

Some of our dungeons have pre-filled chests and the contents are more
generous than our current loot system (e.g. ruinsO has a prefilled
chest). I'll have to wipe all the chests later.
This commit is contained in:
SenseiKiwi 2013-08-01 13:00:27 -04:00
parent a174ad4b29
commit 0b9f8fa5d5
7 changed files with 150 additions and 15 deletions

View file

@ -71,7 +71,9 @@ public class SchematicLoader
//TODO: In the future, remove this dungeon from the generation lists altogether. //TODO: In the future, remove this dungeon from the generation lists altogether.
//That will have to wait until our code is updated to support that more easily. //That will have to wait until our code is updated to support that more easily.
System.err.println("The dungeon will not be loaded."); System.err.println("The dungeon will not be loaded.");
dungeon = checkSourceAndLoad(DungeonHelper.instance().defaultBreak.schematicPath); DungeonGenerator defaultError = DungeonHelper.instance().getDefaultErrorDungeon();
dimList.get(destDimID).dungeonGenerator = defaultError;
dungeon = checkSourceAndLoad(defaultError.schematicPath);
dungeon.applyImportFilters(properties); dungeon.applyImportFilters(properties);
} }

View file

@ -132,7 +132,7 @@ public class CommandExportDungeon extends DDCommandBase
if (dungeonHelper.exportDungeon(player.worldObj, x, y, z, exportPath)) if (dungeonHelper.exportDungeon(player.worldObj, x, y, z, exportPath))
{ {
player.sendChatToPlayer("Saved dungeon schematic in " + exportPath); player.sendChatToPlayer("Saved dungeon schematic in " + exportPath);
dungeonHelper.registerCustomDungeon(new File(exportPath)); dungeonHelper.registerDungeon(exportPath, false, true);
return DDCommandResult.SUCCESS; return DDCommandResult.SUCCESS;
} }
else else

View file

@ -1,6 +1,9 @@
package StevenDimDoors.mod_pocketDim.helpers; package StevenDimDoors.mod_pocketDim.helpers;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@ -28,6 +31,11 @@ public class DungeonHelper
public static final Pattern SchematicNamePattern = Pattern.compile("[A-Za-z0-9_\\-]+"); public static final Pattern SchematicNamePattern = Pattern.compile("[A-Za-z0-9_\\-]+");
public static final Pattern DungeonNamePattern = Pattern.compile("[A-Za-z0-9\\-]+"); public static final Pattern DungeonNamePattern = Pattern.compile("[A-Za-z0-9\\-]+");
private static final String DEFAULT_UP_SCHEMATIC_PATH = "/schematics/core/simpleStairsUp.schematic";
private static final String DEFAULT_DOWN_SCHEMATIC_PATH = "/schematics/core/simpleStairsDown.schematic";
private static final String DEFAULT_ERROR_SCHEMATIC_PATH = "/schematics/core/somethingBroke.schematic";
private static final String BUNDLED_DUNGEONS_LIST_PATH = "/schematics/schematics.txt";
public static final String SCHEMATIC_FILE_EXTENSION = ".schematic"; public static final String SCHEMATIC_FILE_EXTENSION = ".schematic";
private static final int DEFAULT_DUNGEON_WEIGHT = 100; private static final int DEFAULT_DUNGEON_WEIGHT = 100;
public static final int MAX_DUNGEON_WEIGHT = 10000; //Used to prevent overflows and math breaking down public static final int MAX_DUNGEON_WEIGHT = 10000; //Used to prevent overflows and math breaking down
@ -72,8 +80,9 @@ public class DungeonHelper
private ArrayList<DungeonGenerator> pistonTraps = new ArrayList<DungeonGenerator>(); private ArrayList<DungeonGenerator> pistonTraps = new ArrayList<DungeonGenerator>();
private ArrayList<DungeonGenerator> exits = new ArrayList<DungeonGenerator>(); private ArrayList<DungeonGenerator> exits = new ArrayList<DungeonGenerator>();
public DungeonGenerator defaultBreak = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, "/schematics/somethingBroke.schematic", true); private DungeonGenerator defaultUp;
public DungeonGenerator defaultUp = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, "/schematics/simpleStairsUp.schematic", true); private DungeonGenerator defaultDown;
private DungeonGenerator defaultError;
private HashSet<String> dungeonTypeChecker; private HashSet<String> dungeonTypeChecker;
private HashMap<String, ArrayList<DungeonGenerator>> dungeonTypeMapping; private HashMap<String, ArrayList<DungeonGenerator>> dungeonTypeMapping;
@ -138,8 +147,8 @@ public class DungeonHelper
{ {
copyfile.copyFile("/mods/DimDoors/text/How_to_add_dungeons.txt", file.getAbsolutePath() + "/How_to_add_dungeons.txt"); copyfile.copyFile("/mods/DimDoors/text/How_to_add_dungeons.txt", file.getAbsolutePath() + "/How_to_add_dungeons.txt");
} }
registerBundledDungeons();
importCustomDungeons(properties.CustomSchematicDirectory); importCustomDungeons(properties.CustomSchematicDirectory);
registerBaseDungeons();
} }
public List<DungeonGenerator> getRegisteredDungeons() public List<DungeonGenerator> getRegisteredDungeons()
@ -152,6 +161,21 @@ public class DungeonHelper
return Collections.unmodifiableList(this.untaggedDungeons); return Collections.unmodifiableList(this.untaggedDungeons);
} }
public DungeonGenerator getDefaultErrorDungeon()
{
return defaultError;
}
public DungeonGenerator getDefaultUpDungeon()
{
return defaultUp;
}
public DungeonGenerator getDefaultDownDungeon()
{
return defaultDown;
}
public LinkData createCustomDungeonDoor(World world, int x, int y, int z) public LinkData createCustomDungeonDoor(World world, int x, int y, int z)
{ {
//Create a link above the specified position. Link to a new pocket dimension. //Create a link above the specified position. Link to a new pocket dimension.
@ -213,10 +237,13 @@ public class DungeonHelper
return true; return true;
} }
public void registerCustomDungeon(File schematicFile) public void registerDungeon(String schematicPath, boolean isInternal, boolean verbose)
{ {
//We use schematicPath as the real path for internal files (inside our JAR) because it seems
//that File tries to interpret it as a local drive path and mangles it.
File schematicFile = new File(schematicPath);
String name = schematicFile.getName(); String name = schematicFile.getName();
String path = schematicFile.getAbsolutePath(); String path = isInternal ? schematicPath : schematicFile.getAbsolutePath();
try try
{ {
if (validateSchematicName(name)) if (validateSchematicName(name))
@ -233,23 +260,29 @@ public class DungeonHelper
dungeonTypeMapping.get(dungeonType).add(generator); dungeonTypeMapping.get(dungeonType).add(generator);
registeredDungeons.add(generator); registeredDungeons.add(generator);
System.out.println("Imported " + name); if (verbose)
{
System.out.println("Registered dungeon: " + name);
}
} }
else else
{
if (verbose)
{ {
System.out.println("Could not parse dungeon filename, not adding dungeon to generation lists"); System.out.println("Could not parse dungeon filename, not adding dungeon to generation lists");
}
untaggedDungeons.add(new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, path, true)); untaggedDungeons.add(new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, path, true));
System.out.println("Imported " + name); System.out.println("Registered untagged dungeon: " + name);
} }
} }
catch(Exception e) catch(Exception e)
{ {
System.err.println("Failed to register dungeon: " + name);
e.printStackTrace(); e.printStackTrace();
System.out.println("Failed to import " + name);
} }
} }
public void importCustomDungeons(String path) private void importCustomDungeons(String path)
{ {
File directory = new File(path); File directory = new File(path);
File[] schematicNames = directory.listFiles(); File[] schematicNames = directory.listFiles();
@ -260,15 +293,48 @@ public class DungeonHelper
{ {
if (schematicFile.getName().endsWith(SCHEMATIC_FILE_EXTENSION)) if (schematicFile.getName().endsWith(SCHEMATIC_FILE_EXTENSION))
{ {
registerCustomDungeon(schematicFile); registerDungeon(schematicFile.getPath(), false, true);
} }
} }
} }
} }
public void registerBaseDungeons() private void registerBundledDungeons()
{ {
//Register the core schematics
//These are used for debugging and in case of unusual errors while loading dungeons
defaultUp = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_UP_SCHEMATIC_PATH, true);
defaultDown = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_DOWN_SCHEMATIC_PATH, true);
defaultError = new DungeonGenerator(DEFAULT_DUNGEON_WEIGHT, DEFAULT_ERROR_SCHEMATIC_PATH, true);
//Open the list of dungeons packaged with our mod and register their schematics
InputStream listStream = this.getClass().getResourceAsStream(BUNDLED_DUNGEONS_LIST_PATH);
if (listStream == null)
{
System.err.println("Unable to open list of bundled dungeon schematics.");
return;
}
try
{
BufferedReader listReader = new BufferedReader(new InputStreamReader(listStream));
String schematicPath = listReader.readLine();
while (schematicPath != null)
{
schematicPath = schematicPath.trim();
if (!schematicPath.isEmpty())
{
registerDungeon(schematicPath, true, false);
}
schematicPath = listReader.readLine();
}
listReader.close();
}
catch (Exception e)
{
System.err.println("An exception occurred while reading the list of bundled dungeon schematics.");
e.printStackTrace();
}
} }
public boolean exportDungeon(World world, int centerX, int centerY, int centerZ, String exportPath) public boolean exportDungeon(World world, int centerX, int centerY, int centerZ, String exportPath)

67
schematics/schematics.txt Normal file
View file

@ -0,0 +1,67 @@
/schematics/ruins/complexHall_buggyTopEntry1_open_100.schematic
/schematics/ruins/complexHall_exitRuinsWithHiddenDoor_open_100.schematic
/schematics/ruins/complexHall_hallwayHiddenTreasure_closed_100.schematic
/schematics/ruins/complexHall_largeBrokenHall_closed_100.schematic
/schematics/ruins/complexHall_mediumPillarStairs_open_100.schematic
/schematics/ruins/complexHall_pitStairs_open_100.schematic
/schematics/ruins/complexHall_ruinsO_open_100.schematic
/schematics/ruins/ComplexHall_SK-AnchoredDescent_Open_50.schematic
/schematics/ruins/ComplexHall_SK-HiddenStairs_Open_100.schematic
/schematics/ruins/ComplexHall_SK-LostGarden_Open_10.schematic
/schematics/ruins/complexHall_smallBranchWithExit_closed_100.schematic
/schematics/ruins/complexHall_smallRotundaWithExit_closed_100.schematic
/schematics/ruins/complexHall_tntPuzzleTrap_closed_50.schematic
/schematics/ruins/deadEnd_azersDungeonO_closed_100.schematic
/schematics/ruins/deadEnd_brokenPillarsO_open_100.schematic
/schematics/ruins/deadEnd_diamondTowerTemple1_open_100.schematic
/schematics/ruins/deadEnd_fallingTrapO_open_100.schematic
/schematics/ruins/deadEnd_hiddenStaircaseO_open_100.schematic
/schematics/ruins/deadEnd_lavaTrapO_open_100.schematic
/schematics/ruins/deadend_randomTree_open_75.schematic
/schematics/ruins/DeadEnd_SK-EyesOfTricksters_Open_50.schematic
/schematics/ruins/DeadEnd_SK-FarAwayInTheDark_Open_100.schematic
/schematics/ruins/DeadEnd_SK-UnstableDesert_Open_50.schematic
/schematics/ruins/deadEnd_smallDesert_open_75.schematic
/schematics/ruins/deadEnd_smallHiddenTowerO_open_100.schematic
/schematics/ruins/deadEnd_smallPond_open_75.schematic
/schematics/ruins/deadEnd_smallSilverfishRoom_closed_100.schematic
/schematics/ruins/deadEnd_tntTrapO_open_100.schematic
/schematics/ruins/exit_exitCube_open_100.schematic
/schematics/ruins/exit_lockingExitHall_closed_100.schematic
/schematics/ruins/exit_smallExitPrison_open_100.schematic
/schematics/ruins/hub_4WayBasicHall_closed_200.schematic
/schematics/ruins/hub_4WayHallExit_closed_200.schematic
/schematics/ruins/hub_doorTotemRuins_open_100.schematic
/schematics/ruins/hub_fortRuins_open_100.schematic
/schematics/ruins/hub_hallwayTrapRooms1_closed_100.schematic
/schematics/ruins/hub_longDoorHallway_closed_100.schematic
/schematics/ruins/Hub_SK-Claustrophobia_Open_10.schematic
/schematics/ruins/Hub_SK-FractalCage_Open_20.schematic
/schematics/ruins/Hub_SK-HeartOfDisorder_Open_50.schematic
/schematics/ruins/maze_smallMaze1_closed_100.schematic
/schematics/ruins/maze_smallMultilevelMaze_closed_100.schematic
/schematics/ruins/simpleHall_collapsedSingleTunnel1_closed_100.schematic
/schematics/ruins/simpleHall_simpleDropHall_closed_100.schematic
/schematics/ruins/simpleHall_simpleSmallT1_closed_100.schematic
/schematics/ruins/simpleHall_simpleStairsDown_closed_100.schematic
/schematics/ruins/simpleHall_simpleStairsUp_closed_100.schematic
/schematics/ruins/simpleHall_singleStraightHall1_closed_100.schematic
/schematics/ruins/SimpleHall_SK-LeftDownStairs_Open_50.schematic
/schematics/ruins/SimpleHall_SK-LeftUpPath_Open_50.schematic
/schematics/ruins/SimpleHall_SK-RightDownStairs_Open_50.schematic
/schematics/ruins/SimpleHall_SK-RightUpPath_Open_50.schematic
/schematics/ruins/SimpleHall_SK-SpiralHallway_Open_100.schematic
/schematics/ruins/simpleHall_smallSimpleLeft_closed_100.schematic
/schematics/ruins/simpleHall_smallSimpleRight_closed_100.schematic
/schematics/ruins/trap_fakeTNTTrap_closed_100.schematic
/schematics/ruins/trap_hallwayPitFallTrap_closed_200.schematic
/schematics/ruins/trap_lavaPyramid_open_100.schematic
/schematics/ruins/trap_pistonFallRuins_open_100.schematic
/schematics/ruins/trap_pistonFloorHall_closed_150.schematic
/schematics/ruins/trap_pistonFloorPlatform2_closed_100.schematic
/schematics/ruins/trap_pistonFloorPlatform_closed_100.schematic
/schematics/ruins/trap_pistonHallway_closed_100.schematic
/schematics/ruins/trap_pistonSmasherHall_closed_100.schematic
/schematics/ruins/trap_raceTheTNTHall_closed_50.schematic
/schematics/ruins/Trap_SK-RestlessCorridor_Open_10.schematic
/schematics/ruins/trap_wallFallcomboPistonHall_closed_200.schematic