Example rules to enable/disable challenges (feeds fitness evaluator).

This commit is contained in:
Woody Folsom
2012-03-18 16:41:23 -04:00
parent 862ba2aa31
commit 992f2eef46
4 changed files with 59 additions and 30 deletions

View File

@@ -15,3 +15,19 @@ rule "BeginnerJumper"
System.out.println("PlayerProfile indicates Beginner (or better) Jumper. Pipe challenge enabled!"); // consequence
playerProfile.setEnabled(LevelComponent.TYPE.PIPE_JUMP);
end
rule "NoviceRunner"
when
playerProfile : PlayerProfile( runSkill <= 20 ) // condition
then
System.out.println("PlayerProfile indicates NoviceRunner. Disabling Maze challenge."); // consequence
playerProfile.setDisabled(LevelComponent.TYPE.MAZE);
end
rule "BeginnerRunner"
when
playerProfile : PlayerProfile( runSkill > 20 ) // condition
then
System.out.println("PlayerProfile indicates Beginner (or better) Runner. Maze challenge enabled!"); // consequence
playerProfile.setEnabled(LevelComponent.TYPE.MAZE);
end

View File

@@ -8,7 +8,23 @@ public class FitnessEvaluator {
public static boolean isFit(LevelParseTree parseTree, PlayerProfile playerProfile, LevelArchetype levelArchetype) {
System.out.println("Evaluating LevelParseTree for fitness");
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
//a good level has 8-16 components, plus some additional complexity depending on the player's skill level
return levelTemplate.size() > 9 && levelTemplate.size() < 25;
//a good level has 8-24 components, plus some additional complexity depending on the player's skill level
if (levelTemplate.size() < 8) {
return false;
}
if (levelTemplate.size() > 24) {
return false;
}
for (LevelComponent lc : levelTemplate) {
if (!playerProfile.isEnabled(lc.getType())) {
System.out.println("Level is not fit: " + lc.getType() + " is not enabled.");
return false;
}
}
return true;
}
}

View File

@@ -1110,7 +1110,7 @@ public class PCGLevel extends Level {
System.out.println("Generating level for component list: ");
LevelParseTree parseTree = grammar.generateRandomTree(seed, width);
int MAX_REGENS = 10;
int MAX_REGENS = 30;
int nRegens = 0;
while (!FitnessEvaluator.isFit(parseTree, profile, archetype)
&& nRegens < MAX_REGENS) {
@@ -1120,12 +1120,17 @@ public class PCGLevel extends Level {
nRegens++;
}
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
if (nRegens == MAX_REGENS) {
System.out.println("Failed to generate a fit level after "
+ nRegens + " attempts. Proceeding with unfit level.");
} else {
System.out.println("Found fit level:");
for (LevelComponent lc : levelTemplate) {
System.out.println(lc);
}
}
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
for (LevelComponent lcomp : levelTemplate) {
LevelComponent.TYPE lctype = lcomp.getType();
@@ -1162,7 +1167,6 @@ public class PCGLevel extends Level {
break;
case POWER_UP :
length += buildFreebie(length, width - 64 - length);
//length += buildStraight(length, lcomp.getEnd(), true);
break;
case SINGLE_PIT :
length += buildSinglePit(length, width - 64 - length);

View File

@@ -52,33 +52,26 @@ public class PlayerProfile {
return skillLevel;
}
public int getBumpSkill() {
return skillVector.get(SKILL.BUMP);
}
public int getCollectSkill() {
return skillVector.get(SKILL.COLLECT);
}
public int getJumpSkill() {
switch (type) {
case JUMPER:
switch (skillLevel) {
case NOVICE:
return 20;
case BEGINNER:
return 40;
case COMPETENT:
return 60;
case PROFICIENT:
return 80;
case EXPERT:
return 100;
default:
return 0;
return skillVector.get(SKILL.JUMP);
}
default:
return 0;
public int getRunSkill() {
return skillVector.get(SKILL.RUN);
}
public int getShootSkill() {
return skillVector.get(SKILL.SHOOT);
}
public int getStompSkill() {
return skillVector.get(SKILL.STOMP);
}
public double getProbability(ChallengeRewardType crt) {
// if (!isEnabled(type)) {
// return 0.0;
// }
switch (crt) {
case GAP:
return Math.min(.5, (.5) * (skillVector.get(SKILL.JUMP) / 100.0)