Rete-based rule system (Drools) correctly fires the appropriate actions when Player's Profile meets certain criteria, based on the rules in rules/LevelTunerRules.drl.
This commit is contained in:
@@ -13,7 +13,7 @@ public class ParsedArgs {
|
||||
private boolean custom = false;
|
||||
private boolean videoCaptureEnabled = false;
|
||||
private int levelRandSeed = (int) (Math.random() * Integer.MAX_VALUE);
|
||||
private String generatorClass = "MyLevel";
|
||||
private String generatorClass = "PCGLevel";
|
||||
private String videoFileName = "LevelGenerator";
|
||||
|
||||
public LevelGenerator createLevelGenerator() {
|
||||
@@ -22,7 +22,7 @@ public class ParsedArgs {
|
||||
}
|
||||
if ("MyLevel".equals(generatorClass)) {
|
||||
return new MyLevelGenerator();
|
||||
} else if ("MyNewLevel".equals(generatorClass)) {
|
||||
} else if ("PCGLevel".equals(generatorClass)) {
|
||||
return new PCGLevelGenerator();
|
||||
} else if ("CustomizedLevel".equalsIgnoreCase(generatorClass)) {
|
||||
return new CustomizedLevelGenerator();
|
||||
|
||||
54
src/dk/itu/mario/level/GrammarTuner.java
Normal file
54
src/dk/itu/mario/level/GrammarTuner.java
Normal file
@@ -0,0 +1,54 @@
|
||||
package dk.itu.mario.level;
|
||||
|
||||
import java.io.File;
|
||||
import org.drools.KnowledgeBase;
|
||||
import org.drools.KnowledgeBaseFactory;
|
||||
import org.drools.builder.KnowledgeBuilder;
|
||||
import org.drools.builder.KnowledgeBuilderFactory;
|
||||
import org.drools.builder.ResourceType;
|
||||
import org.drools.io.ResourceFactory;
|
||||
import org.drools.runtime.StatefulKnowledgeSession;
|
||||
|
||||
import dk.itu.mario.level.PlayerProfile;
|
||||
import dk.itu.mario.level.grammar.LevelGrammar;
|
||||
|
||||
public class GrammarTuner {
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void tune(LevelGrammar levelGrammar, PlayerProfile playerProfile, LevelArchetype archetype) {
|
||||
KnowledgeBase knowledgeBase = createKnowledgeBase();
|
||||
|
||||
try {
|
||||
StatefulKnowledgeSession session = knowledgeBase
|
||||
.newStatefulKnowledgeSession();
|
||||
session.insert(playerProfile);
|
||||
session.fireAllRules();
|
||||
} catch (RuntimeException rte) {
|
||||
System.out
|
||||
.println("Unable to initialize StatefulKnowledgeSession for Rete grammar tuning - all challenges will be enabled! Exception: ");
|
||||
rte.printStackTrace(System.out);
|
||||
}
|
||||
}
|
||||
|
||||
private static KnowledgeBase createKnowledgeBase() {
|
||||
KnowledgeBuilder builder = KnowledgeBuilderFactory
|
||||
.newKnowledgeBuilder();
|
||||
|
||||
File accountRules = new File("rules/LevelTunerRules.drl");
|
||||
builder.add(ResourceFactory.newFileResource(accountRules),
|
||||
ResourceType.DRL);
|
||||
|
||||
if (builder.hasErrors()) {
|
||||
throw new RuntimeException(builder.getErrors().toString());
|
||||
}
|
||||
|
||||
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
|
||||
|
||||
// Add to Knowledge Base packages (rules from the drl file).
|
||||
knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
|
||||
|
||||
return knowledgeBase;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package dk.itu.mario.level.matcher;
|
||||
package dk.itu.mario.level;
|
||||
|
||||
import dk.itu.mario.MarioInterface.LevelInterface;
|
||||
|
||||
@@ -9,13 +9,10 @@ import dk.itu.mario.MarioInterface.LevelInterface;
|
||||
import dk.itu.mario.engine.DataRecorder;
|
||||
import dk.itu.mario.engine.sprites.Enemy;
|
||||
import dk.itu.mario.engine.sprites.SpriteTemplate;
|
||||
import dk.itu.mario.level.grammar.GrammarTuner;
|
||||
import dk.itu.mario.level.grammar.LevelGrammar;
|
||||
import dk.itu.mario.level.grammar.LevelGrammarFactory;
|
||||
import dk.itu.mario.level.grammar.LevelParseTree;
|
||||
import dk.itu.mario.level.matcher.ArchetypeMatcher;
|
||||
import dk.itu.mario.level.matcher.LevelArchetype;
|
||||
import dk.itu.mario.level.matcher.PlayerProfile;
|
||||
import dk.itu.mario.level.matcher.ProfileMatcher;
|
||||
|
||||
public class PCGLevel extends Level {
|
||||
@@ -81,7 +78,7 @@ public class PCGLevel extends Level {
|
||||
|
||||
System.out
|
||||
.println("Tuning grammar for PlayerProfile & LevelArchetype using RETE");
|
||||
grammar = GrammarTuner.tune(grammar, profile, archetype);
|
||||
GrammarTuner.tune(grammar, profile, archetype);
|
||||
|
||||
System.out.println("Creating level.");
|
||||
create(seed, profile, archetype, grammar);
|
||||
|
||||
70
src/dk/itu/mario/level/PlayerProfile.java
Normal file
70
src/dk/itu/mario/level/PlayerProfile.java
Normal file
@@ -0,0 +1,70 @@
|
||||
package dk.itu.mario.level;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class PlayerProfile {
|
||||
//From Bartle/Yee models of player psychology: achiever, killer, explorer, manipulator
|
||||
public enum TYPE { RUNNER, SHOOTER, JUMPER, BUMPER}
|
||||
//Dreyfus model of skill acquisition:
|
||||
public enum SKILL_LEVEL { NOVICE, BEGINNER, COMPETENT, PROFICIENT, EXPERT}
|
||||
|
||||
private Set<LevelComponent.TYPE> enabledComponents = new HashSet<LevelComponent.TYPE>();
|
||||
|
||||
private SKILL_LEVEL skillLevel;
|
||||
private TYPE type;
|
||||
|
||||
public PlayerProfile(SKILL_LEVEL skillLevel, TYPE type) {
|
||||
this.skillLevel = skillLevel;
|
||||
this .type = type;
|
||||
}
|
||||
|
||||
public SKILL_LEVEL getSkillLevel() {
|
||||
return skillLevel;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public TYPE getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setDisabled(LevelComponent.TYPE type) {
|
||||
if (enabledComponents.contains(type)) {
|
||||
System.out.println("Component type disabled: " + type);
|
||||
enabledComponents.remove(type);
|
||||
}
|
||||
}
|
||||
|
||||
public void setEnabled(LevelComponent.TYPE type) {
|
||||
if (!enabledComponents.contains(type)) {
|
||||
System.out.println("Component type enabled: " + type);
|
||||
enabledComponents.add(type);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return skillLevel + " " + type;
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package dk.itu.mario.level.grammar;
|
||||
|
||||
import dk.itu.mario.level.matcher.LevelArchetype;
|
||||
import dk.itu.mario.level.matcher.PlayerProfile;
|
||||
|
||||
public class GrammarTuner {
|
||||
public static LevelGrammar tune(LevelGrammar grammar, PlayerProfile profile, LevelArchetype archetype) {
|
||||
return grammar;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package dk.itu.mario.level.grammar;
|
||||
|
||||
import dk.itu.mario.level.matcher.LevelArchetype;
|
||||
import dk.itu.mario.level.matcher.PlayerProfile;
|
||||
import dk.itu.mario.level.LevelArchetype;
|
||||
import dk.itu.mario.level.PlayerProfile;
|
||||
|
||||
|
||||
public class LevelGrammarFactory {
|
||||
|
||||
@@ -2,7 +2,8 @@ package dk.itu.mario.level.matcher;
|
||||
|
||||
import dk.itu.mario.MarioInterface.GamePlay;
|
||||
import dk.itu.mario.engine.DataRecorder;
|
||||
import dk.itu.mario.level.matcher.LevelArchetype.TYPE;
|
||||
import dk.itu.mario.level.LevelArchetype;
|
||||
import dk.itu.mario.level.LevelArchetype.TYPE;
|
||||
|
||||
public class ArchetypeMatcher {
|
||||
public static LevelArchetype getMatchingArchetype(GamePlay playerMetrics, DataRecorder detailedInfo) {
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
package dk.itu.mario.level.matcher;
|
||||
|
||||
public class PlayerProfile {
|
||||
//From Bartle/Yee models of player psychology: achiever, killer, explorer, manipulator
|
||||
public enum TYPE { RUNNER, SHOOTER, JUMPER, BUMPER}
|
||||
//Dreyfus model of skill acquisition:
|
||||
public enum SKILL_LEVEL { NOVICE, BEGINNER, COMPETENT, PROFICIENT, EXPERT}
|
||||
|
||||
private SKILL_LEVEL skillLevel;
|
||||
private TYPE type;
|
||||
|
||||
public PlayerProfile(SKILL_LEVEL skillLevel, TYPE type) {
|
||||
this.skillLevel = skillLevel;
|
||||
this .type = type;
|
||||
}
|
||||
|
||||
public SKILL_LEVEL getSkillLevel() {
|
||||
return skillLevel;
|
||||
}
|
||||
|
||||
public TYPE getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return skillLevel + " " + type;
|
||||
}
|
||||
}
|
||||
@@ -2,12 +2,13 @@ package dk.itu.mario.level.matcher;
|
||||
|
||||
import dk.itu.mario.MarioInterface.GamePlay;
|
||||
import dk.itu.mario.engine.DataRecorder;
|
||||
import dk.itu.mario.level.matcher.PlayerProfile.SKILL_LEVEL;
|
||||
import dk.itu.mario.level.matcher.PlayerProfile.TYPE;
|
||||
import dk.itu.mario.level.PlayerProfile;
|
||||
import dk.itu.mario.level.PlayerProfile.SKILL_LEVEL;
|
||||
import dk.itu.mario.level.PlayerProfile.TYPE;
|
||||
|
||||
public class ProfileMatcher {
|
||||
public static PlayerProfile getMatchingProfile(GamePlay playerMetrics, DataRecorder detailedInfo) {
|
||||
System.out.println("Selecting PlayerProfile based on GamePlay metrics, DataRecorder logs.");
|
||||
return new PlayerProfile(SKILL_LEVEL.NOVICE, TYPE.RUNNER);
|
||||
return new PlayerProfile(SKILL_LEVEL.BEGINNER, TYPE.JUMPER);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user