package com.lateensoft.pathfinder.toolkit.model.character.stats; import com.google.common.base.Preconditions; import android.os.Parcel; import android.os.Parcelable; import org.jetbrains.annotations.NotNull; public class Ability implements TypedStat<AbilityType>, Parcelable, Comparable<Ability> { private static final int[] SCORES = {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}; private static final int[] COSTS = {-4, -2, -1, 0, 1, 2, 3, 5, 7, 10, 13, 17}; private static final int MAX_SCORE = 18; private static final int MIN_SCORE = 7; public static final int BASE_ABILITY_SCORE = 10; private final AbilityType type; private int score; private int tempBonus; public Ability(@NotNull AbilityType type, int score, int temp) { Preconditions.checkNotNull(type); this.type = type; this.score = score; this.tempBonus = temp; } public Ability(@NotNull AbilityType type) { this(type, BASE_ABILITY_SCORE, 0); } public Ability(Parcel in) { score = in.readInt(); tempBonus = in.readInt(); type = AbilityType.forKey(in.readInt()); } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(score); out.writeInt(tempBonus); out.writeInt(type.getKey()); } @Override public AbilityType getType() { return type; } /** * @return The base score for the ability */ public int getScore() { return score; } public void setScore(int score) { this.score = score; } /** * @return The temporary change to the base score */ public int getTempBonus() { return tempBonus; } public void setTempBonus(int tempBonus) { this.tempBonus = tempBonus; } public int getAbilityModifier() { return calculateModifier(score); } /** * The modifier for the base + temp bonus */ public int getTempModifier() { return calculateModifier(score + tempBonus); } private int calculateModifier(int score) { float mod = (float) ((score - 10)/2.0); if (mod < 0) { return (int) (mod - 0.5); } else { return (int) mod; } } public void incScore() { if (score < MAX_SCORE) { score++; } } public void decScore() { if (score > MIN_SCORE) { score--; } } public int getAbilityPointCost() { for(int i = 0; i < SCORES.length; i++) { if(score == SCORES[i]) { return COSTS[i]; } } return 0; } @Override public int describeContents() { return 0; } public static final Parcelable.Creator<Ability> CREATOR = new Parcelable.Creator<Ability>() { public Ability createFromParcel(Parcel in) { return new Ability(in); } public Ability[] newArray(int size) { return new Ability[size]; } }; @Override public int compareTo(Ability another) { return this.type.compareTo(another.type); } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Ability)) return false; Ability ability = (Ability) o; if (type != ability.type) return false; if (score != ability.score) return false; if (tempBonus != ability.tempBonus) return false; return true; } @Override public int hashCode() { int result = type.hashCode(); result = 31 * result + score; result = 31 * result + tempBonus; return result; } @Override public String toString() { return type.toString() + "; score:" + score + "; temp:" + tempBonus; } }