Merge branch 'master' of woodyfolsom.net:/opt/git/cs8803p3
This commit is contained in:
@@ -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<LevelComponent> 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<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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<LevelComponent.PlatformLevel> jumps = new ArrayList<LevelComponent.PlatformLevel>();
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user