package ring.mobiles.mobclass;
import java.io.Serializable;
import ring.util.Dice;
public class MobileClass implements Serializable {
public static final long serialVersionUID = 1;
/**
* 1dX, where X is the value of hitDie, plus Con modifier is added for HP
* each levelup.
*/
private Dice hitDie;
// A list of ClassFeatures this class has.
// Save and Base Attack Bonus classification variables.
private SaveType fortSaveType;
private SaveType refSaveType;
private SaveType willSaveType;
private BaseAttackBonus baseAttackBonus;
// Level variable... This is the level the mobile has in the class.
private int level;
// Miscellaneous variables.
private String name; // The class's name.
private String displayName; // How the class's name appears in-game.
// Saving throw type. This enum describes if a classes specific saves are
// good or poor.
// To calculate a base save bonus, the formulas are as follows:
// GOOD: trunc((level / 2) + 2)
// POOR: trunc(level / 3)
public enum SaveType {
GOOD, POOR;
}
// Save enum.
// This enum describes the three D&D 3.5 saving throw types.
public enum Save {
FORTITUDE, REFLEX, WILL
}
// Base Attack Bonus type.
public enum BaseAttackBonus {
GOOD(1), // Barbarian, Warrior, Paladin, Ranger
AVERAGE(.75), // Rogue, Cleric, Druid, Shapeshifter
POOR(.5); // CASTER, PSION, Occultist, Alchemist
private double modifier;
BaseAttackBonus(double modifier) {
this.modifier = modifier;
}
public double getModifier() {
return modifier;
}
}
public MobileClass() {
}
public int getClassLevel() {
return level;
}
public Dice getHitDie() {
return hitDie;
}
public String getDisplayName() {
return displayName;
}
public String getName() {
return name;
}
public BaseAttackBonus getBaseAttackBonus() {
return baseAttackBonus;
}
public SaveType getFortitudeSaveType() {
return fortSaveType;
}
public SaveType getReflexSaveType() {
return refSaveType;
}
public SaveType getWillSaveType() {
return willSaveType;
}
public void setClassLevel(int level) {
this.level = level;
}
public int getBaseSaveBonus(Save save) {
if (save == Save.FORTITUDE) {
if (fortSaveType == SaveType.POOR)
return (int) (level / 3);
if (fortSaveType == SaveType.GOOD)
return (int) ((level / 2) + 2);
}
if (save == Save.REFLEX) {
if (refSaveType == SaveType.POOR)
return (int) (level / 3);
if (refSaveType == SaveType.GOOD)
return (int) ((level / 2) + 2);
}
if (save == Save.WILL) {
if (willSaveType == SaveType.POOR)
return (int) (level / 3);
if (willSaveType == SaveType.GOOD)
return (int) ((level / 2) + 2);
}
return -9999; // should never be hit, but keeps compiler happy
}
public void addClassFeature(String featureName) {
//TODO reimplement afte rewrite of class features.
}
// getFeatureByName method.
// Returns the class feature specified by the name parameter or null if
// nothing
// is found. This method is case insensitive.
public ClassFeature getClassFeature(String name) {
//TODO rewrite after implementation of class features.
return null;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((baseAttackBonus == null) ? 0 : baseAttackBonus.hashCode());
result = prime * result
+ ((displayName == null) ? 0 : displayName.hashCode());
result = prime * result
+ ((fortSaveType == null) ? 0 : fortSaveType.hashCode());
result = prime * result + ((hitDie == null) ? 0 : hitDie.hashCode());
result = prime * result + level;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result
+ ((refSaveType == null) ? 0 : refSaveType.hashCode());
result = prime * result
+ ((willSaveType == null) ? 0 : willSaveType.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MobileClass other = (MobileClass) obj;
if (baseAttackBonus == null) {
if (other.baseAttackBonus != null)
return false;
} else if (!baseAttackBonus.equals(other.baseAttackBonus))
return false;
if (displayName == null) {
if (other.displayName != null)
return false;
} else if (!displayName.equals(other.displayName))
return false;
if (fortSaveType == null) {
if (other.fortSaveType != null)
return false;
} else if (!fortSaveType.equals(other.fortSaveType))
return false;
if (hitDie == null) {
if (other.hitDie != null)
return false;
} else if (!hitDie.equals(other.hitDie))
return false;
if (level != other.level)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (refSaveType == null) {
if (other.refSaveType != null)
return false;
} else if (!refSaveType.equals(other.refSaveType))
return false;
if (willSaveType == null) {
if (other.willSaveType != null)
return false;
} else if (!willSaveType.equals(other.willSaveType))
return false;
return true;
}
}