/*
* 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.prereq;
import com.trollworks.gcs.character.GURPSCharacter;
import com.trollworks.gcs.criteria.IntegerCriteria;
import com.trollworks.gcs.criteria.NumericCompareType;
import com.trollworks.gcs.feature.BonusAttributeType;
import com.trollworks.gcs.widgets.outline.ListRow;
import com.trollworks.toolkit.annotation.Localize;
import com.trollworks.toolkit.io.xml.XMLReader;
import com.trollworks.toolkit.io.xml.XMLWriter;
import com.trollworks.toolkit.utility.Localization;
import com.trollworks.toolkit.utility.text.Enums;
import java.io.IOException;
import java.text.MessageFormat;
/** A Attribute prerequisite. */
public class AttributePrereq extends HasPrereq {
@Localize("{0}{1} {2} which {3}")
@Localize(locale = "de", value = "{0}{1} {2} die {3}")
@Localize(locale = "ru", value = "{0}{1} {2} который {3}")
@Localize(locale = "es", value = "{0}{1} {2} el cual {3}")
private static String DESCRIPTION;
@Localize("{0}+{1}")
@Localize(locale = "de", value = "{0}+{1}")
private static String COMBINED;
static {
Localization.initialize();
}
/** The possible {@link BonusAttributeType}s that can be affected. */
public static final BonusAttributeType[] TYPES = { BonusAttributeType.ST, BonusAttributeType.DX, BonusAttributeType.IQ, BonusAttributeType.HT, BonusAttributeType.WILL, BonusAttributeType.PERCEPTION };
/** The XML tag for this class. */
public static final String TAG_ROOT = "attribute_prereq"; //$NON-NLS-1$
private static final String ATTRIBUTE_WHICH = "which"; //$NON-NLS-1$
private static final String ATTRIBUTE_COMBINED_WITH = "combined_with"; //$NON-NLS-1$
private static final String ATTRIBUTE_COMPARE = "compare"; //$NON-NLS-1$
private BonusAttributeType mWhich;
private BonusAttributeType mCombinedWith;
private IntegerCriteria mValueCompare;
/**
* Creates a new prerequisite.
*
* @param parent The owning prerequisite list, if any.
*/
public AttributePrereq(PrereqList parent) {
super(parent);
mValueCompare = new IntegerCriteria(NumericCompareType.AT_LEAST, 10);
setWhich(BonusAttributeType.IQ);
setCombinedWith(null);
}
/**
* Loads a prerequisite.
*
* @param parent The owning prerequisite list, if any.
* @param reader The XML reader to load from.
*/
public AttributePrereq(PrereqList parent, XMLReader reader) throws IOException {
this(parent);
loadHasAttribute(reader);
setWhich(Enums.extract(reader.getAttribute(ATTRIBUTE_WHICH), TYPES, BonusAttributeType.ST));
setCombinedWith(Enums.extract(reader.getAttribute(ATTRIBUTE_COMBINED_WITH), TYPES));
mValueCompare.setType(Enums.extract(reader.getAttribute(ATTRIBUTE_COMPARE), NumericCompareType.values(), NumericCompareType.AT_LEAST));
mValueCompare.setQualifier(reader.readInteger(10));
}
/**
* Creates a copy of the specified prerequisite.
*
* @param parent The owning prerequisite list, if any.
* @param prereq The prerequisite to clone.
*/
protected AttributePrereq(PrereqList parent, AttributePrereq prereq) {
super(parent, prereq);
mWhich = prereq.mWhich;
mCombinedWith = prereq.mCombinedWith;
mValueCompare = new IntegerCriteria(prereq.mValueCompare);
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof AttributePrereq && super.equals(obj)) {
AttributePrereq ap = (AttributePrereq) obj;
return mWhich == ap.mWhich && mCombinedWith == ap.mCombinedWith && mValueCompare.equals(ap.mValueCompare);
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public String getXMLTag() {
return TAG_ROOT;
}
@Override
public Prereq clone(PrereqList parent) {
return new AttributePrereq(parent, this);
}
@Override
public void save(XMLWriter out) {
out.startTag(TAG_ROOT);
saveHasAttribute(out);
out.writeAttribute(ATTRIBUTE_WHICH, Enums.toId(mWhich));
if (mCombinedWith != null) {
out.writeAttribute(ATTRIBUTE_COMBINED_WITH, Enums.toId(mCombinedWith));
}
out.writeAttribute(ATTRIBUTE_COMPARE, Enums.toId(mValueCompare.getType()));
out.finishTag();
out.writeEncodedData(Integer.toString(mValueCompare.getQualifier()));
out.endTagEOL(TAG_ROOT, false);
}
/** @return The type of comparison to make. */
public BonusAttributeType getWhich() {
return mWhich;
}
/** @param which The type of comparison to make. */
public void setWhich(BonusAttributeType which) {
mWhich = which;
}
/** @return The type of comparison to make. */
public BonusAttributeType getCombinedWith() {
return mCombinedWith;
}
/** @param which The type of comparison to make. */
public void setCombinedWith(BonusAttributeType which) {
mCombinedWith = which;
}
private static int getAttributeValue(GURPSCharacter character, BonusAttributeType attribute) {
if (attribute == null) {
return 0;
}
switch (attribute) {
case ST:
return character.getStrength();
case DX:
return character.getDexterity();
case IQ:
return character.getIntelligence();
case HT:
return character.getHealth();
case WILL:
return character.getWill();
case PERCEPTION:
return character.getPerception();
default:
return 0;
}
}
/** @return The value comparison object. */
public IntegerCriteria getValueCompare() {
return mValueCompare;
}
@Override
public boolean satisfied(GURPSCharacter character, ListRow exclude, StringBuilder builder, String prefix) {
boolean satisfied = mValueCompare.matches(getAttributeValue(character, mWhich) + getAttributeValue(character, mCombinedWith));
if (!has()) {
satisfied = !satisfied;
}
if (!satisfied && builder != null) {
builder.append(MessageFormat.format(DESCRIPTION, prefix, has() ? HAS : DOES_NOT_HAVE, mCombinedWith == null ? mWhich.getPresentationName() : MessageFormat.format(COMBINED, mWhich.getPresentationName(), mCombinedWith.getPresentationName()), mValueCompare.toString()));
}
return satisfied;
}
}