/**
*
*/
package de.urszeidler.eclipse.shr5Management.util;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
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 org.eclipse.emf.ecore.util.EObjectValidator;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import de.urszeidler.eclipse.shr5.AbstraktGegenstand;
import de.urszeidler.eclipse.shr5.AbstraktPersona;
import de.urszeidler.eclipse.shr5.Beschreibbar;
import de.urszeidler.eclipse.shr5.Credstick;
import de.urszeidler.eclipse.shr5.Cyberdeck;
import de.urszeidler.eclipse.shr5.Erlernbar;
import de.urszeidler.eclipse.shr5.Fertigkeit;
import de.urszeidler.eclipse.shr5.FertigkeitsGruppe;
import de.urszeidler.eclipse.shr5.KiAdept;
import de.urszeidler.eclipse.shr5.KiKraft;
import de.urszeidler.eclipse.shr5.KoerperPersona;
import de.urszeidler.eclipse.shr5.PersonaEigenschaft;
import de.urszeidler.eclipse.shr5.PersonaFertigkeit;
import de.urszeidler.eclipse.shr5.PersonaFertigkeitsGruppe;
import de.urszeidler.eclipse.shr5.PersonaZauber;
import de.urszeidler.eclipse.shr5.Shr5Factory;
import de.urszeidler.eclipse.shr5.Shr5Package;
import de.urszeidler.eclipse.shr5.ShrList;
import de.urszeidler.eclipse.shr5.SourceBook;
import de.urszeidler.eclipse.shr5.Spezies;
import de.urszeidler.eclipse.shr5.Steigerbar;
import de.urszeidler.eclipse.shr5.Technomancer;
import de.urszeidler.eclipse.shr5.TimeUnits;
import de.urszeidler.eclipse.shr5.Zauberer;
import de.urszeidler.eclipse.shr5.util.ShadowrunTools;
import de.urszeidler.eclipse.shr5Management.Advancement;
import de.urszeidler.eclipse.shr5Management.AttributeChange;
import de.urszeidler.eclipse.shr5Management.Changes;
import de.urszeidler.eclipse.shr5Management.CharacterAdvancementSystem;
import de.urszeidler.eclipse.shr5Management.CharacterDiary;
import de.urszeidler.eclipse.shr5Management.CharacterGeneratorSystem;
import de.urszeidler.eclipse.shr5Management.Connection;
import de.urszeidler.eclipse.shr5Management.DiaryEntry;
import de.urszeidler.eclipse.shr5Management.GeneratorState;
import de.urszeidler.eclipse.shr5Management.IncreaseCharacterPart;
import de.urszeidler.eclipse.shr5Management.KarmaGaint;
import de.urszeidler.eclipse.shr5Management.KarmaGenerator;
import de.urszeidler.eclipse.shr5Management.LifeModule;
import de.urszeidler.eclipse.shr5Management.LifeModuleType;
import de.urszeidler.eclipse.shr5Management.LifeModulesGenerator;
import de.urszeidler.eclipse.shr5Management.ManagedCharacter;
import de.urszeidler.eclipse.shr5Management.PersonaChange;
import de.urszeidler.eclipse.shr5Management.PlayerCharacter;
import de.urszeidler.eclipse.shr5Management.RangeTableEntry;
import de.urszeidler.eclipse.shr5Management.Shr5Generator;
import de.urszeidler.eclipse.shr5Management.Shr5System;
import de.urszeidler.eclipse.shr5Management.Shr5managementFactory;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage;
import de.urszeidler.eclipse.shr5Management.TrainingRange;
import de.urszeidler.eclipse.shr5Management.TrainingRate;
import de.urszeidler.eclipse.shr5Management.TrainingsTime;
/**
* @author urs
*/
public class ShadowrunManagmentTools {
/**
* Is the object a child of a managed character.
* @param object
* @return
*/
public static boolean isContainedInCharacter(EObject object) {
EObject eContainer = getBaseParent(object);
return eContainer instanceof ManagedCharacter;
}
/**
* Is the object a child of a managed characte, return this character or null.
* @param object
* @return
*/
public static ManagedCharacter getContainedInCharacter(EObject object) {
EObject eContainer = getBaseParent(object);
if( eContainer instanceof ManagedCharacter)
return (ManagedCharacter)eContainer;
return null;
}
/**
* Returns the first 'real' container managedcharacter or shrlist.
* @param object
* @return
*/
public static EObject getBaseParent(EObject object) {
EObject eContainer = object.eContainer();
while (eContainer!=null && !(eContainer instanceof ManagedCharacter) && !(eContainer instanceof ShrList)) {
eContainer = eContainer.eContainer();
}
return eContainer;
}
/**
* @param managedCharacter
* @return
*/
public static int calcPowerPointsSpend(ManagedCharacter managedCharacter) {
AbstraktPersona persona = managedCharacter.getPersona();
if (persona == null)
return 0;
int sum = 0;
if (persona instanceof KiAdept) {
KiAdept ka = (KiAdept)persona;
EList<KiKraft> kikraft = ka.getKikraft();
for (KiKraft kraft : kikraft) {
sum = sum + kraft.getKraftpunkte();
}
}
return sum;
}
/**
* Finds the first credstick in the list.
*
* @param eList
* @return
*/
public static Credstick findFirstCedstick(List<AbstraktGegenstand> eList) {
EClass eClass = Shr5Package.Literals.CREDSTICK;
return (Credstick)getFirstItemOfType(eList, eClass);
}
private static EObject getFirstItemOfType(List<? extends EObject> eList, EClass eClass) {
for (EObject abstraktGegenstand : eList) {
if (eClass.equals(abstraktGegenstand.eClass()))
return abstraktGegenstand;
}
return null;
}
/**
* Checks if the character has a matrix initiative.
*
* @param character
* @return
*/
public static String getMatrixInitative(ManagedCharacter character) {
return getMatrixInitativeValue(character) + "";
}
/**
* Checks if the character has a matrix initiative.
*
* @param character
* @return
*/
public static int getMatrixInitativeValue(ManagedCharacter character) {
if (character == null || character.getPersona() == null)
return -1;
if (character.getPersona() instanceof Technomancer) {
Technomancer t = (Technomancer)character.getPersona();
return (t.getDatenverarbeitung() + t.getIntuition());
} else {
EList<AbstraktGegenstand> inventar = character.getInventar();
for (AbstraktGegenstand abstraktGegenstand : inventar) {
if (abstraktGegenstand instanceof Cyberdeck) {
return ((Cyberdeck)abstraktGegenstand).getDatenverarbeitung() + character.getPersona().getIntuition();
}
}
}
return -1;
}
/**
* Checks if the character has a matrix initiative.
*
* @param character
* @return
*/
public static boolean hasMatrixInitative(ManagedCharacter character) {
if (character == null || character.getPersona() == null)
return false;
if (character.getPersona() instanceof Technomancer) {
return true;
} else {
EList<AbstraktGegenstand> inventar = character.getInventar();
for (AbstraktGegenstand abstraktGegenstand : inventar) {
if (abstraktGegenstand instanceof Cyberdeck) {
return true;
}
}
}
return false;
}
/**
* Checks if the character has a matrix initiative.
*
* @param character
* @return
*/
public static boolean hasControllRig(ManagedCharacter character) {
if (character == null || character.getPersona() == null)
return false;
int modWert = character.getPersona().getModManager().getmodWert(Shr5Package.Literals.CYBERWARE_MODIFIKATIOREN__CONTROL_RIG);
return modWert > 0;
}
/**
* Count the number of {@link Erlernbar} spend with Karma.
*
* @param changes the changes of a character
* @param erlernbar the {@link Erlernbar} type
* @param type the type of the {@link Erlernbar} to look after
* @return
*/
public static int countSpendByKarma(List<Changes> changes, EClass erlernbar, EClass type) {
int counter = 0;
for (Changes change : changes) {
if (change.isChangeApplied())
if (change instanceof PersonaChange) {
PersonaChange pv = (PersonaChange)change;
if (erlernbar.equals(pv.getChangeable().eClass())) {
PersonaFertigkeit pfg = (PersonaFertigkeit)pv.getChangeable();
if (type.equals(pfg.getFertigkeit().eClass()))
counter++;
}
}
}
return counter;
}
/**
* Calculates the spend karma by advacements. The Karma cost are a negative number.
*/
public static int getKarmaSpend(ManagedCharacter managedCharacter) {
int karmaGaint = 0;
EList<Changes> changes = managedCharacter.getChanges();
for (Changes change : changes) {
if (!change.eClass().equals(Shr5managementPackage.Literals.KARMA_GAINT)) {
if (change.isChangeApplied()) {
if (managedCharacter.getGeneratorSrc() != null) {
if (managedCharacter.getGeneratorSrc().getState() == GeneratorState.COMMITED && change.getDate() != null
&& change.getDateApplied() != null)
karmaGaint = karmaGaint + change.getKarmaCost();
} else
if(change.getDateApplied() != null)
karmaGaint = karmaGaint + change.getKarmaCost();
}
}
}
return karmaGaint;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*/
public static int getKarmaGaint(ManagedCharacter managedCharacter) {
int karmaGaint = 0;
EList<Changes> changes = managedCharacter.getChanges();
for (Changes change : changes) {
if (change.eClass().equals(Shr5managementPackage.Literals.KARMA_GAINT)) {
if (change instanceof KarmaGaint) {
KarmaGaint kg = (KarmaGaint)change;
if (kg.isChangeApplied())
karmaGaint = karmaGaint + kg.getKarma();
}
}
}
return karmaGaint;
}
/**
* Calcs the connection point used.
*
* @param managedCharacter
* @return
*/
public static int calcQuallityKarmaCost(List<PersonaEigenschaft> eigenschaften) {
int karmaKosten = 0;
for (PersonaEigenschaft personaEigenschaft : eigenschaften) {
karmaKosten = karmaKosten + personaEigenschaft.getKarmaKosten();
}
return karmaKosten;
}
/**
* Calcs the resources for a managed character.
*
* @param context
* @return
*/
public static BigDecimal calcResourcesSpend(ManagedCharacter context) {
BigDecimal wert = ShadowrunTools.calcListenWert(context.getInventar());
if (context.getPersona() instanceof KoerperPersona) {
KoerperPersona kp = (KoerperPersona)context.getPersona();
wert = wert.add(ShadowrunTools.calcListenWert(kp.getKoerperMods()));
}
wert = wert.add(ShadowrunTools.calcListenWert(context.getContracts()));
wert = wert.add(ShadowrunTools.calcListenWert(context.getVehicels()));
return wert;
}
/**
* Calcs the connection point used.
*
* @param managedCharacter
* @return
*/
public static int calcConnectionsSpend(ManagedCharacter managedCharacter) {
int pointsSpend = 0;
EList<Connection> connections = managedCharacter.getConnections();
for (Connection connection : connections) {
pointsSpend = pointsSpend + connection.getInfluence() + connection.getLoyality();
}
return pointsSpend;
}
/**
* Calcs the connections points for the sh5 system.
*
* @param character
* @param shr5Generator
* @return
*/
public static int calcConnectionsPoints(ManagedCharacter character, Shr5System shr5Generator) {
if (character == null || character.getPersona() == null || shr5Generator == null)
return 0;
int connP = character.getPersona().getCharisma() * shr5Generator.getCharismaToConnectionFactor();
return connP;
}
/**
* Calcs the connections points for the sh5 system.
*
* @param character
* @param shr5Generator
* @return
*/
public static boolean hasEigenschaft(ManagedCharacter character, PersonaEigenschaft eigenschaft) {
if (character == null || character.getPersona() == null)
return false;
if (character.getPersona() instanceof KoerperPersona) {
KoerperPersona kp = (KoerperPersona)character.getPersona();
EList<PersonaEigenschaft> eigenschaften = kp.getEigenschaften();
return eigenschaften.contains(eigenschaft);
}
return false;
}
/**
* Finds the persona change for the given {@link Steigerbar}.
*
* @param character
* @param attribute
* @return
*/
public static AttributeChange findCharacterAdvacements(ManagedCharacter character, EAttribute attribute) {
if (character == null || attribute == null)
return null;
EList<Changes> changes = character.getChanges();
for (Changes change : changes) {
if(change.getDateApplied()!=null)
if (change instanceof AttributeChange) {
AttributeChange pc = (AttributeChange)change;
if (attribute.equals(pc.getAttibute()))
return pc;
}
}
return null;
}
/**
* Finds the persona change for the given {@link Steigerbar}.
*
* @param character
* @param steigerbar
* @return
*/
public static PersonaChange findCharacterAdvacements(ManagedCharacter character, Steigerbar steigerbar) {
if (character == null || steigerbar == null)
return null;
EList<Changes> changes = character.getChanges();
for (Changes change : changes) {
if(change.getDateApplied()!=null)
if (change instanceof PersonaChange) {
PersonaChange pc = (PersonaChange)change;
if (steigerbar.equals(pc.getChangeable()))
return pc;
}
}
return null;
}
/**
* Finds the persona change for the given {@link Steigerbar}.
*
* @param character
* @param steigerbar
* @return
*/
public static PersonaChange findCharacterAdvacements(ManagedCharacter character, Erlernbar steigerbar) {
if (character == null || steigerbar == null)
return null;
EList<Changes> changes = character.getChanges();
for (Changes change : changes) {
// if(change.getDateApplied()!=null)
if (change instanceof PersonaChange) {
PersonaChange pc = (PersonaChange)change;
if (steigerbar.equals(pc.getChangeable()))
return pc;
}
}
return null;
}
/**
* Finds the corresponding rule for a given type.
*
* @param characterAdvancements the list
* @param eClass
* @return
*/
public static IncreaseCharacterPart findAdvancment(List<Advancement> characterAdvancements, EClass eClass) {
for (Advancement advancement : characterAdvancements) {
if (advancement instanceof IncreaseCharacterPart) {
IncreaseCharacterPart icp = (IncreaseCharacterPart)advancement;
if (icp.getType() != null && icp.getType().equals(eClass))
return icp;
}
}
return null;
}
/**
* Get the best date match.
*
* @param character
* @return
*/
public static Date findCorrenspondingDate(ManagedCharacter character) {
if (character == null)
return new Date(System.currentTimeMillis());
Comparator<Date> comparator = new Comparator<Date>() {
@Override
public int compare(Date o1, Date o2) {
if (o1 == null)
return 1;
if (o2 == null)
return -1;
return o2.compareTo(o1);
}
};
Date date = null;
if (character instanceof PlayerCharacter) {
PlayerCharacter pc = (PlayerCharacter)character;
CharacterDiary diary = pc.getDiary();
date = diary.getCharacterDate();
if (!diary.getEntries().isEmpty()) {
Function<DiaryEntry, Date> function = new Function<DiaryEntry, Date>() {
@Override
public Date apply(DiaryEntry input) {
return input.getDate();
}
};
date = getMaxDate(comparator, date,function, diary.getEntries());
}
Function<TrainingRange, Date> function = new Function<TrainingRange, Date>() {
@Override
public Date apply(TrainingRange input) {
return input.getEnd();
}
};
ImmutableList<TrainingsTime> tts = FluentIterable.from(diary.getEntries()).filter(TrainingsTime.class).toList();
for (TrainingsTime trainingsTime : tts) {
date = getMaxDate(comparator, date,function, trainingsTime.getTraining());
}
}
Function<Changes, Date> function = new Function<Changes, Date>() {
@Override
public Date apply(Changes input) {
return input.getDate();
}
};
date = getMaxDate(comparator, date,function, character.getChanges());
if (date != null)
return date;
try {
SourceBook srcBook = character.getChracterSource().getGenerator().getSrcBook();
return srcBook.getStartShrTime();
} catch (Exception e) {
}
return new Date(System.currentTimeMillis());
}
/**
* @param comparator
* @param date
* @param function
* @param changes
* @return
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private static Date getMaxDate(Comparator<Date> comparator, Date date,
Function function, EList<? extends EObject> changes) {
if (!changes.isEmpty()) {
List<Date> sortedList = FluentIterable.from(changes).transform(function).filter(Predicates.notNull()).toSortedList(comparator);
if (!sortedList.isEmpty()) {
Date date2 = sortedList.get(0);
if (date == null)
date = date2;
else
date = date2.before(date) ? date : date2;
}
}
return date;
}
/**
* Calcs the karma left for a generator.
*
* @param object
* @return
*/
public static int calcKarmaLeft(Shr5Generator object) {
return object.getGenerator().getKarmaPoints() - object.getKarmaSpend();
}
/**
* Calc the complete Karma cost for a character.
*
* @param character
* @param advacmentSystem
* @return
*/
public static int calcCompleteKaramaSpend(ManagedCharacter character, CharacterAdvancementSystem advacmentSystem) {
int spendBySkills = calcKarmaSpendBySkills(character, advacmentSystem);
int spendBySkillGroups = calcKarmaSpendBySkillGroups(character, advacmentSystem);
int spendBySecalism = calcKarmaSpendBySpecalism(character, advacmentSystem);
int spendByQuallities = calcKarmaSpendByQuallities(character, advacmentSystem);
int spendByAttributes = calcKarmaSpendByAttributes(character, advacmentSystem);
int spendByConnections = calcKarmaSpendByConnections(character);
int spendByResources = calcKarmaSpendByResources(character);
int spendBySpellsOrForms = calcKarmaSpendBySpellsOrForms(character, advacmentSystem);
return spendBySpellsOrForms + spendByQuallities + spendBySecalism + spendBySkillGroups + spendBySkills + spendByAttributes
+ spendByConnections + spendByResources;
}
/**
* Calcs the karma used for the spells or forms. Return 0 if not an apply able .
*
* @param object
* @return
*/
public static int calcKarmaSpendBySpellsOrForms(ManagedCharacter character, CharacterAdvancementSystem advacmentSystem) {
AbstraktPersona persona = character.getPersona();
if (persona == null || advacmentSystem == null)
return 0;
if (persona instanceof Zauberer) {
Zauberer z = (Zauberer)persona;
EList<PersonaZauber> zauber = z.getZauber();
IncreaseCharacterPart advancment = findAdvancment(advacmentSystem.getCharacterAdvancements(), Shr5Package.Literals.ZAUBER);
if (advancment != null)
return zauber.size() * advancment.getKarmaFactor();
} else if (persona instanceof Technomancer) {
Technomancer t = (Technomancer)persona;
IncreaseCharacterPart advancment = findAdvancment(advacmentSystem.getCharacterAdvancements(), Shr5Package.Literals.KOMPLEXE_FORM);
if (advancment != null)
return t.getComplexForms().size() * advancment.getKarmaFactor();
}
return 0;
}
/**
* Calcs the karma used for the attributes.
*
* @param object
* @return
*/
public static int calcKarmaSpendByResources(ManagedCharacter character) {
if (character == null || character.getChracterSource() == null)
return 0;
if (!Shr5Generator.class.isAssignableFrom(character.getChracterSource().getClass()))
return 0;
Shr5Generator generator = (Shr5Generator)character.getChracterSource();
return calcKarmaSpendByResources(generator);
}
/**
* Calc the karma spend for the given {@link Shr5Generator}.
*
* @param generator
* @return
*/
public static int calcKarmaSpendByResources(Shr5Generator generator) {
if (generator == null || generator.getGenerator() == null)
return 0;
int karmaToResourceFactor = generator.getGenerator().getKarmaToResourceFactor();
if (karmaToResourceFactor == 0)
return 0;
int resource = generator.getResourcen().getResource();
int karmaToResources = ShadowrunManagmentTools.calcKarmaToResources(generator, generator.getGenerator());
return (resource + karmaToResources) / karmaToResourceFactor;
}
/**
* Calcs the karma used for the attributes.
*
* @param object
* @return
*/
public static int calcKarmaSpendByConnections(ManagedCharacter character) {
if (character == null)
return 0;
CharacterGeneratorSystem generator = character.getChracterSource().getGenerator();
return calcKarmaSpendByConnections(character, generator);
}
/**
* Calcs the karma used for the attributes.
*
* @param object
* @return
*/
public static int calcKarmaSpendByConnections(ManagedCharacter character, Shr5System system) {
if (character == null || system == null)
return 0;
return ShadowrunManagmentTools.calcConnectionsSpend(character) * system.getKarmaToConnectionFactor();
}
public static int calcKarmaSpendByConnections(ManagedCharacter character, CharacterGeneratorSystem generator) {
if (Shr5System.class.isAssignableFrom(generator.getClass()))
return calcKarmaSpendByConnections(character, (Shr5System)generator);
return 0;
}
/**
* Calcs the karma used for the attributes.
*
* @param object
* @return
*/
public static int calcKarmaSpendByAttributes(ManagedCharacter character, CharacterAdvancementSystem advacmentSystem) {
AbstraktPersona persona = character.getPersona();
if (persona == null || advacmentSystem == null)
return 0;
int sum = 0;
Spezies spezies = persona.getSpezies();
if (spezies == null)
return 0;
List<EAttribute> attibutes = ShadowrunTools.getOrderedAttibutes(persona);
for (EAttribute eAttribute : attibutes) {
EAttribute speciesMin = ShadowrunTools.base2SpeciesMin(eAttribute);
Integer specMin = (Integer)spezies.eGet(speciesMin);
Integer personaAttibuteValue = (Integer)persona.eGet(eAttribute);
IncreaseCharacterPart advancment = findAdvancment(advacmentSystem.getCharacterAdvancements(), eAttribute.eClass());
if (advancment != null)
sum = sum + ShadowrunTools.calcKarmaCosts(specMin, personaAttibuteValue, advancment.getKarmaFactor());
}
return sum;
}
/**
* Calcs the karma used for the skills.
*
* @param object
* @return
*/
public static int calcKarmaSpendByQuallities(ManagedCharacter character, CharacterAdvancementSystem advacmentSystem) {
AbstraktPersona persona = character.getPersona();
if (persona == null || advacmentSystem == null)
return 0;
int sum = 0;
if (persona instanceof KoerperPersona) {
KoerperPersona kp = (KoerperPersona)persona;
EList<PersonaEigenschaft> eigenschaften = kp.getEigenschaften();
for (PersonaEigenschaft personaEigenschaft : eigenschaften) {
IncreaseCharacterPart advancment = findAdvancment(advacmentSystem.getCharacterAdvancements(), personaEigenschaft.eClass());
if (advancment != null)
sum = sum + personaEigenschaft.getKarmaKosten() * advancment.getKarmaFactor();
}
}
return sum;
}
/**
* Calcs the karma used for the skills.
*
* @param object
* @return
*/
public static int calcKarmaSpendBySkills(ManagedCharacter character, CharacterAdvancementSystem advacmentSystem) {
AbstraktPersona persona = character.getPersona();
if (persona == null || advacmentSystem == null)
return 0;
int sum = 0;
EList<PersonaFertigkeit> fertigkeiten = persona.getFertigkeiten();
for (PersonaFertigkeit personaFertigkeit : fertigkeiten) {
IncreaseCharacterPart advancment = findAdvancment(advacmentSystem.getCharacterAdvancements(), personaFertigkeit.getFertigkeit().eClass());
if (advancment != null)
sum = sum + ShadowrunTools.calcKarmaCosts(0, personaFertigkeit.getStufe(), advancment.getKarmaFactor());
}
return sum;// object.getShr5Generator().getKarmaPoints() - object.getKarmaSpend();
}
/**
* Calcs the karma used for the secalism.
*
* @param object
* @return
*/
public static int calcKarmaSpendBySpecalism(ManagedCharacter character, CharacterAdvancementSystem advacmentSystem) {
AbstraktPersona persona = character.getPersona();
if (persona == null || advacmentSystem == null)
return 0;
int sum = 0;
EList<PersonaFertigkeit> fertigkeiten = persona.getFertigkeiten();
for (PersonaFertigkeit personaFertigkeit : fertigkeiten) {
sum = sum + personaFertigkeit.getSpezialisierungen().size();
}
IncreaseCharacterPart advancment = findAdvancment(advacmentSystem.getCharacterAdvancements(), Shr5Package.Literals.SPEZIALISIERUNG);
if (advancment != null)
return sum * advancment.getKarmaFactor();
return sum * 7;// object.getShr5Generator().getKarmaPoints() - object.getKarmaSpend();
}
/**
* Calcs the karma used for the skill groups.
*
* @param object
* @return
*/
public static int calcKarmaSpendBySkillGroups(ManagedCharacter character, CharacterAdvancementSystem advacmentSystem) {
AbstraktPersona persona = character.getPersona();
if (persona == null || advacmentSystem == null)
return 0;
int sum = 0;
EList<PersonaFertigkeitsGruppe> fertigkeiten = persona.getFertigkeitsGruppen();
for (PersonaFertigkeitsGruppe personaFertigkeit : fertigkeiten) {
IncreaseCharacterPart advancment = findAdvancment(advacmentSystem.getCharacterAdvancements(), personaFertigkeit.getGruppe().eClass());
if (advancment != null)
sum = sum + ShadowrunTools.calcKarmaCosts(0, personaFertigkeit.getStufe(), advancment.getKarmaFactor());
}
return sum;// object.getShr5Generator().getKarmaPoints() - object.getKarmaSpend();
}
/**
* Calcs the karma left for a generator.
*
* @param object
* @return
*/
public static int calcKarmaLeft(KarmaGenerator<Shr5System> object) {
return object.getGenerator().getKarmaPoints() - object.getKarmaSpend();
}
/**
* Calcs the resources left for a generator.
*
* @param object
* @return
*/
public static int calcResourcesLeft(Shr5Generator object) {
Shr5System sr5g = object.getGenerator();
if (sr5g == null)
return 0;
int calcResourceSpend = object.getResourceSpend();
int karmaToResource = calcKarmaToResources(object, sr5g);
return (object.getResourcen().getResource() + karmaToResource - calcResourceSpend);
}
/**
* Calcs the resources for the spend karma.
*
* @param object
* @param sr5g
* @return
*/
public static int calcKarmaToResources(Shr5Generator object, Shr5System sr5g) {
return object.getKarmaToResource() * sr5g.getKarmaToResourceFactor();
}
/**
* Calcs the knowlege skill points for the spend karma.
*
* @param object
* @param sr5g
* @return
*/
public static int calcKnownlegeSkillPoints(ManagedCharacter context, Shr5System sr5g) {
int intuition = context.getPersona().getIntuition();
int logik = context.getPersona().getLogik();
return (intuition + logik) * sr5g.getKnowlegeSkillFactor();
}
/**
* Calcs the resources left for a generator.
*
* @param object
* @return
*/
public static int calcResourcesLeft(KarmaGenerator<? extends Shr5System> object) {
Shr5System sr5g = object.getGenerator();
if (sr5g == null)
return 0;
int calcResourceSpend = object.getResourceSpend();
int karmaToResource = object.getKarmaToResource() * sr5g.getKarmaToResourceFactor();
return karmaToResource - calcResourceSpend;
}
/**
* Creates a string from a list of beschreibbar.
*
* @param list the attributes
* @return the localized test
*/
public static String beschreibarListToString(List<? extends Beschreibbar> list) {
StringBuffer buffer = new StringBuffer();
for (Iterator<? extends Beschreibbar> iterator2 = list.iterator(); iterator2.hasNext();) {
Beschreibbar besch = iterator2.next();
buffer.append(besch.getName());
if (iterator2.hasNext())
buffer.append(",");
}
return buffer.toString();
}
/**
* Uses the validation context to generate a string from a list of eobjects.
* @param collection
* @param separator
* @param context
* @return
*/
public static String eobjectsToSting(Collection<? extends EObject> collection,String separator, final Map<Object, Object> context) {
return Joiner.on(separator).join(FluentIterable.from(collection).transform(new Function<EObject, String>() {
@Override
public String apply(EObject input) {
return EObjectValidator.getObjectLabel(input, context);
}
}));
}
/**
* Set the persona fertigkeit to the value by applying a persona change. It clears the persona fertigkeit and the advancement is set to 0.
*
* @param character
* @param fertigkeit
* @param value
*/
public static void changeFertigkeitByAdvacement(ManagedCharacter character, Fertigkeit fertigkeit, Integer value) {
final AbstraktPersona persona = character.getPersona();
PersonaFertigkeit personaFertigkeit = ShadowrunTools.findFertigkeit(fertigkeit, persona);
if (personaFertigkeit == null) {
PersonaFertigkeit pf = Shr5Factory.eINSTANCE.createPersonaFertigkeit();
pf.setFertigkeit(fertigkeit);
PersonaChange personaChange = Shr5managementFactory.eINSTANCE.createPersonaChange();
character.getChanges().add(personaChange);
personaChange.setChangeable(pf);
personaChange.setFrom(0);
personaChange.setTo((Integer)value);
personaChange.applyChanges();
} else {
if ((Integer)value == 0) {
persona.getFertigkeiten().remove(personaFertigkeit);
PersonaChange advacements = ShadowrunManagmentTools.findCharacterAdvacements(character, personaFertigkeit);
if (advacements != null)
character.getChanges().remove(advacements);
} else {
PersonaChange advacements = ShadowrunManagmentTools.findCharacterAdvacements(character, personaFertigkeit);
if (advacements != null) {
advacements.setTo((Integer)value);
advacements.applyChanges();
persona.eNotify(new ENotificationImpl((InternalEObject)persona, Notification.SET,
Shr5Package.Literals.ABSTRAKT_PERSONA__FERTIGKEITEN, null, null));
}
}
}
}
/**
* Set the persona fertigkeit to the value by applying a persona change. It clears the persona fertigkeit and the advancement is set to 0.
*
* @param character
* @param fertigkeitsGruppe
* @param value
*/
public static int changeAttributeByAdvacement(ManagedCharacter character, EAttribute attribute, Integer value) {
final AbstraktPersona persona = character.getPersona();
EAttribute speciesMin = ShadowrunTools.base2SpeciesMin(attribute);
Spezies spezies = persona.getSpezies();
if (spezies == null)
return -1;
Integer eGet = (Integer)spezies.eGet(speciesMin);
if (value < eGet)
value = eGet;
int rValue = value;
AttributeChange attributeChange = ShadowrunManagmentTools.findCharacterAdvacements(character, attribute);
if (attributeChange == null) {
if (value == eGet)
return value;
attributeChange = Shr5managementFactory.eINSTANCE.createAttributeChange();
character.getChanges().add(attributeChange);
attributeChange.setAttibute(attribute);
if(attributeChange.getFrom()==0)
attributeChange.setFrom((Integer)eGet);
attributeChange.setTo(Math.max(attributeChange.getFrom(),(Integer)value));
attributeChange.applyChanges();
rValue = attributeChange.getTo();
} else if (eGet == value) {
character.getChanges().remove(attributeChange);
persona.eSet(attribute, eGet);
rValue = eGet;
} else {
attributeChange.setTo(Math.max(attributeChange.getFrom(),(Integer)value));
attributeChange.applyChanges();
rValue = attributeChange.getTo();
}
return rValue;
}
/**
* Set the persona fertigkeit to the value by applying a persona change. It clears the persona fertigkeit and the advancement is set to 0.
*
* @param character
* @param fertigkeitsGruppe
* @param value
*/
public static void changeFertigkeitsGruppeByAdvacement(ManagedCharacter character, FertigkeitsGruppe fertigkeitsGruppe, Integer value) {
final AbstraktPersona persona = character.getPersona();
PersonaFertigkeitsGruppe personaFertigkeitsGruppe = ShadowrunTools.findGruppe(fertigkeitsGruppe, persona);
if (personaFertigkeitsGruppe == null) {
PersonaFertigkeitsGruppe pf = Shr5Factory.eINSTANCE.createPersonaFertigkeitsGruppe();
pf.setGruppe(fertigkeitsGruppe);
PersonaChange personaChange = Shr5managementFactory.eINSTANCE.createPersonaChange();
character.getChanges().add(personaChange);
personaChange.setChangeable(pf);
personaChange.setFrom(0);
personaChange.setTo((Integer)value);
personaChange.applyChanges();
} else {
if ((Integer)value == 0) {
persona.getFertigkeitsGruppen().remove(personaFertigkeitsGruppe);
PersonaChange advacements = ShadowrunManagmentTools.findCharacterAdvacements(character, personaFertigkeitsGruppe);
if (advacements != null)
character.getChanges().remove(advacements);
} else {
PersonaChange advacements = ShadowrunManagmentTools.findCharacterAdvacements(character, personaFertigkeitsGruppe);
if (advacements != null) {
advacements.setTo((Integer)value);
advacements.applyChanges();
persona.eNotify(new ENotificationImpl((InternalEObject)persona, Notification.SET,
Shr5Package.Literals.ABSTRAKT_PERSONA__FERTIGKEITEN, null, null));
}
}
}
}
/**
* Set the erlernbar or remove it.
*
* @param character
* @param erlernbar
* @return
*/
public static boolean changeErlernbarByAdvacement(ManagedCharacter character, Erlernbar erlernbar) {
PersonaChange advancements = ShadowrunManagmentTools.findCharacterAdvacements(character, erlernbar);
if (advancements == null) {
PersonaChange personaChange = Shr5managementFactory.eINSTANCE.createPersonaChange();
character.getChanges().add(personaChange);
personaChange.setChangeable(erlernbar);
personaChange.applyChanges();
} else {
if(advancements.getDateApplied()==null)
return false;
advancements.setTo(0);
advancements.applyChanges();
character.getChanges().remove(advancements);
}
return true;
}
/**
* Returns a {@link Predicate} to filter the managed character by its {@link GeneratorState}.
*
* @param state
* @return
*/
public static Predicate<ManagedCharacter> characterGeneratorStatePredicate(final GeneratorState state) {
return new Predicate<ManagedCharacter>() {
@Override
public boolean apply(ManagedCharacter input) {
return input.getChracterSource() != null && input.getChracterSource().getState() == state;
}
};
}
public static Predicate<? super LifeModule> moduleTypePredicate(final LifeModuleType type) {
return new Predicate<LifeModule>() {
@Override
public boolean apply(LifeModule input) {
return input.getModuleType() == type;
}
};
}
public static int calcKarmaLeft(LifeModulesGenerator object) {
return object.getGenerator().getKarmaPoints() - object.getKarmaSpend();
}
/**
* Find the matching entry in the ranged table.
* @param value
* @param rangeTableEntries
* @return
*/
public static RangeTableEntry findMatchingRange(final int value, EList<? extends RangeTableEntry> rangeTableEntries) {
if(rangeTableEntries.size()==1)
return rangeTableEntries.get(0);
return FluentIterable.from(rangeTableEntries).firstMatch(new Predicate<RangeTableEntry>() {
@Override
public boolean apply(RangeTableEntry input) {
return input.getFrom()<=value && input.getTo()>=value;
}
}).orNull();
}
/**
* Calc the days for a training time.
* @param tr
* @return
*/
public static int calcDays(TrainingRate tr) {
if(tr==null || tr.getTimeUnit()==null)
return -1;
TimeUnits timeUnit = tr.getTimeUnit();
int days = 0;
switch (timeUnit) {
case DAY:
days = 1;
break;
case WEEK:
days = 7;
break;
case MONTH:
days = 30;
break;
default:
break;
}
return days * tr.getFactor();
}
/**
* Finds the advacements for an erlernbar (Fertigkeit/PersonaFertigkeit).
* @param characterAdvancements
* @param changeable
* @return
*/
public static IncreaseCharacterPart findAdvancment(EList<Advancement> characterAdvancements, Erlernbar changeable) {
if (changeable instanceof PersonaFertigkeitsGruppe) {
PersonaFertigkeitsGruppe pfg = (PersonaFertigkeitsGruppe)changeable;
return findAdvancment(characterAdvancements, pfg.getGruppe().eClass());
} else if (changeable instanceof PersonaFertigkeit) {
PersonaFertigkeit pf = (PersonaFertigkeit)changeable;
return findAdvancment(characterAdvancements, pf.getFertigkeit().eClass());
}
return null;
}
/**
* Create a predicate for checking id an object is in the manage character.
* @param character
* @return
*/
public static Predicate<EObject> containedInCharaterPredicate(final ManagedCharacter character) {
return new Predicate<EObject>() {
@Override
public boolean apply(EObject input) {
if (input instanceof EObject) {
EObject eo = (EObject)input;
ManagedCharacter containedInCharacter2 = getContainedInCharacter(eo);
return character.equals(containedInCharacter2);
}
return false;
}
};
}
}