package br.com.while42.rpgcs.model.classes; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import br.com.while42.rpgcs.R; 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.BaseAttackBonuses; import br.com.while42.rpgcs.model.classes.bonuses.BaseSaveBonuses; import br.com.while42.rpgcs.model.classes.bonuses.ExperienceAndLevel; public class Monk extends AbstractRpgClass { private static final long serialVersionUID = 1L; private static HitDice unarmedDamageSizeSmall[] = new HitDice[ExperienceAndLevel.MAX_LEVEL + 1]; private static HitDice unarmedDamageSizeMedium[] = new HitDice[ExperienceAndLevel.MAX_LEVEL + 1]; private static HitDice unarmedDamageSizeLarge[] = new HitDice[ExperienceAndLevel.MAX_LEVEL + 1]; private static final Set<TypeRpgReligion> religions = new HashSet<TypeRpgReligion>(Arrays.asList( TypeRpgReligion.HEIRONEOUS, TypeRpgReligion.ST_CUTHBERT, TypeRpgReligion.HEXTOR )); static { for (int level = 1; level <= 3; level++) { unarmedDamageSizeSmall[level] = new HitDice(1, HitDiceType.d4); unarmedDamageSizeLarge[level] = new HitDice(1, HitDiceType.d8); } for (int level = 4; level <= 7; level++) { unarmedDamageSizeSmall[level] = new HitDice(1, HitDiceType.d6); unarmedDamageSizeLarge[level] = new HitDice(2, HitDiceType.d6); } for (int level = 8; level <= 11; level++) { unarmedDamageSizeSmall[level] = new HitDice(1, HitDiceType.d8); unarmedDamageSizeLarge[level] = new HitDice(2, HitDiceType.d8); } for (int level = 12; level <= 15; level++) { unarmedDamageSizeSmall[level] = new HitDice(1, HitDiceType.d10); unarmedDamageSizeLarge[level] = new HitDice(3, HitDiceType.d6); } for (int level = 16; level <= 19; level++) { unarmedDamageSizeSmall[level] = new HitDice(2, HitDiceType.d6); unarmedDamageSizeLarge[level] = new HitDice(3, HitDiceType.d8); } // TODO: Falta tratar corretamente casos acima do level 20 for (int level = 20; level <= ExperienceAndLevel.MAX_LEVEL; level++) { unarmedDamageSizeSmall[level] = new HitDice(2, HitDiceType.d8); unarmedDamageSizeLarge[level] = new HitDice(4, HitDiceType.d8); } } @Override public HitDiceType getHitDice() { return HitDiceType.d8; } @Override public int getCodeName() { return R.string.class_monk; } @Override public int getBaseAttackBonus() { return new BaseAttackBonuses().getAverage(classLevel); } @Override public int getFortSave() { return new BaseSaveBonuses().getGood(classLevel); } @Override public int getRefSave() { return new BaseSaveBonuses().getGood(classLevel); } @Override public int getWillSave() { return new BaseSaveBonuses().getGood(classLevel); } @Override public HitDice getUnarmedDamage(TypeRpgSize size) { if (classLevel < ExperienceAndLevel.MIN_LEVEL || classLevel > ExperienceAndLevel.MAX_LEVEL) { throw new IllegalArgumentException("Illegal class level"); } switch (size) { case SMALL: return unarmedDamageSizeSmall[classLevel]; case LARGE: return unarmedDamageSizeLarge[classLevel]; case MEDIUM: return unarmedDamageSizeMedium[classLevel]; default: return new HitDice(HitDiceType.d4); } } @Override public Set<TypeRpgReligion> getReligions(TypeRpgAlignment alignment) { return getReligions(religions, alignment); } @Override public HitDice getStartingGold() { return new HitDice(5, HitDiceType.d4); } }