package com.lateensoft.pathfinder.toolkit.model.character.stats;
import java.util.Iterator;
import java.util.List;
import com.google.common.collect.Lists;
import android.os.Parcel;
import android.os.Parcelable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.lateensoft.pathfinder.toolkit.model.character.stats.AbilityType.*;
public class AbilitySet extends ValidatedTypedStatSet<Ability, AbilityType> implements Parcelable, Iterable<Ability> {
private List<Ability> abilities;
public AbilitySet() {
super();
}
public AbilitySet(List<Ability> items, @Nullable ValidatedTypedStatSet.CorrectionListener<Ability> listener) {
super(items, listener);
}
public AbilitySet(Parcel in) {
abilities = Lists.newArrayListWithCapacity(values().length);
in.readTypedList(abilities, Ability.CREATOR);
}
@Override
public void writeToParcel(Parcel out, int flags) {
out.writeTypedList(abilities);
}
@Override
protected void initWithValidatedItems(List<Ability> items) {
abilities = items;
}
@Override
protected List<AbilityType> getSortedTypes() {
return AbilityType.getKeySortedValues();
}
@Override
protected Ability newItemOfType(AbilityType type) {
return new Ability(type);
}
@Override
protected ItemValidityChecker newItemValidityChecker() {
return new ItemValidityChecker() {
@Override public boolean isValid(Ability item) {
return numberOfTypePreviouslyFound(item.getType()) == 0;
}
};
}
public Ability getAbility(@NotNull AbilityType type) {
for (Ability ability : abilities) {
if (type == ability.getType()) {
return ability;
}
}
throw new NullPointerException();
}
/**
* @return the ability at index. Note: indexes of the set are defined by ABILITY_KEYS
*/
public Ability getAbilityAtIndex(int index) {
return abilities.get(index);
}
/**
* @param maxDex maximum dex mod for the character
* @return the final mod value of the ability
*/
public int getTotalAbilityMod(AbilityType type, int maxDex) {
int abilityMod = getAbility(type).getTempModifier();
if (type == DEX && abilityMod > maxDex) {
return maxDex;
} else {
return abilityMod;
}
}
@Override
public int size(){
return abilities.size();
}
@Override
public Iterator<Ability> iterator() {
return new Iterator<Ability>() {
Iterator<Ability> iterator = abilities.iterator();
@Override public boolean hasNext() {
return iterator.hasNext();
}
@Override public Ability next() {
return iterator.next();
}
@Override public void remove() {
throw new UnsupportedOperationException(AbilitySet.class.getSimpleName() + ".iterator.remove");
}
};
}
@Override
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<AbilitySet> CREATOR = new Parcelable.Creator<AbilitySet>() {
public AbilitySet createFromParcel(Parcel in) {
return new AbilitySet(in);
}
public AbilitySet[] newArray(int size) {
return new AbilitySet[size];
}
};
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof AbilitySet)) return false;
AbilitySet that = (AbilitySet) o;
if (!abilities.equals(that.abilities)) return false;
return true;
}
@Override
public int hashCode() {
return abilities.hashCode();
}
}