Added the LemmingTrap challenge.
This commit is contained in:
@@ -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,13 +121,33 @@ public class PCGLevel extends Level {
|
|||||||
|
|
||||||
lastSeed = seed;
|
lastSeed = seed;
|
||||||
random = new Random(seed);
|
random = new Random(seed);
|
||||||
|
int length = 0;
|
||||||
|
|
||||||
|
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: ");
|
System.out.println("Generating level for component list: ");
|
||||||
LevelParseTree parseTree = grammar.generateRandomTree(seed, width);
|
LevelParseTree parseTree = grammar.generateRandomTree(seed, width);
|
||||||
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
|
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
|
||||||
|
|
||||||
int length = 0;
|
|
||||||
|
|
||||||
for (LevelComponent lcomp : levelTemplate) {
|
for (LevelComponent lcomp : levelTemplate) {
|
||||||
LevelComponent.TYPE lctype = lcomp.getType();
|
LevelComponent.TYPE lctype = lcomp.getType();
|
||||||
System.out.println("Building for: " + lcomp);
|
System.out.println("Building for: " + lcomp);
|
||||||
@@ -139,13 +156,13 @@ public class PCGLevel extends Level {
|
|||||||
length += buildStraight(length, lcomp.getEnd(), true);
|
length += buildStraight(length, lcomp.getEnd(), true);
|
||||||
break;
|
break;
|
||||||
case PIPE_JUMP:
|
case PIPE_JUMP:
|
||||||
length += buildPipeJump(length, width-64-length);
|
length += buildPipeJump(length, width - 64 - length);
|
||||||
break;
|
break;
|
||||||
case PLATFORM_JUMP:
|
case PLATFORM_JUMP:
|
||||||
length += buildPlatformJump(length, width-64-length);
|
length += buildPlatformJump(length, width - 64 - length);
|
||||||
break;
|
break;
|
||||||
case MAZE:
|
case MAZE:
|
||||||
length += buildMaze(length, width-64-length);
|
length += buildMaze(length, width - 64 - length);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
System.out
|
System.out
|
||||||
@@ -153,6 +170,7 @@ public class PCGLevel extends Level {
|
|||||||
+ type);
|
+ type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
System.out.println("Total length built: " + length);
|
System.out.println("Total length built: " + length);
|
||||||
|
|
||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user