/* * Copyright (c) 1998-2017 by Richard A. Wilkes. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, version 2.0. If a copy of the MPL was not distributed with * this file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This Source Code Form is "Incompatible With Secondary Licenses", as * defined by the Mozilla Public License, version 2.0. */ package com.trollworks.gcs.feature; import com.trollworks.gcs.criteria.StringCompareType; import com.trollworks.gcs.criteria.StringCriteria; import com.trollworks.gcs.skill.Skill; import com.trollworks.gcs.widgets.outline.ListRow; import com.trollworks.toolkit.io.xml.XMLReader; import com.trollworks.toolkit.io.xml.XMLWriter; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; /** A skill bonus. */ public class SkillBonus extends Bonus { /** The XML tag. */ public static final String TAG_ROOT = "skill_bonus"; //$NON-NLS-1$ private static final String TAG_NAME = "name"; //$NON-NLS-1$ private static final String TAG_SPECIALIZATION = "specialization"; //$NON-NLS-1$ private static final String EMPTY = ""; //$NON-NLS-1$ private StringCriteria mNameCriteria; private StringCriteria mSpecializationCriteria; /** Creates a new skill bonus. */ public SkillBonus() { super(1); mNameCriteria = new StringCriteria(StringCompareType.IS, EMPTY); mSpecializationCriteria = new StringCriteria(StringCompareType.IS_ANYTHING, EMPTY); } /** * Loads a {@link SkillBonus}. * * @param reader The XML reader to use. */ public SkillBonus(XMLReader reader) throws IOException { this(); load(reader); } /** * Creates a clone of the specified bonus. * * @param other The bonus to clone. */ public SkillBonus(SkillBonus other) { super(other); mNameCriteria = new StringCriteria(other.mNameCriteria); mSpecializationCriteria = new StringCriteria(other.mSpecializationCriteria); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj instanceof SkillBonus && super.equals(obj)) { SkillBonus sb = (SkillBonus) obj; if (mNameCriteria.equals(sb.mNameCriteria)) { return mSpecializationCriteria.equals(sb.mSpecializationCriteria); } } return false; } @Override public Feature cloneFeature() { return new SkillBonus(this); } @Override public String getXMLTag() { return TAG_ROOT; } @Override public String getKey() { StringBuffer buffer = new StringBuffer(); buffer.append(Skill.ID_NAME); if (mNameCriteria.getType() == StringCompareType.IS && mSpecializationCriteria.getType() == StringCompareType.IS_ANYTHING) { buffer.append('/'); buffer.append(mNameCriteria.getQualifier()); } else { buffer.append("*"); //$NON-NLS-1$ } return buffer.toString(); } @Override protected void loadSelf(XMLReader reader) throws IOException { String name = reader.getName(); if (TAG_NAME.equals(name)) { mNameCriteria.load(reader); } else if (TAG_SPECIALIZATION.equals(name)) { mSpecializationCriteria.load(reader); } else { super.loadSelf(reader); } } /** * Saves the bonus. * * @param out The XML writer to use. */ @Override public void save(XMLWriter out) { out.startSimpleTagEOL(TAG_ROOT); mNameCriteria.save(out, TAG_NAME); mSpecializationCriteria.save(out, TAG_SPECIALIZATION); saveBase(out); out.endTagEOL(TAG_ROOT, true); } /** @return The name criteria. */ public StringCriteria getNameCriteria() { return mNameCriteria; } /** @return The name criteria. */ public StringCriteria getSpecializationCriteria() { return mSpecializationCriteria; } @Override public void fillWithNameableKeys(HashSet<String> set) { ListRow.extractNameables(set, mNameCriteria.getQualifier()); ListRow.extractNameables(set, mSpecializationCriteria.getQualifier()); } @Override public void applyNameableKeys(HashMap<String, String> map) { mNameCriteria.setQualifier(ListRow.nameNameables(map, mNameCriteria.getQualifier())); mSpecializationCriteria.setQualifier(ListRow.nameNameables(map, mSpecializationCriteria.getQualifier())); } }