Example rules to enable/disable challenges (feeds fitness evaluator).
This commit is contained in:
@@ -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
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user