package com.lateensoft.pathfinder.toolkit.model.character.stats; import java.util.*; import android.os.Parcel; import android.os.Parcelable; import com.google.common.collect.Lists; import org.jetbrains.annotations.Nullable; public class SkillSet extends ValidatedTypedStatSet<Skill, SkillType> implements Parcelable, Iterable<Skill> { private List<Skill> skills; public SkillSet() { super(); } public SkillSet(List<Skill> items, @Nullable CorrectionListener<Skill> listener) { super(items, listener); } public SkillSet(Parcel in) { skills = Lists.newArrayList(); in.readTypedList(skills, Skill.CREATOR); } @Override public void writeToParcel(Parcel out, int flags) { out.writeTypedList(skills); } @Override protected void initWithValidatedItems(List<Skill> items) { skills = items; } @Override protected List<SkillType> getSortedTypes() { return SkillType.getKeySortedValues(); } @Override protected Skill newItemOfType(SkillType type) { return new Skill(type); } @Override protected ItemValidityChecker newItemValidityChecker() { return new ItemValidityChecker() { @Override public boolean isValid(Skill item) { return item.canBeSubTyped() || numberOfTypePreviouslyFound(item.getType()) == 0; } }; } public Skill getSkillByIndex(int index) { return skills.get(index); } public Skill getSkillByType(SkillType type) { for (Skill skill : skills) { if (skill.getType() == type) { return skill; } } throw new IllegalStateException("No skill of type " + type + " found"); } /** * @return reference to skill at index. Index corresponds to array created by getTrainedSkills */ public Skill getTrainedSkill(int index){ int trainedSkillIndex = 0; for (Skill m_skill : skills) { if (m_skill.getRank() > 0) { if (trainedSkillIndex == index) { return m_skill; } else { trainedSkillIndex++; } } } return null; } public List<Skill> getSkills(){ return skills; } @Override public Iterator<Skill> iterator() { return new Iterator<Skill>() { Iterator<Skill> _iterator = skills.iterator(); @Override public boolean hasNext() { return _iterator.hasNext(); } @Override public Skill next() { return _iterator.next(); } @Override public void remove() { throw new UnsupportedOperationException(SkillSet.class.getSimpleName() + ".iterator.remove"); } }; } public int size() { return skills.size(); } public ArrayList<Skill> getTrainedSkills(){ ArrayList<Skill> trainedSkills = new ArrayList<Skill>(); for (Skill m_skill : skills) { if (m_skill.getRank() > 0) { trainedSkills.add(m_skill); } } return trainedSkills; } public Skill addNewSubSkill(SkillType skillType) { Skill newSkill = new Skill(skillType); skills.add(newSkill); Collections.sort(skills); return newSkill; } public void deleteSkill(Skill skill) { skills.remove(skill); } public boolean hasMultipleOfSkill(SkillType skillType) { int numOfSkill = 0; for (Skill skill : skills) { if (skill.getType() == skillType) { numOfSkill++; } if (numOfSkill > 1) { return true; } } return false; } /** * @return true if all subtypes of this skill are either trained or named */ public boolean allSubSkillsUsed(SkillType skillType) { for (Skill m_skill : skills) { if (m_skill.getType() == skillType && m_skill.getRank() == 0 && (m_skill.getSubType() == null || m_skill.getSubType().isEmpty())) { return false; } } return true; } @Override public int describeContents() { return 0; } public static final Parcelable.Creator<SkillSet> CREATOR = new Parcelable.Creator<SkillSet>() { public SkillSet createFromParcel(Parcel in) { return new SkillSet(in); } public SkillSet[] newArray(int size) { return new SkillSet[size]; } }; @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof SkillSet)) return false; SkillSet skills = (SkillSet) o; if (!this.skills.equals(skills.skills)) return false; return true; } @Override public int hashCode() { return skills.hashCode(); } }