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

@@ -14,4 +14,20 @@ rule "BeginnerJumper"
then then
System.out.println("PlayerProfile indicates Beginner (or better) Jumper. Pipe challenge enabled!"); // consequence System.out.println("PlayerProfile indicates Beginner (or better) Jumper. Pipe challenge enabled!"); // consequence
playerProfile.setEnabled(LevelComponent.TYPE.PIPE_JUMP); 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 end

View File

@@ -8,7 +8,23 @@ public class FitnessEvaluator {
public static boolean isFit(LevelParseTree parseTree, PlayerProfile playerProfile, LevelArchetype levelArchetype) { public static boolean isFit(LevelParseTree parseTree, PlayerProfile playerProfile, LevelArchetype levelArchetype) {
System.out.println("Evaluating LevelParseTree for fitness"); System.out.println("Evaluating LevelParseTree for fitness");
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate(); List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
//a good level has 8-16 components, plus some additional complexity depending on the player's skill level //a good level has 8-24 components, plus some additional complexity depending on the player's skill level
return levelTemplate.size() > 9 && levelTemplate.size() < 25;
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: "); System.out.println("Generating level for component list: ");
LevelParseTree parseTree = grammar.generateRandomTree(seed, width); LevelParseTree parseTree = grammar.generateRandomTree(seed, width);
int MAX_REGENS = 10; int MAX_REGENS = 30;
int nRegens = 0; int nRegens = 0;
while (!FitnessEvaluator.isFit(parseTree, profile, archetype) while (!FitnessEvaluator.isFit(parseTree, profile, archetype)
&& nRegens < MAX_REGENS) { && nRegens < MAX_REGENS) {
@@ -1120,13 +1120,18 @@ public class PCGLevel extends Level {
nRegens++; nRegens++;
} }
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
if (nRegens == MAX_REGENS) { if (nRegens == MAX_REGENS) {
System.out.println("Failed to generate a fit level after " System.out.println("Failed to generate a fit level after "
+ nRegens + " attempts. Proceeding with unfit level."); + 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) { 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);
@@ -1162,7 +1167,6 @@ public class PCGLevel extends Level {
break; break;
case POWER_UP : case POWER_UP :
length += buildFreebie(length, width - 64 - length); length += buildFreebie(length, width - 64 - length);
//length += buildStraight(length, lcomp.getEnd(), true);
break; break;
case SINGLE_PIT : case SINGLE_PIT :
length += buildSinglePit(length, width - 64 - length); length += buildSinglePit(length, width - 64 - length);

View File

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