diff --git a/src/dk/itu/mario/level/PCGLevel.java b/src/dk/itu/mario/level/PCGLevel.java index ea0a09c..a64218b 100644 --- a/src/dk/itu/mario/level/PCGLevel.java +++ b/src/dk/itu/mario/level/PCGLevel.java @@ -16,10 +16,7 @@ import dk.itu.mario.level.matcher.ArchetypeMatcher; import dk.itu.mario.level.matcher.ProfileMatcher; public class PCGLevel extends Level { - public enum MazeLevel { - BOT, MID, TOP - } - + public static boolean TESTING = true; public static long lastSeed; private static Random levelSeedRandom = new Random(); @@ -121,33 +118,54 @@ public class PCGLevel extends Level { lastSeed = seed; random = new Random(seed); - - System.out.println("Generating level for component list: "); - LevelParseTree parseTree = grammar.generateRandomTree(seed, width); - List levelTemplate = parseTree.getLevelTemplate(); - int length = 0; - for (LevelComponent lcomp : levelTemplate) { - LevelComponent.TYPE lctype = lcomp.getType(); - System.out.println("Building for: " + lcomp); - switch (lctype) { - case FLAT: - length += buildStraight(length, lcomp.getEnd(), true); - break; - case PIPE_JUMP: - length += buildPipeJump(length, width-64-length); - break; - case PLATFORM_JUMP: - length += buildPlatformJump(length, width-64-length); - break; - case MAZE: - length += buildMaze(length, width-64-length); - break; - default: - System.out - .println("Cannot build level segment for unrecognized LevelComponent type: " - + type); + if (TESTING) { + length = buildStraight(0, width - 64, true); + + length += buildLemmingTrap(length, width - 64 - length, + SpriteTemplate.GOOMPA); + length += buildLemmingTrap(length, width - 64 - length, + SpriteTemplate.GREEN_TURTLE); + length += buildLemmingTrap(length, width - 64 - length, + SpriteTemplate.ARMORED_TURTLE); + + length += buildPlatformJump(length, width - 64 - length); + length += buildMaze(length, width - 64 - length); + length += buildPipeJump(length, width - 64 - length); + + // create all of the medium sections + while (length < width - 64) { + length += buildStraight(length, width - length, true); + } + } + + else { + System.out.println("Generating level for component list: "); + LevelParseTree parseTree = grammar.generateRandomTree(seed, width); + List levelTemplate = parseTree.getLevelTemplate(); + + for (LevelComponent lcomp : levelTemplate) { + LevelComponent.TYPE lctype = lcomp.getType(); + System.out.println("Building for: " + lcomp); + switch (lctype) { + case FLAT: + length += buildStraight(length, lcomp.getEnd(), true); + break; + case PIPE_JUMP: + length += buildPipeJump(length, width - 64 - length); + break; + case PLATFORM_JUMP: + length += buildPlatformJump(length, width - 64 - length); + break; + case MAZE: + length += buildMaze(length, width - 64 - length); + break; + default: + System.out + .println("Cannot build level segment for unrecognized LevelComponent type: " + + type); + } } } @@ -170,6 +188,31 @@ public class PCGLevel extends Level { fillEndPiece(length, floor); } + private int buildLemmingTrap(int xo, int maxLength, int enemyType) { + if (maxLength >= 14 + && (enemyType == SpriteTemplate.GOOMPA + || enemyType == SpriteTemplate.GREEN_TURTLE || enemyType == SpriteTemplate.ARMORED_TURTLE)) { + for (int x = 0; x < 18; x++) { + if (x > 5) { + for (int y = 0; y < 5; y++) { + setBlock(xo + x, this.height - 1 - y, Level.GROUND); + } + } else { + setBlock(xo + x, this.height - 1 - ((x > 5) ? 6 : 0), + Level.GROUND); + } + + if (x > 6 && x % 2 == 0) { + setSpriteTemplate(xo + x, this.height - 6, + new SpriteTemplate(enemyType, false)); + } + } + return 18; + } + + return 0; + } + private void fillEndPiece(int length, int floor) { // fills the end piece for (int x = length; x < width; x++) { @@ -455,7 +498,7 @@ public class PCGLevel extends Level { return length; } - + private int buildPipeJump(int xo, int maxLength) { int numPipes = 4; int length = numPipes * 2; @@ -527,7 +570,7 @@ public class PCGLevel extends Level { if (numPlatforms > 1) { boolean found = false; - MazeLevel nextDir = MazeLevel.TOP; + LevelComponent.MazeLevel nextDir = LevelComponent.MazeLevel.TOP; LevelComponent.PlatformLevel last; LevelComponent.PlatformLevel next; ArrayList jumps = new ArrayList(); @@ -544,33 +587,33 @@ public class PCGLevel extends Level { switch (random.nextInt(5)) { case 0: case 1: - nextDir = MazeLevel.BOT; + nextDir = LevelComponent.MazeLevel.BOT; break; case 2: case 3: - nextDir = MazeLevel.TOP; + nextDir = LevelComponent.MazeLevel.TOP; break; default: - nextDir = MazeLevel.MID; + nextDir = LevelComponent.MazeLevel.MID; } - found = !((last == LevelComponent.PlatformLevel.TOP && nextDir == MazeLevel.TOP) || (last == LevelComponent.PlatformLevel.BOT && nextDir == MazeLevel.BOT)); + found = !((last == LevelComponent.PlatformLevel.TOP && nextDir == LevelComponent.MazeLevel.TOP) || (last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.BOT)); } - if ((last == LevelComponent.PlatformLevel.BOT && nextDir == MazeLevel.MID) - || (last == LevelComponent.PlatformLevel.MID_D && nextDir == MazeLevel.BOT)) { + if ((last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.MID) + || (last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.BOT)) { next = LevelComponent.PlatformLevel.BOT; } - else if ((last == LevelComponent.PlatformLevel.MID_D && nextDir == MazeLevel.MID) - || (last == LevelComponent.PlatformLevel.MID_U && nextDir == MazeLevel.BOT) - || (last == LevelComponent.PlatformLevel.BOT && nextDir == MazeLevel.TOP)) { + else if ((last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.MID) + || (last == LevelComponent.PlatformLevel.MID_U && nextDir == LevelComponent.MazeLevel.BOT) + || (last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.TOP)) { next = LevelComponent.PlatformLevel.MID_D; } - else if ((last == LevelComponent.PlatformLevel.MID_U && nextDir == MazeLevel.MID) - || (last == LevelComponent.PlatformLevel.TOP && nextDir == MazeLevel.BOT) - || (last == LevelComponent.PlatformLevel.MID_D && nextDir == MazeLevel.TOP)) { + else if ((last == LevelComponent.PlatformLevel.MID_U && nextDir == LevelComponent.MazeLevel.MID) + || (last == LevelComponent.PlatformLevel.TOP && nextDir == LevelComponent.MazeLevel.BOT) + || (last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.TOP)) { next = LevelComponent.PlatformLevel.MID_U; } @@ -605,6 +648,9 @@ public class PCGLevel extends Level { heightMod = 3; } + heightMod += (random.nextBoolean() ? random.nextInt(2) : -1 + * random.nextInt(2)); + setBlock(xo + length, this.height - heightMod, Level.BLOCK_EMPTY); setBlock(xo + length + 1, this.height - heightMod,