Files
cs8803p3/src/dk/itu/mario/level/PlayerProfile.java
2012-03-18 20:31:54 -04:00

152 lines
3.7 KiB
Java

package dk.itu.mario.level;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import dk.itu.mario.level.matcher.ProfileMatcher.SKILL;
public class PlayerProfile {
// From Bartle/Yee models of player psychology: achiever, killer, explorer,
// manipulator
public enum TYPE {
BUMPER, COLLECTOR, RUNNER, SHOOTER, JUMPER
}
/*
* Certain probabilities are boosted by this constant based on the player's
* type.
*/
public static final double TYPE_MULTIPLIER = 1.25;
public enum ChallengeRewardType {
GAP, ENEMY, HARDER_ENEMY, JUMP, COIN, BLOCK, POWERUP
};
// 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 Map<SKILL, Integer> skillVector;
private TYPE type;
public PlayerProfile(SKILL_LEVEL skillLevel, TYPE type,
Map<SKILL, Integer> skillVector) {
this.skillLevel = skillLevel;
this.type = type;
this.skillVector = skillVector;
for (LevelComponent.TYPE lcType : LevelComponent.TYPE.values()) {
setEnabled(lcType);
}
}
public boolean isEnabled(LevelComponent.TYPE type) {
return enabledComponents.contains(type);
}
public SKILL_LEVEL getSkillLevel() {
return skillLevel;
}
public int getBumpSkill() {
return skillVector.get(SKILL.BUMP);
}
public int getCollectSkill() {
return skillVector.get(SKILL.COLLECT);
}
public int getJumpSkill() {
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) {
switch (crt) {
case GAP:
return Math.min(.5, (.5) * (skillVector.get(SKILL.JUMP) / 100.0)
* ((type == TYPE.JUMPER) ? TYPE_MULTIPLIER : 1));
case ENEMY:
double skillSet = ((100 - skillVector.get(SKILL.RUN)) / 100.0)
* ((type == TYPE.RUNNER) ? -1 * TYPE_MULTIPLIER : 1);
skillSet += (skillVector.get(SKILL.STOMP) / 100.0);
skillSet /= 2;
return Math.min(.5, (.5) * skillSet);
case HARDER_ENEMY:
return Math.min(.5, (.5) * (skillVector.get(SKILL.SHOOT) / 100.0)
* ((type == TYPE.SHOOTER) ? TYPE_MULTIPLIER : 1));
case JUMP:
return Math.min(.5, (.5) * (skillVector.get(SKILL.JUMP) / 100.0)
* ((type == TYPE.JUMPER) ? TYPE_MULTIPLIER : 1));
case BLOCK:
return Math.min(.5, (.5) * (skillVector.get(SKILL.BUMP) / 100.0)
* ((type == TYPE.BUMPER) ? TYPE_MULTIPLIER : 1));
case COIN:
return Math.min(.5, (.5) * (skillVector.get(SKILL.COLLECT) / 100.0)
* ((type == TYPE.COLLECTOR) ? TYPE_MULTIPLIER : 1));
case POWERUP:
double skillMod = 0;
switch (skillLevel) {
case BEGINNER:
skillMod = .8;
break;
case COMPETENT:
skillMod = .6;
break;
case PROFICIENT:
skillMod = .4;
break;
case EXPERT:
skillMod = .2;
break;
default:
skillMod = 1;
}
skillMod = (skillMod + (skillVector.get(SKILL.SHOOT) / 100.0)) / 2.0;
return (.3) * skillMod;
default:
return 0.1;
}
}
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;
}
}