/**
* 2014 Urs Zeidler
*/
package de.urszeidler.eclipse.shr5Management.impl;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.util.Map;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.util.EObjectValidator;
import de.urszeidler.eclipse.shr5Management.KarmaGenerator;
import de.urszeidler.eclipse.shr5Management.MetaType;
import de.urszeidler.eclipse.shr5Management.ModelPlugin;
import de.urszeidler.eclipse.shr5Management.Shr5System;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage;
import de.urszeidler.eclipse.shr5Management.SpecialType;
import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools;
import de.urszeidler.eclipse.shr5Management.util.Shr5managementValidator;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Shr5 Karma Generator</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getMetaType <em>Meta Type</em>}</li>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getCharacterConcept <em>Character Concept</em>}</li>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getKarmaToResource <em>Karma To Resource</em>}</li>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getKarmaSpend <em>Karma Spend</em>}</li>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getResourceSpend <em>Resource Spend</em>}</li>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getStartKarma <em>Start Karma</em>}</li>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getStartResources <em>Start Resources</em>}</li>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.KarmaGeneratorImpl#getChoiseKarmaCost <em>Choise Karma Cost</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public abstract class KarmaGeneratorImpl<G extends Shr5System> extends Shr5RuleGeneratorImpl<G> implements KarmaGenerator<G> {
/**
* The cached value of the '{@link #getMetaType() <em>Meta Type</em>}' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getMetaType()
* @generated
* @ordered
*/
protected MetaType metaType;
/**
* The cached value of the '{@link #getCharacterConcept() <em>Character Concept</em>}' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getCharacterConcept()
* @generated
* @ordered
*/
protected SpecialType characterConcept;
/**
* The default value of the '{@link #getKarmaToResource() <em>Karma To Resource</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getKarmaToResource()
* @generated
* @ordered
*/
protected static final int KARMA_TO_RESOURCE_EDEFAULT = 0;
/**
* The cached value of the '{@link #getKarmaToResource() <em>Karma To Resource</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getKarmaToResource()
* @generated
* @ordered
*/
protected int karmaToResource = KARMA_TO_RESOURCE_EDEFAULT;
/**
* The default value of the '{@link #getKarmaSpend() <em>Karma Spend</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getKarmaSpend()
* @generated
* @ordered
*/
protected static final int KARMA_SPEND_EDEFAULT = 0;
/**
* The default value of the '{@link #getResourceSpend() <em>Resource Spend</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getResourceSpend()
* @generated
* @ordered
*/
protected static final int RESOURCE_SPEND_EDEFAULT = 0;
/**
* The default value of the '{@link #getStartKarma() <em>Start Karma</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getStartKarma()
* @generated
* @ordered
*/
protected static final int START_KARMA_EDEFAULT = 0;
/**
* The cached value of the '{@link #getStartKarma() <em>Start Karma</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getStartKarma()
* @generated
* @ordered
*/
protected int startKarma = START_KARMA_EDEFAULT;
/**
* The default value of the '{@link #getStartResources() <em>Start Resources</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getStartResources()
* @generated
* @ordered
*/
protected static final int START_RESOURCES_EDEFAULT = 0;
/**
* The cached value of the '{@link #getStartResources() <em>Start Resources</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getStartResources()
* @generated
* @ordered
*/
protected int startResources = START_RESOURCES_EDEFAULT;
/**
* The default value of the '{@link #getChoiseKarmaCost() <em>Choise Karma Cost</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getChoiseKarmaCost()
* @generated
* @ordered
*/
protected static final int CHOISE_KARMA_COST_EDEFAULT = 0;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected KarmaGeneratorImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return Shr5managementPackage.Literals.KARMA_GENERATOR;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public MetaType getMetaType() {
if (metaType != null && metaType.eIsProxy()) {
InternalEObject oldMetaType = (InternalEObject)metaType;
metaType = (MetaType)eResolveProxy(oldMetaType);
if (metaType != oldMetaType) {
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, Shr5managementPackage.KARMA_GENERATOR__META_TYPE, oldMetaType, metaType));
}
}
return metaType;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public MetaType basicGetMetaType() {
return metaType;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated not
*/
public void setMetaType(MetaType newMetaType) {
MetaType oldMetaType = metaType;
metaType = newMetaType;
if (eNotificationRequired()){
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.SHR5_KARMA_GENERATOR__META_TYPE, oldMetaType, metaType));
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.SHR5_KARMA_GENERATOR__CHOISE_KARMA_COST, oldMetaType, metaType));
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public SpecialType getCharacterConcept() {
if (characterConcept != null && characterConcept.eIsProxy()) {
InternalEObject oldCharacterConcept = (InternalEObject)characterConcept;
characterConcept = (SpecialType)eResolveProxy(oldCharacterConcept);
if (characterConcept != oldCharacterConcept) {
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, Shr5managementPackage.KARMA_GENERATOR__CHARACTER_CONCEPT, oldCharacterConcept, characterConcept));
}
}
return characterConcept;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public SpecialType basicGetCharacterConcept() {
return characterConcept;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setCharacterConcept(SpecialType newCharacterConcept) {
SpecialType oldCharacterConcept = characterConcept;
characterConcept = newCharacterConcept;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.KARMA_GENERATOR__CHARACTER_CONCEPT, oldCharacterConcept, characterConcept));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public int getKarmaToResource() {
return karmaToResource;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @generated not
*/
public void setKarmaToResource(int newKarmaToResource) {
int oldKarmaToResource = karmaToResource;
karmaToResource = newKarmaToResource;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.SHR5_KARMA_GENERATOR__KARMA_TO_RESOURCE, oldKarmaToResource,
karmaToResource));
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.SHR5_KARMA_GENERATOR__KARMA_SPEND, oldKarmaToResource,
karmaToResource));
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.SHR5_KARMA_GENERATOR__RESOURCE_SPEND, oldKarmaToResource,
karmaToResource));
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @generated not
*/
public int getKarmaSpend() {
if (getGenerator() == null || getCharacterConcept() == null || getMetaType() == null || getCharacter() == null
|| getCharacter().getPersona() == null)
return 0;
int karmaSpend = ShadowrunManagmentTools.getKarmaSpend(getCharacter());
int connectionsSpend = ShadowrunManagmentTools.calcConnectionsSpend(getCharacter()) * getGenerator().getKarmaToConnectionFactor();
int basicCost = getChoiseKarmaCost();//getMetaType().getCost() + getCharacterConcept().getCost();
return Math.abs(karmaSpend) + basicCost + connectionsSpend + getKarmaToResource();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @generated not
*/
public int getResourceSpend() {
if (getCharacter() == null)
return 0;
BigDecimal resourcesSpend = ShadowrunManagmentTools.calcResourcesSpend(getCharacter());
return resourcesSpend.intValue();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public int getStartKarma() {
return startKarma;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setStartKarma(int newStartKarma) {
int oldStartKarma = startKarma;
startKarma = newStartKarma;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.KARMA_GENERATOR__START_KARMA, oldStartKarma, startKarma));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public int getStartResources() {
return startResources;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setStartResources(int newStartResources) {
int oldStartResources = startResources;
startResources = newStartResources;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.KARMA_GENERATOR__START_RESOURCES, oldStartResources, startResources));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated not
*/
public int getChoiseKarmaCost() {
int basicCost = 0;//
if(getMetaType()!=null)
basicCost += getMetaType().getCost();
if(getCharacterConcept()!=null)
basicCost += getCharacterConcept().getCost();
return basicCost;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @generated not
*/
public boolean hasSpendAllPoints(DiagnosticChain diagnostics, Map<Object, Object> context) {
if (!canValidate())
return true;
if (!hasSpendAllKarmaPoints(null, null)) {
if (diagnostics != null) {
diagnostics.add(new BasicDiagnostic(Diagnostic.ERROR, Shr5managementValidator.DIAGNOSTIC_SOURCE,
Shr5managementValidator.SHR5_RULE_GENERATOR__HAS_SPEND_ALL_POINTS, ModelPlugin.INSTANCE.getString("_UI_NotSpendAllPoints",
new Object[]{ "hasSpendAllPoints", EObjectValidator.getObjectLabel(this, context) }), new Object[]{ this,
Shr5managementPackage.Literals.CHARACTER_GENERATOR__GENERATOR }));
}
return false;
}
return true;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @generated not
*/
public boolean hasSpendAllKarmaPoints(DiagnosticChain diagnostics, Map<Object, Object> context) {
if (!canValidate())
return true;
int karmaPoints = getGenerator().getKarmaPoints();
int diff = karmaPoints - getKarmaSpend();
boolean test = getGenerator().getMaxKarmaToKeep() < diff;
if (test || diff < 0) {
if (diagnostics != null) {
diagnostics.add(new BasicDiagnostic(Diagnostic.ERROR, Shr5managementValidator.DIAGNOSTIC_SOURCE,
Shr5managementValidator.KARMA_GENERATOR__HAS_SPEND_ALL_KARMA_POINTS, ModelPlugin.INSTANCE.getString(
"_UI_NotSpendAllKarmaPoints", new Object[]{
diff < 0 ? ModelPlugin.INSTANCE.getString("_UI_Less") : ModelPlugin.INSTANCE.getString("_UI_More"), diff }),
new Object[]{ this, Shr5managementPackage.Literals.CHARACTER_GENERATOR__GENERATOR }));
}
return false;
}
return true;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated not
*/
public boolean hasSpendAllResources(DiagnosticChain diagnostics, Map<Object, Object> context) {
if (!canValidate())
return true;
int resourceSpend = getResourceSpend();
int avail = getKarmaToResource() * getGenerator().getKarmaToResourceFactor();
int diff = avail - resourceSpend;
boolean test = getGenerator().getMaxResourceToKeep() < diff;
if (test || diff < 0) {
if (diagnostics != null) {
diagnostics.add
(new BasicDiagnostic
(Diagnostic.ERROR,
Shr5managementValidator.DIAGNOSTIC_SOURCE,
Shr5managementValidator.KARMA_GENERATOR__HAS_SPEND_ALL_RESOURCES,
ModelPlugin.INSTANCE.getString("_UI_hasSpendAllResources", new Object[] { diff,
diff < 0 ? ModelPlugin.INSTANCE.getString("_UI_Less") : ModelPlugin.INSTANCE.getString("_UI_More") }),
new Object [] { this,Shr5managementPackage.Literals.SHR5_GENERATOR__RESOURCEN }));
}
return false;
}
return true;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case Shr5managementPackage.KARMA_GENERATOR__META_TYPE:
if (resolve) return getMetaType();
return basicGetMetaType();
case Shr5managementPackage.KARMA_GENERATOR__CHARACTER_CONCEPT:
if (resolve) return getCharacterConcept();
return basicGetCharacterConcept();
case Shr5managementPackage.KARMA_GENERATOR__KARMA_TO_RESOURCE:
return getKarmaToResource();
case Shr5managementPackage.KARMA_GENERATOR__KARMA_SPEND:
return getKarmaSpend();
case Shr5managementPackage.KARMA_GENERATOR__RESOURCE_SPEND:
return getResourceSpend();
case Shr5managementPackage.KARMA_GENERATOR__START_KARMA:
return getStartKarma();
case Shr5managementPackage.KARMA_GENERATOR__START_RESOURCES:
return getStartResources();
case Shr5managementPackage.KARMA_GENERATOR__CHOISE_KARMA_COST:
return getChoiseKarmaCost();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case Shr5managementPackage.KARMA_GENERATOR__META_TYPE:
setMetaType((MetaType)newValue);
return;
case Shr5managementPackage.KARMA_GENERATOR__CHARACTER_CONCEPT:
setCharacterConcept((SpecialType)newValue);
return;
case Shr5managementPackage.KARMA_GENERATOR__KARMA_TO_RESOURCE:
setKarmaToResource((Integer)newValue);
return;
case Shr5managementPackage.KARMA_GENERATOR__START_KARMA:
setStartKarma((Integer)newValue);
return;
case Shr5managementPackage.KARMA_GENERATOR__START_RESOURCES:
setStartResources((Integer)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case Shr5managementPackage.KARMA_GENERATOR__META_TYPE:
setMetaType((MetaType)null);
return;
case Shr5managementPackage.KARMA_GENERATOR__CHARACTER_CONCEPT:
setCharacterConcept((SpecialType)null);
return;
case Shr5managementPackage.KARMA_GENERATOR__KARMA_TO_RESOURCE:
setKarmaToResource(KARMA_TO_RESOURCE_EDEFAULT);
return;
case Shr5managementPackage.KARMA_GENERATOR__START_KARMA:
setStartKarma(START_KARMA_EDEFAULT);
return;
case Shr5managementPackage.KARMA_GENERATOR__START_RESOURCES:
setStartResources(START_RESOURCES_EDEFAULT);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case Shr5managementPackage.KARMA_GENERATOR__META_TYPE:
return metaType != null;
case Shr5managementPackage.KARMA_GENERATOR__CHARACTER_CONCEPT:
return characterConcept != null;
case Shr5managementPackage.KARMA_GENERATOR__KARMA_TO_RESOURCE:
return karmaToResource != KARMA_TO_RESOURCE_EDEFAULT;
case Shr5managementPackage.KARMA_GENERATOR__KARMA_SPEND:
return getKarmaSpend() != KARMA_SPEND_EDEFAULT;
case Shr5managementPackage.KARMA_GENERATOR__RESOURCE_SPEND:
return getResourceSpend() != RESOURCE_SPEND_EDEFAULT;
case Shr5managementPackage.KARMA_GENERATOR__START_KARMA:
return startKarma != START_KARMA_EDEFAULT;
case Shr5managementPackage.KARMA_GENERATOR__START_RESOURCES:
return startResources != START_RESOURCES_EDEFAULT;
case Shr5managementPackage.KARMA_GENERATOR__CHOISE_KARMA_COST:
return getChoiseKarmaCost() != CHOISE_KARMA_COST_EDEFAULT;
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
@SuppressWarnings("unchecked")
public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
switch (operationID) {
case Shr5managementPackage.KARMA_GENERATOR___HAS_SPEND_ALL_KARMA_POINTS__DIAGNOSTICCHAIN_MAP:
return hasSpendAllKarmaPoints((DiagnosticChain)arguments.get(0), (Map<Object, Object>)arguments.get(1));
case Shr5managementPackage.KARMA_GENERATOR___HAS_SPEND_ALL_RESOURCES__DIAGNOSTICCHAIN_MAP:
return hasSpendAllResources((DiagnosticChain)arguments.get(0), (Map<Object, Object>)arguments.get(1));
}
return super.eInvoke(operationID, arguments);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public String toString() {
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (karmaToResource: ");
result.append(karmaToResource);
result.append(", startKarma: ");
result.append(startKarma);
result.append(", startResources: ");
result.append(startResources);
result.append(')');
return result.toString();
}
} // Shr5KarmaGeneratorImpl