/**
*
*/
package de.urszeidler.eclipse.shr5.util;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMLResource;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import de.urszeidler.eclipse.shr5.AbstraktModifikatoren;
import de.urszeidler.eclipse.shr5.AbstraktPersona;
import de.urszeidler.eclipse.shr5.AttributModifikatorWert;
import de.urszeidler.eclipse.shr5.Beschreibbar;
import de.urszeidler.eclipse.shr5.Fertigkeit;
import de.urszeidler.eclipse.shr5.FertigkeitsGruppe;
import de.urszeidler.eclipse.shr5.Feuerwaffe;
import de.urszeidler.eclipse.shr5.GeldWert;
import de.urszeidler.eclipse.shr5.Identifiable;
import de.urszeidler.eclipse.shr5.KiKraft;
import de.urszeidler.eclipse.shr5.Koerpermods;
import de.urszeidler.eclipse.shr5.Magazin;
import de.urszeidler.eclipse.shr5.Modifizierbar;
import de.urszeidler.eclipse.shr5.Munition;
import de.urszeidler.eclipse.shr5.PersonaFertigkeit;
import de.urszeidler.eclipse.shr5.PersonaFertigkeitsGruppe;
import de.urszeidler.eclipse.shr5.Quelle;
import de.urszeidler.eclipse.shr5.SchadensTyp;
import de.urszeidler.eclipse.shr5.Shr5Factory;
import de.urszeidler.eclipse.shr5.Shr5Package;
import de.urszeidler.eclipse.shr5.SourceBook;
import de.urszeidler.eclipse.shr5.Spezies;
/**
* Collection of tool methods.
*
* @author urs
*/
public class ShadowrunTools {
private static final String EMPTY = "";
private static Map<EAttribute, EAttribute> base2SpeciesMin;
private static Map<EAttribute, EAttribute> base2SpeciesMax;
private static Map<EAttribute, EAttribute> base2Calced;
private static List<EAttribute> orderedAttibutes;
private static List<EAttribute> orderedBasedAttibutes;
private static List<EAttribute> orderedCalcedAttibutes;
private static Pattern damagePattern = Pattern.compile("(\\d*)(\\D)");
private static Pattern damagePattern1 = Pattern.compile("\\(([\\w]{3})\\+([0-9]*)\\)(\\D)");
;
// the static initaliser
static {
base2SpeciesMin = new HashMap<EAttribute, EAttribute>();
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__KONSTITUTION_BASIS, Shr5Package.Literals.SPEZIES__KONSTITUTION_MIN);
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__GESCHICKLICHKEIT_BASIS, Shr5Package.Literals.SPEZIES__GESCHICKLICHKEIT_MIN);
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__REAKTION_BASIS, Shr5Package.Literals.SPEZIES__REAKTION_MIN);
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__STAERKE_BASIS, Shr5Package.Literals.SPEZIES__STAERKE_MIN);
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__CHARISMA_BASIS, Shr5Package.Literals.SPEZIES__CHARISMA_MIN);
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__INTUITION_BASIS, Shr5Package.Literals.SPEZIES__INTUITION_MIN);
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__LOGIK_BASIS, Shr5Package.Literals.SPEZIES__LOGIK_MIN);
base2SpeciesMin.put(Shr5Package.Literals.ABSTRAKT_PERSONA__WILLENSKRAFT_BASIS, Shr5Package.Literals.SPEZIES__WILLENSKRAFT_MIN);
base2SpeciesMin.put(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS, Shr5Package.Literals.SPEZIES__MAGIE_MIN);
base2SpeciesMin.put(Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ_BASIS, Shr5Package.Literals.SPEZIES__RESONANZ_MIN);
base2SpeciesMin.put(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS, Shr5Package.Literals.SPEZIES__EDGE_MIN);
base2SpeciesMax = new HashMap<EAttribute, EAttribute>();
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__KONSTITUTION_BASIS, Shr5Package.Literals.SPEZIES__KONSTITUTION_MAX);
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__GESCHICKLICHKEIT_BASIS, Shr5Package.Literals.SPEZIES__GESCHICKLICHKEIT_MAX);
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__REAKTION_BASIS, Shr5Package.Literals.SPEZIES__REAKTION_MAX);
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__STAERKE_BASIS, Shr5Package.Literals.SPEZIES__STAERKE_MAX);
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__CHARISMA_BASIS, Shr5Package.Literals.SPEZIES__CHARISMA_MAX);
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__INTUITION_BASIS, Shr5Package.Literals.SPEZIES__INTUITION_MAX);
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__LOGIK_BASIS, Shr5Package.Literals.SPEZIES__LOGIK_MAX);
base2SpeciesMax.put(Shr5Package.Literals.ABSTRAKT_PERSONA__WILLENSKRAFT_BASIS, Shr5Package.Literals.SPEZIES__WILLENSKRAFT_MAX);
base2SpeciesMax.put(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS, Shr5Package.Literals.SPEZIES__MAGIE_MAX);
base2SpeciesMax.put(Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ_BASIS, Shr5Package.Literals.SPEZIES__RESONANZ_MAX);
base2SpeciesMax.put(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS, Shr5Package.Literals.SPEZIES__EDGE_MAX);
base2Calced = new HashMap<EAttribute, EAttribute>();
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__KONSTITUTION_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__KONSTITUTION);
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__GESCHICKLICHKEIT_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__GESCHICKLICHKEIT);
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__REAKTION_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__REAKTION);
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__STAERKE_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__STAERKE);
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__CHARISMA_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__CHARISMA);
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__INTUITION_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__INTUITION);
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__LOGIK_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__LOGIK);
base2Calced.put(Shr5Package.Literals.ABSTRAKT_PERSONA__WILLENSKRAFT_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__WILLENSKRAFT);
base2Calced.put(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS, Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE);
base2Calced.put(Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ_BASIS, Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ);
base2Calced.put(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE);
orderedAttibutes = new ArrayList<EAttribute>();
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__KONSTITUTION_BASIS);
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__GESCHICKLICHKEIT_BASIS);
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__REAKTION_BASIS);
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__STAERKE_BASIS);
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__WILLENSKRAFT_BASIS);
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__LOGIK_BASIS);
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__INTUITION_BASIS);
orderedAttibutes.add(Shr5Package.Literals.ABSTRAKT_PERSONA__CHARISMA_BASIS);
orderedAttibutes.add(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS);
orderedAttibutes.add(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS);
orderedAttibutes.add(Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ_BASIS);
orderedBasedAttibutes = new ArrayList<EAttribute>(orderedAttibutes);
orderedBasedAttibutes.remove(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS);
orderedBasedAttibutes.remove(Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ_BASIS);
orderedBasedAttibutes.remove(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS);
orderedCalcedAttibutes = new ArrayList<EAttribute>(orderedAttibutes);
// orderedAttibutes.add(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__ESSENZ);
// orderedAttibutes.add(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__AUSWEICHEN);
}
/**
* The list of the astral attributes.
* @return
*/
public static EList<EAttribute> getAstraleAttribute() {
return Shr5Package.Literals.ASTRALE_PROJEKTION.getEAllAttributes();
}
/**
* The ordered list of the attributes.
*
* @return the orderedAttibutes
*/
public static List<EAttribute> getOrderedAttibutes() {
return orderedAttibutes;
}
/**
* The ordered list of the attributes, filtered by the persona.
*
* @return the orderedAttibutes
*/
public static List<EAttribute> getOrderedAttibutes(AbstraktPersona persona) {
List<EAttribute> attributes = orderedAttibutes;
return filterAttributesForPersona(persona, attributes);
}
/**
* The ordered list of the base attributes (without edge and resonance or magic), filtered by the persona.
*
* @return the orderedAttibutes
*/
public static List<EAttribute> getOrderedBaseAttibutes(AbstraktPersona persona) {
List<EAttribute> attributes = orderedBasedAttibutes;
return filterAttributesForPersona(persona, attributes);
}
private static List<EAttribute> filterAttributesForPersona(AbstraktPersona persona, List<EAttribute> attributes) {
EList<EAttribute> eAllAttributes = persona.eClass().getEAllAttributes();
ArrayList<EAttribute> list = new ArrayList<EAttribute>(attributes.size());
for (EAttribute eAttribute : attributes) {
if (eAllAttributes.contains(eAttribute))
list.add(eAttribute);
}
return list;
}
/**
* Get the species min attribute for a persona attribute.
*
* @param attribute
* @return
*/
public static EAttribute base2Calced(EAttribute attribute) {
return base2Calced.get(attribute);
}
/**
* Get the species min attribute for a persona attribute.
*
* @param attribute
* @return
*/
public static EAttribute base2SpeciesMin(EAttribute attribute) {
return base2SpeciesMin.get(attribute);
}
/**
* Get the species max attribute for a persona attribute.
*
* @param attribute
* @return
*/
public static EAttribute base2SpeciesMax(EAttribute attribute) {
return base2SpeciesMax.get(attribute);
}
/**
* Create the permutation of the given list of integer, all unique combinations are stored in the target set.
* Can be used to get all valid cyberdeck combinations.
*
* @param prefix
* @param src
* @param target
*/
public static void permutation(List<Integer> prefix, List<Integer> src, Set<List<Integer>> target) {
int n = src.size();
if (n == 0) {
target.add(prefix);
} else {
for (int i = 0; i < n; i++) {
List<Integer> list = new ArrayList<Integer>(n);
list.addAll(src.subList(0, i));
list.addAll(src.subList(i + 1, n));
Integer remove = src.get(i);
ArrayList<Integer> prefix2 = new ArrayList<Integer>(prefix);
prefix2.add(remove);
permutation(prefix2, list, target);
}
}
}
/**
* Collects all fertigkeiten and groups in a list.
*
* @param persona
* @return
*/
public static ArrayList<Beschreibbar> fertigkeitsGruppenToFertigkeiten(AbstraktPersona persona) {
ArrayList<Beschreibbar> list = new ArrayList<Beschreibbar>();
EList<PersonaFertigkeitsGruppe> fertigkeitsGruppen = persona.getFertigkeitsGruppen();
for (PersonaFertigkeitsGruppe personaFertigkeitsGruppe : fertigkeitsGruppen) {
FertigkeitsGruppe fertigkeitsGruppe = personaFertigkeitsGruppe.getGruppe();
list.add(fertigkeitsGruppe);
EList<Fertigkeit> fertigkeiten = fertigkeitsGruppe.getFertigkeiten();
for (Fertigkeit fertigkeit : fertigkeiten) {
list.add(fertigkeit);
}
}
return list;
}
/**
* Returns the values of the attribute, if the calculated value is not equals it will return as (val).
*
* @param eAttribute
* @param persona
* @return
*/
public static String attributeValue(AbstraktPersona persona, EAttribute eAttribute) {
EAttribute base2Calced = ShadowrunTools.base2Calced(eAttribute);
if (base2Calced == null)
return EMPTY;
Integer value = (Integer)persona.eGet(eAttribute);
Integer calc = (Integer)persona.eGet(base2Calced);
String a = EMPTY;
if (value != calc)
a = "(" + calc + ")";
return value.toString() + a;
}
/**
* Filters the skillgoups only having skill with the given attribute.
*
* @param attribute the attribute
* @return the filtered list
*/
public static ArrayList<FertigkeitsGruppe> filterSkillGroups(EAttribute attribute, List<FertigkeitsGruppe> list) {
ArrayList<FertigkeitsGruppe> arrayList = new ArrayList<FertigkeitsGruppe>(list.size());
boolean included = true;
for (FertigkeitsGruppe fertigkeitsGruppe : list) {
if (fertigkeitsGruppe == null)
continue;
EList<Fertigkeit> fertigkeiten = fertigkeitsGruppe.getFertigkeiten();
for (Fertigkeit fertigkeit : fertigkeiten) {
if (!attribute.equals(fertigkeit.getAttribut())) {
included = false;
break;
}
}
if (included)
arrayList.add(fertigkeitsGruppe);
included = true;
}
return arrayList;
}
/**
* Returns the essence value for the modificator.
*
* @param mod
* @return
*/
public static int getEssencesValue(AbstraktModifikatoren mod) {
return getModificatorValue(mod, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__ESSENZ);
}
/**
* Returns the summ of modificator values for the given eattribute.
*
* @param mod the modificator
* @param eattribute the attribute to get the value for
* @return the sum
*/
public static int getModificatorValue(Modifizierbar mod, EAttribute eattribute) {
if (eattribute == null)
return 0;
List<AttributModifikatorWert> mods = mod.getMods();
return getModificatorValue(eattribute, mods);
}
/**
* Returns the sum of a list of {@link AbstraktModifikatoren} values for the given eattribute.
*
* @param eattribute the attribute to get the value for
* @param mod list of {@link AbstraktModifikatoren}
* @return the sum
*/
public static int getModificatorenValue(EAttribute eattribute, List<? extends AbstraktModifikatoren> mods) {
int sum = 0;
for (AbstraktModifikatoren attributModifikatorWert : mods) {
sum = sum + getModificatorValue(eattribute, attributModifikatorWert.getMods());
}
return sum;
}
/**
* Returns the sum of modificator values for the given eattribute.
*
* @param mod the modificator
* @param eattribute the attribute to get the value for
* @return the sum
*/
public static int getModificatorValue(EAttribute eattribute, List<AttributModifikatorWert> mods) {
int sum = 0;
for (AttributModifikatorWert attributModifikatorWert : mods) {
if (eattribute.equals(attributModifikatorWert.getAttribut()))
sum = sum + attributModifikatorWert.getWert();
}
return sum;
}
/**
* Creates and initalise a character with the given spezies.
*
* @param spezies
* @param eclass
* @param edge
* @return
*/
public static AbstraktPersona createPersona(Spezies spezies, EClass eclass, int edge) {
EObject p = Shr5Factory.eINSTANCE.create(eclass);
AbstraktPersona persona = (AbstraktPersona)p;
persona.setSpezies(spezies);
persona.setKonstitutionBasis(spezies.getKonstitutionMin());
persona.setGeschicklichkeitBasis(spezies.getGeschicklichkeitMin());
persona.setReaktionBasis(spezies.getReaktionMin());
persona.setStaerkeBasis(spezies.getStaerkeMin());
persona.setCharismaBasis(spezies.getCharismaMin());
persona.setIntuitionBasis(spezies.getIntuitionMin());
persona.setLogikBasis(spezies.getLogikMin());
persona.setWillenskraftBasis(spezies.getWillenskraftMin());
persona.setEdgeBasis(spezies.getEdgeMin());
// persona.setEdgeBasis(edge);
return persona;
}
/**
* Returns the geldwert as rounded string.
*
* @param list
* @return
*/
public static String calcListenWertToString(List<Object> list) {
BigDecimal summ = calcListenWert(list);
return NumberFormat.getNumberInstance().format(summ);// summ.longValue() + EMPTY;
}
/**
* Calcs the wert of all {@link GeldWert} in the given list.
*
* @param list
* @return
*/
public static BigDecimal calcListenWert(List<? extends Object> list) {
BigDecimal summ = new BigDecimal(0);
for (Object eo : list) {
if (eo instanceof GeldWert) {
GeldWert wert = (GeldWert)eo;
if (wert.getWert() != null)
summ = summ.add(wert.getWert());
}
}
return summ;
}
/**
* Find the value of the personafertigeitsgruppe for a persona.
*
* @param fg the {@link FertigkeitsGruppe} to look for
* @param persona the persona
* @return the value or 0
*/
public static int findFertigkeitValue(FertigkeitsGruppe fg, AbstraktPersona persona) {
PersonaFertigkeitsGruppe pfg = findGruppe(fg, persona);
if (pfg != null)
return pfg.getStufe();
return 0;
}
public static boolean isSameObject(EObject a, EObject b) {
if (a == null || b == null)
return false;
return isASameB(a, b) || isASameB(b, a);
}
/**
* Checks if the a object is a b, which means it has the same parentId
*
* @param a
* @param b
* @return
*/
public static boolean isASameB(EObject a, EObject b) {
if (a == b)
return true;
if (a instanceof Identifiable) {
Identifiable id = (Identifiable)a;
String parentId = id.getParentId();
if (parentId == null)
return false;
boolean equals = parentId.equals(getResourceId(b));
if (equals)
return true;
if (b instanceof Identifiable) {
Identifiable idb = (Identifiable)b;
String parentId2 = idb.getParentId();
if (parentId2 == null)
return false;
return parentId.equals(parentId2);
}
// String resourceId = getResourceId(a);
// if(resourceId!=null)
// equals = resourceId.equals( getResourceId(b));
// if(equals)
// return true;
// if(parentId==null || ((Identifiable)b).getParentId()==null)
// return false;
//
// return parentId.equals(((Identifiable)b).getParentId());
}
return false;
}
/**
* Finds the values of {@link PersonaFertigkeitsGruppe} for a given {@link FertigkeitsGruppe} and persona.
*
* @param fg the fertigkeit
* @param persona the persina
* @return null or the {@link PersonaFertigkeitsGruppe}r
*/
public static PersonaFertigkeitsGruppe findGruppe(FertigkeitsGruppe fg, AbstraktPersona persona) {
EList<PersonaFertigkeitsGruppe> fertigkeitsGruppen = persona.getFertigkeitsGruppen();
for (PersonaFertigkeitsGruppe personaFertigkeitsGruppe : fertigkeitsGruppen) {
if (fg.equals(personaFertigkeitsGruppe.getGruppe()))
return personaFertigkeitsGruppe;
}
return null;
}
/**
* Returns the dicepool for the fertigkeit or -1.
*
* @param fertigkeit
* @param persona
* @return
*/
public static Integer fertigkeitDicePoolValue(PersonaFertigkeit personaFertigkeit, AbstraktPersona persona) {
if (personaFertigkeit == null || persona == null)
return -1;
Fertigkeit fertigkeit = personaFertigkeit.getFertigkeit();
if (fertigkeit != null && fertigkeit.getAttribut() != null) {
Integer value = (Integer)persona.eGet(fertigkeit.getAttribut());
Integer fertigkeitValue = personaFertigkeit.getStufe();
if (fertigkeitValue == 0)
return value - 1;
value = value + fertigkeitValue;
return value;
}
return -1;
}
// /**
// * Returns the dicepool for the fertigkeit.
// *
// * @param fertigkeit
// * @param persona
// * @return
// */
// public static Integer fertigkeitDicePool(PersonaFertigkeit personaFertigkeit, AbstraktPersona persona) {
// if (personaFertigkeit == null || persona == null)
// return -1;
//
// Fertigkeit fertigkeit = personaFertigkeit.getFertigkeit();
// if (fertigkeit != null && fertigkeit.getAttribut() != null) {
// Integer value = (Integer)persona.eGet(fertigkeit.getAttribut());
// Integer fertigkeitValue = personaFertigkeit.getStufe();
// if (fertigkeitValue == 0)
// return value - 1;
//
// value = value + fertigkeitValue;
// return value;
// }
//
// return -1;
// }
/**
* Returns the stufe or -1.
*
* @param fertigkeit
* @param persona
* @return
*/
public static Integer findFertigkeitValue(Fertigkeit fertigkeit, AbstraktPersona persona) {
PersonaFertigkeit pf = findFertigkeit(fertigkeit, persona);
if (pf != null)
if (pf.getStufe() == 0)
return -1;
else
return pf.getStufe();
if (Shr5Package.Literals.FERTIGKEITS_GRUPPE__FERTIGKEITEN.equals(fertigkeit.eContainmentFeature())) {
FertigkeitsGruppe eContainer = (FertigkeitsGruppe)fertigkeit.eContainer();
PersonaFertigkeitsGruppe gruppe = findGruppe(eContainer, persona);
if (gruppe != null)
return gruppe.getStufe();
}
return -1;
}
/**
* Returns the persona fertigkeit or null.
*
* @param fertigkeit
* @param persona
* @return
*/
public static PersonaFertigkeit findFertigkeit(Fertigkeit fertigkeit, AbstraktPersona persona) {
if (fertigkeit == null || persona == null)
return null;
EList<PersonaFertigkeit> fertigkeiten = persona.getFertigkeiten();
for (PersonaFertigkeit personaFertigkeit : fertigkeiten) {
if (fertigkeit.equals(personaFertigkeit.getFertigkeit()))
return personaFertigkeit;
}
return null;
}
/**
* Calcs the race maximum for the given persona and the max feature.
*
* @param persona
* @param attribute
* @return
*/
public static int calcRaceMaximum(AbstraktPersona persona, EAttribute attribute) {
if (persona == null)
return -1;
Spezies spezies = persona.getSpezies();
if (spezies == null)
return -1;
int value = (Integer)spezies.eGet(attribute);
int wert = persona.getModManager().getmodWert(attribute);
return value + wert;
}
/**
* Calcs the race maximum for the given persona and the max feature.
*
* @param persona
* @param attribute
* @return
*/
public static int calcRaceMaximum_(AbstraktPersona persona, EAttribute attribute) {
if (persona == null)
return -1;
// TODO : this is the wrong method it calcs the overRaceMax need to add the right method also
Spezies spezies = persona.getSpezies();
if (spezies == null)
return -1;
int value = (Integer)spezies.eGet(attribute);
int wert = persona.getModManager().getmodWert(attribute);
int halfEven = (int)Math.ceil((float)(value + wert) / 2F);
return value + halfEven;
}
public static boolean hasFertigkeitUnderGroup(FertigkeitsGruppe fg, AbstraktPersona persona) {
EList<Fertigkeit> fertigkeiten = fg.getFertigkeiten();
for (Fertigkeit fertigkeit : fertigkeiten) {
if (findFertigkeit(fertigkeit, persona) != null)
return true;
}
return false;
}
/**
* calcs a simple Karma costs.
*
* @param from
* @param to
* @param fac
* @return
*/
public static int calcKarmaCosts(int from, int to, int fac) {
if (from < 0 || to <= 0)
return 0;
if (from >= to)
return 0;
int sum = 0;
for (int i = from; i < to; i++) {
sum += (i + 1) * fac;
}
return (int)sum;
}
/**
* Calculated the sum of essence in the given list.
*
* @param koerperMods
* @return
*/
public static int calcEssenceSum(List<Koerpermods> koerperMods) {
int sum = 0;
for (Koerpermods koerpermods2 : koerperMods) {
sum = sum + getEssencesValue(koerpermods2);
}
return sum;
}
/**
* Calcs the sum of ki power points.
*
* @param kikraft
* @return
*/
public static int calcKiPowerSum(List<KiKraft> kikraft) {
int sum = 0;
for (KiKraft kiKraft2 : kikraft) {
sum = sum + kiKraft2.getKraftpunkte();
}
return sum;
}
/**
* Create a float string from an int with base 100.
*
* @param essenz
* @return
*/
public static String essenzToFloat(int essenz) {
float f = essenz / 100f;
String string = String.format("%.2f", f);//$NON-NLS-1$
return string;
}
/**
* Parse a damage code to an effective one. f.e. STR+1, where the strength is taken from the persona.
*
* @param damage
* @param persona
* @return
*/
public static DamageCode parseDamageCode(String damage, AbstraktPersona persona) {
DamageCode damageCode = ShadowrunTools.parseDamageCode(damage);
if (damageCode != null) {
int power = damageCode.getPower();
if (damageCode.getAttribute() != null) {
Integer value = (Integer)persona.eGet(damageCode.getAttribute());
power = value + power;
return new DamageCode(power, damageCode.type);
} else
return damageCode;
}
return null;
}
public static DamageCode parseDamageCode(String damage) {
if (damage == null)
return null;
Matcher matcher = damagePattern.matcher(damage.trim());
SchadensTyp st = SchadensTyp.KOERPERLICH;
if (matcher.matches()) {
String p = matcher.group(1);
String t = matcher.group(2);
if ("M".equalsIgnoreCase(t))
st = SchadensTyp.GEISTIG;
try {
return new DamageCode(Integer.parseInt(p), st);
} catch (Exception e) {
}
} else {
matcher = damagePattern1.matcher(damage.trim());
if (matcher.matches()) {
String a = matcher.group(1);
String p = matcher.group(2);
String t = matcher.group(3);
if ("M".equalsIgnoreCase(t))
st = SchadensTyp.GEISTIG;
try {
return new DamageCode(Integer.parseInt(p), st, a);
} catch (Exception e) {
}
}
}
return null;
}
/**
* Repesent the parsed damage code.
*
* @author urs
*/
public static class DamageCode {
public DamageCode(int power, SchadensTyp type) {
super();
this.power = power;
this.type = type;
}
public DamageCode(int power, SchadensTyp type, String att) {
this(power, type);
this.attribute = getAttributeFromShortName(att);
}
private int power;
private SchadensTyp type;
private EAttribute attribute;
public int getPower() {
return power;
}
public SchadensTyp getType() {
return type;
}
@Override
public String toString() {
if (attribute == null)
return power + getTypeCode();
else {
return "(" + attributeToShortStr(attribute) + "+" + power + ")" + getTypeCode();
}
}
private String attributeToShortStr(EAttribute att) {
if (Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__STAERKE.equals(att))
return "STR";
else
return "U";
}
private String getTypeCode() {
if (type == SchadensTyp.KOERPERLICH)
return "P";
else if (type == SchadensTyp.GEISTIG)
return "M";
return "U";
}
public EAttribute getAttribute() {
return attribute;
}
public void setPower(int power) {
this.power = power;
}
public void setType(SchadensTyp type) {
this.type = type;
}
}
/**
* Return the attribute from the short name.
*
* @param att
* @return
*/
public static EAttribute getAttributeFromShortName(String att) {
String lower = att.toLowerCase();
if ("str".equals(lower))
return Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__STAERKE;
return null;
}
public static Predicate<? super EObject> muniForMagazinPredicate(final Magazin eo) {
return new Predicate<Object>() {
@Override
public boolean apply(Object input) {
if (input instanceof Munition) {
Munition muni = (Munition)input;
if (muni.getType() == null || eo.getType() == null)
return false;
return muni.getType().equals(eo.getType().getReichweite());
}
return false;
}
};
}
public static Predicate<? super EObject> matchingMagazinPredicate(final Feuerwaffe fw) {
return new Predicate<Object>() {
@Override
public boolean apply(Object input) {
if (input instanceof Magazin) {
Feuerwaffe type = ((Magazin)input).getType();
return ShadowrunTools.isSameObject(fw, type);
}
return false;
}
};
}
/**
* Create a predicate to filter for the eclass.
*
* @param eClass
* @return
*/
public static Predicate<? super EObject> eclassPredicate(final EClass eClass) {
return new Predicate<EObject>() {
@Override
public boolean apply(EObject input) {
return eClass.equals(input.eClass());
}
};
}
public static String getResourceId(EObject eo) {
try {
XMLResource xmlRes = (XMLResource)eo.eResource();
return xmlRes.getID(eo);
} catch (Exception e) {
}
return null;
}
public static EObject getEObjectFromId(String id,Resource resource) {
try {
return resource.getEObject(id);
} catch (Exception e) {
}
return null;
}
/**
* Return a predicate to filter by the xml id.
*
* @param id
* @return
*/
public static Predicate<EObject> xmlIdPredicate(final String id) {
if (id == null)
throw new IllegalArgumentException("Null is no valid id !!");
return new Predicate<EObject>() {
@Override
public boolean apply(EObject input) {
String resourceId = ShadowrunTools.getResourceId(input);
return id.equals(resourceId);
}
};
}
public static Function<String, EObject> xmlId2EObjectTransformer(final Collection<? extends EObject> objects) {
return new Function<String, EObject>() {
@Override
public EObject apply(String input) {
return getFirstObjectById(objects, input);
}
};
}
public static EObject getFirstObjectById(Collection<? extends EObject> objects, String id) {
try {
Collection<? extends EObject> filter = Collections2.filter(objects, ShadowrunTools.xmlIdPredicate(id));
Iterator<? extends EObject> iterator = filter.iterator();
if (!iterator.hasNext())
return null;
return iterator.next();
} catch (Exception e) {
}
return null;
}
/**
* Simple wrapper for an iterable.
*
* @param iterator
* @return
*/
public static Iterable<EObject> toIterable(final Iterator<EObject> iterator) {
return new Iterable<EObject>() {
@Override
public Iterator<EObject> iterator() {
return iterator;
}
};
}
/**
* Create a allowed Sorces predicate to match a {@link Quelle}, not in the allowedSources.
*
* @param allowedSources should not be empty
* @return
*/
public static Predicate<EObject> notAllowedSourcePredicate(final EList<SourceBook> allowedSources) {
return new Predicate<EObject>() {
@Override
public boolean apply(EObject input) {
if (input instanceof Quelle) {
Quelle q = (Quelle)input;
if (q.getSrcBook() == null)
return false;
return !allowedSources.contains(q.getSrcBook());
} else if (input instanceof PersonaFertigkeit) {
PersonaFertigkeit pf = (PersonaFertigkeit)input;
return apply(pf.getFertigkeit());
}
return false;
}
};
}
/**
* Create a allowed Sorces predicate to match a {@link Quelle}, in the allowedSources.
*
* @param allowedSources should not be empty
* @return
*/
public static Predicate<EObject> allowedSourcePredicate(final EList<SourceBook> allowedSources) {
return new Predicate<EObject>() {
@Override
public boolean apply(EObject input) {
if (input instanceof Quelle) {
Quelle q = (Quelle)input;
if (q.getSrcBook() == null)
return true;
return allowedSources.contains(q.getSrcBook());
} else if (input instanceof PersonaFertigkeit) {
PersonaFertigkeit pf = (PersonaFertigkeit)input;
return apply(pf.getFertigkeit());
}
return true;
}
};
}
public static Predicate<EClass> esupertypePredicate(final EClass eClass) {
return new Predicate<EClass>() {
@Override
public boolean apply(EClass input) {
return input.getEAllSuperTypes().contains(eClass);
}
};
}
/**
* A predicate to check isASameB
* @param source
* @return
*/
public static Predicate<? super EObject> isASameBPredicate(final Quelle source) {
return new Predicate<EObject>() {
@Override
public boolean apply(EObject input) {
return ShadowrunTools.isASameB(input, source);
}
};
}
/**
* Get the mod for the list of {@link Modifizierbar}.
* @param eAttribute
* @param list
* @return
*/
public static Integer getModificatorsValue(EAttribute eAttribute, EList<? extends Modifizierbar> list) {
int sum = 0;
for (Modifizierbar modifizierbar : list) {
sum += getModificatorValue(modifizierbar, eAttribute);
}
return sum;
}
}