package br.com.while42.rpgcs.model.classes; import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import br.com.while42.rpgcs.model.HitDice; import br.com.while42.rpgcs.model.HitDiceType; import br.com.while42.rpgcs.model.character.attributes.TypeRpgAlignment; import br.com.while42.rpgcs.model.character.attributes.TypeRpgReligion; import br.com.while42.rpgcs.model.character.attributes.TypeRpgSize; import br.com.while42.rpgcs.model.classes.bonuses.ExperienceAndLevel; public abstract class AbstractRpgClass implements CharacterClass, Serializable { private static final long serialVersionUID = 1L; protected Integer classLevel; public AbstractRpgClass() { classLevel = ExperienceAndLevel.MIN_LEVEL; } public AbstractRpgClass(Integer classLevel) { setClassLevel(classLevel); } @Override public final Integer getClassLevel() { return classLevel; } @Override public final void setClassLevel(Integer classLevel) { if (classLevel < ExperienceAndLevel.MIN_LEVEL || classLevel > ExperienceAndLevel.MAX_LEVEL) { throw new IllegalArgumentException("Invalid class level"); } this.classLevel = classLevel; } @Override public HitDice getUnarmedDamage(TypeRpgSize size) { return new HitDice(HitDiceType.d4); } @Override public Set<TypeRpgReligion> getReligions(TypeRpgAlignment alignment) { return Collections.unmodifiableSet(new HashSet<TypeRpgReligion>()); } protected Set<TypeRpgReligion> getReligions(Collection<TypeRpgReligion> religions, TypeRpgAlignment alignment) { Set<TypeRpgReligion> religionsAvailable = new HashSet<TypeRpgReligion>(); for (TypeRpgReligion r: religions) { if (r.getAlignment() == alignment) { religionsAvailable.add(r); } } return Collections.unmodifiableSet(religionsAvailable); } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof AbstractRpgClass)) return false; AbstractRpgClass rc = (AbstractRpgClass) o; return classLevel.equals(rc.classLevel) && getClass().equals(rc.getClass()); } @Override public int hashCode() { return classLevel + getClass().getName().hashCode(); } }