From 992f2eef463aa68696f60e240aa7204a124e3192 Mon Sep 17 00:00:00 2001 From: Woody Folsom Date: Sun, 18 Mar 2012 16:41:23 -0400 Subject: [PATCH] Example rules to enable/disable challenges (feeds fitness evaluator). --- rules/LevelTunerRules.drl | 16 ++++++++ src/dk/itu/mario/level/FitnessEvaluator.java | 20 +++++++++- src/dk/itu/mario/level/PCGLevel.java | 12 ++++-- src/dk/itu/mario/level/PlayerProfile.java | 41 ++++++++------------ 4 files changed, 59 insertions(+), 30 deletions(-) diff --git a/rules/LevelTunerRules.drl b/rules/LevelTunerRules.drl index 3ce180a..b318ba9 100644 --- a/rules/LevelTunerRules.drl +++ b/rules/LevelTunerRules.drl @@ -14,4 +14,20 @@ rule "BeginnerJumper" then 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 \ No newline at end of file diff --git a/src/dk/itu/mario/level/FitnessEvaluator.java b/src/dk/itu/mario/level/FitnessEvaluator.java index 3e677a3..495b4d3 100644 --- a/src/dk/itu/mario/level/FitnessEvaluator.java +++ b/src/dk/itu/mario/level/FitnessEvaluator.java @@ -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 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; } } diff --git a/src/dk/itu/mario/level/PCGLevel.java b/src/dk/itu/mario/level/PCGLevel.java index 03be73c..55c412a 100644 --- a/src/dk/itu/mario/level/PCGLevel.java +++ b/src/dk/itu/mario/level/PCGLevel.java @@ -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,13 +1120,18 @@ public class PCGLevel extends Level { nRegens++; } + List 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 levelTemplate = parseTree.getLevelTemplate(); - for (LevelComponent lcomp : levelTemplate) { LevelComponent.TYPE lctype = lcomp.getType(); System.out.println("Building for: " + lcomp); @@ -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); diff --git a/src/dk/itu/mario/level/PlayerProfile.java b/src/dk/itu/mario/level/PlayerProfile.java index 5854ef7..7ceaee7 100644 --- a/src/dk/itu/mario/level/PlayerProfile.java +++ b/src/dk/itu/mario/level/PlayerProfile.java @@ -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; - } - default: - return 0; - } + return skillVector.get(SKILL.JUMP); + } + 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; - // } - + public double getProbability(ChallengeRewardType crt) { switch (crt) { case GAP: return Math.min(.5, (.5) * (skillVector.get(SKILL.JUMP) / 100.0)