Renamed MyNewLevel -> PCGLevel.

This commit is contained in:
Woody Folsom
2012-03-17 12:33:00 -04:00
parent 2c5339ba8e
commit 8bedf88fd3
2 changed files with 54 additions and 108 deletions

View File

@@ -16,14 +16,14 @@ import dk.itu.mario.level.matcher.LevelArchetype;
import dk.itu.mario.level.matcher.PlayerProfile; import dk.itu.mario.level.matcher.PlayerProfile;
import dk.itu.mario.level.matcher.ProfileMatcher; import dk.itu.mario.level.matcher.ProfileMatcher;
public class MyNewLevel extends Level { public class PCGLevel extends Level {
public enum MazeLevel { public enum MazeLevel {
BOT, MID, TOP BOT, MID, TOP
} }
public static long lastSeed; public static long lastSeed;
private static Random levelSeedRandom = new Random(); private static Random levelSeedRandom = new Random();
public int BLOCKS_COINS = 0; // the number of coin blocks public int BLOCKS_COINS = 0; // the number of coin blocks
public int BLOCKS_EMPTY = 0; // the number of empty blocks public int BLOCKS_EMPTY = 0; // the number of empty blocks
public int BLOCKS_POWER = 0; // the number of power blocks public int BLOCKS_POWER = 0; // the number of power blocks
@@ -36,45 +36,54 @@ public class MyNewLevel extends Level {
private int gaps; private int gaps;
private int type; private int type;
private Random random; private Random random;
public MyNewLevel(int width, int height) { public PCGLevel(int width, int height) {
super(width, height); super(width, height);
} }
public MyNewLevel(int width, int height, long seed, int difficulty, public PCGLevel(int width, int height, long seed, int difficulty,
int type, GamePlay playerMetrics) { int type, GamePlay playerMetrics) {
this(width, height); this(width, height);
System.out.println("Generating level based on previous GamePlay metrics ONLY."); System.out
.println("Generating level based on previous GamePlay metrics ONLY.");
this.dataRecorder = DataRecorder.BLANK_RECORD; this.dataRecorder = DataRecorder.BLANK_RECORD;
create(seed, difficulty, type); generateLevel(seed, playerMetrics);
} }
public MyNewLevel(int width, int height, long seed, int difficulty, public PCGLevel(int width, int height, long seed, int difficulty,
int type, GamePlay playerMetrics, DataRecorder dataRecorder) { int type, GamePlay playerMetrics, DataRecorder dataRecorder) {
this(width, height); this(width, height);
System.out.println("Generating level based on previous GamePlay AND DataRecorder metrics."); System.out
.println("Generating level based on previous GamePlay AND DataRecorder metrics.");
this.dataRecorder = dataRecorder; this.dataRecorder = dataRecorder;
PlayerProfile profile = ProfileMatcher.getMatchingProfile(playerMetrics, dataRecorder); generateLevel(seed, playerMetrics);
System.out.println("PlayerProfile: " + profile);
LevelArchetype archetype = ArchetypeMatcher.getMatchingArchetype(playerMetrics, dataRecorder);
System.out.println("LevelArchetype: " + archetype);
System.out.println("Creating level grammar");
LevelGrammar grammar = LevelGrammarFactory.createGrammar(profile, archetype);
System.out.println("Tuning grammar for PlayerProfile & LevelArchetype using RETE");
grammar = GrammarTuner.tune(grammar,profile, archetype);
System.out.println("Sample level parameters: "
+ grammar.generateRandom(seed));
create(seed, difficulty, type);
} }
private void generateLevel(long seed, GamePlay playerMetrics) {
PlayerProfile profile = ProfileMatcher.getMatchingProfile(
playerMetrics, dataRecorder);
System.out.println("PlayerProfile: " + profile);
LevelArchetype archetype = ArchetypeMatcher.getMatchingArchetype(
playerMetrics, dataRecorder);
System.out.println("LevelArchetype: " + archetype);
System.out.println("Creating level grammar");
LevelGrammar grammar = LevelGrammarFactory.createGrammar(profile,
archetype);
System.out
.println("Tuning grammar for PlayerProfile & LevelArchetype using RETE");
grammar = GrammarTuner.tune(grammar, profile, archetype);
System.out.println("Creating level.");
}
@Override @Override
public RandomLevel clone() throws CloneNotSupportedException { public RandomLevel clone() throws CloneNotSupportedException {
@@ -100,13 +109,18 @@ public class MyNewLevel extends Level {
} }
public void create(long seed, int difficulty, int type) { public void create(long seed, PlayerProfile profile,
LevelArchetype archetype, LevelGrammar grammar) {
if (dataRecorder == DataRecorder.BLANK_RECORD) { if (dataRecorder == DataRecorder.BLANK_RECORD) {
System.out.println("DataRecorder record is BLANK - using GamePlay metrics only."); System.out
.println("DataRecorder record is BLANK - using GamePlay metrics only.");
} }
this.type = type; System.out.println("Sample level parameters: "
this.difficulty = difficulty; + grammar.generateRandom(seed));
this.type = archetype.getTypeInt();
this.difficulty = archetype.getDifficultyLevel();
lastSeed = seed; lastSeed = seed;
random = new Random(seed); random = new Random(seed);
@@ -273,11 +287,11 @@ public class MyNewLevel extends Level {
int length = random.nextInt(maxLength - 19) + 20; int length = random.nextInt(maxLength - 19) + 20;
int soFar = 0; int soFar = 0;
int next; int next;
//MazeLevel last = MazeLevel.BOT; // MazeLevel last = MazeLevel.BOT;
class Stretch { class Stretch {
public int len; public int len;
public MyNewLevel.MazeLevel lvl; public PCGLevel.MazeLevel lvl;
public Stretch(int lngth) { public Stretch(int lngth) {
len = lngth; len = lngth;
@@ -352,25 +366,11 @@ public class MyNewLevel extends Level {
} }
} }
} }
//last = str.lvl;
} }
return length; return length;
} }
// private int buildPlatformJump(int xo, int maxLength) {
// int length = random.nextInt(maxLength + 1);
// int soFar;
// int segment;
//
// for (soFar = 0; soFar < length;) {
// int
// }
//
// 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;
@@ -434,60 +434,6 @@ public class MyNewLevel extends Level {
} }
return length; return length;
// int numPipes = 4;
// int floor = height - 1 - random.nextInt(2);
// int length = numPipes * 4;
// int height;
//
// int[] pitLens = new int[numPipes];
// int[] pipeGrad = new int[numPipes];
//
// for (int i = 0; i < numPipes; i++) {
// pitLens[i] = random.nextInt(6) + 1;
// pipeGrad[i] = random.nextInt(4);
//
// length += pitLens[i];
// }
//
// if (length > maxLength) {
// return 0;
// }
//
// length = 0;
// height = pipeGrad[0];
//
// for (int i = 0; i < numPipes; i++) {
//
// height = (height == 0) ? 1 : (height < 1) ? height * -1 : height;
//
// setBlock(xo + length, floor, pits ? Level.HILL_TOP_LEFT
// : Level.GROUND);
// setBlock(xo + length + 1, floor, pits ? Level.HILL_TOP_RIGHT
// : Level.GROUND);
//
// for (int h = 0; h < height; h++) {
// setBlock(xo + length, floor - 1 - h, Level.TUBE_SIDE_LEFT);
// setBlock(xo + length + 1, floor - 1 - h, Level.TUBE_SIDE_RIGHT);
// }
//
// setBlock(xo + length, floor - 1 - height, Level.TUBE_TOP_LEFT);
// setBlock(xo + length + 1, floor - 1 - height, Level.TUBE_TOP_RIGHT);
//
// if (!pits) {
// for (int y = floor; y < pitLens[i]; y++) {
// for (int x = xo + length + 2; x < xo + length + 2
// + pitLens[i]; x++) {
// setBlock(x, y, Level.HILL_FILL);
// }
// }
//
// length += (2 + pitLens[i]);
// height += (i == numPipes - 1) ? 0 : pipeGrad[i + 1];
// }
// }
//
// return length;
} }
private int buildStraight(int xo, int maxLength, boolean safe) { private int buildStraight(int xo, int maxLength, boolean safe) {

View File

@@ -7,9 +7,9 @@ import dk.itu.mario.MarioInterface.LevelGenerator;
import dk.itu.mario.MarioInterface.LevelInterface; import dk.itu.mario.MarioInterface.LevelInterface;
import dk.itu.mario.engine.DataRecorder; import dk.itu.mario.engine.DataRecorder;
import dk.itu.mario.level.Level; import dk.itu.mario.level.Level;
import dk.itu.mario.level.MyNewLevel; import dk.itu.mario.level.PCGLevel;
public class MyNewLevelGenerator implements public class PCGLevelGenerator implements
LevelGenerator { LevelGenerator {
@Override @Override
public int generateLevelDifficulty(GamePlay playerMetrics, DataRecorder dataRecorder) { public int generateLevelDifficulty(GamePlay playerMetrics, DataRecorder dataRecorder) {
@@ -26,7 +26,7 @@ public class MyNewLevelGenerator implements
@Override @Override
public LevelInterface generateLevel(GamePlay playerMetrics) { public LevelInterface generateLevel(GamePlay playerMetrics) {
System.out.println("Generating customized level"); System.out.println("Generating customized level");
LevelInterface level = new MyNewLevel(320, 15, LevelInterface level = new PCGLevel(320, 15,
new Random().nextLong(), generateLevelDifficulty(playerMetrics,DataRecorder.BLANK_RECORD), generateLevelType(playerMetrics,DataRecorder.BLANK_RECORD), playerMetrics); new Random().nextLong(), generateLevelDifficulty(playerMetrics,DataRecorder.BLANK_RECORD), generateLevelType(playerMetrics,DataRecorder.BLANK_RECORD), playerMetrics);
return level; return level;
} }
@@ -34,7 +34,7 @@ public class MyNewLevelGenerator implements
@Override @Override
public LevelInterface generateLevel(GamePlay playerMetrics, DataRecorder dataRecorder) { public LevelInterface generateLevel(GamePlay playerMetrics, DataRecorder dataRecorder) {
System.out.println("Generating customized level"); System.out.println("Generating customized level");
LevelInterface level = new MyNewLevel(320, 15, LevelInterface level = new PCGLevel(320, 15,
new Random().nextLong(), generateLevelDifficulty(playerMetrics,DataRecorder.BLANK_RECORD), generateLevelType(playerMetrics,dataRecorder), playerMetrics, dataRecorder); new Random().nextLong(), generateLevelDifficulty(playerMetrics,DataRecorder.BLANK_RECORD), generateLevelType(playerMetrics,dataRecorder), playerMetrics, dataRecorder);
return level; return level;
} }