/**
* 2014 Urs Zeidler
*/
package de.urszeidler.eclipse.shr5Management.impl;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import de.urszeidler.eclipse.shr5.BaseMagischePersona;
import de.urszeidler.eclipse.shr5.Erlernbar;
import de.urszeidler.eclipse.shr5.Fertigkeit;
import de.urszeidler.eclipse.shr5.Fokus;
import de.urszeidler.eclipse.shr5.FokusBinding;
import de.urszeidler.eclipse.shr5.Initation;
import de.urszeidler.eclipse.shr5.KiAdept;
import de.urszeidler.eclipse.shr5.KiKraft;
import de.urszeidler.eclipse.shr5.KoerperPersona;
import de.urszeidler.eclipse.shr5.MartialartStyle;
import de.urszeidler.eclipse.shr5.PersonaEigenschaft;
import de.urszeidler.eclipse.shr5.PersonaFertigkeit;
import de.urszeidler.eclipse.shr5.PersonaFertigkeitsGruppe;
import de.urszeidler.eclipse.shr5.PersonaKomplexForm;
import de.urszeidler.eclipse.shr5.PersonaMartialartStyle;
import de.urszeidler.eclipse.shr5.PersonaMartialartTechnique;
import de.urszeidler.eclipse.shr5.PersonaZauber;
import de.urszeidler.eclipse.shr5.Shr5Factory;
import de.urszeidler.eclipse.shr5.Spezialisierung;
import de.urszeidler.eclipse.shr5.Steigerbar;
import de.urszeidler.eclipse.shr5.Technomancer;
import de.urszeidler.eclipse.shr5.Zauberer;
import de.urszeidler.eclipse.shr5.util.ShadowrunTools;
import de.urszeidler.eclipse.shr5.util.Shr5Switch;
import de.urszeidler.eclipse.shr5Management.CharacterGenerator;
import de.urszeidler.eclipse.shr5Management.GeneratorState;
import de.urszeidler.eclipse.shr5Management.IncreaseCharacterPart;
import de.urszeidler.eclipse.shr5Management.PersonaChange;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage;
import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Persona Change</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link de.urszeidler.eclipse.shr5Management.impl.PersonaChangeImpl#getChangeable <em>Changeable</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class PersonaChangeImpl extends PersonaValueChangeImpl implements PersonaChange {
/**
* The cached value of the '{@link #getChangeable() <em>Changeable</em>}' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getChangeable()
* @generated
* @ordered
*/
protected Erlernbar changeable;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected PersonaChangeImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return Shr5managementPackage.Literals.PERSONA_CHANGE;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Erlernbar getChangeable() {
if (changeable != null && changeable.eIsProxy()) {
InternalEObject oldChangeable = (InternalEObject)changeable;
changeable = (Erlernbar)eResolveProxy(oldChangeable);
if (changeable != oldChangeable) {
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, Shr5managementPackage.PERSONA_CHANGE__CHANGEABLE, oldChangeable, changeable));
}
}
return changeable;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public Erlernbar basicGetChangeable() {
return changeable;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @generated not
*/
public void setChangeable(Erlernbar newChangeable) {
Erlernbar oldChangeable = changeable;
changeable = newChangeable;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.PERSONA_CHANGE__CHANGEABLE, oldChangeable, changeable));
if (newChangeable != null) {
Shr5Switch<Object> shr5Switch = new Shr5Switch<Object>() {
@Override
public Object caseSteigerbar(Steigerbar object) {
setFrom(object.getStufe());
setTo(object.getStufe() + 1);
return object;
}
@Override
public Object casePersonaFertigkeit(PersonaFertigkeit object) {
Integer fromValue = object.getStufe();
if (object.getFertigkeit() != null && getCharacter() != null && getCharacter().getPersona() != null)
fromValue = Math.max(object.getStufe(),
ShadowrunTools.findFertigkeitValue(object.getFertigkeit(), getCharacter().getPersona()));
setFrom(fromValue);
setTo(fromValue + 1);
return object;
}
@Override
public Object casePersonaEigenschaft(PersonaEigenschaft object) {
if (ShadowrunManagmentTools.hasEigenschaft(getCharacter(), object)) {
setFrom(1);
setTo(0);
} else {
setFrom(0);
setTo(1);
}
return object;
}
@Override
public Object caseErlernbar(Erlernbar object) {
setFrom(0);
setTo(1);
return object;
}
};
if (!changeApplied) {
Object ret = shr5Switch.doSwitch(newChangeable);
if (ret != null)
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, Shr5managementPackage.Literals.CHANGES__KARMA_COST, 0, 1));
}
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case Shr5managementPackage.PERSONA_CHANGE__CHANGEABLE:
if (resolve) return getChangeable();
return basicGetChangeable();
}
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.PERSONA_CHANGE__CHANGEABLE:
setChangeable((Erlernbar)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case Shr5managementPackage.PERSONA_CHANGE__CHANGEABLE:
setChangeable((Erlernbar)null);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case Shr5managementPackage.PERSONA_CHANGE__CHANGEABLE:
return changeable != null;
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @generated not
*/
public void applyChanges() {
if (getChangeable() == null || getCharacter() == null || getCharacter().getPersona() == null)
return;
internalApply();
Shr5Switch<Object> shr5Switch = new Shr5Switch<Object>() {
@Override
public Object casePersonaFertigkeitsGruppe(PersonaFertigkeitsGruppe object) {
if (getFrom() == 0) {
getCharacter().getPersona().getFertigkeitsGruppen().add(object);
object.setStufe(getTo());
return object;
}
return super.casePersonaFertigkeitsGruppe(object);
}
@Override
public Object casePersonaFertigkeit(PersonaFertigkeit object) {
if (ShadowrunTools.findFertigkeit(object.getFertigkeit(), getCharacter().getPersona()) == null) {
getCharacter().getPersona().getFertigkeiten().add(object);
object.setStufe(getTo());
return object;
}
return super.casePersonaFertigkeit(object);
}
@Override
public Object caseSpezialisierung(Spezialisierung object) {
if (object instanceof PersonaMartialartStyle) {
PersonaMartialartStyle pmas = (PersonaMartialartStyle)object;
getCharacter().getPersona().getMartialartStyles().add(pmas);
MartialartStyle style = pmas.getStyle();
if (style != null) {
EList<Fertigkeit> usableWith = style.getUsableWith();
if (usableWith.size() == 1) {
Fertigkeit fertigkeit = usableWith.get(0);
PersonaFertigkeit personaFertigkeit = ShadowrunTools.findFertigkeit(fertigkeit, getCharacter().getPersona());
if(personaFertigkeit!=null)
personaFertigkeit.getSpezialisierungen().add(object);
}
}
} else {
EObject eContainer2 = object.eContainer();
if (eContainer2 instanceof Fertigkeit) {
Fertigkeit f = (Fertigkeit)eContainer2;
PersonaFertigkeit personaFertigkeit = ShadowrunTools.findFertigkeit(f, getCharacter().getPersona());
personaFertigkeit.getSpezialisierungen().add(object);
}
}
return super.caseSpezialisierung(object);
}
@Override
public Object caseSteigerbar(Steigerbar object) {
object.setStufe(getTo());
return object;
}
@Override
public Object caseKiKraft(KiKraft object) {
if (getCharacter().getPersona() instanceof KiAdept) {
KiAdept ka = (KiAdept)getCharacter().getPersona();
EList<KiKraft> list = ka.getKikraft();
addOrRemoveEntry(object, list);
}
return object;
}
@Override
public Object casePersonaZauber(PersonaZauber object) {
if (getCharacter().getPersona() instanceof Zauberer) {
Zauberer z = (Zauberer)getCharacter().getPersona();
EList<PersonaZauber> list = z.getZauber();
addOrRemoveEntry(object, list);
}
return object;
}
@Override
public Object casePersonaKomplexForm(PersonaKomplexForm object) {
if (getCharacter().getPersona() instanceof Technomancer) {
Technomancer persona = (Technomancer)getCharacter().getPersona();
EList<PersonaKomplexForm> list = persona.getComplexForms();
addOrRemoveEntry(object, list);
}
return object;
}
@Override
public Object casePersonaEigenschaft(PersonaEigenschaft object) {
if (getCharacter().getPersona() instanceof KoerperPersona) {
KoerperPersona kp = (KoerperPersona)getCharacter().getPersona();
EList<PersonaEigenschaft> eigenschaften = kp.getEigenschaften();
addOrRemoveEntry(object, eigenschaften);
}
return object;
}
@Override
public Object caseInitation(Initation object) {
if (getCharacter().getPersona() instanceof BaseMagischePersona) {
BaseMagischePersona bm = (BaseMagischePersona)getCharacter().getPersona();
EList<Initation> list = bm.getInitationen();
addOrRemoveEntry(object, list);
}
return object;
}
@Override
public Object caseFokus(Fokus object) {
if (getCharacter().getPersona() instanceof BaseMagischePersona) {
BaseMagischePersona bm = (BaseMagischePersona)getCharacter().getPersona();
FokusBinding fokusBinding = Shr5Factory.eINSTANCE.createFokusBinding();
fokusBinding.setFokus(object);
EList<FokusBinding> list = bm.getBoundFoki();
addOrRemoveEntry(fokusBinding, list);
}
return object;
}
// @Override
// public Object casePersonaMartialartStyle(PersonaMartialartStyle object) {
// MartialartStyle style = object.getStyle();
//
// EList<Fertigkeit> usableWith = style.getUsableWith();
// return super.casePersonaMartialartStyle(object);
// }
};
shr5Switch.doSwitch(getChangeable());
}
/**
* @generated not
*/
public int getKarmaCost() {
if (getChangeable() == null || getCharacter() == null || getCharacter().getPersona() == null)
return 0;
Shr5Switch<Integer> sw = new Shr5Switch<Integer>() {
@Override
public Integer casePersonaEigenschaft(PersonaEigenschaft object) {
return getKarmaCostQuallity(object);
}
@Override
public Integer casePersonaFertigkeit(PersonaFertigkeit object) {
return getKarmaCostSkill(object);
}
@Override
public Integer caseSpezialisierung(Spezialisierung object) {
return getKarmaCostAdd(object);
}
@Override
public Integer casePersonaFertigkeitsGruppe(PersonaFertigkeitsGruppe object) {
return getKarmaCostSkillGroup(object);
}
@Override
public Integer caseInitation(Initation object) {
return getKarmaCostInitation(object);
}
@Override
public Integer casePersonaZauber(PersonaZauber object) {
return getKarmaCostAdd(object);
}
@Override
public Integer casePersonaKomplexForm(PersonaKomplexForm object) {
return getKarmaCostAdd(object);
}
@Override
public Integer casePersonaMartialartStyle(PersonaMartialartStyle object) {
return getKarmaCostAdd(object);
}
@Override
public Integer casePersonaMartialartTechnique(PersonaMartialartTechnique object) {
return getKarmaCostAdd(object);
}
@Override
public Integer caseFokus(Fokus object) {
return object.getBindungskosten() * -1;
}
};
Integer i = sw.doSwitch(getChangeable());
if (i != null) {
return i;
}
return 0;
}
/**
* Return the karma cost for spell and complex form.
*/
private Integer getKarmaCostAdd(EObject eobject) {
if (eobject == null)
return 0;
EClass eClass = eobject.eClass();
return getKarmaCostAdd(eClass);
}
/**
* @param eClass
* @return
*/
protected Integer getKarmaCostAdd(EClass eClass) {
if (getCharacter() == null)
return 0;
CharacterGenerator<?> chracterSource = getCharacter().getChracterSource();
if (chracterSource == null)
return 0;
IncreaseCharacterPart part = ShadowrunManagmentTools.findAdvancment(chracterSource.getGenerator().getCharacterAdvancements()
.getCharacterAdvancements(), eClass);
if (part != null) {
int karmaFactor = part.getKarmaFactor();
return -1 * Math.abs(karmaFactor * 1);
}
return 0;
}
/**
* @generated not
*/
private int getKarmaCostQuallity(PersonaEigenschaft quallity) {
if (getCharacter() == null)
return 0;
CharacterGenerator<?> chracterSource = getCharacter().getChracterSource();
if (chracterSource == null)
return 0;
if (quallity != null) {
IncreaseCharacterPart part = ShadowrunManagmentTools.findAdvancment(chracterSource.getGenerator().getCharacterAdvancements()
.getCharacterAdvancements(), quallity.eClass());
if (part != null) {
int karmaFactor = part.getKarmaFactor();
if (chracterSource.getState() != GeneratorState.COMMITED)
return -1 * karmaFactor * quallity.getKarmaKosten();
else
return -1 * Math.abs(karmaFactor * quallity.getKarmaKosten());
}
}
return 0;
}
/**
* @generated not
*/
private int getKarmaCostInitation(Initation initation) {
if (getCharacter() == null)
return 0;
CharacterGenerator<?> chracterSource = getCharacter().getChracterSource();
if (chracterSource == null)
return 0;
if (initation != null) {
IncreaseCharacterPart part = ShadowrunManagmentTools.findAdvancment(chracterSource.getGenerator().getCharacterAdvancements()
.getCharacterAdvancements(), initation.eClass());
if (part != null) {
int karmaFactor = part.getKarmaFactor();
return -1 * Math.abs(karmaFactor * initation.getStufe());
}
}
return 0;
}
/**
* @generated not
*/
private int getKarmaCostSkill(PersonaFertigkeit skill) {
if (getCharacter() == null)
return 0;
CharacterGenerator<?> chracterSource = getCharacter().getChracterSource();
if (chracterSource == null)
return 0;
if (skill != null) {
Fertigkeit fertigkeit = skill.getFertigkeit();
if (fertigkeit == null)
return 0;
EClass eClass = fertigkeit.eClass();
IncreaseCharacterPart part = ShadowrunManagmentTools.findAdvancment(chracterSource.getGenerator().getCharacterAdvancements()
.getCharacterAdvancements(), eClass);
if (part != null) {
int karmaFactor = part.getKarmaFactor();
int calcKarmaCosts = ShadowrunTools.calcKarmaCosts(getFrom(), getTo(), karmaFactor);
return -1 * calcKarmaCosts;// karmaFactor * (getTo());
}
}
return 0;
}
/**
* @generated not
*/
private int getKarmaCostSkillGroup(PersonaFertigkeitsGruppe skill) {
if (getCharacter() == null)
return 0;
CharacterGenerator<?> chracterSource = getCharacter().getChracterSource();
if (chracterSource == null)
return 0;
if (skill != null) {
IncreaseCharacterPart part = ShadowrunManagmentTools.findAdvancment(chracterSource.getGenerator().getCharacterAdvancements()
.getCharacterAdvancements(), skill.getGruppe().eClass());
if (part != null) {
int karmaFactor = part.getKarmaFactor();
int calcKarmaCosts = ShadowrunTools.calcKarmaCosts(getFrom(), getTo(), karmaFactor);
return -1 * calcKarmaCosts;// karmaFactor * (getTo());
}
}
return 0;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private void addOrRemoveEntry(EObject object, List eigenschaften) {
if (getTo() == 0) {
eigenschaften.remove(object);
} else {
eigenschaften.add(object);
}
}
} // PersonaChangeImpl