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;
|
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();
|
||||||
|
|
||||||
@@ -121,33 +118,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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,6 +188,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++) {
|
||||||
@@ -455,7 +498,7 @@ public class PCGLevel extends Level {
|
|||||||
|
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int buildPipeJump(int xo, int maxLength) {
|
private int buildPipeJump(int xo, int maxLength) {
|
||||||
int numPipes = 4;
|
int numPipes = 4;
|
||||||
int length = numPipes * 2;
|
int length = numPipes * 2;
|
||||||
@@ -527,7 +570,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>();
|
||||||
@@ -544,33 +587,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,6 +648,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