Added the LemmingTrap challenge.

This commit is contained in:
Marshall
2012-03-17 17:47:40 -04:00
parent 1d9eae7af0
commit 2d7507632d

View File

@@ -19,10 +19,7 @@ import dk.itu.mario.level.matcher.PlayerProfile;
import dk.itu.mario.level.matcher.ProfileMatcher; import dk.itu.mario.level.matcher.ProfileMatcher;
public class PCGLevel extends Level { public class PCGLevel extends Level {
public enum MazeLevel { public static boolean TESTING = true;
BOT, MID, TOP
}
public static long lastSeed; public static long lastSeed;
private static Random levelSeedRandom = new Random(); private static Random levelSeedRandom = new Random();
@@ -124,33 +121,54 @@ public class PCGLevel extends Level {
lastSeed = seed; lastSeed = seed;
random = new Random(seed); random = new Random(seed);
System.out.println("Generating level for component list: ");
LevelParseTree parseTree = grammar.generateRandomTree(seed, width);
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
int length = 0; int length = 0;
for (LevelComponent lcomp : levelTemplate) { if (TESTING) {
LevelComponent.TYPE lctype = lcomp.getType(); length = buildStraight(0, width - 64, true);
System.out.println("Building for: " + lcomp);
switch (lctype) { length += buildLemmingTrap(length, width - 64 - length,
case FLAT: SpriteTemplate.GOOMPA);
length += buildStraight(length, lcomp.getEnd(), true); length += buildLemmingTrap(length, width - 64 - length,
break; SpriteTemplate.GREEN_TURTLE);
case PIPE_JUMP: length += buildLemmingTrap(length, width - 64 - length,
length += buildPipeJump(length, width-64-length); SpriteTemplate.ARMORED_TURTLE);
break;
case PLATFORM_JUMP: length += buildPlatformJump(length, width - 64 - length);
length += buildPlatformJump(length, width-64-length); length += buildMaze(length, width - 64 - length);
break; length += buildPipeJump(length, width - 64 - length);
case MAZE:
length += buildMaze(length, width-64-length); // create all of the medium sections
break; while (length < width - 64) {
default: length += buildStraight(length, width - length, true);
System.out }
.println("Cannot build level segment for unrecognized LevelComponent type: " }
+ type);
else {
System.out.println("Generating level for component list: ");
LevelParseTree parseTree = grammar.generateRandomTree(seed, width);
List<LevelComponent> 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);
}
} }
} }
@@ -173,6 +191,31 @@ public class PCGLevel extends Level {
fillEndPiece(length, floor); 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) { private void fillEndPiece(int length, int floor) {
// fills the end piece // fills the end piece
for (int x = length; x < width; x++) { for (int x = length; x < width; x++) {
@@ -530,7 +573,7 @@ public class PCGLevel extends Level {
if (numPlatforms > 1) { if (numPlatforms > 1) {
boolean found = false; boolean found = false;
MazeLevel nextDir = MazeLevel.TOP; LevelComponent.MazeLevel nextDir = LevelComponent.MazeLevel.TOP;
LevelComponent.PlatformLevel last; LevelComponent.PlatformLevel last;
LevelComponent.PlatformLevel next; LevelComponent.PlatformLevel next;
ArrayList<LevelComponent.PlatformLevel> jumps = new ArrayList<LevelComponent.PlatformLevel>(); ArrayList<LevelComponent.PlatformLevel> jumps = new ArrayList<LevelComponent.PlatformLevel>();
@@ -547,33 +590,33 @@ public class PCGLevel extends Level {
switch (random.nextInt(5)) { switch (random.nextInt(5)) {
case 0: case 0:
case 1: case 1:
nextDir = MazeLevel.BOT; nextDir = LevelComponent.MazeLevel.BOT;
break; break;
case 2: case 2:
case 3: case 3:
nextDir = MazeLevel.TOP; nextDir = LevelComponent.MazeLevel.TOP;
break; break;
default: 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) if ((last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.MID)
|| (last == LevelComponent.PlatformLevel.MID_D && nextDir == MazeLevel.BOT)) { || (last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.BOT)) {
next = LevelComponent.PlatformLevel.BOT; next = LevelComponent.PlatformLevel.BOT;
} }
else if ((last == LevelComponent.PlatformLevel.MID_D && nextDir == MazeLevel.MID) else if ((last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.MID)
|| (last == LevelComponent.PlatformLevel.MID_U && nextDir == MazeLevel.BOT) || (last == LevelComponent.PlatformLevel.MID_U && nextDir == LevelComponent.MazeLevel.BOT)
|| (last == LevelComponent.PlatformLevel.BOT && nextDir == MazeLevel.TOP)) { || (last == LevelComponent.PlatformLevel.BOT && nextDir == LevelComponent.MazeLevel.TOP)) {
next = LevelComponent.PlatformLevel.MID_D; next = LevelComponent.PlatformLevel.MID_D;
} }
else if ((last == LevelComponent.PlatformLevel.MID_U && nextDir == MazeLevel.MID) else if ((last == LevelComponent.PlatformLevel.MID_U && nextDir == LevelComponent.MazeLevel.MID)
|| (last == LevelComponent.PlatformLevel.TOP && nextDir == MazeLevel.BOT) || (last == LevelComponent.PlatformLevel.TOP && nextDir == LevelComponent.MazeLevel.BOT)
|| (last == LevelComponent.PlatformLevel.MID_D && nextDir == MazeLevel.TOP)) { || (last == LevelComponent.PlatformLevel.MID_D && nextDir == LevelComponent.MazeLevel.TOP)) {
next = LevelComponent.PlatformLevel.MID_U; next = LevelComponent.PlatformLevel.MID_U;
} }
@@ -608,6 +651,9 @@ public class PCGLevel extends Level {
heightMod = 3; heightMod = 3;
} }
heightMod += (random.nextBoolean() ? random.nextInt(2) : -1
* random.nextInt(2));
setBlock(xo + length, this.height - heightMod, setBlock(xo + length, this.height - heightMod,
Level.BLOCK_EMPTY); Level.BLOCK_EMPTY);
setBlock(xo + length + 1, this.height - heightMod, setBlock(xo + length + 1, this.height - heightMod,