diff --git a/Projekte/common/build.gradle b/Projekte/common/build.gradle deleted file mode 100644 index 7878132d..00000000 --- a/Projekte/common/build.gradle +++ /dev/null @@ -1,5 +0,0 @@ -plugins { - id 'buildlogic.java-library-conventions' -} - -description = 'Common classes' diff --git a/Projekte/common/logging.properties b/Projekte/common/logging.properties deleted file mode 100644 index c1441221..00000000 --- a/Projekte/common/logging.properties +++ /dev/null @@ -1,7 +0,0 @@ -handlers=java.util.logging.ConsoleHandler -.level=INFO -;pp.level=FINE -pp.util.triangulation.Polygon.level=FINE -java.util.logging.ConsoleHandler.level=FINER -java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter -java.util.logging.SimpleFormatter.format=[%4$s %2$s] %5$s%6$s%n \ No newline at end of file diff --git a/Projekte/common/src/main/java/pp/util/Angle.java b/Projekte/common/src/main/java/pp/util/Angle.java deleted file mode 100644 index f3399a78..00000000 --- a/Projekte/common/src/main/java/pp/util/Angle.java +++ /dev/null @@ -1,257 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import java.util.Objects; - -import static pp.util.FloatMath.DEG_TO_RAD; -import static pp.util.FloatMath.FLT_EPSILON; -import static pp.util.FloatMath.RAD_TO_DEG; -import static pp.util.FloatMath.abs; -import static pp.util.FloatMath.atan2; -import static pp.util.FloatMath.cos; -import static pp.util.FloatMath.sin; -import static pp.util.FloatMath.sqrt; - -/** - * A class for representing angles by unit vectors where angles define - * polar coordinates. - */ -public class Angle implements Comparable { - /** - * 0 degrees, i.e., along the x-axis - */ - public static final Angle ZERO = new Angle(1f, 0f); - /** - * 180 degrees, i.e., along the negative x-axis - */ - public static final Angle PI = new Angle(-1f, 0f); - - /** - * Returns the minimum of the specified angles with respect to - * {@linkplain #compareTo(Angle)}. - * - * @param u first angle to compare - * @param v second angle to compare - */ - public static Angle min(Angle u, Angle v) { - return u.compareTo(v) <= 0 ? u : v; - } - - /** - * The x-coordinate of the unit vector. - */ - public final float x; - /** - * The y-coordinate of the unit vector. - */ - public final float y; - - /** - * Creates a new angle represented by the vector with the specified - * coordinates. Note that the vector must have length 1. - */ - private Angle(float x, float y) { - this.x = x; - this.y = y; - } - - /** - * Returns the polar coordinates angle of the specified vector. - * - * @param x the vectors x value - * @param y the vectors y value - */ - public static Angle fromVector(float x, float y) { - final float len = sqrt(x * x + y * y); - if (len < FLT_EPSILON) - throw new IllegalArgumentException("null vector"); - return new Angle(x / len, y / len); - } - - /** - * Returns the polar coordinates angle when looking from the first to the second - * specified position. - * - * @param from first position - * @param to second position - */ - public static Angle direction(Position from, Position to) { - return fromVector(to.getX() - from.getX(), - to.getY() - from.getY()); - } - - /** - * Returns an Angle object for the specified angle in radians. - * - * @param radians the specified radian value - */ - public static Angle fromRadians(float radians) { - return new Angle(cos(radians), sin(radians)); - } - - /** - * Returns an Angle object for the specified angle in degrees. - * - * @param degrees the specified degrees value - */ - public static Angle fromDegrees(float degrees) { - return fromRadians(degrees * DEG_TO_RAD); - } - - /** - * Returns the value of this angle in radians in the range (-pi,pi]. - */ - public float radians() { - return atan2(y, x); - } - - /** - * Returns the value of this angle in degrees in the range (-180,180]. - */ - public float degrees() { - return radians() * RAD_TO_DEG; - } - - /** - * Returns the x-coordinate of the unit vector, that is the cosine of the angle. - */ - public float getX() { - return x; - } - - /** - * Returns the y-coordinate of the unit vector, that is the sinus of the angle. - */ - public float getY() { - return y; - } - - /** - * Returns the angle obtained by adding the specified angle to this angle. - * - * @param o the other angle - */ - public Angle plus(Angle o) { - return new Angle(x * o.x - y * o.y, - x * o.y + y * o.x); - } - - /** - * Returns the angle obtained by subtracting the specified angle from this angle. - * - * @param o the other angle - */ - public Angle minus(Angle o) { - return new Angle(y * o.y + x * o.x, - y * o.x - x * o.y); - } - - /** - * Returns the bisector angle between this angle as left angle and the - * specified right angle, that is, the angle halfway from the right to this - * angle when turning from right to left. - * - * @param right right angle - * @return the bisector angle between this as left and the specified right angle - */ - public Angle bisector(Angle right) { - // compute vector of this.minus(right) - final float dx = y * right.y + x * right.x; - final float dy = y * right.x - x * right.y; - if (abs(dy) < FLT_EPSILON) { - // the difference is either 0° or 180° - if (dx > 0f) - return this; - else - return new Angle(-right.y, right.x); - } - final float mid = 0.5f * atan2(dy, dx); - final float sum = right.radians() + mid; - if (mid > 0f) - return new Angle(cos(sum), sin(sum)); - else - return new Angle(-cos(sum), -sin(sum)); - } - - /** - * Returns true if turning left from the specified angle towards this angle is - * shorter than turning right towards this angle. - * - * @param o another angle - */ - public boolean leftOf(Angle o) { - return y * o.x - x * o.y > 0f; - } - - /** - * Returns true if turning right from the specified angle towards this angle is - * shorter than turning left towards this angle. - * - * @param o another angle - */ - public boolean rightOf(Angle o) { - return y * o.x - x * o.y < 0f; - } - - /** - * Compares this angle with the specified one and returns -1, 0, or 1 if - * the value of this angle is less than, equal to, or greater than the value - * of the specified angle, respectively, where angle values are in the - * range [0,2*pi) and 0 means along the x-axis. - * - * @param o the other angle - */ - @Override - public int compareTo(Angle o) { - if (y == 0f) { - if (o.y < 0f) - return -1; - if (o.y > 0f) - return x > 0f ? -1 : 1; - if (x > 0f) - return o.x > 0f ? 0 : 1; - return o.x > 0f ? -1 : 0; - } - if (y > 0f) { - if (o.y < 0f) - return -1; - if (o.y == 0f) - return o.x > 0f ? 1 : -1; - } - else if (o.y >= 0f) - return 1; - final float det = x * o.y - y * o.x; - if (det == 0f) - return 0; - return det > 0f ? -1 : 1; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o instanceof Angle angle) - return compareTo(angle) == 0; - return false; - } - - @Override - public int hashCode() { - return Objects.hash(x, y); - } - - /** - * Returns a string representation of this angle in degrees in the range [0,2*pi). - */ - @Override - public String toString() { - if (degrees() < 0f) - return (degrees() + 360f) + "°"; - return degrees() + "°"; - } -} diff --git a/Projekte/common/src/main/java/pp/util/FloatMath.java b/Projekte/common/src/main/java/pp/util/FloatMath.java deleted file mode 100644 index 09844716..00000000 --- a/Projekte/common/src/main/java/pp/util/FloatMath.java +++ /dev/null @@ -1,460 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -/** - * Provides mathematical functions using float precision. - */ -public class FloatMath { - private FloatMath() { /* don't instantiate */ } - - public static final double DBL_EPSILON = 2.220446049250313E-16d; - /** - * A "close to zero" float epsilon value for use - */ - public static final float FLT_EPSILON = 1.1920928955078125E-7f; - /** - * A "close to zero" float epsilon value for use - */ - public static final float ZERO_TOLERANCE = 0.0001f; - /** - * The value 1/3, as a float. - */ - public static final float ONE_THIRD = 1f / 3f; - /** - * The value PI as a float. (180 degrees) - */ - public static final float PI = (float) Math.PI; - /** - * The value 2PI as a float. (360 degrees) - */ - public static final float TWO_PI = 2.0f * PI; - /** - * The value PI/2 as a float. (90 degrees) - */ - public static final float HALF_PI = 0.5f * PI; - /** - * The value PI/4 as a float. (45 degrees) - */ - public static final float QUARTER_PI = 0.25f * PI; - /** - * The value 1/PI as a float. - */ - public static final float INV_PI = 1.0f / PI; - /** - * The value 1/(2PI) as a float. - */ - public static final float INV_TWO_PI = 1.0f / TWO_PI; - /** - * A value to multiply a degree value by, to convert it to radians. - */ - public static final float DEG_TO_RAD = PI / 180.0f; - /** - * A value to multiply a radian value by, to convert it to degrees. - */ - public static final float RAD_TO_DEG = 180.0f / PI; - - /** - * Linear interpolation from startValue to endValue by the given percent. - * Basically: ((1 - percent) * startValue) + (percent * endValue) - * - * @param scale scale value to use. if 1, use endValue, if 0, use startValue. - * @param startValue Beginning value. 0% of f - * @param endValue ending value. 100% of f - * @return The interpolated value between startValue and endValue. - */ - public static float interpolateLinear(float scale, float startValue, float endValue) { - if (startValue == endValue) { - return startValue; - } - if (scale <= 0f) { - return startValue; - } - if (scale >= 1f) { - return endValue; - } - return ((1f - scale) * startValue) + (scale * endValue); - } - - /** - * Linear extrapolation from startValue to endValue by the given scale. - * if scale is between 0 and 1 this method returns the same result as interpolateLinear - * if the scale is over 1 the value is linearly extrapolated. - * Note that the end value is the value for a scale of 1. - * - * @param scale the scale for extrapolation - * @param startValue the starting value (scale = 0) - * @param endValue the end value (scale = 1) - * @return an extrapolation for the given parameters - */ - public static float extrapolateLinear(float scale, float startValue, float endValue) { - return ((1f - scale) * startValue) + (scale * endValue); - } - - /** - * Returns the arc cosine of a value.
- * Special cases: - * - * - * @param fValue The value to arc cosine. - * @return The angle, in radians. - * @see Math#acos(double) - */ - public static float acos(float fValue) { - if (-1.0f < fValue) { - if (fValue < 1.0f) { - return (float) Math.acos(fValue); - } - - return 0.0f; - } - - return PI; - } - - /** - * Returns the arc sine of a value.
- * Special cases: - * - * - * @param fValue The value to arc sine. - * @return the angle in radians. - * @see Math#asin(double) - */ - public static float asin(float fValue) { - if (-1.0f < fValue) { - if (fValue < 1.0f) { - return (float) Math.asin(fValue); - } - - return HALF_PI; - } - - return -HALF_PI; - } - - /** - * Returns the arc tangent of an angle given in radians.
- * - * @param fValue The angle, in radians. - * @return fValue's atan - * @see Math#atan(double) - */ - public static float atan(float fValue) { - return (float) Math.atan(fValue); - } - - /** - * A direct call to Math.atan2. - * - * @param fY ordinate - * @param fX abscissa - * @return Math.atan2(fY, fX) - * @see Math#atan2(double, double) - */ - public static float atan2(float fY, float fX) { - return (float) Math.atan2(fY, fX); - } - - /** - * A direct call to Math.sinh. - * - * @param x The value for which to compute the hyperbolic sine - * @return Math.sinh(x) - * @see Math#sinh(double) - */ - public static float sinh(float x) { - return (float) Math.sinh(x); - } - - /** - * A direct call to Math.cosh. - * - * @param x The value for which to compute the hyperbolic cosine - * @return Math.cosh(x) - * @see Math#cosh(double) - */ - public static float cosh(float x) { - return (float) Math.cosh(x); - } - - /** - * A direct call to Math.tanh. - * - * @param x The value for which to compute the hyperbolic tangent - * @return Math.tanh(x) - * @see Math#tanh(double) - */ - public static float tanh(float x) { - return (float) Math.tanh(x); - } - - /** - * Returns the hyperbolic cotangent of a value. - * @param x The value for which to compute the hyperbolic cotangent. - * @return The hyperbolic cotangent of x. - * @see Math#tanh(double) - */ - public static float coth(float x) { - return (float) (1d / Math.tanh(x)); - } - - public static float arsinh(float x) { - return log(x + sqrt(x * x + 1f)); - } - - public static float arcosh(float x) { - return log(x + sqrt(x * x - 1f)); - } - - public static float artanh(float x) { - return 0.5f * log((1f + x) / (1f - x)); - } - - public static float arcoth(float x) { - return 0.5f * log((x + 1f) / (x - 1f)); - } - - /** - * Rounds a fValue up. A call to Math.ceil - * - * @param fValue The value. - * @return The fValue rounded up - * @see Math#ceil(double) - */ - public static float ceil(float fValue) { - return (float) Math.ceil(fValue); - } - - /** - * Returns cosine of an angle. Direct call to Math - * - * @param v The angle to cosine. - * @return the cosine of the angle. - * @see Math#cos(double) - */ - public static float cos(float v) { - return (float) Math.cos(v); - } - - /** - * Returns the sine of an angle. Direct call to Math - * - * @param v The angle to sine. - * @return the sine of the angle. - * @see Math#sin(double) - */ - public static float sin(float v) { - return (float) Math.sin(v); - } - - /** - * Returns E^fValue - * - * @param fValue Value to raise to a power. - * @return The value E^fValue - * @see Math#exp(double) - */ - public static float exp(float fValue) { - return (float) Math.exp(fValue); - } - - /** - * Returns e^fValue - 1. - * This is equivalent to calling Math.expm1. - * - * @param fValue The exponent to raise e to, minus 1. - * @return The result of e^fValue - 1. - * @see Math#expm1(double) - */ - public static float expm1(float fValue) { - return (float) Math.expm1(fValue); - } - - /** - * Returns Absolute value of a float. - * - * @param fValue The value to abs. - * @return The abs of the value. - * @see Math#abs(float) - */ - public static float abs(float fValue) { - if (fValue < 0) { - return -fValue; - } - return fValue; - } - - /** - * Returns a number rounded down. - * - * @param fValue The value to round - * @return The given number rounded down - * @see Math#floor(double) - */ - public static float floor(float fValue) { - return (float) Math.floor(fValue); - } - - /** - * Returns 1/sqrt(fValue) - * - * @param fValue The value to process. - * @return 1/sqrt(fValue) - * @see Math#sqrt(double) - */ - public static float invSqrt(float fValue) { - return (float) (1.0f / Math.sqrt(fValue)); - } - - /** - * Quickly estimate 1/sqrt(fValue). - * - * @param x the input value (≥0) - * @return an approximate value for 1/sqrt(x) - */ - public static float fastInvSqrt(float x) { - float halfX = 0.5f * x; - int i = Float.floatToIntBits(x); // get bits for floating value - i = 0x5f375a86 - (i >> 1); // gives initial guess y0 - x = Float.intBitsToFloat(i); // convert bits back to float - x = x * (1.5f - halfX * x * x); // Newton step, repeating increases accuracy - return x; - } - - /** - * Returns the log base E of a value. - * - * @param fValue The value to log. - * @return The log of fValue base E - * @see Math#log(double) - */ - public static float log(float fValue) { - return (float) Math.log(fValue); - } - - /** - * Returns a number raised to an exponent power. fBase^fExponent - * - * @param fBase The base value (IE 2) - * @param fExponent The exponent value (IE 3) - * @return base raised to exponent (IE 8) - * @see Math#pow(double, double) - */ - public static float pow(float fBase, float fExponent) { - return (float) Math.pow(fBase, fExponent); - } - - /** - * Returns the value squared. fValue ^ 2 - * - * @param fValue The value to square. - * @return The square of the given value. - */ - public static float sqr(float fValue) { - return fValue * fValue; - } - - /** - * Returns the square root of a given value. - * - * @param fValue The value to sqrt. - * @return The square root of the given value. - * @see Math#sqrt(double) - */ - public static float sqrt(float fValue) { - return (float) Math.sqrt(fValue); - } - - /** - * Returns the tangent of the specified angle. - * - * @param fValue The value to tangent, in radians. - * @return The tangent of fValue. - * @see Math#tan(double) - */ - public static float tan(float fValue) { - return (float) Math.tan(fValue); - } - - /** - * Returns 1 if the number is positive, -1 if the number is negative, and 0 otherwise - * - * @param iValue The integer to examine. - * @return The integer's sign. - */ - public static int sign(int iValue) { - return Integer.compare(iValue, 0); - } - - /** - * Returns 1 if the number is positive, -1 if the number is negative, and 0 otherwise - * - * @param fValue The float to examine. - * @return The float's sign. - */ - public static float sign(float fValue) { - return Math.signum(fValue); - } - - /** - * Take a float input and clamp it between min and max. - * - * @param input the value to be clamped - * @param min the minimum output value - * @param max the maximum output value - * @return clamped input - */ - public static float clamp(float input, float min, float max) { - return Math.max(min, Math.min(input, max)); - } - - /** - * Clamps the given float to be between 0 and 1. - * - * @param input the value to be clamped - * @return input clamped between 0 and 1. - */ - public static float saturate(float input) { - return clamp(input, 0f, 1f); - } - - /** - * Determine if two floats are approximately equal. - * This takes into account the magnitude of the floats, since - * large numbers will have larger differences be close to each other. - *

- * Should return true for a=100000, b=100001, but false for a=10000, b=10001. - * - * @param a The first float to compare - * @param b The second float to compare - * @return True if a and b are approximately equal, false otherwise. - */ - public static boolean approximateEquals(float a, float b) { - if (a == b) { - return true; - } - else { - return (abs(a - b) / Math.max(abs(a), abs(b))) <= 0.00001f; - } - } - - /** - * Normalizes the specified angle to lie in the interval (-pi,pi] and returns the normalized value in radians. - * - * @param angle the specified angle in radians - */ - public static float normalizeAngle(float angle) { - final float res = angle % TWO_PI; - if (res <= -FloatMath.PI) return res + TWO_PI; - else if (res > FloatMath.PI) return res - TWO_PI; - return res; - } -} diff --git a/Projekte/common/src/main/java/pp/util/FloatPoint.java b/Projekte/common/src/main/java/pp/util/FloatPoint.java deleted file mode 100644 index c43a3f31..00000000 --- a/Projekte/common/src/main/java/pp/util/FloatPoint.java +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -/** - * A trivial implementation of points in the plane with float coordinates. - * - * @param x x-coordinate - * @param y y-coordinate - */ -public record FloatPoint(float x, float y) implements Position { - public static final FloatPoint ZERO = new FloatPoint(0f, 0f); - - /** - * Create a new FloatPoint object for the given position. - * - * @param p a position - */ - public FloatPoint(Position p) { - this(p.getX(), p.getY()); - } - - /** - * Returns the x-coordinate. - */ - @Override - public float getX() { - return x; - } - - /** - * Returns the y-coordinate. - */ - @Override - public float getY() { - return y; - } - - public static Position p(float x, float y) { - return new FloatPoint(x, y); - } -} diff --git a/Projekte/common/src/main/java/pp/util/Interval.java b/Projekte/common/src/main/java/pp/util/Interval.java deleted file mode 100644 index 77c7ff9d..00000000 --- a/Projekte/common/src/main/java/pp/util/Interval.java +++ /dev/null @@ -1,77 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import static pp.util.FloatMath.ZERO_TOLERANCE; -import static pp.util.FloatMath.abs; - -/** - * Represents an interval. The start value must not be greater than the end value. - * - * @param from the start value of the interval - * @param to the end value of the interval - */ -public record Interval(float from, float to) { - - /** - * Creates a new interval between two specified values. - * - * @param from the specified start value - * @param to the specified end value - */ - public Interval { - if (from > to) - throw new IllegalArgumentException(from + " > " + to); - } - - /** - * Checks whether this interval has length 0, i.e., from and to are equal. - */ - public boolean isEmpty() { - return to == from; - } - - /** - * Checks whether the specified value is contained in this interval. Note that an empty interval may - * contain the value if the value is the start and the end value of the interval. - * - * @param value the specified value to check - */ - public boolean contains(float value) { - return from - value <= ZERO_TOLERANCE && value - to <= ZERO_TOLERANCE; - } - - /** - * Checks whether the specified interval is contained as a sub-interval. - * - * @param other the potential sub-interval - */ - public boolean contains(Interval other) { - return from - other.from < ZERO_TOLERANCE && other.to - to < ZERO_TOLERANCE; - } - - /** - * Returns a string representation of this interval. - */ - @Override - public String toString() { - return "[" + from + "; " + to + "]"; - } - - /** - * Checks whether the specified interval is almost equal to this - * interval up to the specified epsilon value. - * - * @param other the other interval to check - * @param eps the allowed epsilon value - */ - public boolean matches(Interval other, float eps) { - return abs(from - other.from) < eps && - abs(to - other.to) < eps; - } -} diff --git a/Projekte/common/src/main/java/pp/util/Position.java b/Projekte/common/src/main/java/pp/util/Position.java deleted file mode 100644 index c46928f4..00000000 --- a/Projekte/common/src/main/java/pp/util/Position.java +++ /dev/null @@ -1,84 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import static pp.util.FloatMath.sqrt; - -/** - * Interface for all objects that provide a position in the plane. - */ -public interface Position extends Comparable { - /** - * Returns the x-coordinate of the position - * - * @return x-coordinate as float - */ - float getX(); - - /** - * Returns the y-coordinate of the position - * - * @return y-coordinate as float - */ - float getY(); - - /** - * Returns the distance of this position from the specified position. - * - * @param x x-coordinate of the position - * @param y y-coordinate of the position - * @return distance - */ - default float distanceTo(float x, float y) { - return sqrt(distanceSquaredTo(x, y)); - } - - /** - * Returns the distance of this position from the specified position. - * This is just a convenience method for {@linkplain #distanceTo(float, float)}. - * - * @param other the other position - * @return distance - */ - default float distanceTo(Position other) { - return distanceTo(other.getX(), other.getY()); - } - - /** - * Returns the squared distance of this position from the specified position. - * - * @param x x-coordinate of the position - * @param y y-coordinate of the position - * @return squared distance - */ - default float distanceSquaredTo(float x, float y) { - final float dx = getX() - x; - final float dy = getY() - y; - return dx * dx + dy * dy; - } - - /** - * Returns the squared distance of this position from the specified position. - * - * @param p the other position - * @return squared distance - */ - default float distanceSquaredTo(Position p) { - return distanceSquaredTo(p.getX(), p.getY()); - } - - /** - * Compares positions in the plane from top to bottom - * (y coordinates grow downwards) and then from left ro right. - */ - @Override - default int compareTo(Position other) { - final int c = Float.compare(getY(), other.getY()); - return c != 0 ? c : Float.compare(getX(), other.getX()); - } -} diff --git a/Projekte/common/src/main/java/pp/util/PreferencesUtils.java b/Projekte/common/src/main/java/pp/util/PreferencesUtils.java deleted file mode 100644 index 40f032a6..00000000 --- a/Projekte/common/src/main/java/pp/util/PreferencesUtils.java +++ /dev/null @@ -1,30 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import java.util.prefs.Preferences; - -/** - * A class with convenience methods for preferences. - */ -public class PreferencesUtils { - private PreferencesUtils() { - // don't instantiate - } - - /** - * Returns a preferences node for the specified class object. The path of the - * preference node corresponds to the fully qualified name of the class. - * - * @param clazz a class object - * @return a preference node for the specified class - */ - public static Preferences getPreferences(Class clazz) { - return Preferences.userNodeForPackage(clazz).node(clazz.getSimpleName()); - } -} diff --git a/Projekte/common/src/main/java/pp/util/RandomPositionIterator.java b/Projekte/common/src/main/java/pp/util/RandomPositionIterator.java deleted file mode 100644 index 9d6d00a1..00000000 --- a/Projekte/common/src/main/java/pp/util/RandomPositionIterator.java +++ /dev/null @@ -1,90 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Random; - -/** - * An iterator that creates a random permutation of positions (x, y) where x and y are integer values - * in the range {0, ..., width-1} x {0, ..., height-1}. All permutations are uniformly distributed - * using the Fisher–Yates shuffle (also known as Knuth shuffle). - * - * @param the type of elements returned by this iterator - */ -public class RandomPositionIterator implements Iterator { - private final Random random = new Random(); - private final int height; - private final Map movedMap = new HashMap<>(); - private int remaining; - private final Creator creator; - - /** - * Functional interface to create instances of type T. - * - * @param the type of elements created by this creator - */ - public interface Creator { - T create(int x, int y); - } - - /** - * Creates a RandomPositionIterator for Position instances with float coordinates. - * - * @param width the width of the rectangle - * @param height the height of the rectangle - * @return a RandomPositionIterator for Position instances - */ - public static RandomPositionIterator floatPoints(int width, int height) { - return new RandomPositionIterator<>(FloatPoint::new, width, height); - } - - /** - * Creates a new permutation iterator generating a random permutation of positions (x, y) - * where x and y are integer values in the range {0, ..., width-1} x {0, ..., height-1}. - * - * @param creator the creator to create instances of type T - * @param width the width of the rectangle - * @param height the height of the rectangle - */ - public RandomPositionIterator(Creator creator, int width, int height) { - this.height = height; - this.remaining = width * height; - this.creator = creator; - } - - @Override - public boolean hasNext() { - return remaining > 0; - } - - @Override - public T next() { - if (hasNext()) { - final int idx = random.nextInt(remaining--); // note that remaining is decremented - final T result = getWhere(idx); - if (idx < remaining) - movedMap.put(idx, getWhere(remaining)); - movedMap.remove(remaining); - return result; - } - throw new NoSuchElementException(); - } - - private T getWhere(int idx) { - final T movedWhere = movedMap.get(idx); - if (movedWhere != null) - return movedWhere; - final int x = idx / height; - final int y = idx % height; - return creator.create(x, y); - } -} diff --git a/Projekte/common/src/main/java/pp/util/Segment.java b/Projekte/common/src/main/java/pp/util/Segment.java deleted file mode 100644 index c5f42525..00000000 --- a/Projekte/common/src/main/java/pp/util/Segment.java +++ /dev/null @@ -1,16 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -/** - * A directed straight line segment between two positions in the plane. - * - * @param from the start position of the segment - * @param to the end position of the segment - */ -public record Segment(Position from, Position to) implements SegmentLike {} diff --git a/Projekte/common/src/main/java/pp/util/SegmentLike.java b/Projekte/common/src/main/java/pp/util/SegmentLike.java deleted file mode 100644 index 41edea26..00000000 --- a/Projekte/common/src/main/java/pp/util/SegmentLike.java +++ /dev/null @@ -1,396 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import static java.lang.Float.max; -import static java.lang.Float.min; -import static pp.util.FloatMath.FLT_EPSILON; -import static pp.util.FloatMath.ZERO_TOLERANCE; -import static pp.util.FloatMath.abs; -import static pp.util.FloatMath.atan2; -import static pp.util.FloatMath.cos; -import static pp.util.FloatMath.sin; -import static pp.util.FloatMath.sqr; -import static pp.util.FloatMath.sqrt; - -/** - * Interface of geometrical objects like segments, i.e., having a start and an end position. - */ -public interface SegmentLike { - /** - * Returns the start position of the segment. - */ - Position from(); - - /** - * Returns the end position of the segment. - */ - Position to(); - - /** - * Returns the length, i.e., the distance between the start and the end point of this segment. - * - * @return length of the line segment - */ - default float length() { - return sqrt(lengthSquared()); - } - - /** - * Returns the length squared where the length is the distance between the start and the - * end point of this segment. - * - * @return length squared of the line segment - */ - default float lengthSquared() { - return lengthSquared(from(), to()); - } - - /** - * Returns the squared length of the vector between the specified points. - */ - static float lengthSquared(Position from, Position to) { - final float dx = to.getX() - from.getX(); - final float dy = to.getY() - from.getY(); - return dx * dx + dy * dy; - } - - /** - * Returns the length of the vector between the specified points. - */ - static float length(Position from, Position to) { - return sqrt(lengthSquared(from, to)); - } - - /** - * Returns the angle of this line segment with the x-axis. - * - * @return angle with the x-axis - */ - default float angle() { - final float dx = to().getX() - from().getX(); - final float dy = to().getY() - from().getY(); - return atan2(dy, dx); - } - - /** - * Returns the distance of the specified point from this segment. - * The distance is the length of the shortest connection between the specified - * point and any point of the line segment. - * - * @param x x-coordinate of the point - * @param y y-coordinate of the point - * @return the distance - */ - default float distanceTo(float x, float y) { - return distance(from().getX(), from().getY(), to().getX(), to().getY(), x, y); - } - - /** - * Returns the distance of the point from the segment between the specified points. - * The distance is the length of the shortest connection between the specified - * point and any point of the line segment. - * - * @param from the segment start point - * @param to the segment end point - * @param p the point - * @return the distance - */ - static float distance(Position from, Position to, Position p) { - return distance(from.getX(), from.getY(), to.getX(), to.getY(), p.getX(), p.getY()); - } - - /** - * Returns the distance of the point (x,y) from the segment from (x1,y1) to (x2,y2) - * The distance is the length of the shortest connection between the specified - * point and any point of the line segment. - * - * @param x1 x-coordinate of the segment start point - * @param y1 y-coordinate of the segment start point - * @param x2 x-coordinate of the segment end point - * @param y2 y-coordinate of the segment end point - * @param x x-coordinate of the point - * @param y y-coordinate of the point - * @return the distance - */ - static float distance(float x1, float y1, float x2, float y2, float x, float y) { - final float dx = x2 - x1; - final float dy = y2 - y1; - final float dx1 = x - x1; - final float dy1 = y - y1; - if (dx * dx1 + dy * dy1 <= 0f) - return sqrt(dx1 * dx1 + dy1 * dy1); - final float dx2 = x - x2; - final float dy2 = y - y2; - if (dx * dx2 + dy * dy2 >= 0f) - return sqrt(dx2 * dx2 + dy2 * dy2); - final float len = sqrt(dx * dx + dy * dy); - return FloatMath.abs(dx1 * dy - dy1 * dx) / len; - } - - /** - * Returns the distance of the specified position from this segment. - * This is just a convenience method for {@linkplain #distanceTo(float, float)}. - * - * @param pos a position - * @return the distance - */ - default float distanceTo(Position pos) { - return distanceTo(pos.getX(), pos.getY()); - } - - /** - * Returns the point of this segment with the specified quotient, i.e., q*from()+(1-q)*to(). - * - * @param q the quotient - */ - default Position pointAt(float q) { - if (q == 0f) return from(); - if (q == 1f) return to(); - return new FloatPoint((1f - q) * from().getX() + q * to().getX(), - (1f - q) * from().getY() + q * to().getY()); - } - - /** - * Shoots a ray from the specified position in the direction of the specified angle and returns the distance - * of the specified position from the intersection point of the ray with the straight line determined by the - * end points of this segment. Returns {@linkplain Float#NaN} if there is no intersection. - * - * @param pos the specified position - * @param angle the specified angle - */ - default float dist(Position pos, float angle) { - return quotientDist(pos, quotient(pos, angle)); - } - - /** - * Shoots a ray from the specified position in the direction of the specified angle and returns the distance - * of the specified position from the intersection point of the ray with the straight line determined by the - * end points of this segment. Returns {@linkplain Float#NaN} if there is no intersection. - * - * @param pos the specified position - * @param angle the specified angle - */ - default float dist(Position pos, Angle angle) { - return quotientDist(pos, quotient(pos, angle.x, angle.y)); - } - - /** - * Shoots a ray from the specified position in the direction of the point of this segment with the specified - * quotient, i.e., the point at q*from()+(1-q)*to(), and returns the distance - * of the specified position from the intersection point of the ray with the straight line determined by the - * end points of this segment. Returns {@linkplain Float#NaN} if there is no intersection. - * - * @param pos the specified position - * @param q the specified quotient - */ - default float quotientDist(Position pos, float q) { - final float dx = (1f - q) * from().getX() + q * to().getX() - pos.getX(); - final float dy = (1f - q) * from().getY() + q * to().getY() - pos.getY(); - return sqrt(dx * dx + dy * dy); - } - - /** - * Shoots a ray from the specified position in the direction of the specified angle and returns the - * quotient q such that the intersection point of the ray with the straight line determined by the - * end points of this segment is at q*from()+(1-q)*to(). - * - * @param pos the specified position - * @param angle the specified angle - */ - default float quotient(Position pos, float angle) { - final float ux = cos(angle); - final float uy = sin(angle); - return quotient(pos, ux, uy); - } - - /** - * Shoots a ray from the specified position in the direction of the specified vector and returns the - * quotient q such that the intersection point of the ray with the straight line determined by the - * end points of this segment is at q*from()+(1-q)*to(). - * - * @param pos the specified position - * @param ux the vectors x value - * @param uy the vectors y value - */ - private float quotient(Position pos, float ux, float uy) { - final float nom = nominator(pos, ux, uy); - final float det = determinant(ux, uy); - // the following is for dealing with floating point imprecision - if (abs(det) > FLT_EPSILON) - return nom / det; - if (abs(nom) > FLT_EPSILON) - return Float.NaN; - final float q = project(pos); - if (q > -FLT_EPSILON && q - 1f < FLT_EPSILON) - // pos lies (almost) within the segment - return q; - final float distFrom = isCandidate(pos, ux, uy, from()); - final float distTo = isCandidate(pos, ux, uy, to()); - if (distFrom >= 0f) { - if (distTo >= 0f) - return distFrom < distTo ? 0f : 1f; - else - return 0f; - } - if (distTo >= 0f) - return 1f; - return Float.NaN; - } - - /** - * Returns the determinant of a specified vector. - * - * @param ux the vectors x value - * @param uy the vectors y value - */ - private float determinant(float ux, float uy) { - return diffX() * uy - diffY() * ux; - } - - /** - * Returns the nominator of the specified vector starting at a specified position. - * - * @param pos the specified position - * @param ux the vectors x value - * @param uy the vectors y value - */ - private float nominator(Position pos, float ux, float uy) { - final float dx = pos.getX() - from().getX(); - final float dy = pos.getY() - from().getY(); - return dx * uy - dy * ux; - } - - /** - * Checks whether the (ux,uy) ray starting at pos hits (or almost hits) target. - * - * @param pos the specified start position - * @param ux the rays x value - * @param uy the rays y value - * @param target the specified target position - */ - private float isCandidate(Position pos, float ux, float uy, Position target) { - final float lambda = lambda(pos, target, ux, uy); - if (lambda < -FLT_EPSILON) return -1f; - final float dx = target.getX() - pos.getX() - lambda * ux; - final float dy = target.getY() - pos.getY() - lambda * uy; - return dx * dx + dy * dy; - } - - private float lambda(Position p1, Position p2, float ux, float uy) { - return ux * (p2.getX() - p1.getX()) + uy * (p2.getY() - p1.getY()); - } - - /** - * Returns the quotient q such that the specified point projected onto this - * segment is at q*from()+(1-q)*to(). - * - * @param pos the specified points position - */ - default float project(Position pos) { - return ((pos.getX() - from().getX()) * diffX() + (pos.getY() - from().getY()) * diffY()) / lengthSquared(); - } - - /** - * Returns the interval of quotients between leftAngle and rightAngle - * looking from the specified position. The starting point of the - * segment must be left of its end point when looking from the - * specified position. - * - * @param pos the specified position to look from - * @param leftAngle the specified left angle - * @param rightAngle the specified right angle - */ - default Interval interval(Position pos, Angle leftAngle, Angle rightAngle) { - final float nomLeft = nominator(pos, leftAngle.x, leftAngle.y); - final float detLeft = determinant(leftAngle.x, leftAngle.y); - final float nomRight = nominator(pos, rightAngle.x, rightAngle.y); - final float detRight = determinant(rightAngle.x, rightAngle.y); - if (abs(detLeft) <= FLT_EPSILON || abs(detRight) <= FLT_EPSILON) - return new Interval(0f, 0f); - final float q1 = nomLeft / detLeft; - final float q2 = nomRight / detRight; - if (q1 > q2) - return new Interval(0f, 0f); - final float lower = q1 < ZERO_TOLERANCE ? 0f : min(1f, q1); - final float upper = q2 > 1f - ZERO_TOLERANCE ? 1f : max(0f, q2); - return new Interval(lower, upper); - } - - /** - * Returns the x-coordinate of the vector from the start to the end point. - */ - default float diffX() { - return to().getX() - from().getX(); - } - - /** - * Returns the y-coordinate of the vector from the start to the end point. - */ - default float diffY() { - return to().getY() - from().getY(); - } - - /** - * Computes the determinant of the matrix whose first column vector is this segment and the - * second column vector is the specified segment. - * - * @param other the specified segment - */ - default float determinantWith(SegmentLike other) { - return diffX() * other.diffY() - diffY() * other.diffX(); - } - - /** - * Computes the square of the minimal distance between this and the specified segment. - * - * @param other other segment - * @return squared distance - */ - default float minDistanceSquared(SegmentLike other) { - final float rx = other.from().getX() - from().getX(); - final float ry = other.from().getY() - from().getY(); - final float ux = diffX(); - final float uy = diffY(); - final float vx = other.diffX(); - final float vy = other.diffY(); - - final float ru = rx * ux + ry * uy; - final float rv = rx * vx + ry * vy; - final float uu = ux * ux + uy * uy; - final float uv = ux * vx + uy * vy; - final float vv = vx * vx + vy * vy; - - if (uu < ZERO_TOLERANCE) { // this segment is in fact a single point - if (vv < ZERO_TOLERANCE) // other is a point, too - return rx * rx + ry * ry; - else - return sqr(other.distanceTo(from())); - } - if (vv < ZERO_TOLERANCE) // other is in fact a point - return sqr(distanceTo(other.from())); - - final float det = uu * vv - uv * uv; - final float s; - final float t; - - if (det < ZERO_TOLERANCE * uu * vv) { - s = min(max(ru / uu, 0f), 1f); - t = 0f; - } - else { - s = min(max((ru * vv - rv * uv) / det, 0f), 1f); - t = min(max((ru * uv - rv * uu) / det, 0f), 1f); - } - - final float mu1 = min(max((t * uv + ru) / uu, 0f), 1f); - final float mu2 = min(max((s * uv - rv) / vv, 0f), 1f); - - return pointAt(mu1).distanceSquaredTo(other.pointAt(mu2)); - } -} \ No newline at end of file diff --git a/Projekte/common/src/main/java/pp/util/Util.java b/Projekte/common/src/main/java/pp/util/Util.java deleted file mode 100644 index acebd346..00000000 --- a/Projekte/common/src/main/java/pp/util/Util.java +++ /dev/null @@ -1,90 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * A class with auxiliary functions. - */ -public class Util { - private Util() { /* do not instantiate */ } - - /** - * Calculates and returns the area of a polygon defined by a list of points, using the shoelace formula. - * The result is positive if the sequence of vertices is in clockwise order, and negative - * otherwise. - * - * @param points A list of positions that define the vertices of the polygon in planar coordinates. - * @return The calculated area of the polygon. - */ - public static float getArea(List points) { - float sum = 0; - Position prev = getLast(points); - for (var next : points) { - sum += prev.getX() * next.getY() - next.getX() * prev.getY(); - prev = next; - } - return 0.5f * sum; - } - - /** - * Returns the last element of the given list. - * - * @param list the list from which to retrieve the last element - * @param the type of elements in the list - * @return the last element of the list - * @throws IndexOutOfBoundsException if the list is empty - */ - public static T getLast(List list) { - return list.get(list.size() - 1); - } - - /** - * Reverses the order of elements in the given list. - * - * @param list the list to be reversed - * @param the type of elements in the list - * @return a new list with elements in reversed order - */ - public static List reverse(List list) { - final List reversed = new ArrayList<>(list); - Collections.reverse(reversed); - return reversed; - } - - /** - * Creates a copy of the given list. - * - * @param list the list to be copied, may be null - * @param the type of elements in the list - * @return a new list containing the elements of the original list, or null if the original list is null - */ - public static List copy(List list) { - return list == null ? null : new ArrayList<>(list); - } - - /** - * Adds an element to a set and returns a new set containing the original elements and the new element. - * - * @param set the original set, must not be null - * @param element the element to be added to the set - * @param the type of elements in the set - * @param the type of the element being added, must extend T - * @return a new set containing the original elements and the new element - */ - public static Set add(Set set, E element) { - final Set newSet = new HashSet<>(set); - newSet.add(element); - return newSet; - } -} diff --git a/Projekte/common/src/main/java/pp/util/config/Config.java b/Projekte/common/src/main/java/pp/util/config/Config.java deleted file mode 100644 index 57121989..00000000 --- a/Projekte/common/src/main/java/pp/util/config/Config.java +++ /dev/null @@ -1,286 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util.config; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.Reader; -import java.lang.System.Logger; -import java.lang.System.Logger.Level; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; -import java.lang.reflect.Array; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.function.Function; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -/** - * Abstract base class for representing configurations that can be read from properties files. - * Subclasses can define fields annotated with {@link Property} to specify the configuration keys - * and optionally {@link Separator} to specify custom separators for array values. - */ -public abstract class Config { - private static final String BLANK_SEQ = " *"; - - /** - * Annotation for specifying the property key for a field. - */ - @Retention(RUNTIME) - @Target(FIELD) - @Documented - protected @interface Property { - /** - * The key of the property. - */ - String value(); - } - - /** - * Annotation for specifying a custom separator for array values. - */ - @Retention(RUNTIME) - @Target(FIELD) - @Documented - protected @interface Separator { - /** - * The separator for array values. - */ - String value(); - } - - private static final Logger LOGGER = System.getLogger(Config.class.getName()); - private static final Map, Function> CONVERTER_MAP = new HashMap<>(); - - static { - CONVERTER_MAP.put(String.class, x -> x); - CONVERTER_MAP.put(byte.class, Byte::parseByte); - CONVERTER_MAP.put(short.class, Short::parseShort); - CONVERTER_MAP.put(int.class, Integer::parseInt); - CONVERTER_MAP.put(long.class, Long::parseLong); - CONVERTER_MAP.put(boolean.class, Boolean::parseBoolean); - CONVERTER_MAP.put(float.class, Float::parseFloat); - CONVERTER_MAP.put(double.class, Double::parseDouble); - CONVERTER_MAP.put(Byte.class, Byte::parseByte); - CONVERTER_MAP.put(Short.class, Short::parseShort); - CONVERTER_MAP.put(Integer.class, Integer::parseInt); - CONVERTER_MAP.put(Long.class, Long::parseLong); - CONVERTER_MAP.put(Boolean.class, Boolean::parseBoolean); - CONVERTER_MAP.put(Float.class, Float::parseFloat); - CONVERTER_MAP.put(Double.class, Double::parseDouble); - } - - /** - * Reads the specified properties file and sets the values of this config using {@link #readFrom(Properties)}. - * - * @param file the properties file to read - * @throws IOException if an I/O error occurs - * @see #readFrom(Properties) - */ - public void readFrom(File file) throws IOException { - try (Reader reader = new FileReader(file)) { - final Properties properties = new Properties(); - properties.load(reader); - readFrom(properties); - } - } - - /** - * Sets the values of fields annotated with {@link Property} using the specified properties. - * Array fields can be split into components using the default separator (",") or a custom separator - * specified with {@link Separator}. - * - * @param props the properties to read from - */ - public void readFrom(Properties props) { - for (Class clazz = getClass(); Config.class.isAssignableFrom(clazz); clazz = clazz.getSuperclass()) { - for (Field field : clazz.getDeclaredFields()) { - final Property keyAnnot = field.getAnnotation(Property.class); - if (keyAnnot != null && props.containsKey(keyAnnot.value())) { - try { - final String text = props.getProperty(keyAnnot.value()); - final Object value = createValue(text, field); - setField(field, value); - } - catch (IllegalAccessException ex) { - LOGGER.log(Level.ERROR, "Cannot access " + field, ex); //NON-NLS - } - } - } - } - } - - /** - * Reads the specified properties file and sets the values of this config if the file exists, - * otherwise uses default values. This method is a convenience version of {@link #readFrom(File)} - * that checks the existence of the specified file and does nothing if the file does not exist. - * - * @param file the properties file to read, if it exists - */ - public void readFromIfExists(File file) { - if (!file.exists()) { - LOGGER.log(Level.INFO, "There is no config file {0}; using default configuration", //NON-NLS - file.getAbsolutePath()); - return; - } - try { - readFrom(file); - LOGGER.log(Level.INFO, "Successfully read config from {0}", file.getAbsolutePath()); //NON-NLS - } - catch (IOException e) { - LOGGER.log(Level.WARNING, "Cannot read config file " + file.getAbsolutePath(), e); //NON-NLS - } - } - - /** - * Converts a string value from the properties file into an object that can be assigned to the specified field. - * For array fields, the string value is first split into components. - * - * @param value the string value to convert - * @param field the field to set with the converted value - * @return an object of the appropriate type for the field - */ - private Object createValue(String value, Field field) { - if (!field.getType().isArray()) - return convertToType(value, field.getType()); - // the field is an array - final Separator sepAnn = field.getDeclaredAnnotation(Separator.class); - final String sep = sepAnn == null ? "," : sepAnn.value(); - final String[] split = value.split(BLANK_SEQ + sep + BLANK_SEQ, -1); - final Object array = Array.newInstance(field.getType().componentType(), split.length); - for (int i = 0; i < split.length; i++) - Array.set(array, i, convertToType(split[i], field.getType().componentType())); - return array; - } - - /** - * Converts a string value into an object of the specified type. - * - * @param value the string value to convert - * @param targetType the target type to convert to - * @return an object of the specified type - */ - protected Object convertToType(String value, Class targetType) { - Function handler = CONVERTER_MAP.get(targetType); - if (handler != null) - return handler.apply(value); - throw new IllegalArgumentException("Cannot translate " + value + " to " + targetType); - } - - /** - * Returns a string representation of the configuration object, including all properties and their values. - * - * @return a string representation of the configuration object - */ - @Override - public String toString() { - final List propertyStrings = getPropertyStrings(); - propertyStrings.sort(String.CASE_INSENSITIVE_ORDER); - return "[\n" + String.join(",\n", propertyStrings) + "\n]"; - } - - /** - * Retrieves all property strings of the configuration object. - * - * @return a list of property strings - */ - private List getPropertyStrings() { - final List propertyStrings = new ArrayList<>(); - for (Class clazz = getClass(); Config.class.isAssignableFrom(clazz); clazz = clazz.getSuperclass()) { - for (Field field : clazz.getDeclaredFields()) { - final String stringRepresentation = getStringRepresentation(field); - if (stringRepresentation != null) - propertyStrings.add(stringRepresentation); - } - } - return propertyStrings; - } - - /** - * Retrieves the string representation of a field annotated with {@link Property}. - * - * @param field the field to retrieve the string representation for - * @return the string representation of the field, or null if the field is not annotated with {@link Property} - */ - private String getStringRepresentation(Field field) { - final Property keyAnnotation = field.getAnnotation(Property.class); - if (keyAnnotation != null) { - try { - final Object fieldValue = getField(field); - final String valueString = asString(fieldValue); - return keyAnnotation.value() + " -> " + field.getName() + " = " + valueString; - } - catch (IllegalAccessException e) { - LOGGER.log(Level.ERROR, "Cannot access " + field, e); //NON-NLS - } - } - return null; - } - - /** - * Converts an object to its string representation. For arrays, string representations of their components are produced. - * - * @param value the object to convert - * @return the string representation of the object - */ - private String asString(Object value) { - if (value == null) - return "null"; //NON-NLS - if (!value.getClass().isArray()) - return value.toString(); - final int length = Array.getLength(value); - final List components = new ArrayList<>(length); - for (int i = 0; i < length; i++) { - final Object component = Array.get(value, i); - components.add(asString(component)); - } - return "{" + String.join(", ", components) + "}"; - } - - /** - * Sets the value of a field, making it accessible if necessary. - * - * @param field the field to set - * @param value the value to set - * @throws IllegalAccessException if the field cannot be accessed - */ - private void setField(Field field, Object value) throws IllegalAccessException { - boolean inaccessible = !field.canAccess(this); - if (inaccessible) - field.setAccessible(true); - field.set(this, value); - if (inaccessible) - field.setAccessible(false); - LOGGER.log(Level.TRACE, "Set {0} to {1}", field, value); //NON-NLS - } - - /** - * Retrieves the value of a field, making it accessible if necessary. - * - * @param field the field to retrieve the value from - * @return the value of the field - * @throws IllegalAccessException if the field cannot be accessed - */ - private Object getField(Field field) throws IllegalAccessException { - boolean inaccessible = !field.canAccess(this); - if (inaccessible) - field.setAccessible(true); - final Object value = field.get(this); - if (inaccessible) - field.setAccessible(false); - return value; - } -} diff --git a/Projekte/common/src/test/java/pp/util/AngleTest.java b/Projekte/common/src/test/java/pp/util/AngleTest.java deleted file mode 100644 index 28f333e3..00000000 --- a/Projekte/common/src/test/java/pp/util/AngleTest.java +++ /dev/null @@ -1,109 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import org.junit.Test; - -import static java.lang.Math.min; -import static org.junit.Assert.assertEquals; -import static pp.util.FloatMath.DEG_TO_RAD; -import static pp.util.FloatMath.ZERO_TOLERANCE; -import static pp.util.FloatMath.cos; -import static pp.util.FloatMath.sin; - -public class AngleTest { - @Test - public void compareAngles() { - for (int i = 0; i < 360; i++) { - final Angle u = Angle.fromDegrees(i); - for (int j = 0; j < 360; j++) { - final Angle v = Angle.fromDegrees(j); - assertEquals("compare " + i + "° and " + j + "°", Integer.compare(i, j), (Object) u.compareTo(v)); - } - } - } - - @Test - public void addAngles() { - for (int i = 0; i < 360; i++) { - final Angle u = Angle.fromDegrees(i); - for (int j = 0; j < 360; j++) { - final Angle v = Angle.fromDegrees(j); - final Angle sum = u.plus(v); - assertEquals(i + "° + " + j + "°, x coordinate", cos((i + j) * DEG_TO_RAD), sum.x, ZERO_TOLERANCE); - assertEquals(i + "° + " + j + "°, y coordinate", sin((i + j) * DEG_TO_RAD), sum.y, ZERO_TOLERANCE); - } - } - } - - @Test - public void subtractAngles() { - for (int i = 0; i < 360; i++) { - final Angle u = Angle.fromDegrees(i); - for (int j = 0; j < 360; j++) { - final Angle v = Angle.fromDegrees(j); - final Angle diff = u.minus(v); - assertEquals(i + "° - " + j + "°, x coordinate", cos((i - j) * DEG_TO_RAD), diff.x, ZERO_TOLERANCE); - assertEquals(i + "° - " + j + "°, y coordinate", sin((i - j) * DEG_TO_RAD), diff.y, ZERO_TOLERANCE); - } - } - } - - @Test - public void minAngle() { - for (int i = 0; i < 360; i++) { - final Angle u = Angle.fromDegrees(i); - for (int j = 0; j < 360; j++) { - final Angle v = Angle.fromDegrees(j); - final Angle diff = Angle.min(u, v); - assertEquals(i + "° - " + j + "°, x coordinate", cos(min(i, j) * DEG_TO_RAD), diff.x, ZERO_TOLERANCE); - assertEquals(i + "° - " + j + "°, y coordinate", sin(min(i, j) * DEG_TO_RAD), diff.y, ZERO_TOLERANCE); - } - } - } - - @Test - public void bisector() { - for (int right = 0; right < 360; right++) { - final Angle rightAngle = Angle.fromDegrees(right); - for (int add = 0; add < 360; add++) { - final int left = right + add; - final Angle bisector = Angle.fromDegrees(left).bisector(rightAngle); - final float exp = (right + 0.5f * add) * DEG_TO_RAD; - assertEquals("left=" + left + "° / right=" + right + "°, x coordinate", cos(exp), bisector.x, ZERO_TOLERANCE); - assertEquals("left=" + left + "° / right=" + right + "°, y coordinate", sin(exp), bisector.y, ZERO_TOLERANCE); - } - } - } - - @Test - public void leftOf() { - for (int right = 0; right < 360; right++) { - final Angle rightAngle = Angle.fromDegrees(right); - for (int add = 1; add < 360; add++) - if (add != 180) { - final int left = right + add; - final Angle leftAngle = Angle.fromDegrees(left); - assertEquals(left + "° left of " + right + "°", add < 180, leftAngle.leftOf(rightAngle)); - } - } - } - - @Test - public void rightOf() { - for (int right = 0; right < 360; right++) { - final Angle rightAngle = Angle.fromDegrees(right); - for (int add = 1; add < 360; add++) - if (add != 180) { - final int left = right + add; - final Angle leftAngle = Angle.fromDegrees(left); - assertEquals(left + "° right of " + right + "°", add > 180, leftAngle.rightOf(rightAngle)); - } - } - } -} \ No newline at end of file diff --git a/Projekte/common/src/test/java/pp/util/IntervalTest.java b/Projekte/common/src/test/java/pp/util/IntervalTest.java deleted file mode 100644 index 2f367020..00000000 --- a/Projekte/common/src/test/java/pp/util/IntervalTest.java +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static pp.util.FloatMath.ZERO_TOLERANCE; - -public class IntervalTest { - private Interval interval; - - @Before - public void setUp() { - interval = new Interval(0f, 1f); - } - - @Test - public void contains() { - assertTrue(interval.contains(0.5f)); - assertTrue(interval.contains(0f)); - assertTrue(interval.contains(1f)); - assertFalse(interval.contains(1.5f)); - assertFalse(interval.contains(-0.5f)); - } - - @Test - public void matches() { - assertTrue(interval.matches(new Interval(0f, 1f), ZERO_TOLERANCE)); - assertFalse(interval.matches(new Interval(0f, 0.99f), ZERO_TOLERANCE)); - } -} \ No newline at end of file diff --git a/Projekte/common/src/test/java/pp/util/RandomPositionIteratorTest.java b/Projekte/common/src/test/java/pp/util/RandomPositionIteratorTest.java deleted file mode 100644 index 44eee8e7..00000000 --- a/Projekte/common/src/test/java/pp/util/RandomPositionIteratorTest.java +++ /dev/null @@ -1,36 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import org.junit.Test; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class RandomPositionIteratorTest { - public static final int WIDTH = 15; - public static final int HEIGHT = 25; - - @Test - public void permutation() { - for (int i = 0; i < 10; i++) { - final List permutation = new ArrayList<>(); - RandomPositionIterator.floatPoints(WIDTH, HEIGHT).forEachRemaining(permutation::add); - assertEquals(WIDTH * HEIGHT, permutation.size()); - assertEquals(permutation.size(), new HashSet<>(permutation).size()); - for (Position w : permutation) { - assertTrue(w.toString(), 0 <= w.getX() && w.getX() < WIDTH); - assertTrue(w.toString(), 0 <= w.getY() && w.getY() < HEIGHT); - } - } - } -} \ No newline at end of file diff --git a/Projekte/common/src/test/java/pp/util/SegmentTest.java b/Projekte/common/src/test/java/pp/util/SegmentTest.java deleted file mode 100644 index edae4faa..00000000 --- a/Projekte/common/src/test/java/pp/util/SegmentTest.java +++ /dev/null @@ -1,201 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static pp.util.FloatMath.FLT_EPSILON; -import static pp.util.FloatMath.PI; -import static pp.util.FloatMath.ZERO_TOLERANCE; -import static pp.util.FloatMath.cos; -import static pp.util.FloatMath.sqr; -import static pp.util.FloatMath.sqrt; -import static pp.util.FloatMath.tan; - -public class SegmentTest { - private static final float SQRT2 = sqrt(2f); - private static final Segment segment1 = new Segment(new FloatPoint(1f, -1f), new FloatPoint(1f, 1f)); - private static final Segment segment2 = new Segment(new FloatPoint(SQRT2, 0f), new FloatPoint(0f, SQRT2)); - private static final Segment segment3 = new Segment(new FloatPoint(2f, -1f), new FloatPoint(2f, 1f)); - private static final Segment segment4 = new Segment(new FloatPoint(SQRT2, -1f), new FloatPoint(SQRT2, 1f)); - private static final Segment segment5 = new Segment(new FloatPoint(-SQRT2, 2f * SQRT2), new FloatPoint(2f * SQRT2, -SQRT2)); - private static final Segment segment6 = new Segment(new FloatPoint(0f, 0f), new FloatPoint(SQRT2, 1f)); - private static final FloatPoint ZERO = new FloatPoint(0f, 0f); - public static final FloatPoint ONE_UP = new FloatPoint(0f, 1f); - public static final FloatPoint ONE_DOWN = new FloatPoint(0f, -1f); - - @Test - public void dist1() { - assertEquals(1f, segment1.dist(ZERO, 0f), FLT_EPSILON); - assertEquals(1f, segment1.dist(ONE_UP, 0f), FLT_EPSILON); - assertEquals(1f, segment1.dist(ONE_DOWN, 0f), FLT_EPSILON); - assertEquals(1f / cos(0.125f * PI), segment1.dist(ZERO, 0.125f * PI), FLT_EPSILON); - assertEquals(1f / cos(0.125f * PI), segment1.dist(ONE_UP, 0.125f * PI), FLT_EPSILON); - assertEquals(1f / cos(0.125f * PI), segment1.dist(ONE_DOWN, 0.125f * PI), FLT_EPSILON); - assertEquals(1f / cos(0.125f * PI), segment1.dist(ZERO, -0.125f * PI), FLT_EPSILON); - assertEquals(1f / cos(0.125f * PI), segment1.dist(ONE_UP, -0.125f * PI), FLT_EPSILON); - assertEquals(1f / cos(0.125f * PI), segment1.dist(ONE_DOWN, -0.125f * PI), FLT_EPSILON); - assertEquals(SQRT2, segment1.dist(ZERO, 0.25f * PI), FLT_EPSILON); - assertEquals(SQRT2, segment1.dist(ZERO, -0.25f * PI), FLT_EPSILON); - } - - @Test - public void dist2() { - assertEquals(1f, segment2.dist(ZERO, 0.25f * PI), FLT_EPSILON); - assertEquals(SQRT2, segment2.dist(ZERO, 0f), FLT_EPSILON); - assertEquals(SQRT2, segment2.dist(ZERO, 0.5f * PI), FLT_EPSILON); - assertEquals(1f / cos(0.125f * PI), segment2.dist(ZERO, 0.375f * PI), FLT_EPSILON); - assertEquals(SQRT2, segment2.dist(ZERO, PI / 2f), FLT_EPSILON); - } - - @Test - public void quotient1() { - assertEquals(0.5f, segment1.quotient(ZERO, 0f), FLT_EPSILON); - assertEquals(1f, segment1.quotient(ONE_UP, 0f), FLT_EPSILON); - assertEquals(0f, segment1.quotient(ONE_DOWN, 0f), FLT_EPSILON); - assertEquals(0.5f * tan(0.125f * PI) + 0.5f, segment1.quotient(ZERO, 0.125f * PI), FLT_EPSILON); - assertEquals(0.5f * tan(0.125f * PI) + 1f, segment1.quotient(ONE_UP, 0.125f * PI), FLT_EPSILON); - assertEquals(0.5f * tan(0.125f * PI), segment1.quotient(ONE_DOWN, 0.125f * PI), FLT_EPSILON); - assertEquals(0.5f - 0.5f * tan(0.125f * PI), segment1.quotient(ZERO, -0.125f * PI), FLT_EPSILON); - assertEquals(1f - 0.5f * tan(0.125f * PI), segment1.quotient(ONE_UP, -0.125f * PI), FLT_EPSILON); - assertEquals(-0.5f * tan(0.125f * PI), segment1.quotient(ONE_DOWN, -0.125f * PI), FLT_EPSILON); - assertEquals(1f, segment1.quotient(ZERO, 0.25f * PI), FLT_EPSILON); - assertEquals(0f, segment1.quotient(ZERO, -0.25f * PI), FLT_EPSILON); - } - - @Test - public void quotient2() { - assertEquals(0.5f, segment2.quotient(ZERO, 0.25f * PI), FLT_EPSILON); - assertEquals(0f, segment2.quotient(ZERO, 0f), FLT_EPSILON); - assertEquals(1f, segment2.quotient(ZERO, 0.5f * PI), FLT_EPSILON); - assertEquals(0.5f * SQRT2, segment2.quotient(ZERO, 0.375f * PI), FLT_EPSILON); - assertEquals(1f - 0.5f * SQRT2, segment2.quotient(ZERO, 0.125f * PI), FLT_EPSILON); - } - - @Test - public void project() { - assertEquals(0.5f, segment1.project(ZERO), FLT_EPSILON); - assertEquals(0.5f, segment2.project(ZERO), FLT_EPSILON); - } - - @Test - public void minDistanceSquared1() { - assertEquals(0f, segment1.minDistanceSquared(segment1), ZERO_TOLERANCE); - - assertEquals(0f, segment1.minDistanceSquared(segment2), ZERO_TOLERANCE); - assertEquals(0f, segment2.minDistanceSquared(segment1), ZERO_TOLERANCE); - - assertEquals(1f, segment1.minDistanceSquared(segment3), ZERO_TOLERANCE); - assertEquals(1f, segment3.minDistanceSquared(segment1), ZERO_TOLERANCE); - - assertEquals(sqr(SQRT2 - 1f), segment1.minDistanceSquared(segment4), ZERO_TOLERANCE); - assertEquals(sqr(SQRT2 - 1f), segment4.minDistanceSquared(segment1), ZERO_TOLERANCE); - - assertEquals(0f, segment1.minDistanceSquared(segment5), ZERO_TOLERANCE); - assertEquals(0f, segment5.minDistanceSquared(segment1), ZERO_TOLERANCE); - - assertEquals(0f, segment1.minDistanceSquared(segment6), ZERO_TOLERANCE); - assertEquals(0f, segment6.minDistanceSquared(segment1), ZERO_TOLERANCE); - - assertEquals(0f, segment2.minDistanceSquared(segment2), ZERO_TOLERANCE); - - assertEquals(sqr(2f - SQRT2), segment2.minDistanceSquared(segment3), ZERO_TOLERANCE); - assertEquals(sqr(2f - SQRT2), segment3.minDistanceSquared(segment2), ZERO_TOLERANCE); - - assertEquals(0f, segment2.minDistanceSquared(segment4), ZERO_TOLERANCE); - assertEquals(0f, segment4.minDistanceSquared(segment2), ZERO_TOLERANCE); - - assertEquals(0f, segment2.minDistanceSquared(segment5), ZERO_TOLERANCE); - assertEquals(0f, segment5.minDistanceSquared(segment2), ZERO_TOLERANCE); - - assertEquals(0f, segment2.minDistanceSquared(segment6), ZERO_TOLERANCE); - assertEquals(0f, segment6.minDistanceSquared(segment2), ZERO_TOLERANCE); - - assertEquals(0f, segment3.minDistanceSquared(segment3), ZERO_TOLERANCE); - - assertEquals(sqr(2f - SQRT2), segment3.minDistanceSquared(segment4), ZERO_TOLERANCE); - assertEquals(sqr(2f - SQRT2), segment4.minDistanceSquared(segment3), ZERO_TOLERANCE); - - assertEquals(0f, segment3.minDistanceSquared(segment5), ZERO_TOLERANCE); - assertEquals(0f, segment5.minDistanceSquared(segment3), ZERO_TOLERANCE); - - assertEquals(sqr(2f - SQRT2), segment3.minDistanceSquared(segment6), ZERO_TOLERANCE); - assertEquals(sqr(2f - SQRT2), segment6.minDistanceSquared(segment3), ZERO_TOLERANCE); - - assertEquals(0f, segment4.minDistanceSquared(segment4), ZERO_TOLERANCE); - - assertEquals(0f, segment4.minDistanceSquared(segment5), ZERO_TOLERANCE); - assertEquals(0f, segment5.minDistanceSquared(segment4), ZERO_TOLERANCE); - - assertEquals(0f, segment4.minDistanceSquared(segment6), ZERO_TOLERANCE); - assertEquals(0f, segment6.minDistanceSquared(segment4), ZERO_TOLERANCE); - - assertEquals(0f, segment5.minDistanceSquared(segment5), ZERO_TOLERANCE); - - assertEquals(0f, segment5.minDistanceSquared(segment6), ZERO_TOLERANCE); - assertEquals(0f, segment6.minDistanceSquared(segment5), ZERO_TOLERANCE); - - assertEquals(0f, segment6.minDistanceSquared(segment6), ZERO_TOLERANCE); - } - - @Test - public void minDistanceSquared2() { - final Segment s1 = new Segment(new FloatPoint(0f, 0f), new FloatPoint(2f, 1f)); - for (int i = -20; i <= 40; i++) { - final float x = i * 0.1f; - final Segment s2 = new Segment(new FloatPoint(x, 2f), new FloatPoint(x + 2f, -2f)); - final float dist; - if (i <= -10) - dist = 0.8f * sqr(1f + x); - else if (i <= 15) - dist = 0f; - else - dist = 0.8f * sqr(x - 1.5f); - assertEquals("x = " + x, dist, s1.minDistanceSquared(s2), ZERO_TOLERANCE); - assertEquals("x = " + x, dist, s2.minDistanceSquared(s1), ZERO_TOLERANCE); - } - } - - @Test - public void minDistanceSquared3() { - final Segment s1 = new Segment(new FloatPoint(0f, 0f), new FloatPoint(2f, 1f)); - for (float i = -30; i <= 30; i++) { - final float x = i * 0.1f; - final Segment s2 = new Segment(new FloatPoint(x, 0.5f * x), new FloatPoint(x + 2f, 0.5f * x + 1f)); - final float dist; - if (i <= -20) - dist = 1.25f * sqr(2f + x); - else if (i <= 20) - dist = 0f; - else - dist = 1.25f * sqr(x - 2f); - assertEquals("x = " + x, dist, s1.minDistanceSquared(s2), ZERO_TOLERANCE); - assertEquals("x = " + x, dist, s2.minDistanceSquared(s1), ZERO_TOLERANCE); - } - } - - @Test - public void minDistanceSquared4() { - final Segment s1 = new Segment(new FloatPoint(0f, 0f), new FloatPoint(3f, 1.5f)); - for (float i = -30; i <= 50; i++) { - final float x = i * 0.1f; - final float y = 1f - 0.5f * x; - final Segment s2 = new Segment(new FloatPoint(x, 1f), new FloatPoint(x, 1f)); - final float dist; - if (i <= -5) - dist = sqr(x) + 1f; - else if (i <= 32) - dist = 0.2f * sqr(x - 2f); - else - dist = sqr(x - 3f) + 0.25f; - assertEquals("x = " + x, dist, s1.minDistanceSquared(s2), ZERO_TOLERANCE); - assertEquals("x = " + x, dist, s2.minDistanceSquared(s1), ZERO_TOLERANCE); - } - } -} \ No newline at end of file diff --git a/Projekte/common/src/test/java/pp/util/config/ConfigTest.java b/Projekte/common/src/test/java/pp/util/config/ConfigTest.java deleted file mode 100644 index 99fefbbe..00000000 --- a/Projekte/common/src/test/java/pp/util/config/ConfigTest.java +++ /dev/null @@ -1,101 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util.config; - -import org.junit.Before; -import org.junit.Test; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Properties; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class ConfigTest { - - private TestConfig config; - - @Before - public void setUp() { - config = new TestConfig(); - } - - @Test - public void testReadFromProperties() { - Properties properties = new Properties(); - properties.setProperty("test.string", "hello"); //NON-NLS - properties.setProperty("test.int", "42"); - properties.setProperty("test.boolean", "true"); //NON-NLS - properties.setProperty("test.intArray", "1; 2 ;3;4"); - - config.readFrom(properties); - - assertEquals("hello", config.getTestString()); - assertEquals(42, config.getTestInt()); - assertTrue(config.isTestBoolean()); - assertArrayEquals(new int[]{1, 2, 3, 4}, config.getTestIntArray()); - } - - @Test - public void testReadFromFile() throws IOException { - Properties properties = new Properties(); - properties.setProperty("test.string", "fileTest"); - properties.setProperty("test.int", "24"); - properties.setProperty("test.boolean", "false"); //NON-NLS - properties.setProperty("test.intArray", "10;20;30"); - - File tempFile = File.createTempFile("testConfig", ".properties"); - try (FileWriter writer = new FileWriter(tempFile)) { - properties.store(writer, null); - } - - config.readFrom(tempFile); - - assertEquals("fileTest", config.getTestString()); - assertEquals(24, config.getTestInt()); - assertFalse(config.isTestBoolean()); - assertArrayEquals(new int[]{10, 20, 30}, config.getTestIntArray()); - - // Clean up - tempFile.delete(); - } - - @Test - public void testConvertToType() { - assertEquals(42, config.convertToType("42", int.class)); - assertEquals(true, config.convertToType("true", boolean.class)); //NON-NLS - assertEquals(3.14, config.convertToType("3.14", double.class)); - } - - @Test(expected = IllegalArgumentException.class) - public void testConvertToTypeWithUnsupportedType() { - config.convertToType("unsupported", Object.class); //NON-NLS - } - - @Test - public void testToString() { - Properties properties = new Properties(); - properties.setProperty("test.string", "stringValue"); - properties.setProperty("test.int", "123"); - properties.setProperty("test.boolean", "true"); //NON-NLS - properties.setProperty("test.intArray", "5;6;7"); - - config.readFrom(properties); - - String expected = "[\ntest.boolean -> testBoolean = true,\n" + - "test.int -> testInt = 123,\n" + - "test.intArray -> testIntArray = {5, 6, 7},\n" + - "test.string -> testString = stringValue\n" + - "]"; - assertEquals(expected, config.toString()); - } -} diff --git a/Projekte/common/src/test/java/pp/util/config/TestConfig.java b/Projekte/common/src/test/java/pp/util/config/TestConfig.java deleted file mode 100644 index 0ede0bda..00000000 --- a/Projekte/common/src/test/java/pp/util/config/TestConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.util.config; - -class TestConfig extends Config { - @Property("test.string") - private String testString; - - @Property("test.int") - private int testInt; - - @Property("test.boolean") - private boolean testBoolean; - - @Property("test.intArray") - @Separator(";") - private int[] testIntArray; - - // Getters for testing - public String getTestString() { - return testString; - } - - public int getTestInt() { - return testInt; - } - - public boolean isTestBoolean() { - return testBoolean; - } - - public int[] getTestIntArray() { - return testIntArray; - } -} diff --git a/Projekte/jme-common/build.gradle b/Projekte/jme-common/build.gradle deleted file mode 100644 index b04d9455..00000000 --- a/Projekte/jme-common/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - id 'buildlogic.java-library-conventions' -} - -description = 'Common classes used in jME applications' - -dependencies { - implementation libs.jme3.core - api libs.lemur - api project(':common') - - runtimeOnly libs.groovy.jsr223 - runtimeOnly libs.slf4j.nop -} diff --git a/Projekte/jme-common/src/main/java/pp/dialog/Dialog.java b/Projekte/jme-common/src/main/java/pp/dialog/Dialog.java deleted file mode 100644 index 188952af..00000000 --- a/Projekte/jme-common/src/main/java/pp/dialog/Dialog.java +++ /dev/null @@ -1,102 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.dialog; - -import com.simsilica.lemur.Container; - -/** - * Represents a dialog within a dialog manager system. - * Extends the Container class from the Lemur GUI library. - */ -public class Dialog extends Container { - /** - * The depth of the dialog within the dialog stack. - * Dialogs with lower depth values are considered to be "on top" of dialogs with higher values. - */ - protected final int depth; - - /** - * The manager responsible for handling this dialog. - */ - protected final DialogManager manager; - - /** - * Constructs a new Dialog with a depth automatically assigned by the DialogManager. - * - * @param manager The DialogManager that manages this dialog. - */ - public Dialog(DialogManager manager) { - this(manager, manager.nextDepth()); - } - - /** - * Constructs a new Dialog with the specified depth. - * - * @param manager The DialogManager that manages this dialog. - * @param depth The depth of this dialog within the dialog stack. - * @throws IllegalArgumentException if the specified depth is invalid (i.e., it is not greater than the depth of the top dialog in the manager's stack). - */ - public Dialog(DialogManager manager, int depth) { - this.manager = manager; - this.depth = depth; - // Ensure the dialog depth is greater than the depth of the current top dialog in the stack - if (!manager.getDialogStack().isEmpty() && manager.getDialogStack().getLast().depth >= depth) - throw new IllegalArgumentException("Invalid dialog depth " + depth); - } - - /** - * Checks if this dialog is the topmost dialog in the dialog stack. - * - * @return true if this dialog is the topmost dialog, false otherwise. - */ - public boolean isTopDialog() { - return manager.isTop(this); - } - - /** - * Runs the specified runnable if this dialog is the topmost dialog in the dialog stack. - * - * @param runnable the runnable. - * @see Dialog#isTopDialog() - */ - public void ifTopDialog(Runnable runnable) { - if (isTopDialog()) runnable.run(); - } - - /** - * Opens this dialog, centers it, and notifies the DialogManager to manage it. - */ - public void open() { - manager.centering(this, depth); - manager.open(this); - } - - /** - * Closes this dialog and notifies the DialogManager to stop managing it. - */ - public void close() { - manager.close(this); - } - - /** - * This method is called whenever the {@linkplain pp.dialog.DialogManager} would - * like to update this dialog. - */ - public void update() { /* empty */ } - - /** - * This method is called by {@linkplain DialogManager#update(float)} for periodically - * updating this dialog. The default implementation does nothing. - */ - public void update(float delta) { /* empty */ } - - /** - * This method calls the escape action if this dialog is the top dialog. - */ - public void escape() { /* empty */ } -} diff --git a/Projekte/jme-common/src/main/java/pp/dialog/DialogBuilder.java b/Projekte/jme-common/src/main/java/pp/dialog/DialogBuilder.java deleted file mode 100644 index 33228bc3..00000000 --- a/Projekte/jme-common/src/main/java/pp/dialog/DialogBuilder.java +++ /dev/null @@ -1,319 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.dialog; - -import com.jme3.scene.Spatial; -import com.simsilica.lemur.Button; -import com.simsilica.lemur.Container; -import com.simsilica.lemur.Label; -import com.simsilica.lemur.component.BorderLayout; -import com.simsilica.lemur.style.ElementId; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -import static com.simsilica.lemur.component.BorderLayout.Position.East; -import static com.simsilica.lemur.component.BorderLayout.Position.West; - -/** - * A builder class for creating and customizing dialog boxes of type {@link SimpleDialog} or its subclasses. - * This builder pattern facilitates the construction of dialog boxes with various configurations, - * such as titles, text content, buttons, and additional custom behaviors. - * - * @param the type of dialog to be built, typically extending {@link SimpleDialog} - */ -public class DialogBuilder { - - /** - * Creates a {@link DialogBuilder} for a simple dialog with default settings. - * - * @param manager the dialog manager responsible for managing the dialog's lifecycle - * @return a {@link DialogBuilder} instance for creating simple dialogs - */ - public static DialogBuilder simple(DialogManager manager) { - return new DialogBuilder<>(manager, SimpleDialog::new); - } - - protected final DialogManager manager; - private final Function dialogFactory; - private final List> extensionList = new ArrayList<>(); - private String title; - private String text; - private String okLabel; - private String noLabel; - private Consumer okAction = d -> {}; - private Consumer noAction = d -> {}; - private boolean okClose = true; - private boolean noClose = true; - private Function focus; - - /** - * Constructs a dialog builder with the specified dialog manager and dialog factory. - * - * @param manager the dialog manager responsible for managing the dialog's lifecycle - * @param dialogFactory a factory function to create instances of the dialog - */ - public DialogBuilder(DialogManager manager, Function dialogFactory) { - this.manager = manager; - this.dialogFactory = dialogFactory; - } - - /** - * Applies all registered extensions to the given dialog. - * Extensions allow for additional customizations beyond the standard configurations. - * - * @param dialog the dialog object to which the extensions will be applied - * @see #setExtension(java.util.function.Consumer) - */ - protected void extendDialog(D dialog) { - for (Consumer extension : extensionList) - extension.accept(dialog); - } - - /** - * Builds and returns the dialog with the specified configurations. - * This method creates a new dialog object and applies all the configured settings. - * - * @return the fully configured dialog object - */ - public D build() { - return build(dialogFactory.apply(manager)); - } - - /** - * Builds the dialog by configuring an existing dialog object with the specified settings. - * This method allows for further customization of a pre-existing dialog object. - * - * @param dialog the dialog object to configure - * @return the configured dialog object for chaining - */ - public D build(D dialog) { - configureTitle(dialog); - configureText(dialog); - extendDialog(dialog); - configureButtons(dialog); - configureFocus(dialog); - - return dialog; - } - - /** - * Configures the title of the dialog if a title has been set. - * - * @param dialog the dialog to which the title will be added - */ - private void configureTitle(D dialog) { - if (title != null) - dialog.addChild(new Label(title, new ElementId("header"))); // NON-NLS - } - - /** - * Configures the main text content of the dialog if text has been set. - * - * @param dialog the dialog to which the text content will be added - */ - private void configureText(D dialog) { - if (text != null) - dialog.addChild(new Label(text)); - } - - /** - * Configures the OK and NO buttons for the dialog if labels for them have been set. - * - * @param dialog the dialog to which the buttons will be added - */ - private void configureButtons(D dialog) { - if (okLabel != null || noLabel != null) { - final Container buttons = dialog.addChild(new Container(new BorderLayout())); - if (okLabel != null) { - final Button okButton = buttons.addChild(new Button(okLabel), West); - dialog.setOkButton(okButton); - configureButton(okButton, okAction, okClose, dialog); - } - if (noLabel != null) { - final Button noButton = buttons.addChild(new Button(noLabel), East); - configureButton(noButton, noAction, noClose, dialog); - } - } - } - - /** - * Configures a button with its action and whether the dialog should close after the action is performed. - * - * @param button the button to configure - * @param action the action to perform when the button is clicked - * @param close whether the dialog should close after the action is performed - * @param dialog the dialog that contains the button - */ - private void configureButton(Button button, Consumer action, boolean close, D dialog) { - button.addClickCommands(s -> { - if (dialog.isTopDialog()) { - action.accept(dialog); - if (close) { - dialog.close(); - } - } - }); - } - - /** - * Configures the initial focus for the dialog when it is displayed. - * The focus will be set to either a specified component or the OK button if available. - * - * @param dialog the dialog to configure focus for - */ - private void configureFocus(D dialog) { - final Spatial focusComponent = focus == null ? null : focus.apply(dialog); - if (focusComponent != null || dialog.getOkButton() != null) - manager.setFocus(focusComponent != null ? focusComponent : dialog.getOkButton()); - } - - /** - * Sets the title of the dialog. - * - * @param title the title text to be displayed at the top of the dialog - * @return this builder instance for chaining - */ - public DialogBuilder setTitle(String title) { - this.title = title; - return this; - } - - /** - * Sets the main text content of the dialog. - * - * @param text the main content text to be displayed in the dialog - * @return this builder instance for chaining - */ - public DialogBuilder setText(String text) { - this.text = text; - return this; - } - - /** - * Sets the label for the OK button. - * - * @param okLabel the text label to display on the OK button - * @return this builder instance for chaining - */ - public DialogBuilder setOkButton(String okLabel) { - this.okLabel = okLabel; - return this; - } - - /** - * Sets the label and action for the OK button. - * When the OK button is clicked, the specified action will be executed. - * - * @param okLabel the text label to display on the OK button - * @param okAction the action to perform when the OK button is clicked - * @return this builder instance for chaining - */ - public DialogBuilder setOkButton(String okLabel, Consumer okAction) { - this.okAction = okAction; - return setOkButton(okLabel); - } - - /** - * Sets the label and action for the OK button. - * When the OK button is clicked, the specified runnable action will be executed. - * - * @param okLabel the text label to display on the OK button - * @param okAction the runnable action to perform when the OK button is clicked - * @return this builder instance for chaining - */ - public DialogBuilder setOkButton(String okLabel, Runnable okAction) { - this.okAction = d -> okAction.run(); - return setOkButton(okLabel); - } - - /** - * Sets the label for the NO button. - * - * @param noLabel the text label to display on the NO button - * @return this builder instance for chaining - */ - public DialogBuilder setNoButton(String noLabel) { - this.noLabel = noLabel; - return this; - } - - /** - * Sets the label and action for the NO button. - * When the NO button is clicked, the specified action will be executed. - * - * @param noLabel the text label to display on the NO button - * @param noAction the action to perform when the NO button is clicked - * @return this builder instance for chaining - */ - public DialogBuilder setNoButton(String noLabel, Consumer noAction) { - this.noAction = noAction; - return setNoButton(noLabel); - } - - /** - * Sets the label and action for the NO button. - * When the NO button is clicked, the specified runnable action will be executed. - * - * @param noLabel the text label to display on the NO button - * @param noAction the runnable action to perform when the NO button is clicked - * @return this builder instance for chaining - */ - public DialogBuilder setNoButton(String noLabel, Runnable noAction) { - this.noAction = d -> noAction.run(); - return setNoButton(noLabel); - } - - /** - * Sets whether the dialog should automatically close when the OK button is clicked. - * - * @param okClose true to close the dialog when the OK button is clicked, false otherwise - * @return this builder instance for chaining - */ - public DialogBuilder setOkClose(boolean okClose) { - this.okClose = okClose; - return this; - } - - /** - * Sets whether the dialog should automatically close when the NO button is clicked. - * - * @param noClose true to close the dialog when the NO button is clicked, false otherwise - * @return this builder instance for chaining - */ - public DialogBuilder setNoClose(boolean noClose) { - this.noClose = noClose; - return this; - } - - /** - * Sets the component that should initially receive focus when the dialog is displayed. - * If a focus function is not provided, the focus defaults to the OK button. - * - * @param focus a function specifying which component of the dialog should receive focus - * @return this builder instance for chaining - */ - public DialogBuilder setFocus(Function focus) { - this.focus = focus; - return this; - } - - /** - * Adds an extension to the dialog. - * Extensions allow for additional customizations and behaviors beyond the basic configuration. - * - * @param extender a consumer that applies the extension to the dialog - * @return this builder instance for chaining - */ - public DialogBuilder setExtension(Consumer extender) { - extensionList.add(extender); - return this; - } -} diff --git a/Projekte/jme-common/src/main/java/pp/dialog/DialogManager.java b/Projekte/jme-common/src/main/java/pp/dialog/DialogManager.java deleted file mode 100644 index ca0069e9..00000000 --- a/Projekte/jme-common/src/main/java/pp/dialog/DialogManager.java +++ /dev/null @@ -1,157 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.dialog; - -import com.jme3.app.SimpleApplication; -import com.jme3.math.Vector3f; -import com.jme3.scene.Spatial; -import com.jme3.system.AppSettings; -import com.simsilica.lemur.Panel; -import com.simsilica.lemur.focus.FocusManagerState; - -import java.util.ArrayDeque; -import java.util.Deque; - -import static java.lang.Math.max; - -/** - * Manages dialog boxes within the application, handling their display, positioning, and focus. - */ -public class DialogManager { - /** - * The application instance. - */ - private final SimpleApplication app; - - /** - * A stack to keep track of the dialogs. - */ - private final Deque

dialogStack = new ArrayDeque<>(); - - /** - * Constructs a DialogManager for the specified application. - * - * @param app the SimpleApplication instance - */ - public DialogManager(SimpleApplication app) { - this.app = app; - } - - /** - * Checks if any dialog is currently displayed. - * - * @return true if any dialog is currently shown, false otherwise - */ - public boolean showsDialog() { - return !dialogStack.isEmpty(); - } - - /** - * Retrieves the stack of dialogs. - * - * @return the dialog stack - */ - public Deque getDialogStack() { - return dialogStack; - } - - /** - * Calculates the depth for the next dialog to be displayed. - * - * @return the next depth value - */ - public int nextDepth() { - return dialogStack.isEmpty() ? 10 : dialogStack.peek().depth + 10; - } - - /** - * Positions the specified panel in the center of the screen, with a specified z coordinate. - * - * @param panel the panel to center - * @param z the z coordinate - */ - public void centering(Panel panel, float z) { - final Vector3f size = panel.getPreferredSize(); - centering(panel, size.getX(), size.getY(), z); - } - - /** - * Positions the specified spatial in the center of the screen, with specified width, height, and z coordinate. - * - * @param spatial the spatial to center - * @param width the width reserved for the spatial - * @param height the height reserved for the spatial - * @param z the z coordinate - */ - public void centering(Spatial spatial, float width, float height, float z) { - final AppSettings settings = app.getContext().getSettings(); - spatial.setLocalTranslation(max(0f, 0.5f * (settings.getWidth() - width)), - max(0f, 0.5f * (settings.getHeight() + height)), - z); - } - - /** - * Arranges for the specified spatial to receive the focus. - * - * @param spatial the spatial to focus - */ - public void setFocus(Spatial spatial) { - final var focusManager = app.getStateManager().getState(FocusManagerState.class); - if (focusManager != null) - focusManager.setFocus(spatial); - } - - /** - * Opens the specified dialog and adds it to the dialog stack. - * - * @param dialog the dialog to open - */ - void open(Dialog dialog) { - dialogStack.push(dialog); - dialog.update(); - app.getGuiNode().attachChild(dialog); - } - - /** - * Checks if the specified dialog is the topmost dialog in the dialog stack. - * - * @param dialog a dialog. - * @return true if the dialog is the top dialog, false otherwise. - */ - boolean isTop(Dialog dialog) { - return !dialogStack.isEmpty() && dialogStack.peek() == dialog; - } - - /** - * Closes the specified dialog, removing it from the dialog stack. - * - * @param dialog the dialog to close - * @throws IllegalArgumentException if the specified dialog is not the top dialog - */ - void close(Dialog dialog) { - if (!isTop(dialog)) - throw new IllegalArgumentException(dialog + " is not the top dialog"); - dialogStack.pop(); - if (!dialogStack.isEmpty()) - dialogStack.peek().update(); - app.getGuiNode().detachChild(dialog); - } - - /** - * Calls the escape action of the top dialog, if a dialog is shown. - */ - public void escape() { - if (dialogStack.isEmpty()) return; - dialogStack.peek().escape(); - } - - public void update(float delta) { - for (Dialog dialog : dialogStack) - dialog.update(delta); - } -} diff --git a/Projekte/jme-common/src/main/java/pp/dialog/SimpleDialog.java b/Projekte/jme-common/src/main/java/pp/dialog/SimpleDialog.java deleted file mode 100644 index 8dd3be37..00000000 --- a/Projekte/jme-common/src/main/java/pp/dialog/SimpleDialog.java +++ /dev/null @@ -1,64 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.dialog; - -import com.simsilica.lemur.Button; - -/** - * Represents a simple dialog with OK and Cancel buttons. - * It extends the Dialog class and provides methods to get and set these buttons. - */ -public class SimpleDialog extends Dialog { - private Button okButton; - private Button cancelButton; - - /** - * Constructs a SimpleDialog with the specified DialogManager. - * - * @param manager the DialogManager to manage this dialog - */ - public SimpleDialog(DialogManager manager) { - super(manager); - } - - /** - * Returns the OK button of this dialog. - * - * @return the OK button - */ - public Button getOkButton() { - return okButton; - } - - /** - * Sets the OK button of this dialog. - * - * @param okButton the OK button to set - */ - void setOkButton(Button okButton) { - this.okButton = okButton; - } - - /** - * Returns the Cancel button of this dialog. - * - * @return the Cancel button - */ - public Button getCancelButton() { - return cancelButton; - } - - /** - * Sets the Cancel button of this dialog. - * - * @param cancelButton the Cancel button to set - */ - void setCancelButton(Button cancelButton) { - this.cancelButton = cancelButton; - } -} diff --git a/Projekte/jme-common/src/main/java/pp/dialog/StateCheckboxModel.java b/Projekte/jme-common/src/main/java/pp/dialog/StateCheckboxModel.java deleted file mode 100644 index 7cee7ddf..00000000 --- a/Projekte/jme-common/src/main/java/pp/dialog/StateCheckboxModel.java +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.dialog; - -import com.jme3.app.Application; -import com.jme3.app.state.AppState; -import com.simsilica.lemur.DefaultCheckboxModel; - -/** - * A checkbox model for enabling and disabling app states. - * This model links a checkbox with an AppState, so that checking - * or unchecking the box enables or disables the state, respectively. - */ -public class StateCheckboxModel extends DefaultCheckboxModel { - private final AppState state; - - /** - * Constructs a StateCheckboxModel for the specified app state class. - * - * @param app the application containing the state manager - * @param stateClass the class of the app state to be controlled - */ - public StateCheckboxModel(Application app, Class stateClass) { - this(app.getStateManager().getState(stateClass)); - } - - /** - * Constructs a StateCheckboxModel for the specified app state. - * - * @param state the app state to be controlled - */ - public StateCheckboxModel(AppState state) { - this.state = state; - setChecked(state.isEnabled()); - } - - /** - * Sets the checked state of the checkbox and enables or disables - * the associated app state accordingly. - * - * @param checked true to check the box and enable the state, false to uncheck the box and disable the state - */ - @Override - public void setChecked(boolean checked) { - super.setChecked(checked); - state.setEnabled(checked); - } -} diff --git a/Projekte/jme-common/src/main/java/pp/dialog/TextInputDialog.java b/Projekte/jme-common/src/main/java/pp/dialog/TextInputDialog.java deleted file mode 100644 index bed26dcb..00000000 --- a/Projekte/jme-common/src/main/java/pp/dialog/TextInputDialog.java +++ /dev/null @@ -1,132 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.dialog; - -import com.jme3.input.KeyInput; -import com.simsilica.lemur.Container; -import com.simsilica.lemur.Label; -import com.simsilica.lemur.TextField; -import com.simsilica.lemur.component.SpringGridLayout; -import com.simsilica.lemur.event.KeyAction; - -/** - * A dialog class that asks for text input. Usually, this is a single-line - * text input. - * - * @see #getInput() - */ -public class TextInputDialog extends SimpleDialog { - // TextField for user input - private final TextField input = new TextField(""); - - /** - * Constructs a TextInputDialog associated with the specified dialog manager. - * - * @param manager the dialog manager to associate the dialog with - */ - private TextInputDialog(DialogManager manager) { - super(manager); - input.setSingleLine(true); // Set the input field to be single-line - input.setPreferredWidth(500f); // Set preferred width of the input field - } - - /** - * Returns the input field. - * - * @return the input field - */ - public TextField getInput() { - return input; - } - - /** - * Maps the specified key action to trigger a click on the OK button. - * - * @param action the key action to map - */ - private void clickOkOn(KeyAction action) { - input.getActionMap().put(action, (c, k) -> { - if (getOkButton() != null) - getOkButton().click(); - }); - } - - /** - * Creates a builder for TextInputDialog. - * - * @param manager the dialog manager to associate the dialog with - * @return a TextInputDialogBuilder instance - */ - public static TextInputDialogBuilder builder(DialogManager manager) { - return new TextInputDialogBuilder(manager); - } - - /** - * A builder class for creating TextInputDialog instances. - */ - public static class TextInputDialogBuilder extends DialogBuilder { - private String label; - private boolean returnHitsOK = true; - - /** - * Constructs a TextInputDialogBuilder with the specified dialog manager. - * - * @param manager the dialog manager to associate the dialog with - */ - private TextInputDialogBuilder(DialogManager manager) { - super(manager, TextInputDialog::new); - } - - /** - * Extends the dialog with additional components like a label and input field. - * - * @param dialog the dialog to be extended - */ - @Override - protected void extendDialog(TextInputDialog dialog) { - final TextField textField = dialog.getInput(); - if (label == null) { - dialog.addChild(textField); - } - else { - final Container c = dialog.addChild(new Container(new SpringGridLayout())); - c.addChild(new Label(label)); - c.addChild(textField, 1); - } - if (returnHitsOK) { - // move the caret right so that it becomes visible at the end of a long text - textField.getDocumentModel().right(); - // Hitting a return key is like pushing the ok button - dialog.clickOkOn(new KeyAction(KeyInput.KEY_RETURN)); - dialog.clickOkOn(new KeyAction(KeyInput.KEY_NUMPADENTER)); - } - } - - /** - * Sets the label for the input field. - * - * @param label the label text - * @return this builder instance for chaining - */ - public TextInputDialogBuilder setLabel(String label) { - this.label = label; - return this; - } - - /** - * Sets whether hitting the return key triggers the OK button. - * - * @param returnHitsOK true to trigger OK button on return key, false otherwise - * @return this builder instance for chaining - */ - public TextInputDialogBuilder setReturnHitsOK(boolean returnHitsOK) { - this.returnHitsOK = returnHitsOK; - return this; - } - } -} diff --git a/Projekte/jme-common/src/main/java/pp/graphics/Draw.java b/Projekte/jme-common/src/main/java/pp/graphics/Draw.java deleted file mode 100644 index 52b017e0..00000000 --- a/Projekte/jme-common/src/main/java/pp/graphics/Draw.java +++ /dev/null @@ -1,229 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.graphics; - -import com.jme3.asset.AssetManager; -import com.jme3.material.Material; -import com.jme3.material.RenderState; -import com.jme3.material.RenderState.BlendMode; -import com.jme3.math.ColorRGBA; -import com.jme3.math.Vector3f; -import com.jme3.scene.Geometry; -import com.jme3.scene.Mesh; -import com.jme3.scene.VertexBuffer; -import com.jme3.scene.shape.Quad; -import pp.util.Position; -import pp.util.SegmentLike; - -import java.lang.System.Logger; -import java.lang.System.Logger.Level; -import java.util.HashMap; -import java.util.Map; - -import static pp.util.FloatMath.FLT_EPSILON; -import static pp.util.FloatMath.TWO_PI; -import static pp.util.FloatMath.cos; -import static pp.util.FloatMath.sin; -import static pp.util.FloatMath.sqr; -import static pp.util.FloatMath.sqrt; - -/** - * Class for creating graphical primitives. - */ -public class Draw { - private static final Logger LOGGER = System.getLogger(Draw.class.getName()); - private static final int NUM = 10; - private static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; //NON-NLS - private static final String COLOR = "Color"; //NON-NLS - private final AssetManager am; - private final Map lineMap = new HashMap<>(); - private final Map rectangleMap = new HashMap<>(); - private final Map circleMap = new HashMap<>(); - private Mesh lineMesh; - private Mesh circleMesh; - - /** - * Creates an in stance of the Draw class with the specified - * asset manager. - * - * @param assetManager the specified asset manager - */ - public Draw(AssetManager assetManager) { - am = assetManager; - } - - private Geometry makeLine(ColorRGBA color) { - LOGGER.log(Level.DEBUG, "create line with color {0}", color); //NON-NLS - if (lineMesh == null) { - lineMesh = new Mesh(); - lineMesh.setMode(Mesh.Mode.Lines); - lineMesh.setBuffer(VertexBuffer.Type.Position, 3, new float[]{0, 0, 0, 0, 1, 0}); - lineMesh.setBuffer(VertexBuffer.Type.Index, 2, new short[]{0, 1}); - } - final Geometry lineGeom = new Geometry("lineMesh", lineMesh.clone()); - Material matWireframe = new Material(am, UNSHADED); //NON-NLS - matWireframe.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); - matWireframe.setColor(COLOR, color); //NON-NLS - lineGeom.setMaterial(matWireframe); - - return lineGeom; - } - - /** - * Creates a line for the specified segment. - * - * @param segment the segment with its start and end point - * @param z depth information - * @param color line color - */ - public Geometry makeLine(SegmentLike segment, float z, ColorRGBA color) { - return makeLine(segment.from(), segment.to(), z, color); - } - - /** - * Creates a straight line between the specified points with the specified color. - * - * @param p1 start point - * @param p2 end point - * @param z depth information - * @param color line color - */ - public Geometry makeLine(Position p1, Position p2, float z, ColorRGBA color) { - return makeLine(p1.getX(), p1.getY(), p2.getX(), p2.getY(), z, color); - } - - /** - * Creates a straight line between the specified points with the specified color. - * - * @param x1 x-coordinate of the start point - * @param y1 y-coordinate of the start point - * @param x2 x-coordinate of the end point - * @param y2 y-coordinate of the end point - * @param z depth information - * @param color line color - */ - public Geometry makeLine(float x1, float y1, float x2, float y2, float z, ColorRGBA color) { - final Geometry line = lineMap.computeIfAbsent(color, this::makeLine).clone(); - line.lookAt(Vector3f.UNIT_Z, new Vector3f(x2 - x1, y2 - y1, 0)); - line.setLocalScale(sqrt(sqr(x2 - x1) + sqr(y2 - y1))); - line.setLocalTranslation(x1, y1, z); - return line; - } - - /** - * Creates a straight line between the specified points with the specified width and color. - * - * @param p1 start point - * @param p2 end point - * @param z depth information - * @param color line color - * @param width width of the line - */ - public Geometry makeFatLine(Position p1, Position p2, float z, ColorRGBA color, float width) { - return makeFatLine(p1.getX(), p1.getY(), p2.getX(), p2.getY(), z, color, width); - } - - /** - * Creates a straight line between the specified points with the specified width and color. - * - * @param x1 x-coordinate of the start point - * @param y1 y-coordinate of the start point - * @param x2 x-coordinate of the end point - * @param y2 y-coordinate of the end point - * @param z depth information - * @param color line color - * @param width width of the line - */ - public Geometry makeFatLine(float x1, float y1, float x2, float y2, float z, ColorRGBA color, float width) { - final Geometry line = rectangleMap.computeIfAbsent(color, this::makeRectangle).clone(); - final float dx = x2 - x1; - final float dy = y2 - y1; - final float len = sqrt(dx * dx + dy * dy); - line.setLocalScale(width, len + width, 1f); - if (len <= FLT_EPSILON) - line.setLocalTranslation(x1 - 0.5f * width, y1 - 0.5f * width, z); - else { - final float f = 0.5f * width / len; - line.setLocalTranslation(x1 - f * (dy + dx), y1 - f * (dy - dx), z); - line.getLocalRotation().lookAt(Vector3f.UNIT_Z, new Vector3f(dx, dy, 0f)); - } - return line; - } - - private Geometry makeRectangle(ColorRGBA color) { - final Mesh quad = new Quad(1f, 1f); - final Geometry rectangle = new Geometry("quad", quad); //NON-NLS - Material mat = new Material(am, UNSHADED); //NON-NLS - mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - mat.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); - mat.setColor(COLOR, color); //NON-NLS - rectangle.setMaterial(mat); - return rectangle; - } - - /** - * Creates an axis-parallel rectangle with the specified color. - * - * @param x x-coordinate of the bottom-left corner - * @param y y-coordinate of the bottom-left corner - * @param w width of the rectangle - * @param h height of the rectangle - * @param z depth information - * @param color line color - */ - public Geometry makeRectangle(float x, float y, float z, float w, float h, ColorRGBA color) { - final Geometry rectangle = rectangleMap.computeIfAbsent(color, this::makeRectangle).clone(); - rectangle.setLocalScale(w, h, 1f); - rectangle.setLocalTranslation(x, y, z); - return rectangle; - } - - private Geometry makeCircle(ColorRGBA color) { - if (circleMesh == null) { - circleMesh = new Mesh(); - circleMesh.setMode(Mesh.Mode.LineLoop); - final float[] pointBuffer = new float[3 * NUM]; - final short[] indexBuffer = new short[NUM]; - int j = 0; - for (short i = 0; i < NUM; i++) { - final float a = TWO_PI / NUM * i; - pointBuffer[j++] = 0.5f * cos(a); - pointBuffer[j++] = 0.5f * sin(a); - pointBuffer[j++] = 0f; - indexBuffer[i] = i; - } - circleMesh.setBuffer(VertexBuffer.Type.Position, 3, pointBuffer); - circleMesh.setBuffer(VertexBuffer.Type.Index, 2, indexBuffer); - } - - final Geometry circle = new Geometry("circleMesh", circleMesh.clone()); - Material matWireframe = new Material(am, UNSHADED); //NON-NLS - matWireframe.getAdditionalRenderState().setFaceCullMode(RenderState.FaceCullMode.Off); - matWireframe.setColor(COLOR, color); //NON-NLS - circle.setMaterial(matWireframe); - - return circle; - } - - /** - * Creates an ellipse with the specified color. - * - * @param x x-coordinate of the center point - * @param y y-coordinate of the center point - * @param w width of the ellipse - * @param h height of the ellipse - * @param z depth information - * @param color line color - */ - public Geometry makeEllipse(float x, float y, float z, float w, float h, ColorRGBA color) { - final Geometry ellipse = circleMap.computeIfAbsent(color, this::makeCircle).clone(); - ellipse.setLocalScale(w, h, 1f); - ellipse.setLocalTranslation(x, y, z); - return ellipse; - } -} diff --git a/Projekte/jme-common/src/main/java/pp/view/ModelViewSynchronizer.java b/Projekte/jme-common/src/main/java/pp/view/ModelViewSynchronizer.java deleted file mode 100644 index 02538ce8..00000000 --- a/Projekte/jme-common/src/main/java/pp/view/ModelViewSynchronizer.java +++ /dev/null @@ -1,90 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.view; - -import com.jme3.scene.Node; -import com.jme3.scene.Spatial; - -import java.lang.System.Logger; -import java.lang.System.Logger.Level; -import java.util.HashMap; -import java.util.Map; - -/** - * Abstract base class for keeping the scene graph (=view) in sync with the model. - */ -public abstract class ModelViewSynchronizer { - private static final Logger LOGGER = System.getLogger(ModelViewSynchronizer.class.getName()); - private final Node itemNode = new Node("items"); //NON-NLS - private final Map itemMap = new HashMap<>(); - - /** - * Saves the game state and the node. - * - * @param root particular node - */ - protected ModelViewSynchronizer(Node root) { - root.attachChild(itemNode); - } - - /** - * Returns the spatial representing the specified item, - * or null if the item has no view counterpart. - */ - public Spatial getSpatial(I item) { - return itemMap.get(item); - } - - /** - * removes spatial from map - * - * @param item spatial that should be removed - */ - public void delete(I item) { - final Spatial spatial = itemMap.remove(item); - if (spatial != null) { - spatial.removeFromParent(); - LOGGER.log(Level.DEBUG, "removed spatial for {0} in {1}", item, this); //NON-NLS - } - } - - /** - * add spatial to map - * - * @param item spatial that schuld be added - */ - public void add(I item) { - if (itemMap.containsKey(item)) { - LOGGER.log(Level.WARNING, "Item {0} already managed by {1}", item, this); //NON-NLS - return; - } - final Spatial spatial = translate(item); - itemMap.put(item, spatial); - LOGGER.log(Level.DEBUG, "added spatial for {0} in {1}", item, this); //NON-NLS - if (spatial != null) - itemNode.attachChild(spatial); - } - - /** - * Removed every item - */ - public void clear() { - LOGGER.log(Level.DEBUG, "clear"); //NON-NLS - itemMap.clear(); - itemNode.detachAllChildren(); - } - - /** - * Creates the spatial for the specified item. Implementations may decide to return null. This - * means that the item shall not be represented in the scene graph. - * - * @param item the item whose representing spatial is asked for - * @return the spatial of the item, or null if the item shall not be represented by a spatial. - */ - protected abstract Spatial translate(I item); -} diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-32.fnt b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-32.fnt deleted file mode 100644 index 85f5d76c..00000000 --- a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-32.fnt +++ /dev/null @@ -1,524 +0,0 @@ -info face="Metropolis Bold" size=32 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 -common lineHeight=33 base=26 scaleW=512 scaleH=512 pages=1 packed=0 -page id=0 file="Metropolis-Bold-32.png" -chars count=170 -char id=0 x=0 y=0 width=14 height=35 xoffset=1 yoffset=-1 xadvance=16 page=0 chnl=0 -char id=10 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 -char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 -char id=33 x=359 y=117 width=9 height=24 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 -char id=34 x=44 y=165 width=16 height=12 xoffset=0 yoffset=3 xadvance=17 page=0 chnl=0 -char id=35 x=422 y=117 width=23 height=24 xoffset=-1 yoffset=3 xadvance=22 page=0 chnl=0 -char id=36 x=281 y=35 width=22 height=29 xoffset=-1 yoffset=1 xadvance=20 page=0 chnl=0 -char id=37 x=395 y=117 width=27 height=24 xoffset=0 yoffset=3 xadvance=27 page=0 chnl=0 -char id=38 x=280 y=66 width=23 height=25 xoffset=-1 yoffset=3 xadvance=22 page=0 chnl=0 -char id=39 x=503 y=141 width=8 height=12 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 -char id=40 x=48 y=35 width=13 height=30 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 -char id=41 x=61 y=35 width=12 height=30 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 -char id=42 x=490 y=141 width=13 height=16 xoffset=0 yoffset=1 xadvance=13 page=0 chnl=0 -char id=43 x=471 y=141 width=19 height=18 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=0 -char id=44 x=16 y=165 width=9 height=13 xoffset=0 yoffset=19 xadvance=9 page=0 chnl=0 -char id=45 x=142 y=165 width=12 height=6 xoffset=0 yoffset=14 xadvance=12 page=0 chnl=0 -char id=46 x=85 y=165 width=9 height=8 xoffset=0 yoffset=19 xadvance=9 page=0 chnl=0 -char id=47 x=243 y=35 width=19 height=29 xoffset=-2 yoffset=1 xadvance=15 page=0 chnl=0 -char id=48 x=336 y=117 width=23 height=24 xoffset=0 yoffset=3 xadvance=23 page=0 chnl=0 -char id=49 x=201 y=117 width=13 height=24 xoffset=-1 yoffset=3 xadvance=13 page=0 chnl=0 -char id=50 x=214 y=117 width=19 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=51 x=239 y=66 width=21 height=25 xoffset=-1 yoffset=3 xadvance=19 page=0 chnl=0 -char id=52 x=233 y=117 width=22 height=24 xoffset=-1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=53 x=260 y=66 width=20 height=25 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=54 x=255 y=117 width=21 height=24 xoffset=0 yoffset=3 xadvance=21 page=0 chnl=0 -char id=55 x=276 y=117 width=19 height=24 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=0 -char id=56 x=295 y=117 width=20 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=57 x=315 y=117 width=21 height=24 xoffset=0 yoffset=3 xadvance=21 page=0 chnl=0 -char id=58 x=375 y=141 width=9 height=19 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 -char id=59 x=386 y=117 width=9 height=24 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 -char id=60 x=384 y=141 width=18 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=0 -char id=61 x=25 y=165 width=19 height=13 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=0 -char id=62 x=402 y=141 width=18 height=19 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=0 -char id=63 x=368 y=117 width=18 height=24 xoffset=-1 yoffset=3 xadvance=16 page=0 chnl=0 -char id=64 x=303 y=35 width=28 height=28 xoffset=0 yoffset=3 xadvance=28 page=0 chnl=0 -char id=65 x=21 y=92 width=26 height=24 xoffset=-1 yoffset=3 xadvance=24 page=0 chnl=0 -char id=66 x=47 y=92 width=22 height=24 xoffset=1 yoffset=3 xadvance=22 page=0 chnl=0 -char id=67 x=69 y=92 width=23 height=24 xoffset=0 yoffset=3 xadvance=22 page=0 chnl=0 -char id=68 x=92 y=92 width=23 height=24 xoffset=1 yoffset=3 xadvance=24 page=0 chnl=0 -char id=69 x=115 y=92 width=20 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=70 x=135 y=92 width=20 height=24 xoffset=1 yoffset=3 xadvance=20 page=0 chnl=0 -char id=71 x=155 y=92 width=23 height=24 xoffset=0 yoffset=3 xadvance=24 page=0 chnl=0 -char id=72 x=178 y=92 width=22 height=24 xoffset=1 yoffset=3 xadvance=24 page=0 chnl=0 -char id=73 x=200 y=92 width=7 height=24 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=0 -char id=74 x=207 y=92 width=18 height=24 xoffset=-1 yoffset=3 xadvance=17 page=0 chnl=0 -char id=75 x=225 y=92 width=23 height=24 xoffset=1 yoffset=3 xadvance=22 page=0 chnl=0 -char id=76 x=248 y=92 width=18 height=24 xoffset=1 yoffset=3 xadvance=19 page=0 chnl=0 -char id=77 x=266 y=92 width=26 height=24 xoffset=1 yoffset=3 xadvance=28 page=0 chnl=0 -char id=78 x=292 y=92 width=23 height=24 xoffset=1 yoffset=3 xadvance=25 page=0 chnl=0 -char id=79 x=315 y=92 width=26 height=24 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=80 x=341 y=92 width=21 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=81 x=362 y=92 width=26 height=24 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=82 x=388 y=92 width=21 height=24 xoffset=1 yoffset=3 xadvance=22 page=0 chnl=0 -char id=83 x=409 y=92 width=22 height=24 xoffset=-1 yoffset=3 xadvance=20 page=0 chnl=0 -char id=84 x=431 y=92 width=21 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=85 x=452 y=92 width=23 height=24 xoffset=1 yoffset=3 xadvance=24 page=0 chnl=0 -char id=86 x=475 y=92 width=26 height=24 xoffset=-1 yoffset=3 xadvance=24 page=0 chnl=0 -char id=87 x=0 y=117 width=36 height=24 xoffset=-1 yoffset=3 xadvance=35 page=0 chnl=0 -char id=88 x=36 y=117 width=25 height=24 xoffset=-1 yoffset=3 xadvance=23 page=0 chnl=0 -char id=89 x=61 y=117 width=25 height=24 xoffset=-1 yoffset=3 xadvance=22 page=0 chnl=0 -char id=90 x=86 y=117 width=21 height=24 xoffset=0 yoffset=3 xadvance=21 page=0 chnl=0 -char id=91 x=73 y=35 width=11 height=30 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0 -char id=92 x=262 y=35 width=19 height=29 xoffset=-2 yoffset=1 xadvance=15 page=0 chnl=0 -char id=93 x=84 y=35 width=12 height=30 xoffset=0 yoffset=2 xadvance=12 page=0 chnl=0 -char id=94 x=60 y=165 width=16 height=11 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=0 -char id=95 x=154 y=165 width=22 height=5 xoffset=-2 yoffset=27 xadvance=19 page=0 chnl=0 -char id=96 x=94 y=165 width=10 height=7 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0 -char id=97 x=128 y=141 width=18 height=19 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=0 -char id=98 x=107 y=117 width=20 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=99 x=146 y=141 width=18 height=19 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 -char id=100 x=127 y=117 width=21 height=24 xoffset=0 yoffset=3 xadvance=21 page=0 chnl=0 -char id=101 x=164 y=141 width=19 height=19 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=0 -char id=102 x=357 y=35 width=14 height=26 xoffset=-1 yoffset=1 xadvance=12 page=0 chnl=0 -char id=103 x=157 y=66 width=20 height=25 xoffset=0 yoffset=8 xadvance=21 page=0 chnl=0 -char id=104 x=148 y=117 width=19 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=105 x=349 y=35 width=8 height=27 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=0 -char id=106 x=14 y=0 width=12 height=33 xoffset=-3 yoffset=0 xadvance=9 page=0 chnl=0 -char id=107 x=167 y=117 width=20 height=24 xoffset=0 yoffset=3 xadvance=18 page=0 chnl=0 -char id=108 x=501 y=92 width=7 height=24 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=0 -char id=109 x=183 y=141 width=29 height=19 xoffset=0 yoffset=8 xadvance=30 page=0 chnl=0 -char id=110 x=212 y=141 width=19 height=19 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=111 x=231 y=141 width=21 height=19 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=112 x=177 y=66 width=20 height=25 xoffset=1 yoffset=8 xadvance=21 page=0 chnl=0 -char id=113 x=197 y=66 width=21 height=25 xoffset=0 yoffset=8 xadvance=21 page=0 chnl=0 -char id=114 x=491 y=117 width=13 height=20 xoffset=1 yoffset=7 xadvance=13 page=0 chnl=0 -char id=115 x=252 y=141 width=17 height=19 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 -char id=116 x=187 y=117 width=14 height=24 xoffset=-1 yoffset=3 xadvance=13 page=0 chnl=0 -char id=117 x=269 y=141 width=19 height=19 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=118 x=288 y=141 width=21 height=19 xoffset=-1 yoffset=8 xadvance=19 page=0 chnl=0 -char id=119 x=309 y=141 width=29 height=19 xoffset=-1 yoffset=8 xadvance=27 page=0 chnl=0 -char id=120 x=338 y=141 width=20 height=19 xoffset=-1 yoffset=8 xadvance=18 page=0 chnl=0 -char id=121 x=218 y=66 width=21 height=25 xoffset=-1 yoffset=8 xadvance=19 page=0 chnl=0 -char id=122 x=358 y=141 width=17 height=19 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=0 -char id=123 x=96 y=35 width=13 height=30 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 -char id=124 x=502 y=0 width=6 height=29 xoffset=2 yoffset=1 xadvance=10 page=0 chnl=0 -char id=125 x=109 y=35 width=13 height=30 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 -char id=126 x=104 y=165 width=14 height=7 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=0 -char id=161 x=497 y=35 width=8 height=25 xoffset=1 yoffset=8 xadvance=10 page=0 chnl=0 -char id=162 x=303 y=66 width=18 height=25 xoffset=0 yoffset=5 xadvance=18 page=0 chnl=0 -char id=163 x=445 y=117 width=21 height=24 xoffset=0 yoffset=3 xadvance=21 page=0 chnl=0 -char id=165 x=466 y=117 width=25 height=24 xoffset=-1 yoffset=3 xadvance=22 page=0 chnl=0 -char id=168 x=118 y=165 width=14 height=7 xoffset=1 yoffset=2 xadvance=15 page=0 chnl=0 -char id=175 x=176 y=165 width=14 height=5 xoffset=1 yoffset=4 xadvance=15 page=0 chnl=0 -char id=180 x=132 y=165 width=10 height=7 xoffset=1 yoffset=2 xadvance=12 page=0 chnl=0 -char id=184 x=76 y=165 width=9 height=9 xoffset=1 yoffset=25 xadvance=11 page=0 chnl=0 -char id=191 x=321 y=66 width=18 height=25 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 -char id=192 x=94 y=0 width=26 height=31 xoffset=-1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=193 x=120 y=0 width=26 height=31 xoffset=-1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=194 x=146 y=0 width=26 height=31 xoffset=-1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=195 x=172 y=0 width=26 height=31 xoffset=-1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=196 x=198 y=0 width=26 height=31 xoffset=-1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=197 x=26 y=0 width=26 height=33 xoffset=-1 yoffset=-6 xadvance=24 page=0 chnl=0 -char id=198 x=0 y=141 width=36 height=24 xoffset=-1 yoffset=3 xadvance=34 page=0 chnl=0 -char id=199 x=122 y=35 width=23 height=30 xoffset=0 yoffset=3 xadvance=22 page=0 chnl=0 -char id=200 x=224 y=0 width=20 height=31 xoffset=1 yoffset=-4 xadvance=21 page=0 chnl=0 -char id=201 x=244 y=0 width=20 height=31 xoffset=1 yoffset=-4 xadvance=21 page=0 chnl=0 -char id=202 x=264 y=0 width=20 height=31 xoffset=1 yoffset=-4 xadvance=21 page=0 chnl=0 -char id=203 x=284 y=0 width=20 height=31 xoffset=1 yoffset=-4 xadvance=21 page=0 chnl=0 -char id=204 x=304 y=0 width=12 height=31 xoffset=-3 yoffset=-4 xadvance=9 page=0 chnl=0 -char id=205 x=316 y=0 width=12 height=31 xoffset=1 yoffset=-4 xadvance=9 page=0 chnl=0 -char id=206 x=328 y=0 width=13 height=31 xoffset=-2 yoffset=-4 xadvance=9 page=0 chnl=0 -char id=207 x=341 y=0 width=17 height=31 xoffset=-3 yoffset=-4 xadvance=9 page=0 chnl=0 -char id=208 x=36 y=141 width=26 height=24 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=209 x=358 y=0 width=23 height=31 xoffset=1 yoffset=-4 xadvance=25 page=0 chnl=0 -char id=210 x=381 y=0 width=26 height=31 xoffset=0 yoffset=-4 xadvance=26 page=0 chnl=0 -char id=211 x=407 y=0 width=26 height=31 xoffset=0 yoffset=-4 xadvance=26 page=0 chnl=0 -char id=212 x=145 y=35 width=26 height=30 xoffset=0 yoffset=-3 xadvance=26 page=0 chnl=0 -char id=213 x=171 y=35 width=26 height=30 xoffset=0 yoffset=-3 xadvance=26 page=0 chnl=0 -char id=214 x=197 y=35 width=26 height=30 xoffset=0 yoffset=-3 xadvance=26 page=0 chnl=0 -char id=215 x=0 y=165 width=16 height=16 xoffset=1 yoffset=7 xadvance=18 page=0 chnl=0 -char id=216 x=62 y=141 width=26 height=24 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=217 x=433 y=0 width=23 height=31 xoffset=1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=218 x=456 y=0 width=23 height=31 xoffset=1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=219 x=479 y=0 width=23 height=31 xoffset=1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=220 x=0 y=35 width=23 height=31 xoffset=1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=221 x=23 y=35 width=25 height=31 xoffset=-1 yoffset=-4 xadvance=22 page=0 chnl=0 -char id=222 x=88 y=141 width=21 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=223 x=339 y=66 width=19 height=25 xoffset=1 yoffset=2 xadvance=20 page=0 chnl=0 -char id=224 x=371 y=35 width=18 height=26 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=0 -char id=225 x=389 y=35 width=18 height=26 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=0 -char id=226 x=358 y=66 width=18 height=25 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=0 -char id=227 x=376 y=66 width=18 height=25 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=0 -char id=228 x=394 y=66 width=18 height=25 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=0 -char id=229 x=331 y=35 width=18 height=28 xoffset=0 yoffset=-1 xadvance=19 page=0 chnl=0 -char id=230 x=420 y=141 width=30 height=19 xoffset=0 yoffset=8 xadvance=30 page=0 chnl=0 -char id=231 x=412 y=66 width=18 height=25 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 -char id=232 x=407 y=35 width=19 height=26 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=0 -char id=233 x=426 y=35 width=19 height=26 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=0 -char id=234 x=430 y=66 width=19 height=25 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=0 -char id=235 x=449 y=66 width=19 height=25 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=0 -char id=236 x=445 y=35 width=12 height=26 xoffset=-3 yoffset=1 xadvance=9 page=0 chnl=0 -char id=237 x=457 y=35 width=12 height=26 xoffset=1 yoffset=1 xadvance=9 page=0 chnl=0 -char id=238 x=469 y=35 width=13 height=26 xoffset=-2 yoffset=1 xadvance=9 page=0 chnl=0 -char id=239 x=482 y=35 width=15 height=26 xoffset=-3 yoffset=1 xadvance=9 page=0 chnl=0 -char id=240 x=0 y=66 width=20 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=241 x=20 y=66 width=19 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=242 x=39 y=66 width=21 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=243 x=60 y=66 width=21 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=244 x=468 y=66 width=21 height=25 xoffset=0 yoffset=2 xadvance=20 page=0 chnl=0 -char id=245 x=489 y=66 width=21 height=25 xoffset=0 yoffset=2 xadvance=20 page=0 chnl=0 -char id=246 x=0 y=92 width=21 height=25 xoffset=0 yoffset=2 xadvance=20 page=0 chnl=0 -char id=247 x=109 y=141 width=19 height=20 xoffset=0 yoffset=5 xadvance=19 page=0 chnl=0 -char id=248 x=450 y=141 width=21 height=19 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=249 x=81 y=66 width=19 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=250 x=100 y=66 width=19 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=251 x=119 y=66 width=19 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=252 x=138 y=66 width=19 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=253 x=52 y=0 width=21 height=32 xoffset=-1 yoffset=1 xadvance=19 page=0 chnl=0 -char id=254 x=223 y=35 width=20 height=30 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=255 x=73 y=0 width=21 height=32 xoffset=-1 yoffset=1 xadvance=19 page=0 chnl=0 -kernings count=349 -kerning first=244 second=119 amount=-1 -kerning first=86 second=225 amount=-1 -kerning first=119 second=245 amount=-1 -kerning first=253 second=243 amount=-1 -kerning first=111 second=89 amount=-4 -kerning first=248 second=86 amount=-2 -kerning first=84 second=211 amount=-1 -kerning first=84 second=194 amount=-2 -kerning first=221 second=235 amount=-4 -kerning first=192 second=221 amount=-1 -kerning first=121 second=44 amount=-3 -kerning first=65 second=89 amount=-1 -kerning first=75 second=216 amount=-1 -kerning first=87 second=248 amount=-2 -kerning first=89 second=242 amount=-4 -kerning first=221 second=111 amount=-4 -kerning first=233 second=221 amount=-4 -kerning first=75 second=195 amount=1 -kerning first=234 second=86 amount=-2 -kerning first=121 second=233 amount=-1 -kerning first=119 second=235 amount=-1 -kerning first=111 second=119 amount=-1 -kerning first=76 second=86 amount=-3 -kerning first=246 second=221 amount=-4 -kerning first=86 second=198 amount=-3 -kerning first=118 second=242 amount=-1 -kerning first=89 second=194 amount=-1 -kerning first=92 second=92 amount=-4 -kerning first=119 second=111 amount=-1 -kerning first=86 second=232 amount=-2 -kerning first=194 second=221 amount=-1 -kerning first=89 second=101 amount=-4 -kerning first=87 second=234 amount=-2 -kerning first=192 second=86 amount=-3 -kerning first=86 second=246 amount=-2 -kerning first=233 second=86 amount=-2 -kerning first=197 second=84 amount=-2 -kerning first=92 second=47 amount=3 -kerning first=75 second=193 amount=1 -kerning first=118 second=101 amount=-1 -kerning first=243 second=221 amount=-4 -kerning first=245 second=87 amount=-2 -kerning first=246 second=86 amount=-2 -kerning first=84 second=197 amount=-2 -kerning first=121 second=46 amount=-3 -kerning first=193 second=221 amount=-1 -kerning first=197 second=87 amount=-1 -kerning first=194 second=86 amount=-3 -kerning first=89 second=99 amount=-2 -kerning first=87 second=231 amount=-2 -kerning first=235 second=87 amount=-2 -kerning first=195 second=71 amount=-1 -kerning first=99 second=89 amount=-4 -kerning first=89 second=197 amount=-1 -kerning first=121 second=244 amount=-1 -kerning first=221 second=196 amount=-1 -kerning first=243 second=86 amount=-2 -kerning first=68 second=196 amount=-1 -kerning first=84 second=65 amount=-2 -kerning first=221 second=233 amount=-4 -kerning first=86 second=245 amount=-2 -kerning first=119 second=44 amount=-3 -kerning first=75 second=210 amount=-1 -kerning first=89 second=243 amount=-4 -kerning first=193 second=86 amount=-3 -kerning first=87 second=242 amount=-2 -kerning first=231 second=221 amount=-4 -kerning first=255 second=232 amount=-1 -kerning first=230 second=89 amount=-4 -kerning first=196 second=84 amount=-2 -kerning first=119 second=233 amount=-1 -kerning first=255 second=246 amount=-1 -kerning first=89 second=65 amount=-1 -kerning first=118 second=243 amount=-1 -kerning first=242 second=87 amount=-2 -kerning first=87 second=194 amount=-1 -kerning first=118 second=228 amount=-1 -kerning first=86 second=235 amount=-2 -kerning first=87 second=101 amount=-2 -kerning first=196 second=87 amount=-1 -kerning first=230 second=119 amount=-1 -kerning first=213 second=87 amount=-1 -kerning first=86 second=111 amount=-2 -kerning first=253 second=232 amount=-1 -kerning first=101 second=87 amount=-2 -kerning first=192 second=71 amount=-1 -kerning first=245 second=118 amount=-1 -kerning first=231 second=86 amount=-2 -kerning first=121 second=248 amount=-1 -kerning first=86 second=226 amount=-1 -kerning first=221 second=195 amount=-1 -kerning first=253 second=246 amount=-1 -kerning first=68 second=195 amount=-1 -kerning first=84 second=214 amount=-1 -kerning first=244 second=87 amount=-2 -kerning first=84 second=192 amount=-2 -kerning first=232 second=89 amount=-4 -kerning first=119 second=46 amount=-3 -kerning first=221 second=244 amount=-4 -kerning first=47 second=47 amount=-4 -kerning first=87 second=99 amount=-2 -kerning first=121 second=234 amount=-1 -kerning first=194 second=71 amount=-1 -kerning first=65 second=84 amount=-2 -kerning first=255 second=245 amount=-1 -kerning first=89 second=192 amount=-1 -kerning first=87 second=197 amount=-1 -kerning first=119 second=244 amount=-1 -kerning first=221 second=193 amount=-1 -kerning first=111 second=87 amount=-2 -kerning first=118 second=227 amount=-1 -kerning first=68 second=193 amount=-1 -kerning first=195 second=89 amount=-1 -kerning first=232 second=119 amount=-1 -kerning first=82 second=89 amount=-1 -kerning first=65 second=87 amount=-1 -kerning first=75 second=211 amount=-1 -kerning first=87 second=243 amount=-2 -kerning first=210 second=87 amount=-1 -kerning first=255 second=235 amount=-1 -kerning first=86 second=229 amount=-1 -kerning first=75 second=194 amount=1 -kerning first=193 second=71 amount=-1 -kerning first=242 second=118 amount=-1 -kerning first=253 second=245 amount=-1 -kerning first=248 second=89 amount=-4 -kerning first=255 second=111 amount=-1 -kerning first=84 second=213 amount=-1 -kerning first=86 second=196 amount=-3 -kerning first=84 second=198 amount=-2 -kerning first=87 second=65 amount=-1 -kerning first=118 second=225 amount=-1 -kerning first=221 second=248 amount=-4 -kerning first=86 second=233 amount=-2 -kerning first=234 second=89 amount=-4 -kerning first=212 second=87 amount=-1 -kerning first=248 second=119 amount=-1 -kerning first=253 second=235 amount=-1 -kerning first=244 second=118 amount=-1 -kerning first=89 second=198 amount=-1 -kerning first=121 second=242 amount=-1 -kerning first=86 second=97 amount=-1 -kerning first=119 second=248 amount=-1 -kerning first=253 second=111 amount=-1 -kerning first=84 second=79 amount=-1 -kerning first=89 second=232 amount=-4 -kerning first=221 second=234 amount=-4 -kerning first=192 second=89 amount=-1 -kerning first=234 second=119 amount=-1 -kerning first=89 second=246 amount=-4 -kerning first=233 second=89 amount=-4 -kerning first=75 second=197 amount=1 -kerning first=79 second=87 amount=-1 -kerning first=118 second=232 amount=-1 -kerning first=121 second=101 amount=-1 -kerning first=119 second=234 amount=-1 -kerning first=99 second=87 amount=-2 -kerning first=245 second=221 amount=-4 -kerning first=111 second=118 amount=-1 -kerning first=246 second=89 amount=-4 -kerning first=86 second=195 amount=-3 -kerning first=118 second=246 amount=-1 -kerning first=87 second=192 amount=-1 -kerning first=197 second=221 amount=-1 -kerning first=194 second=89 amount=-1 -kerning first=233 second=119 amount=-1 -kerning first=255 second=44 amount=-3 -kerning first=221 second=231 amount=-2 -kerning first=235 second=221 amount=-4 -kerning first=86 second=244 amount=-2 -kerning first=255 second=233 amount=-1 -kerning first=86 second=224 amount=-1 -kerning first=246 second=119 amount=-1 -kerning first=75 second=65 amount=1 -kerning first=230 second=87 amount=-2 -kerning first=243 second=89 amount=-4 -kerning first=245 second=86 amount=-2 -kerning first=86 second=193 amount=-3 -kerning first=89 second=245 amount=-4 -kerning first=193 second=89 amount=-1 -kerning first=253 second=44 amount=-3 -kerning first=197 second=86 amount=-3 -kerning first=221 second=242 amount=-4 -kerning first=235 second=86 amount=-2 -kerning first=253 second=233 amount=-1 -kerning first=243 second=119 amount=-1 -kerning first=118 second=245 amount=-1 -kerning first=242 second=221 amount=-4 -kerning first=87 second=198 amount=-1 -kerning first=121 second=243 amount=-1 -kerning first=221 second=194 amount=-1 -kerning first=119 second=242 amount=-1 -kerning first=68 second=194 amount=-1 -kerning first=255 second=46 amount=-3 -kerning first=89 second=235 amount=-4 -kerning first=87 second=232 amount=-2 -kerning first=196 second=221 amount=-1 -kerning first=221 second=101 amount=-4 -kerning first=86 second=248 amount=-2 -kerning first=75 second=214 amount=-1 -kerning first=101 second=221 amount=-4 -kerning first=89 second=111 amount=-4 -kerning first=87 second=246 amount=-2 -kerning first=232 second=87 amount=-2 -kerning first=231 second=89 amount=-4 -kerning first=195 second=84 amount=-2 -kerning first=86 second=230 amount=-1 -kerning first=75 second=192 amount=1 -kerning first=118 second=235 amount=-1 -kerning first=119 second=101 amount=-1 -kerning first=255 second=244 amount=-1 -kerning first=244 second=221 amount=-4 -kerning first=118 second=111 amount=-1 -kerning first=242 second=86 amount=-2 -kerning first=118 second=226 amount=-1 -kerning first=253 second=46 amount=-3 -kerning first=86 second=234 amount=-2 -kerning first=195 second=87 amount=-1 -kerning first=196 second=86 amount=-3 -kerning first=221 second=99 amount=-2 -kerning first=101 second=86 amount=-2 -kerning first=221 second=197 amount=-1 -kerning first=253 second=244 amount=-1 -kerning first=118 second=100 amount=-1 -kerning first=111 second=221 amount=-4 -kerning first=248 second=87 amount=-2 -kerning first=84 second=212 amount=-1 -kerning first=68 second=197 amount=-1 -kerning first=244 second=86 amount=-2 -kerning first=76 second=84 amount=-1 -kerning first=84 second=196 amount=-2 -kerning first=65 second=221 amount=-1 -kerning first=75 second=213 amount=-1 -kerning first=87 second=245 amount=-2 -kerning first=221 second=243 amount=-4 -kerning first=86 second=231 amount=-2 -kerning first=75 second=198 amount=1 -kerning first=234 second=87 amount=-2 -kerning first=197 second=71 amount=-1 -kerning first=192 second=84 amount=-2 -kerning first=255 second=248 amount=-1 -kerning first=89 second=196 amount=-1 -kerning first=221 second=65 amount=-1 -kerning first=119 second=243 amount=-1 -kerning first=118 second=229 amount=-1 -kerning first=111 second=86 amount=-2 -kerning first=68 second=65 amount=-1 -kerning first=89 second=233 amount=-4 -kerning first=87 second=235 amount=-2 -kerning first=192 second=87 amount=-1 -kerning first=118 second=44 amount=-3 -kerning first=65 second=86 amount=-3 -kerning first=86 second=242 amount=-2 -kerning first=75 second=79 amount=-1 -kerning first=87 second=111 amount=-2 -kerning first=233 second=87 amount=-2 -kerning first=194 second=84 amount=-2 -kerning first=253 second=248 amount=-1 -kerning first=255 second=234 amount=-1 -kerning first=118 second=233 amount=-1 -kerning first=84 second=216 amount=-1 -kerning first=246 second=87 amount=-2 -kerning first=86 second=194 amount=-3 -kerning first=84 second=195 amount=-2 -kerning first=118 second=97 amount=-1 -kerning first=86 second=101 amount=-2 -kerning first=194 second=87 amount=-1 -kerning first=216 second=87 amount=-1 -kerning first=99 second=221 amount=-4 -kerning first=121 second=232 amount=-1 -kerning first=253 second=234 amount=-1 -kerning first=196 second=71 amount=-1 -kerning first=248 second=118 amount=-1 -kerning first=193 second=84 amount=-2 -kerning first=89 second=195 amount=-1 -kerning first=121 second=246 amount=-1 -kerning first=221 second=192 amount=-1 -kerning first=243 second=87 amount=-2 -kerning first=68 second=192 amount=-1 -kerning first=84 second=193 amount=-2 -kerning first=118 second=46 amount=-3 -kerning first=89 second=244 amount=-4 -kerning first=193 second=87 amount=-1 -kerning first=86 second=99 amount=-2 -kerning first=230 second=221 amount=-4 -kerning first=99 second=86 amount=-2 -kerning first=255 second=242 amount=-1 -kerning first=245 second=89 amount=-4 -kerning first=86 second=197 amount=-3 -kerning first=89 second=193 amount=-1 -kerning first=87 second=196 amount=-1 -kerning first=118 second=244 amount=-1 -kerning first=118 second=224 amount=-1 -kerning first=197 second=89 amount=-1 -kerning first=87 second=233 amount=-2 -kerning first=235 second=89 amount=-4 -kerning first=86 second=243 amount=-2 -kerning first=214 second=87 amount=-1 -kerning first=245 second=119 amount=-1 -kerning first=255 second=101 amount=-1 -kerning first=231 second=87 amount=-2 -kerning first=246 second=118 amount=-1 -kerning first=65 second=71 amount=-1 -kerning first=86 second=228 amount=-1 -kerning first=221 second=198 amount=-1 -kerning first=121 second=245 amount=-1 -kerning first=230 second=86 amount=-2 -kerning first=253 second=242 amount=-1 -kerning first=68 second=198 amount=-1 -kerning first=84 second=210 amount=-1 -kerning first=86 second=65 amount=-3 -kerning first=221 second=232 amount=-4 -kerning first=235 second=119 amount=-1 -kerning first=89 second=248 amount=-4 -kerning first=232 second=221 amount=-4 -kerning first=221 second=246 amount=-4 -kerning first=211 second=87 amount=-1 -kerning first=121 second=235 amount=-1 -kerning first=119 second=232 amount=-1 -kerning first=253 second=101 amount=-1 -kerning first=243 second=118 amount=-1 -kerning first=118 second=248 amount=-1 -kerning first=242 second=89 amount=-4 -kerning first=87 second=195 amount=-1 -kerning first=121 second=111 amount=-1 -kerning first=119 second=246 amount=-1 -kerning first=118 second=230 amount=-1 -kerning first=195 second=221 amount=-1 -kerning first=89 second=234 amount=-4 -kerning first=196 second=89 amount=-1 -kerning first=82 second=221 amount=-1 -kerning first=75 second=212 amount=-1 -kerning first=101 second=89 amount=-4 -kerning first=87 second=244 amount=-2 -kerning first=232 second=86 amount=-2 -kerning first=86 second=227 amount=-1 -kerning first=75 second=196 amount=1 -kerning first=242 second=119 amount=-1 -kerning first=118 second=234 amount=-1 -kerning first=248 second=221 amount=-4 -kerning first=255 second=243 amount=-1 -kerning first=244 second=89 amount=-4 -kerning first=86 second=192 amount=-3 -kerning first=87 second=193 amount=-1 -kerning first=221 second=245 amount=-4 -kerning first=101 second=119 amount=-1 -kerning first=195 second=86 amount=-3 -kerning first=89 second=231 amount=-2 -kerning first=234 second=221 amount=-4 diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-32.png b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-32.png deleted file mode 100644 index 6f752422..00000000 Binary files a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-32.png and /dev/null differ diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-42.fnt b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-42.fnt deleted file mode 100644 index 4d808ea8..00000000 --- a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-42.fnt +++ /dev/null @@ -1,545 +0,0 @@ -info face="Metropolis Bold" size=42 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 -common lineHeight=43 base=34 scaleW=512 scaleH=512 pages=1 packed=0 -page id=0 file="Metropolis-Bold-42.png" -chars count=170 -char id=0 x=0 y=0 width=17 height=44 xoffset=2 yoffset=0 xadvance=21 page=0 chnl=0 -char id=10 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 -char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 -char id=33 x=467 y=155 width=11 height=32 xoffset=1 yoffset=4 xadvance=13 page=0 chnl=0 -char id=34 x=397 y=251 width=20 height=15 xoffset=1 yoffset=4 xadvance=22 page=0 chnl=0 -char id=35 x=144 y=220 width=29 height=31 xoffset=0 yoffset=4 xadvance=28 page=0 chnl=0 -char id=36 x=426 y=44 width=27 height=39 xoffset=-1 yoffset=0 xadvance=27 page=0 chnl=0 -char id=37 x=51 y=155 width=35 height=33 xoffset=0 yoffset=3 xadvance=35 page=0 chnl=0 -char id=38 x=322 y=84 width=29 height=34 xoffset=0 yoffset=3 xadvance=29 page=0 chnl=0 -char id=39 x=417 y=251 width=9 height=15 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 -char id=40 x=362 y=44 width=15 height=39 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0 -char id=41 x=377 y=44 width=15 height=39 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=0 -char id=42 x=346 y=251 width=17 height=18 xoffset=0 yoffset=2 xadvance=17 page=0 chnl=0 -char id=43 x=302 y=251 width=23 height=23 xoffset=1 yoffset=8 xadvance=25 page=0 chnl=0 -char id=44 x=363 y=251 width=11 height=16 xoffset=1 yoffset=26 xadvance=12 page=0 chnl=0 -char id=45 x=14 y=277 width=15 height=8 xoffset=0 yoffset=18 xadvance=15 page=0 chnl=0 -char id=46 x=458 y=251 width=10 height=10 xoffset=1 yoffset=26 xadvance=12 page=0 chnl=0 -char id=47 x=0 y=84 width=25 height=37 xoffset=-3 yoffset=1 xadvance=19 page=0 chnl=0 -char id=48 x=0 y=155 width=29 height=33 xoffset=0 yoffset=3 xadvance=30 page=0 chnl=0 -char id=49 x=75 y=220 width=17 height=31 xoffset=-1 yoffset=4 xadvance=17 page=0 chnl=0 -char id=50 x=416 y=155 width=25 height=32 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=51 x=402 y=121 width=25 height=33 xoffset=0 yoffset=3 xadvance=25 page=0 chnl=0 -char id=52 x=92 y=220 width=27 height=31 xoffset=0 yoffset=4 xadvance=27 page=0 chnl=0 -char id=53 x=441 y=155 width=26 height=32 xoffset=0 yoffset=4 xadvance=26 page=0 chnl=0 -char id=54 x=427 y=121 width=27 height=33 xoffset=0 yoffset=3 xadvance=27 page=0 chnl=0 -char id=55 x=119 y=220 width=25 height=31 xoffset=0 yoffset=4 xadvance=25 page=0 chnl=0 -char id=56 x=454 y=121 width=26 height=33 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=57 x=480 y=121 width=27 height=33 xoffset=0 yoffset=3 xadvance=27 page=0 chnl=0 -char id=58 x=112 y=251 width=10 height=25 xoffset=1 yoffset=11 xadvance=12 page=0 chnl=0 -char id=59 x=499 y=155 width=11 height=31 xoffset=1 yoffset=11 xadvance=12 page=0 chnl=0 -char id=60 x=234 y=251 width=22 height=24 xoffset=1 yoffset=8 xadvance=25 page=0 chnl=0 -char id=61 x=374 y=251 width=23 height=16 xoffset=1 yoffset=12 xadvance=25 page=0 chnl=0 -char id=62 x=256 y=251 width=23 height=24 xoffset=1 yoffset=8 xadvance=25 page=0 chnl=0 -char id=63 x=29 y=155 width=22 height=33 xoffset=-1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=64 x=50 y=84 width=37 height=36 xoffset=0 yoffset=4 xadvance=37 page=0 chnl=0 -char id=65 x=28 y=188 width=33 height=31 xoffset=-1 yoffset=4 xadvance=32 page=0 chnl=0 -char id=66 x=61 y=188 width=27 height=31 xoffset=2 yoffset=4 xadvance=29 page=0 chnl=0 -char id=67 x=96 y=121 width=30 height=33 xoffset=0 yoffset=3 xadvance=29 page=0 chnl=0 -char id=68 x=88 y=188 width=30 height=31 xoffset=2 yoffset=4 xadvance=32 page=0 chnl=0 -char id=69 x=118 y=188 width=26 height=31 xoffset=1 yoffset=4 xadvance=27 page=0 chnl=0 -char id=70 x=144 y=188 width=26 height=31 xoffset=1 yoffset=4 xadvance=27 page=0 chnl=0 -char id=71 x=126 y=121 width=30 height=33 xoffset=0 yoffset=3 xadvance=31 page=0 chnl=0 -char id=72 x=170 y=188 width=29 height=31 xoffset=1 yoffset=4 xadvance=31 page=0 chnl=0 -char id=73 x=489 y=155 width=10 height=31 xoffset=1 yoffset=4 xadvance=12 page=0 chnl=0 -char id=74 x=289 y=155 width=23 height=32 xoffset=-1 yoffset=4 xadvance=23 page=0 chnl=0 -char id=75 x=199 y=188 width=29 height=31 xoffset=2 yoffset=4 xadvance=29 page=0 chnl=0 -char id=76 x=228 y=188 width=24 height=31 xoffset=1 yoffset=4 xadvance=24 page=0 chnl=0 -char id=77 x=252 y=188 width=33 height=31 xoffset=2 yoffset=4 xadvance=36 page=0 chnl=0 -char id=78 x=285 y=188 width=29 height=31 xoffset=2 yoffset=4 xadvance=33 page=0 chnl=0 -char id=79 x=156 y=121 width=34 height=33 xoffset=0 yoffset=3 xadvance=34 page=0 chnl=0 -char id=80 x=314 y=188 width=27 height=31 xoffset=1 yoffset=4 xadvance=28 page=0 chnl=0 -char id=81 x=190 y=121 width=34 height=33 xoffset=0 yoffset=3 xadvance=34 page=0 chnl=0 -char id=82 x=341 y=188 width=28 height=31 xoffset=1 yoffset=4 xadvance=28 page=0 chnl=0 -char id=83 x=224 y=121 width=27 height=33 xoffset=-1 yoffset=3 xadvance=27 page=0 chnl=0 -char id=84 x=369 y=188 width=27 height=31 xoffset=0 yoffset=4 xadvance=27 page=0 chnl=0 -char id=85 x=312 y=155 width=29 height=32 xoffset=1 yoffset=4 xadvance=32 page=0 chnl=0 -char id=86 x=396 y=188 width=33 height=31 xoffset=-1 yoffset=4 xadvance=32 page=0 chnl=0 -char id=87 x=429 y=188 width=47 height=31 xoffset=-1 yoffset=4 xadvance=45 page=0 chnl=0 -char id=88 x=476 y=188 width=32 height=31 xoffset=-1 yoffset=4 xadvance=30 page=0 chnl=0 -char id=89 x=0 y=220 width=31 height=31 xoffset=-1 yoffset=4 xadvance=29 page=0 chnl=0 -char id=90 x=31 y=220 width=27 height=31 xoffset=0 yoffset=4 xadvance=28 page=0 chnl=0 -char id=91 x=453 y=44 width=15 height=38 xoffset=1 yoffset=3 xadvance=16 page=0 chnl=0 -char id=92 x=25 y=84 width=25 height=37 xoffset=-2 yoffset=1 xadvance=19 page=0 chnl=0 -char id=93 x=468 y=44 width=15 height=38 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=0 -char id=94 x=426 y=251 width=20 height=14 xoffset=0 yoffset=4 xadvance=21 page=0 chnl=0 -char id=95 x=47 y=277 width=28 height=6 xoffset=-2 yoffset=36 xadvance=25 page=0 chnl=0 -char id=96 x=486 y=251 width=14 height=9 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=0 -char id=97 x=333 y=220 width=23 height=26 xoffset=0 yoffset=10 xadvance=24 page=0 chnl=0 -char id=98 x=251 y=121 width=27 height=33 xoffset=1 yoffset=3 xadvance=28 page=0 chnl=0 -char id=99 x=356 y=220 width=23 height=26 xoffset=0 yoffset=10 xadvance=23 page=0 chnl=0 -char id=100 x=278 y=121 width=27 height=33 xoffset=0 yoffset=3 xadvance=28 page=0 chnl=0 -char id=101 x=379 y=220 width=25 height=26 xoffset=0 yoffset=10 xadvance=25 page=0 chnl=0 -char id=102 x=305 y=121 width=17 height=33 xoffset=0 yoffset=2 xadvance=16 page=0 chnl=0 -char id=103 x=322 y=121 width=26 height=33 xoffset=0 yoffset=10 xadvance=27 page=0 chnl=0 -char id=104 x=341 y=155 width=24 height=32 xoffset=1 yoffset=3 xadvance=26 page=0 chnl=0 -char id=105 x=312 y=84 width=10 height=34 xoffset=1 yoffset=1 xadvance=11 page=0 chnl=0 -char id=106 x=50 y=0 width=17 height=42 xoffset=-4 yoffset=1 xadvance=11 page=0 chnl=0 -char id=107 x=365 y=155 width=24 height=32 xoffset=1 yoffset=3 xadvance=24 page=0 chnl=0 -char id=108 x=499 y=84 width=9 height=32 xoffset=1 yoffset=3 xadvance=11 page=0 chnl=0 -char id=109 x=27 y=251 width=37 height=25 xoffset=1 yoffset=10 xadvance=39 page=0 chnl=0 -char id=110 x=64 y=251 width=24 height=25 xoffset=1 yoffset=10 xadvance=26 page=0 chnl=0 -char id=111 x=404 y=220 width=27 height=26 xoffset=0 yoffset=10 xadvance=27 page=0 chnl=0 -char id=112 x=348 y=121 width=27 height=33 xoffset=1 yoffset=10 xadvance=28 page=0 chnl=0 -char id=113 x=375 y=121 width=27 height=33 xoffset=0 yoffset=10 xadvance=28 page=0 chnl=0 -char id=114 x=491 y=220 width=17 height=25 xoffset=1 yoffset=10 xadvance=17 page=0 chnl=0 -char id=115 x=431 y=220 width=21 height=26 xoffset=0 yoffset=10 xadvance=21 page=0 chnl=0 -char id=116 x=58 y=220 width=17 height=31 xoffset=0 yoffset=5 xadvance=17 page=0 chnl=0 -char id=117 x=88 y=251 width=24 height=25 xoffset=1 yoffset=11 xadvance=26 page=0 chnl=0 -char id=118 x=122 y=251 width=27 height=24 xoffset=-1 yoffset=11 xadvance=25 page=0 chnl=0 -char id=119 x=149 y=251 width=37 height=24 xoffset=-1 yoffset=11 xadvance=35 page=0 chnl=0 -char id=120 x=186 y=251 width=26 height=24 xoffset=-1 yoffset=11 xadvance=24 page=0 chnl=0 -char id=121 x=389 y=155 width=27 height=32 xoffset=-1 yoffset=11 xadvance=25 page=0 chnl=0 -char id=122 x=212 y=251 width=22 height=24 xoffset=0 yoffset=11 xadvance=22 page=0 chnl=0 -char id=123 x=392 y=44 width=17 height=39 xoffset=0 yoffset=3 xadvance=17 page=0 chnl=0 -char id=124 x=503 y=0 width=7 height=37 xoffset=3 yoffset=1 xadvance=13 page=0 chnl=0 -char id=125 x=409 y=44 width=17 height=39 xoffset=0 yoffset=3 xadvance=17 page=0 chnl=0 -char id=126 x=468 y=251 width=18 height=10 xoffset=0 yoffset=14 xadvance=19 page=0 chnl=0 -char id=161 x=478 y=155 width=11 height=32 xoffset=1 yoffset=10 xadvance=13 page=0 chnl=0 -char id=162 x=173 y=220 width=23 height=31 xoffset=0 yoffset=8 xadvance=23 page=0 chnl=0 -char id=163 x=0 y=188 width=28 height=32 xoffset=0 yoffset=3 xadvance=27 page=0 chnl=0 -char id=165 x=196 y=220 width=31 height=31 xoffset=-1 yoffset=4 xadvance=29 page=0 chnl=0 -char id=168 x=29 y=277 width=18 height=8 xoffset=1 yoffset=3 xadvance=20 page=0 chnl=0 -char id=175 x=75 y=277 width=18 height=6 xoffset=1 yoffset=5 xadvance=20 page=0 chnl=0 -char id=180 x=0 y=277 width=14 height=9 xoffset=1 yoffset=2 xadvance=16 page=0 chnl=0 -char id=184 x=446 y=251 width=12 height=11 xoffset=1 yoffset=32 xadvance=14 page=0 chnl=0 -char id=191 x=86 y=155 width=22 height=33 xoffset=0 yoffset=10 xadvance=21 page=0 chnl=0 -char id=192 x=437 y=0 width=33 height=40 xoffset=-1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=193 x=470 y=0 width=33 height=40 xoffset=-1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=194 x=0 y=44 width=33 height=40 xoffset=-1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=195 x=33 y=44 width=33 height=40 xoffset=-1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=196 x=66 y=44 width=33 height=40 xoffset=-1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=197 x=17 y=0 width=33 height=43 xoffset=-1 yoffset=-8 xadvance=32 page=0 chnl=0 -char id=198 x=227 y=220 width=46 height=31 xoffset=-1 yoffset=4 xadvance=45 page=0 chnl=0 -char id=199 x=169 y=0 width=30 height=41 xoffset=0 yoffset=3 xadvance=29 page=0 chnl=0 -char id=200 x=99 y=44 width=26 height=40 xoffset=1 yoffset=-5 xadvance=27 page=0 chnl=0 -char id=201 x=125 y=44 width=26 height=40 xoffset=1 yoffset=-5 xadvance=27 page=0 chnl=0 -char id=202 x=151 y=44 width=26 height=40 xoffset=1 yoffset=-5 xadvance=27 page=0 chnl=0 -char id=203 x=177 y=44 width=26 height=40 xoffset=1 yoffset=-5 xadvance=27 page=0 chnl=0 -char id=204 x=203 y=44 width=17 height=40 xoffset=-4 yoffset=-5 xadvance=12 page=0 chnl=0 -char id=205 x=220 y=44 width=17 height=40 xoffset=1 yoffset=-5 xadvance=12 page=0 chnl=0 -char id=206 x=237 y=44 width=18 height=40 xoffset=-2 yoffset=-5 xadvance=12 page=0 chnl=0 -char id=207 x=255 y=44 width=20 height=40 xoffset=-3 yoffset=-5 xadvance=12 page=0 chnl=0 -char id=208 x=273 y=220 width=33 height=31 xoffset=0 yoffset=4 xadvance=34 page=0 chnl=0 -char id=209 x=275 y=44 width=29 height=40 xoffset=2 yoffset=-5 xadvance=33 page=0 chnl=0 -char id=210 x=67 y=0 width=34 height=42 xoffset=0 yoffset=-6 xadvance=34 page=0 chnl=0 -char id=211 x=101 y=0 width=34 height=42 xoffset=0 yoffset=-6 xadvance=34 page=0 chnl=0 -char id=212 x=135 y=0 width=34 height=42 xoffset=0 yoffset=-6 xadvance=34 page=0 chnl=0 -char id=213 x=199 y=0 width=34 height=41 xoffset=0 yoffset=-5 xadvance=34 page=0 chnl=0 -char id=214 x=233 y=0 width=34 height=41 xoffset=0 yoffset=-5 xadvance=34 page=0 chnl=0 -char id=215 x=325 y=251 width=21 height=21 xoffset=1 yoffset=9 xadvance=24 page=0 chnl=0 -char id=216 x=108 y=155 width=34 height=33 xoffset=0 yoffset=3 xadvance=34 page=0 chnl=0 -char id=217 x=267 y=0 width=29 height=41 xoffset=1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=218 x=296 y=0 width=29 height=41 xoffset=1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=219 x=325 y=0 width=29 height=41 xoffset=1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=220 x=354 y=0 width=29 height=41 xoffset=1 yoffset=-5 xadvance=32 page=0 chnl=0 -char id=221 x=304 y=44 width=31 height=40 xoffset=-1 yoffset=-5 xadvance=29 page=0 chnl=0 -char id=222 x=306 y=220 width=27 height=31 xoffset=1 yoffset=4 xadvance=28 page=0 chnl=0 -char id=223 x=142 y=155 width=25 height=33 xoffset=1 yoffset=2 xadvance=26 page=0 chnl=0 -char id=224 x=87 y=84 width=23 height=35 xoffset=0 yoffset=1 xadvance=24 page=0 chnl=0 -char id=225 x=110 y=84 width=23 height=35 xoffset=0 yoffset=1 xadvance=24 page=0 chnl=0 -char id=226 x=133 y=84 width=23 height=35 xoffset=0 yoffset=1 xadvance=24 page=0 chnl=0 -char id=227 x=351 y=84 width=23 height=34 xoffset=0 yoffset=2 xadvance=24 page=0 chnl=0 -char id=228 x=374 y=84 width=23 height=34 xoffset=0 yoffset=2 xadvance=24 page=0 chnl=0 -char id=229 x=483 y=44 width=23 height=38 xoffset=0 yoffset=-2 xadvance=24 page=0 chnl=0 -char id=230 x=452 y=220 width=39 height=26 xoffset=0 yoffset=10 xadvance=39 page=0 chnl=0 -char id=231 x=397 y=84 width=23 height=34 xoffset=0 yoffset=10 xadvance=23 page=0 chnl=0 -char id=232 x=156 y=84 width=25 height=35 xoffset=0 yoffset=1 xadvance=25 page=0 chnl=0 -char id=233 x=181 y=84 width=25 height=35 xoffset=0 yoffset=1 xadvance=25 page=0 chnl=0 -char id=234 x=206 y=84 width=25 height=35 xoffset=0 yoffset=1 xadvance=25 page=0 chnl=0 -char id=235 x=420 y=84 width=25 height=34 xoffset=0 yoffset=2 xadvance=25 page=0 chnl=0 -char id=236 x=167 y=155 width=16 height=33 xoffset=-4 yoffset=2 xadvance=11 page=0 chnl=0 -char id=237 x=183 y=155 width=16 height=33 xoffset=1 yoffset=2 xadvance=11 page=0 chnl=0 -char id=238 x=199 y=155 width=19 height=33 xoffset=-3 yoffset=2 xadvance=11 page=0 chnl=0 -char id=239 x=218 y=155 width=21 height=33 xoffset=-3 yoffset=2 xadvance=11 page=0 chnl=0 -char id=240 x=239 y=155 width=26 height=33 xoffset=0 yoffset=3 xadvance=27 page=0 chnl=0 -char id=241 x=265 y=155 width=24 height=33 xoffset=1 yoffset=2 xadvance=26 page=0 chnl=0 -char id=242 x=231 y=84 width=27 height=35 xoffset=0 yoffset=1 xadvance=27 page=0 chnl=0 -char id=243 x=258 y=84 width=27 height=35 xoffset=0 yoffset=1 xadvance=27 page=0 chnl=0 -char id=244 x=285 y=84 width=27 height=35 xoffset=0 yoffset=1 xadvance=27 page=0 chnl=0 -char id=245 x=445 y=84 width=27 height=34 xoffset=0 yoffset=2 xadvance=27 page=0 chnl=0 -char id=246 x=472 y=84 width=27 height=34 xoffset=0 yoffset=2 xadvance=27 page=0 chnl=0 -char id=247 x=279 y=251 width=23 height=24 xoffset=1 yoffset=8 xadvance=25 page=0 chnl=0 -char id=248 x=0 y=251 width=27 height=26 xoffset=0 yoffset=10 xadvance=27 page=0 chnl=0 -char id=249 x=0 y=121 width=24 height=34 xoffset=1 yoffset=2 xadvance=26 page=0 chnl=0 -char id=250 x=24 y=121 width=24 height=34 xoffset=1 yoffset=2 xadvance=26 page=0 chnl=0 -char id=251 x=48 y=121 width=24 height=34 xoffset=1 yoffset=2 xadvance=26 page=0 chnl=0 -char id=252 x=72 y=121 width=24 height=34 xoffset=1 yoffset=2 xadvance=26 page=0 chnl=0 -char id=253 x=383 y=0 width=27 height=41 xoffset=-1 yoffset=2 xadvance=25 page=0 chnl=0 -char id=254 x=335 y=44 width=27 height=40 xoffset=1 yoffset=3 xadvance=28 page=0 chnl=0 -char id=255 x=410 y=0 width=27 height=41 xoffset=-1 yoffset=2 xadvance=25 page=0 chnl=0 -kernings count=370 -kerning first=244 second=119 amount=-1 -kerning first=86 second=225 amount=-2 -kerning first=119 second=245 amount=-1 -kerning first=253 second=243 amount=-1 -kerning first=111 second=89 amount=-5 -kerning first=248 second=86 amount=-3 -kerning first=67 second=79 amount=-1 -kerning first=84 second=211 amount=-1 -kerning first=84 second=194 amount=-2 -kerning first=221 second=235 amount=-5 -kerning first=192 second=221 amount=-1 -kerning first=121 second=44 amount=-4 -kerning first=65 second=89 amount=-1 -kerning first=75 second=216 amount=-1 -kerning first=87 second=248 amount=-2 -kerning first=89 second=242 amount=-5 -kerning first=221 second=111 amount=-5 -kerning first=233 second=221 amount=-5 -kerning first=75 second=195 amount=1 -kerning first=234 second=86 amount=-3 -kerning first=121 second=233 amount=-1 -kerning first=119 second=235 amount=-1 -kerning first=111 second=119 amount=-1 -kerning first=76 second=86 amount=-5 -kerning first=246 second=221 amount=-5 -kerning first=86 second=198 amount=-4 -kerning first=118 second=242 amount=-1 -kerning first=89 second=194 amount=-1 -kerning first=92 second=92 amount=-6 -kerning first=199 second=211 amount=-1 -kerning first=119 second=111 amount=-1 -kerning first=114 second=242 amount=-1 -kerning first=86 second=232 amount=-3 -kerning first=194 second=221 amount=-1 -kerning first=89 second=101 amount=-5 -kerning first=87 second=234 amount=-2 -kerning first=192 second=86 amount=-4 -kerning first=86 second=246 amount=-3 -kerning first=233 second=86 amount=-3 -kerning first=197 second=84 amount=-3 -kerning first=92 second=47 amount=3 -kerning first=75 second=193 amount=1 -kerning first=118 second=101 amount=-1 -kerning first=243 second=221 amount=-5 -kerning first=245 second=87 amount=-2 -kerning first=246 second=86 amount=-3 -kerning first=84 second=197 amount=-2 -kerning first=121 second=46 amount=-4 -kerning first=193 second=221 amount=-1 -kerning first=197 second=87 amount=-2 -kerning first=194 second=86 amount=-4 -kerning first=89 second=99 amount=-3 -kerning first=87 second=231 amount=-2 -kerning first=235 second=87 amount=-2 -kerning first=195 second=71 amount=-1 -kerning first=99 second=89 amount=-5 -kerning first=89 second=197 amount=-1 -kerning first=121 second=244 amount=-1 -kerning first=221 second=196 amount=-1 -kerning first=243 second=86 amount=-3 -kerning first=68 second=196 amount=-2 -kerning first=84 second=65 amount=-2 -kerning first=221 second=233 amount=-5 -kerning first=86 second=245 amount=-3 -kerning first=119 second=44 amount=-3 -kerning first=75 second=210 amount=-1 -kerning first=89 second=243 amount=-5 -kerning first=193 second=86 amount=-4 -kerning first=87 second=242 amount=-2 -kerning first=231 second=221 amount=-5 -kerning first=255 second=232 amount=-1 -kerning first=230 second=89 amount=-5 -kerning first=196 second=84 amount=-3 -kerning first=119 second=233 amount=-1 -kerning first=255 second=246 amount=-1 -kerning first=89 second=65 amount=-1 -kerning first=118 second=243 amount=-1 -kerning first=242 second=87 amount=-2 -kerning first=87 second=194 amount=-2 -kerning first=118 second=228 amount=-1 -kerning first=114 second=243 amount=-1 -kerning first=86 second=235 amount=-3 -kerning first=87 second=101 amount=-2 -kerning first=196 second=87 amount=-2 -kerning first=230 second=119 amount=-1 -kerning first=213 second=87 amount=-1 -kerning first=86 second=111 amount=-3 -kerning first=253 second=232 amount=-1 -kerning first=101 second=87 amount=-2 -kerning first=192 second=71 amount=-1 -kerning first=245 second=118 amount=-1 -kerning first=231 second=86 amount=-3 -kerning first=121 second=248 amount=-1 -kerning first=86 second=226 amount=-2 -kerning first=221 second=195 amount=-1 -kerning first=253 second=246 amount=-1 -kerning first=67 second=212 amount=-1 -kerning first=68 second=195 amount=-2 -kerning first=84 second=214 amount=-1 -kerning first=244 second=87 amount=-2 -kerning first=84 second=192 amount=-2 -kerning first=232 second=89 amount=-5 -kerning first=119 second=46 amount=-3 -kerning first=221 second=244 amount=-5 -kerning first=47 second=47 amount=-6 -kerning first=87 second=99 amount=-2 -kerning first=121 second=234 amount=-1 -kerning first=194 second=71 amount=-1 -kerning first=65 second=84 amount=-3 -kerning first=255 second=245 amount=-1 -kerning first=89 second=192 amount=-1 -kerning first=87 second=197 amount=-2 -kerning first=199 second=214 amount=-1 -kerning first=119 second=244 amount=-1 -kerning first=221 second=193 amount=-1 -kerning first=111 second=87 amount=-2 -kerning first=118 second=227 amount=-1 -kerning first=68 second=193 amount=-2 -kerning first=195 second=89 amount=-1 -kerning first=232 second=119 amount=-1 -kerning first=82 second=89 amount=-2 -kerning first=65 second=87 amount=-2 -kerning first=75 second=211 amount=-1 -kerning first=87 second=243 amount=-2 -kerning first=210 second=87 amount=-1 -kerning first=255 second=235 amount=-1 -kerning first=86 second=229 amount=-2 -kerning first=75 second=194 amount=1 -kerning first=193 second=71 amount=-1 -kerning first=242 second=118 amount=-1 -kerning first=253 second=245 amount=-1 -kerning first=248 second=89 amount=-5 -kerning first=255 second=111 amount=-1 -kerning first=67 second=216 amount=-1 -kerning first=84 second=213 amount=-1 -kerning first=86 second=196 amount=-4 -kerning first=84 second=198 amount=-2 -kerning first=87 second=65 amount=-2 -kerning first=118 second=225 amount=-1 -kerning first=221 second=248 amount=-5 -kerning first=86 second=233 amount=-3 -kerning first=234 second=89 amount=-5 -kerning first=212 second=87 amount=-1 -kerning first=248 second=119 amount=-1 -kerning first=253 second=235 amount=-1 -kerning first=244 second=118 amount=-1 -kerning first=89 second=198 amount=-1 -kerning first=199 second=213 amount=-1 -kerning first=121 second=242 amount=-1 -kerning first=86 second=97 amount=-2 -kerning first=119 second=248 amount=-1 -kerning first=253 second=111 amount=-1 -kerning first=84 second=79 amount=-1 -kerning first=89 second=232 amount=-5 -kerning first=221 second=234 amount=-5 -kerning first=192 second=89 amount=-1 -kerning first=234 second=119 amount=-1 -kerning first=89 second=246 amount=-5 -kerning first=233 second=89 amount=-5 -kerning first=75 second=197 amount=1 -kerning first=79 second=87 amount=-1 -kerning first=118 second=232 amount=-1 -kerning first=121 second=101 amount=-1 -kerning first=119 second=234 amount=-1 -kerning first=99 second=87 amount=-2 -kerning first=245 second=221 amount=-5 -kerning first=111 second=118 amount=-1 -kerning first=246 second=89 amount=-5 -kerning first=86 second=195 amount=-4 -kerning first=118 second=246 amount=-1 -kerning first=87 second=192 amount=-2 -kerning first=199 second=79 amount=-1 -kerning first=197 second=221 amount=-1 -kerning first=114 second=246 amount=-1 -kerning first=194 second=89 amount=-1 -kerning first=233 second=119 amount=-1 -kerning first=255 second=44 amount=-4 -kerning first=221 second=231 amount=-3 -kerning first=235 second=221 amount=-5 -kerning first=86 second=244 amount=-3 -kerning first=255 second=233 amount=-1 -kerning first=86 second=224 amount=-2 -kerning first=246 second=119 amount=-1 -kerning first=75 second=65 amount=1 -kerning first=230 second=87 amount=-2 -kerning first=243 second=89 amount=-5 -kerning first=67 second=210 amount=-1 -kerning first=245 second=86 amount=-3 -kerning first=86 second=193 amount=-4 -kerning first=89 second=245 amount=-5 -kerning first=193 second=89 amount=-1 -kerning first=253 second=44 amount=-4 -kerning first=197 second=86 amount=-4 -kerning first=221 second=242 amount=-5 -kerning first=235 second=86 amount=-3 -kerning first=253 second=233 amount=-1 -kerning first=243 second=119 amount=-1 -kerning first=118 second=245 amount=-1 -kerning first=242 second=221 amount=-5 -kerning first=87 second=198 amount=-2 -kerning first=121 second=243 amount=-1 -kerning first=221 second=194 amount=-1 -kerning first=119 second=242 amount=-1 -kerning first=68 second=194 amount=-2 -kerning first=114 second=245 amount=-1 -kerning first=255 second=46 amount=-4 -kerning first=89 second=235 amount=-5 -kerning first=87 second=232 amount=-2 -kerning first=196 second=221 amount=-1 -kerning first=221 second=101 amount=-5 -kerning first=86 second=248 amount=-3 -kerning first=75 second=214 amount=-1 -kerning first=101 second=221 amount=-5 -kerning first=89 second=111 amount=-5 -kerning first=87 second=246 amount=-2 -kerning first=232 second=87 amount=-2 -kerning first=231 second=89 amount=-5 -kerning first=195 second=84 amount=-3 -kerning first=86 second=230 amount=-2 -kerning first=75 second=192 amount=1 -kerning first=118 second=235 amount=-1 -kerning first=119 second=101 amount=-1 -kerning first=255 second=244 amount=-1 -kerning first=244 second=221 amount=-5 -kerning first=118 second=111 amount=-1 -kerning first=242 second=86 amount=-3 -kerning first=118 second=226 amount=-1 -kerning first=253 second=46 amount=-4 -kerning first=114 second=111 amount=-1 -kerning first=86 second=234 amount=-3 -kerning first=195 second=87 amount=-2 -kerning first=196 second=86 amount=-4 -kerning first=221 second=99 amount=-3 -kerning first=101 second=86 amount=-3 -kerning first=221 second=197 amount=-1 -kerning first=253 second=244 amount=-1 -kerning first=118 second=100 amount=-1 -kerning first=111 second=221 amount=-5 -kerning first=248 second=87 amount=-2 -kerning first=67 second=211 amount=-1 -kerning first=68 second=197 amount=-2 -kerning first=84 second=212 amount=-1 -kerning first=244 second=86 amount=-3 -kerning first=76 second=84 amount=-1 -kerning first=84 second=196 amount=-2 -kerning first=65 second=221 amount=-1 -kerning first=75 second=213 amount=-1 -kerning first=87 second=245 amount=-2 -kerning first=221 second=243 amount=-5 -kerning first=86 second=231 amount=-3 -kerning first=75 second=198 amount=1 -kerning first=234 second=87 amount=-2 -kerning first=197 second=71 amount=-1 -kerning first=192 second=84 amount=-3 -kerning first=255 second=248 amount=-1 -kerning first=89 second=196 amount=-1 -kerning first=199 second=212 amount=-1 -kerning first=221 second=65 amount=-1 -kerning first=119 second=243 amount=-1 -kerning first=118 second=229 amount=-1 -kerning first=111 second=86 amount=-3 -kerning first=68 second=65 amount=-2 -kerning first=89 second=233 amount=-5 -kerning first=87 second=235 amount=-2 -kerning first=192 second=87 amount=-2 -kerning first=118 second=44 amount=-4 -kerning first=65 second=86 amount=-4 -kerning first=86 second=242 amount=-3 -kerning first=75 second=79 amount=-1 -kerning first=87 second=111 amount=-2 -kerning first=233 second=87 amount=-2 -kerning first=194 second=84 amount=-3 -kerning first=253 second=248 amount=-1 -kerning first=255 second=234 amount=-1 -kerning first=118 second=233 amount=-1 -kerning first=84 second=216 amount=-1 -kerning first=246 second=87 amount=-2 -kerning first=86 second=194 amount=-4 -kerning first=84 second=195 amount=-2 -kerning first=118 second=97 amount=-1 -kerning first=86 second=101 amount=-3 -kerning first=194 second=87 amount=-2 -kerning first=216 second=87 amount=-1 -kerning first=99 second=221 amount=-5 -kerning first=121 second=232 amount=-1 -kerning first=253 second=234 amount=-1 -kerning first=196 second=71 amount=-1 -kerning first=248 second=118 amount=-1 -kerning first=193 second=84 amount=-3 -kerning first=89 second=195 amount=-1 -kerning first=199 second=216 amount=-1 -kerning first=121 second=246 amount=-1 -kerning first=221 second=192 amount=-1 -kerning first=243 second=87 amount=-2 -kerning first=68 second=192 amount=-2 -kerning first=84 second=193 amount=-2 -kerning first=118 second=46 amount=-4 -kerning first=89 second=244 amount=-5 -kerning first=193 second=87 amount=-2 -kerning first=86 second=99 amount=-3 -kerning first=230 second=221 amount=-5 -kerning first=99 second=86 amount=-3 -kerning first=255 second=242 amount=-1 -kerning first=245 second=89 amount=-5 -kerning first=86 second=197 amount=-4 -kerning first=89 second=193 amount=-1 -kerning first=87 second=196 amount=-2 -kerning first=118 second=244 amount=-1 -kerning first=118 second=224 amount=-1 -kerning first=197 second=89 amount=-1 -kerning first=114 second=244 amount=-1 -kerning first=87 second=233 amount=-2 -kerning first=235 second=89 amount=-5 -kerning first=86 second=243 amount=-3 -kerning first=214 second=87 amount=-1 -kerning first=245 second=119 amount=-1 -kerning first=255 second=101 amount=-1 -kerning first=231 second=87 amount=-2 -kerning first=246 second=118 amount=-1 -kerning first=65 second=71 amount=-1 -kerning first=86 second=228 amount=-2 -kerning first=221 second=198 amount=-1 -kerning first=121 second=245 amount=-1 -kerning first=230 second=86 amount=-3 -kerning first=253 second=242 amount=-1 -kerning first=67 second=214 amount=-1 -kerning first=68 second=198 amount=-2 -kerning first=84 second=210 amount=-1 -kerning first=86 second=65 amount=-4 -kerning first=221 second=232 amount=-5 -kerning first=235 second=119 amount=-1 -kerning first=89 second=248 amount=-5 -kerning first=232 second=221 amount=-5 -kerning first=221 second=246 amount=-5 -kerning first=211 second=87 amount=-1 -kerning first=121 second=235 amount=-1 -kerning first=119 second=232 amount=-1 -kerning first=253 second=101 amount=-1 -kerning first=243 second=118 amount=-1 -kerning first=118 second=248 amount=-1 -kerning first=242 second=89 amount=-5 -kerning first=87 second=195 amount=-2 -kerning first=199 second=210 amount=-1 -kerning first=121 second=111 amount=-1 -kerning first=119 second=246 amount=-1 -kerning first=118 second=230 amount=-1 -kerning first=114 second=248 amount=-1 -kerning first=195 second=221 amount=-1 -kerning first=89 second=234 amount=-5 -kerning first=196 second=89 amount=-1 -kerning first=82 second=221 amount=-2 -kerning first=75 second=212 amount=-1 -kerning first=101 second=89 amount=-5 -kerning first=87 second=244 amount=-2 -kerning first=232 second=86 amount=-3 -kerning first=86 second=227 amount=-2 -kerning first=75 second=196 amount=1 -kerning first=242 second=119 amount=-1 -kerning first=118 second=234 amount=-1 -kerning first=248 second=221 amount=-5 -kerning first=255 second=243 amount=-1 -kerning first=67 second=213 amount=-1 -kerning first=244 second=89 amount=-5 -kerning first=86 second=192 amount=-4 -kerning first=87 second=193 amount=-2 -kerning first=221 second=245 amount=-5 -kerning first=101 second=119 amount=-1 -kerning first=195 second=86 amount=-4 -kerning first=89 second=231 amount=-3 -kerning first=234 second=221 amount=-5 diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-42.png b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-42.png deleted file mode 100644 index 2153dbde..00000000 Binary files a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-42.png and /dev/null differ diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-64.fnt b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-64.fnt deleted file mode 100644 index f620a9b8..00000000 --- a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-64.fnt +++ /dev/null @@ -1,581 +0,0 @@ -info face="Metropolis Bold" size=64 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 -common lineHeight=65 base=51 scaleW=512 scaleH=512 pages=2 packed=0 -page id=0 file="Metropolis-Bold-641.png" -page id=1 file="Metropolis-Bold-642.png" -chars count=170 -char id=0 x=0 y=0 width=24 height=66 xoffset=4 yoffset=-1 xadvance=32 page=0 chnl=0 -char id=10 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 -char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=18 page=0 chnl=0 -char id=33 x=114 y=386 width=15 height=47 xoffset=2 yoffset=6 xadvance=20 page=0 chnl=0 -char id=34 x=103 y=479 width=29 height=22 xoffset=2 yoffset=6 xadvance=33 page=0 chnl=0 -char id=36 x=394 y=126 width=40 height=57 xoffset=0 yoffset=1 xadvance=41 page=0 chnl=0 -char id=37 x=43 y=338 width=52 height=48 xoffset=1 yoffset=5 xadvance=54 page=0 chnl=0 -char id=38 x=109 y=240 width=43 height=49 xoffset=0 yoffset=5 xadvance=43 page=0 chnl=0 -char id=39 x=132 y=479 width=13 height=22 xoffset=2 yoffset=6 xadvance=18 page=0 chnl=0 -char id=40 x=261 y=126 width=22 height=58 xoffset=2 yoffset=5 xadvance=25 page=0 chnl=0 -char id=41 x=283 y=126 width=22 height=58 xoffset=1 yoffset=5 xadvance=25 page=0 chnl=0 -char id=42 x=30 y=479 width=24 height=26 xoffset=1 yoffset=4 xadvance=25 page=0 chnl=0 -char id=44 x=88 y=479 width=15 height=23 xoffset=2 yoffset=39 xadvance=19 page=0 chnl=0 -char id=45 x=291 y=479 width=21 height=10 xoffset=1 yoffset=28 xadvance=23 page=0 chnl=0 -char id=46 x=190 y=479 width=15 height=14 xoffset=2 yoffset=39 xadvance=19 page=0 chnl=0 -char id=47 x=434 y=126 width=36 height=55 xoffset=-3 yoffset=2 xadvance=30 page=0 chnl=0 -char id=48 x=0 y=338 width=43 height=48 xoffset=1 yoffset=5 xadvance=45 page=0 chnl=0 -char id=50 x=40 y=386 width=37 height=47 xoffset=1 yoffset=5 xadvance=39 page=0 chnl=0 -char id=51 x=319 y=290 width=38 height=48 xoffset=0 yoffset=5 xadvance=39 page=0 chnl=0 -char id=53 x=77 y=386 width=37 height=47 xoffset=1 yoffset=6 xadvance=40 page=0 chnl=0 -char id=54 x=357 y=290 width=39 height=48 xoffset=1 yoffset=5 xadvance=41 page=0 chnl=0 -char id=56 x=396 y=290 width=38 height=48 xoffset=1 yoffset=5 xadvance=40 page=0 chnl=0 -char id=57 x=434 y=290 width=39 height=48 xoffset=1 yoffset=5 xadvance=41 page=0 chnl=0 -char id=58 x=495 y=433 width=15 height=37 xoffset=2 yoffset=16 xadvance=19 page=0 chnl=0 -char id=59 x=489 y=386 width=15 height=46 xoffset=2 yoffset=16 xadvance=19 page=0 chnl=0 -char id=61 x=54 y=479 width=34 height=25 xoffset=2 yoffset=17 xadvance=39 page=0 chnl=0 -char id=63 x=473 y=290 width=32 height=48 xoffset=0 yoffset=5 xadvance=32 page=0 chnl=0 -char id=64 x=34 y=185 width=54 height=53 xoffset=1 yoffset=7 xadvance=56 page=0 chnl=0 -char id=65 x=183 y=386 width=50 height=46 xoffset=-1 yoffset=6 xadvance=48 page=0 chnl=0 -char id=66 x=233 y=386 width=41 height=46 xoffset=3 yoffset=6 xadvance=45 page=0 chnl=0 -char id=67 x=412 y=240 width=44 height=48 xoffset=1 yoffset=5 xadvance=45 page=0 chnl=0 -char id=68 x=274 y=386 width=44 height=46 xoffset=3 yoffset=6 xadvance=49 page=0 chnl=0 -char id=69 x=318 y=386 width=37 height=46 xoffset=3 yoffset=6 xadvance=41 page=0 chnl=0 -char id=70 x=355 y=386 width=37 height=46 xoffset=3 yoffset=6 xadvance=41 page=0 chnl=0 -char id=71 x=456 y=240 width=44 height=48 xoffset=1 yoffset=5 xadvance=48 page=0 chnl=0 -char id=72 x=392 y=386 width=42 height=46 xoffset=3 yoffset=6 xadvance=48 page=0 chnl=0 -char id=73 x=434 y=386 width=12 height=46 xoffset=3 yoffset=6 xadvance=18 page=0 chnl=0 -char id=74 x=305 y=338 width=33 height=47 xoffset=-1 yoffset=6 xadvance=35 page=0 chnl=0 -char id=75 x=446 y=386 width=43 height=46 xoffset=3 yoffset=6 xadvance=45 page=0 chnl=0 -char id=76 x=0 y=433 width=34 height=46 xoffset=3 yoffset=6 xadvance=37 page=0 chnl=0 -char id=77 x=34 y=433 width=49 height=46 xoffset=3 yoffset=6 xadvance=55 page=0 chnl=0 -char id=78 x=83 y=433 width=43 height=46 xoffset=3 yoffset=6 xadvance=50 page=0 chnl=0 -char id=79 x=0 y=290 width=50 height=48 xoffset=1 yoffset=5 xadvance=52 page=0 chnl=0 -char id=80 x=126 y=433 width=39 height=46 xoffset=3 yoffset=6 xadvance=42 page=0 chnl=0 -char id=81 x=50 y=290 width=50 height=48 xoffset=1 yoffset=5 xadvance=52 page=0 chnl=0 -char id=82 x=165 y=433 width=40 height=46 xoffset=3 yoffset=6 xadvance=43 page=0 chnl=0 -char id=83 x=100 y=290 width=40 height=48 xoffset=0 yoffset=5 xadvance=41 page=0 chnl=0 -char id=84 x=205 y=433 width=39 height=46 xoffset=1 yoffset=6 xadvance=41 page=0 chnl=0 -char id=85 x=338 y=338 width=43 height=47 xoffset=3 yoffset=6 xadvance=48 page=0 chnl=0 -char id=86 x=244 y=433 width=50 height=46 xoffset=-1 yoffset=6 xadvance=48 page=0 chnl=0 -char id=87 x=294 y=433 width=69 height=46 xoffset=0 yoffset=6 xadvance=69 page=0 chnl=0 -char id=88 x=363 y=433 width=46 height=46 xoffset=0 yoffset=6 xadvance=46 page=0 chnl=0 -char id=89 x=409 y=433 width=47 height=46 xoffset=-1 yoffset=6 xadvance=44 page=0 chnl=0 -char id=90 x=456 y=433 width=39 height=46 xoffset=2 yoffset=6 xadvance=42 page=0 chnl=0 -char id=91 x=305 y=126 width=20 height=58 xoffset=3 yoffset=4 xadvance=25 page=0 chnl=0 -char id=92 x=470 y=126 width=36 height=55 xoffset=-2 yoffset=2 xadvance=30 page=0 chnl=0 -char id=93 x=325 y=126 width=21 height=58 xoffset=1 yoffset=4 xadvance=25 page=0 chnl=0 -char id=94 x=145 y=479 width=29 height=20 xoffset=1 yoffset=6 xadvance=31 page=0 chnl=0 -char id=95 x=312 y=479 width=41 height=8 xoffset=-2 yoffset=54 xadvance=38 page=0 chnl=0 -char id=96 x=230 y=479 width=18 height=12 xoffset=3 yoffset=3 xadvance=24 page=0 chnl=0 -char id=98 x=140 y=290 width=38 height=48 xoffset=3 yoffset=5 xadvance=42 page=0 chnl=0 -char id=100 x=178 y=290 width=39 height=48 xoffset=1 yoffset=5 xadvance=42 page=0 chnl=0 -char id=102 x=217 y=290 width=25 height=48 xoffset=0 yoffset=4 xadvance=24 page=0 chnl=0 -char id=103 x=381 y=338 width=38 height=47 xoffset=1 yoffset=16 xadvance=42 page=0 chnl=0 -char id=104 x=419 y=338 width=35 height=47 xoffset=2 yoffset=5 xadvance=39 page=0 chnl=0 -char id=105 x=88 y=185 width=13 height=50 xoffset=2 yoffset=2 xadvance=17 page=0 chnl=0 -char id=106 x=74 y=0 width=23 height=62 xoffset=-5 yoffset=2 xadvance=17 page=0 chnl=0 -char id=107 x=454 y=338 width=36 height=47 xoffset=2 yoffset=5 xadvance=37 page=0 chnl=0 -char id=108 x=490 y=338 width=12 height=47 xoffset=3 yoffset=5 xadvance=17 page=0 chnl=0 -char id=112 x=242 y=290 width=38 height=48 xoffset=3 yoffset=16 xadvance=42 page=0 chnl=0 -char id=113 x=280 y=290 width=39 height=48 xoffset=1 yoffset=16 xadvance=42 page=0 chnl=0 -char id=121 x=0 y=386 width=40 height=47 xoffset=-1 yoffset=17 xadvance=38 page=0 chnl=0 -char id=123 x=346 y=126 width=24 height=58 xoffset=1 yoffset=5 xadvance=26 page=0 chnl=0 -char id=124 x=500 y=66 width=9 height=55 xoffset=5 yoffset=2 xadvance=19 page=0 chnl=0 -char id=125 x=370 y=126 width=24 height=58 xoffset=1 yoffset=5 xadvance=26 page=0 chnl=0 -char id=126 x=205 y=479 width=25 height=13 xoffset=2 yoffset=21 xadvance=29 page=0 chnl=0 -char id=161 x=129 y=386 width=14 height=47 xoffset=3 yoffset=16 xadvance=20 page=0 chnl=0 -char id=163 x=143 y=386 width=40 height=47 xoffset=1 yoffset=5 xadvance=42 page=0 chnl=0 -char id=168 x=266 y=479 width=25 height=11 xoffset=3 yoffset=4 xadvance=31 page=0 chnl=0 -char id=175 x=353 y=479 width=25 height=8 xoffset=3 yoffset=7 xadvance=30 page=0 chnl=0 -char id=180 x=248 y=479 width=18 height=12 xoffset=3 yoffset=3 xadvance=24 page=0 chnl=0 -char id=184 x=174 y=479 width=16 height=16 xoffset=3 yoffset=49 xadvance=21 page=0 chnl=0 -char id=191 x=95 y=338 width=33 height=48 xoffset=0 yoffset=16 xadvance=32 page=0 chnl=0 -char id=192 x=423 y=0 width=50 height=60 xoffset=-1 yoffset=-8 xadvance=48 page=0 chnl=0 -char id=193 x=0 y=66 width=50 height=60 xoffset=-1 yoffset=-8 xadvance=48 page=0 chnl=0 -char id=194 x=400 y=66 width=50 height=59 xoffset=-1 yoffset=-7 xadvance=48 page=0 chnl=0 -char id=195 x=450 y=66 width=50 height=59 xoffset=-1 yoffset=-7 xadvance=48 page=0 chnl=0 -char id=196 x=0 y=126 width=50 height=59 xoffset=-1 yoffset=-7 xadvance=48 page=0 chnl=0 -char id=197 x=24 y=0 width=50 height=65 xoffset=-1 yoffset=-13 xadvance=48 page=0 chnl=0 -char id=199 x=50 y=66 width=44 height=60 xoffset=1 yoffset=5 xadvance=45 page=0 chnl=0 -char id=200 x=473 y=0 width=37 height=60 xoffset=3 yoffset=-8 xadvance=41 page=0 chnl=0 -char id=201 x=94 y=66 width=37 height=60 xoffset=3 yoffset=-8 xadvance=41 page=0 chnl=0 -char id=202 x=50 y=126 width=37 height=59 xoffset=3 yoffset=-7 xadvance=41 page=0 chnl=0 -char id=203 x=87 y=126 width=37 height=59 xoffset=3 yoffset=-7 xadvance=41 page=0 chnl=0 -char id=204 x=131 y=66 width=23 height=60 xoffset=-5 yoffset=-8 xadvance=18 page=0 chnl=0 -char id=205 x=154 y=66 width=23 height=60 xoffset=3 yoffset=-8 xadvance=18 page=0 chnl=0 -char id=206 x=124 y=126 width=26 height=59 xoffset=-3 yoffset=-7 xadvance=18 page=0 chnl=0 -char id=207 x=150 y=126 width=30 height=59 xoffset=-4 yoffset=-7 xadvance=18 page=0 chnl=0 -char id=209 x=180 y=126 width=43 height=59 xoffset=3 yoffset=-7 xadvance=50 page=0 chnl=0 -char id=210 x=97 y=0 width=50 height=61 xoffset=1 yoffset=-8 xadvance=52 page=0 chnl=0 -char id=211 x=147 y=0 width=50 height=61 xoffset=1 yoffset=-8 xadvance=52 page=0 chnl=0 -char id=212 x=197 y=0 width=50 height=61 xoffset=1 yoffset=-8 xadvance=52 page=0 chnl=0 -char id=213 x=247 y=0 width=50 height=61 xoffset=1 yoffset=-8 xadvance=52 page=0 chnl=0 -char id=214 x=177 y=66 width=50 height=60 xoffset=1 yoffset=-7 xadvance=52 page=0 chnl=0 -char id=215 x=0 y=479 width=30 height=30 xoffset=3 yoffset=15 xadvance=36 page=0 chnl=0 -char id=216 x=128 y=338 width=50 height=48 xoffset=1 yoffset=5 xadvance=52 page=0 chnl=0 -char id=217 x=297 y=0 width=43 height=61 xoffset=3 yoffset=-8 xadvance=48 page=0 chnl=0 -char id=218 x=340 y=0 width=43 height=61 xoffset=3 yoffset=-8 xadvance=48 page=0 chnl=0 -char id=219 x=227 y=66 width=43 height=60 xoffset=3 yoffset=-7 xadvance=48 page=0 chnl=0 -char id=220 x=270 y=66 width=43 height=60 xoffset=3 yoffset=-7 xadvance=48 page=0 chnl=0 -char id=221 x=313 y=66 width=47 height=60 xoffset=-1 yoffset=-8 xadvance=44 page=0 chnl=0 -char id=223 x=178 y=338 width=36 height=48 xoffset=3 yoffset=4 xadvance=39 page=0 chnl=0 -char id=224 x=101 y=185 width=34 height=50 xoffset=1 yoffset=3 xadvance=37 page=0 chnl=0 -char id=225 x=135 y=185 width=34 height=50 xoffset=1 yoffset=3 xadvance=37 page=0 chnl=0 -char id=226 x=169 y=185 width=34 height=50 xoffset=1 yoffset=3 xadvance=37 page=0 chnl=0 -char id=227 x=203 y=185 width=34 height=50 xoffset=1 yoffset=3 xadvance=37 page=0 chnl=0 -char id=228 x=152 y=240 width=34 height=49 xoffset=1 yoffset=4 xadvance=37 page=0 chnl=0 -char id=229 x=0 y=185 width=34 height=55 xoffset=1 yoffset=-2 xadvance=37 page=0 chnl=0 -char id=231 x=186 y=240 width=34 height=49 xoffset=1 yoffset=16 xadvance=35 page=0 chnl=0 -char id=232 x=237 y=185 width=36 height=50 xoffset=1 yoffset=3 xadvance=38 page=0 chnl=0 -char id=233 x=273 y=185 width=36 height=50 xoffset=1 yoffset=3 xadvance=38 page=0 chnl=0 -char id=234 x=309 y=185 width=36 height=50 xoffset=1 yoffset=3 xadvance=38 page=0 chnl=0 -char id=235 x=220 y=240 width=36 height=49 xoffset=1 yoffset=4 xadvance=38 page=0 chnl=0 -char id=236 x=256 y=240 width=23 height=49 xoffset=-5 yoffset=3 xadvance=17 page=0 chnl=0 -char id=237 x=279 y=240 width=24 height=49 xoffset=3 yoffset=3 xadvance=17 page=0 chnl=0 -char id=238 x=214 y=338 width=27 height=48 xoffset=-3 yoffset=4 xadvance=17 page=0 chnl=0 -char id=239 x=241 y=338 width=29 height=48 xoffset=-4 yoffset=4 xadvance=17 page=0 chnl=0 -char id=240 x=345 y=185 width=38 height=50 xoffset=1 yoffset=3 xadvance=40 page=0 chnl=0 -char id=241 x=270 y=338 width=35 height=48 xoffset=2 yoffset=4 xadvance=39 page=0 chnl=0 -char id=242 x=383 y=185 width=39 height=50 xoffset=1 yoffset=3 xadvance=41 page=0 chnl=0 -char id=243 x=422 y=185 width=39 height=50 xoffset=1 yoffset=3 xadvance=41 page=0 chnl=0 -char id=244 x=461 y=185 width=39 height=50 xoffset=1 yoffset=3 xadvance=41 page=0 chnl=0 -char id=245 x=0 y=240 width=39 height=50 xoffset=1 yoffset=3 xadvance=41 page=0 chnl=0 -char id=246 x=303 y=240 width=39 height=49 xoffset=1 yoffset=4 xadvance=41 page=0 chnl=0 -char id=249 x=39 y=240 width=35 height=50 xoffset=2 yoffset=3 xadvance=39 page=0 chnl=0 -char id=250 x=74 y=240 width=35 height=50 xoffset=2 yoffset=3 xadvance=39 page=0 chnl=0 -char id=251 x=342 y=240 width=35 height=49 xoffset=2 yoffset=4 xadvance=39 page=0 chnl=0 -char id=252 x=377 y=240 width=35 height=49 xoffset=2 yoffset=4 xadvance=39 page=0 chnl=0 -char id=253 x=383 y=0 width=40 height=61 xoffset=-1 yoffset=3 xadvance=38 page=0 chnl=0 -char id=254 x=223 y=126 width=38 height=59 xoffset=3 yoffset=5 xadvance=42 page=0 chnl=0 -char id=255 x=360 y=66 width=40 height=60 xoffset=-1 yoffset=4 xadvance=38 page=0 chnl=0 -char id=35 x=125 y=0 width=43 height=46 xoffset=0 yoffset=6 xadvance=43 page=1 chnl=0 -char id=43 x=70 y=83 width=34 height=34 xoffset=2 yoffset=13 xadvance=39 page=1 chnl=0 -char id=49 x=25 y=0 width=24 height=46 xoffset=-1 yoffset=6 xadvance=27 page=1 chnl=0 -char id=52 x=49 y=0 width=41 height=46 xoffset=0 yoffset=6 xadvance=41 page=1 chnl=0 -char id=55 x=90 y=0 width=35 height=46 xoffset=2 yoffset=6 xadvance=39 page=1 chnl=0 -char id=60 x=349 y=46 width=33 height=36 xoffset=2 yoffset=11 xadvance=38 page=1 chnl=0 -char id=62 x=382 y=46 width=33 height=36 xoffset=3 yoffset=11 xadvance=38 page=1 chnl=0 -char id=97 x=406 y=0 width=34 height=37 xoffset=1 yoffset=16 xadvance=37 page=1 chnl=0 -char id=99 x=440 y=0 width=34 height=37 xoffset=1 yoffset=16 xadvance=35 page=1 chnl=0 -char id=101 x=474 y=0 width=36 height=37 xoffset=1 yoffset=16 xadvance=38 page=1 chnl=0 -char id=109 x=201 y=46 width=55 height=36 xoffset=2 yoffset=16 xadvance=59 page=1 chnl=0 -char id=110 x=256 y=46 width=35 height=36 xoffset=2 yoffset=16 xadvance=39 page=1 chnl=0 -char id=111 x=0 y=46 width=39 height=37 xoffset=1 yoffset=16 xadvance=41 page=1 chnl=0 -char id=114 x=291 y=46 width=23 height=36 xoffset=3 yoffset=16 xadvance=26 page=1 chnl=0 -char id=115 x=39 y=46 width=31 height=37 xoffset=0 yoffset=16 xadvance=32 page=1 chnl=0 -char id=116 x=0 y=0 width=25 height=46 xoffset=0 yoffset=7 xadvance=25 page=1 chnl=0 -char id=117 x=314 y=46 width=35 height=36 xoffset=2 yoffset=17 xadvance=39 page=1 chnl=0 -char id=118 x=415 y=46 width=40 height=35 xoffset=-1 yoffset=17 xadvance=39 page=1 chnl=0 -char id=119 x=455 y=46 width=54 height=35 xoffset=0 yoffset=17 xadvance=54 page=1 chnl=0 -char id=120 x=0 y=83 width=38 height=35 xoffset=-1 yoffset=17 xadvance=36 page=1 chnl=0 -char id=122 x=38 y=83 width=32 height=35 xoffset=1 yoffset=17 xadvance=34 page=1 chnl=0 -char id=162 x=168 y=0 width=34 height=46 xoffset=1 yoffset=12 xadvance=35 page=1 chnl=0 -char id=165 x=202 y=0 width=47 height=46 xoffset=-1 yoffset=6 xadvance=44 page=1 chnl=0 -char id=198 x=249 y=0 width=69 height=46 xoffset=-1 yoffset=6 xadvance=69 page=1 chnl=0 -char id=208 x=318 y=0 width=49 height=46 xoffset=1 yoffset=6 xadvance=51 page=1 chnl=0 -char id=222 x=367 y=0 width=39 height=46 xoffset=3 yoffset=6 xadvance=42 page=1 chnl=0 -char id=230 x=70 y=46 width=58 height=37 xoffset=1 yoffset=16 xadvance=60 page=1 chnl=0 -char id=247 x=128 y=46 width=34 height=37 xoffset=2 yoffset=11 xadvance=39 page=1 chnl=0 -char id=248 x=162 y=46 width=39 height=37 xoffset=1 yoffset=16 xadvance=41 page=1 chnl=0 -kernings count=405 -kerning first=244 second=119 amount=-2 -kerning first=86 second=225 amount=-2 -kerning first=119 second=245 amount=-2 -kerning first=253 second=243 amount=-2 -kerning first=111 second=89 amount=-7 -kerning first=248 second=86 amount=-4 -kerning first=67 second=79 amount=-1 -kerning first=84 second=211 amount=-2 -kerning first=99 second=242 amount=-1 -kerning first=84 second=194 amount=-3 -kerning first=221 second=235 amount=-7 -kerning first=192 second=221 amount=-2 -kerning first=121 second=44 amount=-6 -kerning first=65 second=89 amount=-2 -kerning first=75 second=216 amount=-2 -kerning first=87 second=248 amount=-3 -kerning first=89 second=242 amount=-7 -kerning first=221 second=111 amount=-7 -kerning first=233 second=221 amount=-7 -kerning first=246 second=255 amount=-1 -kerning first=75 second=195 amount=2 -kerning first=234 second=86 amount=-4 -kerning first=121 second=233 amount=-1 -kerning first=119 second=235 amount=-2 -kerning first=111 second=119 amount=-2 -kerning first=76 second=86 amount=-7 -kerning first=246 second=221 amount=-7 -kerning first=86 second=198 amount=-6 -kerning first=118 second=242 amount=-2 -kerning first=89 second=194 amount=-1 -kerning first=92 second=92 amount=-8 -kerning first=199 second=211 amount=-1 -kerning first=119 second=111 amount=-2 -kerning first=114 second=242 amount=-1 -kerning first=86 second=232 amount=-4 -kerning first=194 second=221 amount=-2 -kerning first=89 second=101 amount=-7 -kerning first=87 second=234 amount=-3 -kerning first=192 second=86 amount=-6 -kerning first=86 second=246 amount=-4 -kerning first=243 second=255 amount=-1 -kerning first=248 second=121 amount=-1 -kerning first=233 second=86 amount=-4 -kerning first=197 second=84 amount=-4 -kerning first=92 second=47 amount=5 -kerning first=75 second=193 amount=2 -kerning first=118 second=101 amount=-2 -kerning first=243 second=221 amount=-7 -kerning first=245 second=87 amount=-3 -kerning first=246 second=86 amount=-4 -kerning first=84 second=197 amount=-3 -kerning first=121 second=46 amount=-6 -kerning first=193 second=221 amount=-2 -kerning first=197 second=87 amount=-3 -kerning first=194 second=86 amount=-6 -kerning first=89 second=99 amount=-4 -kerning first=87 second=231 amount=-3 -kerning first=235 second=87 amount=-3 -kerning first=195 second=71 amount=-1 -kerning first=99 second=89 amount=-7 -kerning first=89 second=197 amount=-1 -kerning first=121 second=244 amount=-2 -kerning first=221 second=196 amount=-1 -kerning first=243 second=86 amount=-4 -kerning first=68 second=196 amount=-3 -kerning first=99 second=243 amount=-1 -kerning first=84 second=65 amount=-3 -kerning first=221 second=233 amount=-7 -kerning first=86 second=245 amount=-4 -kerning first=119 second=44 amount=-5 -kerning first=75 second=210 amount=-2 -kerning first=89 second=243 amount=-7 -kerning first=193 second=86 amount=-6 -kerning first=87 second=242 amount=-3 -kerning first=231 second=221 amount=-7 -kerning first=246 second=121 amount=-1 -kerning first=245 second=253 amount=-1 -kerning first=230 second=89 amount=-7 -kerning first=255 second=232 amount=-1 -kerning first=196 second=84 amount=-4 -kerning first=119 second=233 amount=-2 -kerning first=255 second=246 amount=-2 -kerning first=89 second=65 amount=-1 -kerning first=118 second=243 amount=-2 -kerning first=242 second=87 amount=-3 -kerning first=87 second=194 amount=-3 -kerning first=231 second=244 amount=-1 -kerning first=118 second=228 amount=-2 -kerning first=114 second=243 amount=-1 -kerning first=86 second=235 amount=-4 -kerning first=87 second=101 amount=-3 -kerning first=196 second=87 amount=-3 -kerning first=230 second=119 amount=-2 -kerning first=213 second=87 amount=-1 -kerning first=86 second=111 amount=-4 -kerning first=101 second=87 amount=-3 -kerning first=243 second=121 amount=-1 -kerning first=192 second=71 amount=-1 -kerning first=245 second=118 amount=-2 -kerning first=231 second=86 amount=-4 -kerning first=253 second=232 amount=-1 -kerning first=121 second=248 amount=-2 -kerning first=86 second=226 amount=-2 -kerning first=221 second=195 amount=-1 -kerning first=253 second=246 amount=-2 -kerning first=67 second=212 amount=-1 -kerning first=68 second=195 amount=-3 -kerning first=84 second=214 amount=-2 -kerning first=244 second=87 amount=-3 -kerning first=84 second=192 amount=-3 -kerning first=232 second=89 amount=-7 -kerning first=119 second=46 amount=-5 -kerning first=221 second=244 amount=-7 -kerning first=47 second=47 amount=-8 -kerning first=87 second=99 amount=-3 -kerning first=242 second=253 amount=-1 -kerning first=121 second=234 amount=-1 -kerning first=194 second=71 amount=-1 -kerning first=65 second=84 amount=-4 -kerning first=255 second=245 amount=-2 -kerning first=89 second=192 amount=-1 -kerning first=87 second=197 amount=-3 -kerning first=199 second=214 amount=-1 -kerning first=119 second=244 amount=-2 -kerning first=221 second=193 amount=-1 -kerning first=231 second=248 amount=-1 -kerning first=111 second=87 amount=-3 -kerning first=118 second=227 amount=-2 -kerning first=68 second=193 amount=-3 -kerning first=195 second=89 amount=-2 -kerning first=232 second=119 amount=-2 -kerning first=82 second=89 amount=-2 -kerning first=65 second=87 amount=-3 -kerning first=75 second=211 amount=-2 -kerning first=87 second=243 amount=-3 -kerning first=210 second=87 amount=-1 -kerning first=244 second=253 amount=-1 -kerning first=86 second=229 amount=-2 -kerning first=75 second=194 amount=2 -kerning first=193 second=71 amount=-1 -kerning first=242 second=118 amount=-2 -kerning first=253 second=245 amount=-2 -kerning first=255 second=235 amount=-1 -kerning first=248 second=89 amount=-7 -kerning first=255 second=111 amount=-2 -kerning first=67 second=216 amount=-1 -kerning first=84 second=213 amount=-2 -kerning first=86 second=196 amount=-6 -kerning first=84 second=198 amount=-3 -kerning first=87 second=65 amount=-3 -kerning first=118 second=225 amount=-2 -kerning first=221 second=248 amount=-7 -kerning first=86 second=233 amount=-4 -kerning first=234 second=89 amount=-7 -kerning first=212 second=87 amount=-1 -kerning first=111 second=253 amount=-1 -kerning first=248 second=119 amount=-2 -kerning first=253 second=235 amount=-1 -kerning first=244 second=118 amount=-2 -kerning first=89 second=198 amount=-1 -kerning first=199 second=213 amount=-1 -kerning first=121 second=242 amount=-2 -kerning first=86 second=97 amount=-2 -kerning first=119 second=248 amount=-2 -kerning first=253 second=111 amount=-2 -kerning first=84 second=79 amount=-2 -kerning first=99 second=246 amount=-1 -kerning first=89 second=232 amount=-7 -kerning first=221 second=234 amount=-7 -kerning first=192 second=89 amount=-2 -kerning first=234 second=119 amount=-2 -kerning first=89 second=246 amount=-7 -kerning first=233 second=89 amount=-7 -kerning first=245 second=255 amount=-1 -kerning first=75 second=197 amount=2 -kerning first=79 second=87 amount=-1 -kerning first=118 second=232 amount=-2 -kerning first=121 second=101 amount=-1 -kerning first=119 second=234 amount=-2 -kerning first=99 second=87 amount=-3 -kerning first=245 second=221 amount=-7 -kerning first=111 second=118 amount=-2 -kerning first=246 second=89 amount=-7 -kerning first=86 second=195 amount=-6 -kerning first=118 second=246 amount=-2 -kerning first=87 second=192 amount=-3 -kerning first=199 second=79 amount=-1 -kerning first=231 second=242 amount=-1 -kerning first=197 second=221 amount=-2 -kerning first=114 second=246 amount=-1 -kerning first=194 second=89 amount=-2 -kerning first=233 second=119 amount=-2 -kerning first=255 second=44 amount=-6 -kerning first=221 second=231 amount=-4 -kerning first=235 second=221 amount=-7 -kerning first=86 second=244 amount=-4 -kerning first=255 second=233 amount=-1 -kerning first=86 second=224 amount=-2 -kerning first=246 second=119 amount=-2 -kerning first=75 second=65 amount=2 -kerning first=230 second=87 amount=-3 -kerning first=243 second=89 amount=-7 -kerning first=67 second=210 amount=-1 -kerning first=245 second=86 amount=-4 -kerning first=99 second=245 amount=-1 -kerning first=86 second=193 amount=-6 -kerning first=89 second=245 amount=-7 -kerning first=193 second=89 amount=-2 -kerning first=253 second=44 amount=-6 -kerning first=197 second=86 amount=-6 -kerning first=221 second=242 amount=-7 -kerning first=242 second=255 amount=-1 -kerning first=235 second=86 amount=-4 -kerning first=253 second=233 amount=-1 -kerning first=243 second=119 amount=-2 -kerning first=118 second=245 amount=-2 -kerning first=242 second=221 amount=-7 -kerning first=87 second=198 amount=-3 -kerning first=121 second=243 amount=-2 -kerning first=221 second=194 amount=-1 -kerning first=119 second=242 amount=-2 -kerning first=68 second=194 amount=-3 -kerning first=114 second=245 amount=-1 -kerning first=99 second=111 amount=-1 -kerning first=255 second=46 amount=-6 -kerning first=89 second=235 amount=-7 -kerning first=87 second=232 amount=-3 -kerning first=196 second=221 amount=-2 -kerning first=221 second=101 amount=-7 -kerning first=86 second=248 amount=-4 -kerning first=75 second=214 amount=-2 -kerning first=101 second=221 amount=-7 -kerning first=89 second=111 amount=-7 -kerning first=87 second=246 amount=-3 -kerning first=232 second=87 amount=-3 -kerning first=244 second=255 amount=-1 -kerning first=231 second=89 amount=-7 -kerning first=245 second=121 amount=-1 -kerning first=195 second=84 amount=-4 -kerning first=86 second=230 amount=-2 -kerning first=75 second=192 amount=2 -kerning first=118 second=235 amount=-2 -kerning first=119 second=101 amount=-2 -kerning first=255 second=244 amount=-2 -kerning first=244 second=221 amount=-7 -kerning first=118 second=111 amount=-2 -kerning first=242 second=86 amount=-4 -kerning first=231 second=243 amount=-1 -kerning first=118 second=226 amount=-2 -kerning first=253 second=46 amount=-6 -kerning first=114 second=111 amount=-1 -kerning first=86 second=234 amount=-4 -kerning first=195 second=87 amount=-3 -kerning first=196 second=86 amount=-6 -kerning first=221 second=99 amount=-4 -kerning first=111 second=255 amount=-1 -kerning first=101 second=86 amount=-4 -kerning first=221 second=197 amount=-1 -kerning first=253 second=244 amount=-2 -kerning first=118 second=100 amount=-1 -kerning first=111 second=221 amount=-7 -kerning first=248 second=87 amount=-3 -kerning first=67 second=211 amount=-1 -kerning first=68 second=197 amount=-3 -kerning first=84 second=212 amount=-2 -kerning first=244 second=86 amount=-4 -kerning first=76 second=84 amount=-1 -kerning first=84 second=196 amount=-3 -kerning first=65 second=221 amount=-2 -kerning first=75 second=213 amount=-2 -kerning first=87 second=245 amount=-3 -kerning first=221 second=243 amount=-7 -kerning first=86 second=231 amount=-4 -kerning first=75 second=198 amount=2 -kerning first=242 second=121 amount=-1 -kerning first=234 second=87 amount=-3 -kerning first=197 second=71 amount=-1 -kerning first=192 second=84 amount=-4 -kerning first=255 second=248 amount=-2 -kerning first=89 second=196 amount=-1 -kerning first=199 second=212 amount=-1 -kerning first=221 second=65 amount=-1 -kerning first=119 second=243 amount=-2 -kerning first=118 second=229 amount=-2 -kerning first=111 second=86 amount=-4 -kerning first=68 second=65 amount=-3 -kerning first=89 second=233 amount=-7 -kerning first=87 second=235 amount=-3 -kerning first=192 second=87 amount=-3 -kerning first=118 second=44 amount=-6 -kerning first=65 second=86 amount=-6 -kerning first=86 second=242 amount=-4 -kerning first=75 second=79 amount=-2 -kerning first=87 second=111 amount=-3 -kerning first=233 second=87 amount=-3 -kerning first=244 second=121 amount=-1 -kerning first=248 second=253 amount=-1 -kerning first=194 second=84 amount=-4 -kerning first=253 second=248 amount=-2 -kerning first=118 second=233 amount=-2 -kerning first=255 second=234 amount=-1 -kerning first=84 second=216 amount=-2 -kerning first=246 second=87 amount=-3 -kerning first=86 second=194 amount=-6 -kerning first=84 second=195 amount=-3 -kerning first=118 second=97 amount=-2 -kerning first=86 second=101 amount=-4 -kerning first=194 second=87 amount=-3 -kerning first=216 second=87 amount=-1 -kerning first=99 second=221 amount=-7 -kerning first=121 second=232 amount=-1 -kerning first=111 second=121 amount=-1 -kerning first=253 second=234 amount=-1 -kerning first=196 second=71 amount=-1 -kerning first=248 second=118 amount=-2 -kerning first=193 second=84 amount=-4 -kerning first=89 second=195 amount=-1 -kerning first=199 second=216 amount=-1 -kerning first=121 second=246 amount=-2 -kerning first=221 second=192 amount=-1 -kerning first=243 second=87 amount=-3 -kerning first=68 second=192 amount=-3 -kerning first=99 second=244 amount=-1 -kerning first=84 second=193 amount=-3 -kerning first=118 second=46 amount=-6 -kerning first=89 second=244 amount=-7 -kerning first=193 second=87 amount=-3 -kerning first=246 second=253 amount=-1 -kerning first=86 second=99 amount=-4 -kerning first=230 second=221 amount=-7 -kerning first=99 second=86 amount=-4 -kerning first=255 second=242 amount=-2 -kerning first=245 second=89 amount=-7 -kerning first=86 second=197 amount=-6 -kerning first=89 second=193 amount=-1 -kerning first=87 second=196 amount=-3 -kerning first=118 second=244 amount=-2 -kerning first=231 second=246 amount=-1 -kerning first=118 second=224 amount=-2 -kerning first=197 second=89 amount=-2 -kerning first=114 second=244 amount=-1 -kerning first=87 second=233 amount=-3 -kerning first=235 second=89 amount=-7 -kerning first=86 second=243 amount=-4 -kerning first=214 second=87 amount=-1 -kerning first=245 second=119 amount=-2 -kerning first=243 second=253 amount=-1 -kerning first=231 second=87 amount=-3 -kerning first=255 second=101 amount=-1 -kerning first=246 second=118 amount=-2 -kerning first=65 second=71 amount=-1 -kerning first=86 second=228 amount=-2 -kerning first=221 second=198 amount=-1 -kerning first=121 second=245 amount=-2 -kerning first=230 second=86 amount=-4 -kerning first=253 second=242 amount=-2 -kerning first=67 second=214 amount=-1 -kerning first=68 second=198 amount=-3 -kerning first=84 second=210 amount=-2 -kerning first=99 second=248 amount=-1 -kerning first=86 second=65 amount=-6 -kerning first=221 second=232 amount=-7 -kerning first=235 second=119 amount=-2 -kerning first=89 second=248 amount=-7 -kerning first=232 second=221 amount=-7 -kerning first=221 second=246 amount=-7 -kerning first=211 second=87 amount=-1 -kerning first=121 second=235 amount=-1 -kerning first=119 second=232 amount=-2 -kerning first=253 second=101 amount=-1 -kerning first=243 second=118 amount=-2 -kerning first=118 second=248 amount=-2 -kerning first=242 second=89 amount=-7 -kerning first=87 second=195 amount=-3 -kerning first=199 second=210 amount=-1 -kerning first=121 second=111 amount=-2 -kerning first=119 second=246 amount=-2 -kerning first=231 second=245 amount=-1 -kerning first=118 second=230 amount=-2 -kerning first=114 second=248 amount=-1 -kerning first=195 second=221 amount=-2 -kerning first=89 second=234 amount=-7 -kerning first=196 second=89 amount=-2 -kerning first=82 second=221 amount=-2 -kerning first=75 second=212 amount=-2 -kerning first=101 second=89 amount=-7 -kerning first=87 second=244 amount=-3 -kerning first=232 second=86 amount=-4 -kerning first=248 second=255 amount=-1 -kerning first=86 second=227 amount=-2 -kerning first=75 second=196 amount=2 -kerning first=242 second=119 amount=-2 -kerning first=118 second=234 amount=-2 -kerning first=248 second=221 amount=-7 -kerning first=255 second=243 amount=-2 -kerning first=67 second=213 amount=-1 -kerning first=244 second=89 amount=-7 -kerning first=86 second=192 amount=-6 -kerning first=87 second=193 amount=-3 -kerning first=231 second=111 amount=-1 -kerning first=221 second=245 amount=-7 -kerning first=101 second=119 amount=-2 -kerning first=195 second=86 amount=-6 -kerning first=89 second=231 amount=-4 -kerning first=234 second=221 amount=-7 diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-641.png b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-641.png deleted file mode 100644 index 401a166d..00000000 Binary files a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-641.png and /dev/null differ diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-642.png b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-642.png deleted file mode 100644 index 03e18bec..00000000 Binary files a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Bold-642.png and /dev/null differ diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Regular-32.fnt b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Regular-32.fnt deleted file mode 100644 index b8b6f30d..00000000 --- a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Regular-32.fnt +++ /dev/null @@ -1,550 +0,0 @@ -info face="Metropolis-Regular" size=32 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 -common lineHeight=33 base=26 scaleW=512 scaleH=512 pages=1 packed=0 -page id=0 file="Metropolis-Regular-32.png" -chars count=170 -char id=0 x=0 y=0 width=14 height=35 xoffset=1 yoffset=-1 xadvance=16 page=0 chnl=0 -char id=10 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 -char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=9 page=0 chnl=0 -char id=33 x=494 y=91 width=7 height=24 xoffset=1 yoffset=3 xadvance=9 page=0 chnl=0 -char id=34 x=353 y=139 width=11 height=10 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0 -char id=35 x=158 y=115 width=22 height=24 xoffset=0 yoffset=3 xadvance=22 page=0 chnl=0 -char id=36 x=212 y=35 width=19 height=29 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=37 x=133 y=115 width=25 height=24 xoffset=0 yoffset=3 xadvance=25 page=0 chnl=0 -char id=38 x=180 y=115 width=22 height=24 xoffset=0 yoffset=3 xadvance=21 page=0 chnl=0 -char id=39 x=364 y=139 width=6 height=10 xoffset=1 yoffset=3 xadvance=7 page=0 chnl=0 -char id=40 x=449 y=0 width=11 height=30 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 -char id=41 x=460 y=0 width=11 height=30 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 -char id=42 x=308 y=139 width=13 height=14 xoffset=0 yoffset=2 xadvance=13 page=0 chnl=0 -char id=43 x=259 y=139 width=17 height=18 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=0 -char id=44 x=370 y=139 width=7 height=10 xoffset=1 yoffset=21 xadvance=8 page=0 chnl=0 -char id=45 x=423 y=139 width=12 height=5 xoffset=0 yoffset=15 xadvance=12 page=0 chnl=0 -char id=46 x=417 y=139 width=6 height=6 xoffset=1 yoffset=21 xadvance=8 page=0 chnl=0 -char id=47 x=178 y=35 width=17 height=29 xoffset=-2 yoffset=1 xadvance=13 page=0 chnl=0 -char id=48 x=94 y=115 width=22 height=24 xoffset=0 yoffset=3 xadvance=22 page=0 chnl=0 -char id=49 x=427 y=91 width=11 height=24 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 -char id=50 x=438 y=91 width=18 height=24 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=0 -char id=51 x=456 y=91 width=18 height=24 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=0 -char id=52 x=474 y=91 width=20 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=53 x=0 y=115 width=19 height=24 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=0 -char id=54 x=19 y=115 width=19 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=55 x=38 y=115 width=18 height=24 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=0 -char id=56 x=56 y=115 width=19 height=24 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=0 -char id=57 x=75 y=115 width=19 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=58 x=504 y=115 width=6 height=19 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=0 -char id=59 x=501 y=91 width=7 height=23 xoffset=1 yoffset=8 xadvance=8 page=0 chnl=0 -char id=60 x=173 y=139 width=18 height=19 xoffset=0 yoffset=6 xadvance=19 page=0 chnl=0 -char id=61 x=321 y=139 width=17 height=12 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=0 -char id=62 x=191 y=139 width=17 height=19 xoffset=1 yoffset=6 xadvance=19 page=0 chnl=0 -char id=63 x=116 y=115 width=17 height=24 xoffset=-1 yoffset=3 xadvance=16 page=0 chnl=0 -char id=64 x=257 y=35 width=28 height=28 xoffset=0 yoffset=3 xadvance=28 page=0 chnl=0 -char id=65 x=312 y=65 width=25 height=24 xoffset=0 yoffset=3 xadvance=24 page=0 chnl=0 -char id=66 x=337 y=65 width=19 height=24 xoffset=2 yoffset=3 xadvance=22 page=0 chnl=0 -char id=67 x=356 y=65 width=22 height=24 xoffset=0 yoffset=3 xadvance=22 page=0 chnl=0 -char id=68 x=378 y=65 width=22 height=24 xoffset=2 yoffset=3 xadvance=24 page=0 chnl=0 -char id=69 x=400 y=65 width=19 height=24 xoffset=1 yoffset=3 xadvance=20 page=0 chnl=0 -char id=70 x=419 y=65 width=19 height=24 xoffset=1 yoffset=3 xadvance=19 page=0 chnl=0 -char id=71 x=438 y=65 width=23 height=24 xoffset=0 yoffset=3 xadvance=24 page=0 chnl=0 -char id=72 x=461 y=65 width=21 height=24 xoffset=1 yoffset=3 xadvance=23 page=0 chnl=0 -char id=73 x=482 y=65 width=6 height=24 xoffset=1 yoffset=3 xadvance=8 page=0 chnl=0 -char id=74 x=488 y=65 width=17 height=24 xoffset=-1 yoffset=3 xadvance=17 page=0 chnl=0 -char id=75 x=0 y=91 width=21 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=76 x=21 y=91 width=17 height=24 xoffset=1 yoffset=3 xadvance=18 page=0 chnl=0 -char id=77 x=38 y=91 width=24 height=24 xoffset=2 yoffset=3 xadvance=27 page=0 chnl=0 -char id=78 x=62 y=91 width=21 height=24 xoffset=2 yoffset=3 xadvance=25 page=0 chnl=0 -char id=79 x=83 y=91 width=26 height=24 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=80 x=109 y=91 width=20 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=81 x=129 y=91 width=26 height=24 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=82 x=155 y=91 width=20 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=83 x=17 y=65 width=19 height=25 xoffset=0 yoffset=2 xadvance=20 page=0 chnl=0 -char id=84 x=175 y=91 width=20 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=85 x=195 y=91 width=22 height=24 xoffset=1 yoffset=3 xadvance=24 page=0 chnl=0 -char id=86 x=217 y=91 width=25 height=24 xoffset=0 yoffset=3 xadvance=24 page=0 chnl=0 -char id=87 x=242 y=91 width=35 height=24 xoffset=0 yoffset=3 xadvance=35 page=0 chnl=0 -char id=88 x=277 y=91 width=23 height=24 xoffset=0 yoffset=3 xadvance=22 page=0 chnl=0 -char id=89 x=300 y=91 width=23 height=24 xoffset=-1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=90 x=323 y=91 width=20 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=91 x=471 y=0 width=11 height=30 xoffset=1 yoffset=1 xadvance=12 page=0 chnl=0 -char id=92 x=195 y=35 width=17 height=29 xoffset=-2 yoffset=1 xadvance=13 page=0 chnl=0 -char id=93 x=482 y=0 width=11 height=30 xoffset=0 yoffset=1 xadvance=12 page=0 chnl=0 -char id=94 x=338 y=139 width=15 height=11 xoffset=0 yoffset=3 xadvance=16 page=0 chnl=0 -char id=95 x=435 y=139 width=22 height=5 xoffset=-2 yoffset=27 xadvance=19 page=0 chnl=0 -char id=96 x=385 y=139 width=9 height=7 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=0 -char id=97 x=433 y=115 width=17 height=19 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 -char id=98 x=343 y=91 width=19 height=24 xoffset=1 yoffset=3 xadvance=20 page=0 chnl=0 -char id=99 x=450 y=115 width=18 height=19 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=0 -char id=100 x=362 y=91 width=19 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=101 x=468 y=115 width=19 height=19 xoffset=0 yoffset=8 xadvance=19 page=0 chnl=0 -char id=102 x=36 y=65 width=12 height=25 xoffset=0 yoffset=2 xadvance=11 page=0 chnl=0 -char id=103 x=48 y=65 width=19 height=25 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=104 x=381 y=91 width=17 height=24 xoffset=1 yoffset=3 xadvance=19 page=0 chnl=0 -char id=105 x=302 y=35 width=6 height=26 xoffset=1 yoffset=1 xadvance=7 page=0 chnl=0 -char id=106 x=39 y=0 width=11 height=32 xoffset=-3 yoffset=1 xadvance=7 page=0 chnl=0 -char id=107 x=398 y=91 width=17 height=24 xoffset=1 yoffset=3 xadvance=17 page=0 chnl=0 -char id=108 x=505 y=65 width=5 height=24 xoffset=1 yoffset=3 xadvance=7 page=0 chnl=0 -char id=109 x=0 y=139 width=27 height=19 xoffset=1 yoffset=8 xadvance=29 page=0 chnl=0 -char id=110 x=487 y=115 width=17 height=19 xoffset=1 yoffset=8 xadvance=19 page=0 chnl=0 -char id=111 x=27 y=139 width=20 height=19 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=112 x=67 y=65 width=19 height=25 xoffset=1 yoffset=8 xadvance=20 page=0 chnl=0 -char id=113 x=86 y=65 width=19 height=25 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=114 x=47 y=139 width=12 height=19 xoffset=1 yoffset=8 xadvance=12 page=0 chnl=0 -char id=115 x=59 y=139 width=16 height=19 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 -char id=116 x=415 y=91 width=12 height=24 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 -char id=117 x=75 y=139 width=17 height=19 xoffset=1 yoffset=8 xadvance=19 page=0 chnl=0 -char id=118 x=92 y=139 width=20 height=19 xoffset=-1 yoffset=8 xadvance=18 page=0 chnl=0 -char id=119 x=112 y=139 width=27 height=19 xoffset=0 yoffset=8 xadvance=27 page=0 chnl=0 -char id=120 x=139 y=139 width=18 height=19 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 -char id=121 x=105 y=65 width=20 height=25 xoffset=-1 yoffset=8 xadvance=19 page=0 chnl=0 -char id=122 x=157 y=139 width=16 height=19 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 -char id=123 x=493 y=0 width=13 height=30 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 -char id=124 x=506 y=0 width=5 height=29 xoffset=2 yoffset=1 xadvance=9 page=0 chnl=0 -char id=125 x=0 y=35 width=13 height=30 xoffset=0 yoffset=3 xadvance=13 page=0 chnl=0 -char id=126 x=394 y=139 width=14 height=7 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=0 -char id=161 x=125 y=65 width=7 height=25 xoffset=1 yoffset=8 xadvance=9 page=0 chnl=0 -char id=162 x=132 y=65 width=18 height=25 xoffset=0 yoffset=5 xadvance=17 page=0 chnl=0 -char id=163 x=202 y=115 width=20 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=165 x=222 y=115 width=23 height=24 xoffset=-1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=168 x=457 y=139 width=12 height=5 xoffset=1 yoffset=3 xadvance=13 page=0 chnl=0 -char id=175 x=469 y=139 width=12 height=4 xoffset=1 yoffset=4 xadvance=14 page=0 chnl=0 -char id=180 x=408 y=139 width=9 height=7 xoffset=1 yoffset=2 xadvance=10 page=0 chnl=0 -char id=184 x=377 y=139 width=8 height=9 xoffset=1 yoffset=24 xadvance=10 page=0 chnl=0 -char id=191 x=150 y=65 width=17 height=25 xoffset=0 yoffset=8 xadvance=16 page=0 chnl=0 -char id=192 x=70 y=0 width=25 height=31 xoffset=0 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=193 x=95 y=0 width=25 height=31 xoffset=0 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=194 x=120 y=0 width=25 height=31 xoffset=0 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=195 x=145 y=0 width=25 height=31 xoffset=0 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=196 x=13 y=35 width=25 height=30 xoffset=0 yoffset=-3 xadvance=24 page=0 chnl=0 -char id=197 x=14 y=0 width=25 height=33 xoffset=0 yoffset=-6 xadvance=24 page=0 chnl=0 -char id=198 x=245 y=115 width=32 height=24 xoffset=0 yoffset=3 xadvance=33 page=0 chnl=0 -char id=199 x=38 y=35 width=22 height=30 xoffset=0 yoffset=3 xadvance=22 page=0 chnl=0 -char id=200 x=170 y=0 width=19 height=31 xoffset=1 yoffset=-4 xadvance=20 page=0 chnl=0 -char id=201 x=189 y=0 width=19 height=31 xoffset=1 yoffset=-4 xadvance=20 page=0 chnl=0 -char id=202 x=208 y=0 width=19 height=31 xoffset=1 yoffset=-4 xadvance=20 page=0 chnl=0 -char id=203 x=60 y=35 width=19 height=30 xoffset=1 yoffset=-3 xadvance=20 page=0 chnl=0 -char id=204 x=227 y=0 width=11 height=31 xoffset=-3 yoffset=-4 xadvance=8 page=0 chnl=0 -char id=205 x=238 y=0 width=11 height=31 xoffset=1 yoffset=-4 xadvance=8 page=0 chnl=0 -char id=206 x=249 y=0 width=12 height=31 xoffset=-2 yoffset=-4 xadvance=8 page=0 chnl=0 -char id=207 x=79 y=35 width=12 height=30 xoffset=-2 yoffset=-3 xadvance=8 page=0 chnl=0 -char id=208 x=277 y=115 width=24 height=24 xoffset=0 yoffset=3 xadvance=25 page=0 chnl=0 -char id=209 x=261 y=0 width=21 height=31 xoffset=2 yoffset=-4 xadvance=25 page=0 chnl=0 -char id=210 x=282 y=0 width=26 height=31 xoffset=0 yoffset=-4 xadvance=26 page=0 chnl=0 -char id=211 x=308 y=0 width=26 height=31 xoffset=0 yoffset=-4 xadvance=26 page=0 chnl=0 -char id=212 x=91 y=35 width=26 height=30 xoffset=0 yoffset=-3 xadvance=26 page=0 chnl=0 -char id=213 x=334 y=0 width=26 height=31 xoffset=0 yoffset=-4 xadvance=26 page=0 chnl=0 -char id=214 x=231 y=35 width=26 height=29 xoffset=0 yoffset=-2 xadvance=26 page=0 chnl=0 -char id=215 x=293 y=139 width=15 height=15 xoffset=1 yoffset=8 xadvance=17 page=0 chnl=0 -char id=216 x=301 y=115 width=26 height=24 xoffset=0 yoffset=3 xadvance=26 page=0 chnl=0 -char id=217 x=360 y=0 width=22 height=31 xoffset=1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=218 x=382 y=0 width=22 height=31 xoffset=1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=219 x=404 y=0 width=22 height=31 xoffset=1 yoffset=-4 xadvance=24 page=0 chnl=0 -char id=220 x=117 y=35 width=22 height=30 xoffset=1 yoffset=-3 xadvance=24 page=0 chnl=0 -char id=221 x=426 y=0 width=23 height=31 xoffset=-1 yoffset=-4 xadvance=21 page=0 chnl=0 -char id=222 x=327 y=115 width=20 height=24 xoffset=1 yoffset=3 xadvance=21 page=0 chnl=0 -char id=223 x=167 y=65 width=17 height=25 xoffset=1 yoffset=2 xadvance=18 page=0 chnl=0 -char id=224 x=308 y=35 width=17 height=26 xoffset=0 yoffset=1 xadvance=18 page=0 chnl=0 -char id=225 x=325 y=35 width=17 height=26 xoffset=0 yoffset=1 xadvance=18 page=0 chnl=0 -char id=226 x=184 y=65 width=17 height=25 xoffset=0 yoffset=2 xadvance=18 page=0 chnl=0 -char id=227 x=201 y=65 width=17 height=25 xoffset=0 yoffset=2 xadvance=18 page=0 chnl=0 -char id=228 x=347 y=115 width=17 height=24 xoffset=0 yoffset=3 xadvance=18 page=0 chnl=0 -char id=229 x=285 y=35 width=17 height=28 xoffset=0 yoffset=-1 xadvance=18 page=0 chnl=0 -char id=230 x=208 y=139 width=31 height=19 xoffset=0 yoffset=8 xadvance=31 page=0 chnl=0 -char id=231 x=218 y=65 width=18 height=25 xoffset=0 yoffset=8 xadvance=17 page=0 chnl=0 -char id=232 x=342 y=35 width=19 height=26 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=0 -char id=233 x=361 y=35 width=19 height=26 xoffset=0 yoffset=1 xadvance=19 page=0 chnl=0 -char id=234 x=236 y=65 width=19 height=25 xoffset=0 yoffset=2 xadvance=19 page=0 chnl=0 -char id=235 x=364 y=115 width=19 height=24 xoffset=0 yoffset=3 xadvance=19 page=0 chnl=0 -char id=236 x=380 y=35 width=10 height=26 xoffset=-3 yoffset=1 xadvance=7 page=0 chnl=0 -char id=237 x=390 y=35 width=12 height=26 xoffset=1 yoffset=1 xadvance=7 page=0 chnl=0 -char id=238 x=402 y=35 width=12 height=26 xoffset=-2 yoffset=1 xadvance=7 page=0 chnl=0 -char id=239 x=383 y=115 width=13 height=24 xoffset=-2 yoffset=3 xadvance=7 page=0 chnl=0 -char id=240 x=414 y=35 width=20 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=241 x=255 y=65 width=17 height=25 xoffset=1 yoffset=2 xadvance=19 page=0 chnl=0 -char id=242 x=434 y=35 width=20 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=243 x=454 y=35 width=20 height=26 xoffset=0 yoffset=1 xadvance=20 page=0 chnl=0 -char id=244 x=272 y=65 width=20 height=25 xoffset=0 yoffset=2 xadvance=20 page=0 chnl=0 -char id=245 x=292 y=65 width=20 height=25 xoffset=0 yoffset=2 xadvance=20 page=0 chnl=0 -char id=246 x=396 y=115 width=20 height=24 xoffset=0 yoffset=3 xadvance=20 page=0 chnl=0 -char id=247 x=276 y=139 width=17 height=16 xoffset=1 yoffset=7 xadvance=19 page=0 chnl=0 -char id=248 x=239 y=139 width=20 height=19 xoffset=0 yoffset=8 xadvance=20 page=0 chnl=0 -char id=249 x=474 y=35 width=17 height=26 xoffset=1 yoffset=1 xadvance=19 page=0 chnl=0 -char id=250 x=491 y=35 width=17 height=26 xoffset=1 yoffset=1 xadvance=19 page=0 chnl=0 -char id=251 x=0 y=65 width=17 height=26 xoffset=1 yoffset=1 xadvance=19 page=0 chnl=0 -char id=252 x=416 y=115 width=17 height=24 xoffset=1 yoffset=3 xadvance=19 page=0 chnl=0 -char id=253 x=50 y=0 width=20 height=32 xoffset=-1 yoffset=1 xadvance=19 page=0 chnl=0 -char id=254 x=139 y=35 width=19 height=30 xoffset=1 yoffset=3 xadvance=20 page=0 chnl=0 -char id=255 x=158 y=35 width=20 height=30 xoffset=-1 yoffset=3 xadvance=19 page=0 chnl=0 -kernings count=375 -kerning first=244 second=119 amount=-1 -kerning first=86 second=225 amount=-1 -kerning first=119 second=245 amount=-1 -kerning first=253 second=243 amount=-1 -kerning first=111 second=89 amount=-4 -kerning first=248 second=86 amount=-2 -kerning first=84 second=211 amount=-1 -kerning first=84 second=194 amount=-2 -kerning first=221 second=235 amount=-4 -kerning first=192 second=221 amount=-1 -kerning first=121 second=44 amount=-4 -kerning first=65 second=89 amount=-1 -kerning first=75 second=216 amount=-1 -kerning first=87 second=248 amount=-2 -kerning first=89 second=242 amount=-4 -kerning first=221 second=111 amount=-4 -kerning first=233 second=221 amount=-4 -kerning first=246 second=255 amount=-1 -kerning first=75 second=195 amount=1 -kerning first=234 second=86 amount=-2 -kerning first=121 second=233 amount=-1 -kerning first=119 second=235 amount=-1 -kerning first=111 second=119 amount=-1 -kerning first=76 second=86 amount=-3 -kerning first=246 second=221 amount=-4 -kerning first=86 second=198 amount=-3 -kerning first=118 second=242 amount=-1 -kerning first=89 second=194 amount=-1 -kerning first=92 second=92 amount=-4 -kerning first=119 second=111 amount=-1 -kerning first=114 second=242 amount=-1 -kerning first=86 second=232 amount=-2 -kerning first=194 second=221 amount=-1 -kerning first=89 second=101 amount=-4 -kerning first=87 second=234 amount=-2 -kerning first=192 second=86 amount=-3 -kerning first=86 second=246 amount=-2 -kerning first=243 second=255 amount=-1 -kerning first=248 second=121 amount=-1 -kerning first=233 second=86 amount=-2 -kerning first=197 second=84 amount=-2 -kerning first=92 second=47 amount=2 -kerning first=75 second=193 amount=1 -kerning first=118 second=101 amount=-1 -kerning first=243 second=221 amount=-4 -kerning first=245 second=87 amount=-2 -kerning first=246 second=86 amount=-2 -kerning first=84 second=197 amount=-2 -kerning first=121 second=46 amount=-4 -kerning first=193 second=221 amount=-1 -kerning first=197 second=87 amount=-1 -kerning first=194 second=86 amount=-3 -kerning first=89 second=99 amount=-4 -kerning first=87 second=231 amount=-2 -kerning first=235 second=87 amount=-2 -kerning first=195 second=71 amount=-1 -kerning first=99 second=89 amount=-4 -kerning first=89 second=197 amount=-1 -kerning first=121 second=244 amount=-1 -kerning first=221 second=196 amount=-1 -kerning first=243 second=86 amount=-2 -kerning first=68 second=196 amount=-2 -kerning first=84 second=65 amount=-2 -kerning first=221 second=233 amount=-4 -kerning first=86 second=245 amount=-2 -kerning first=119 second=44 amount=-3 -kerning first=75 second=210 amount=-1 -kerning first=89 second=243 amount=-4 -kerning first=193 second=86 amount=-3 -kerning first=87 second=242 amount=-2 -kerning first=231 second=221 amount=-4 -kerning first=246 second=121 amount=-1 -kerning first=245 second=253 amount=-1 -kerning first=230 second=89 amount=-4 -kerning first=255 second=232 amount=-1 -kerning first=196 second=84 amount=-2 -kerning first=119 second=233 amount=-1 -kerning first=255 second=246 amount=-1 -kerning first=89 second=65 amount=-1 -kerning first=118 second=243 amount=-1 -kerning first=242 second=87 amount=-2 -kerning first=87 second=194 amount=-1 -kerning first=118 second=228 amount=-1 -kerning first=114 second=243 amount=-1 -kerning first=86 second=235 amount=-2 -kerning first=87 second=101 amount=-2 -kerning first=196 second=87 amount=-1 -kerning first=230 second=119 amount=-1 -kerning first=213 second=87 amount=-1 -kerning first=86 second=111 amount=-2 -kerning first=101 second=87 amount=-2 -kerning first=243 second=121 amount=-1 -kerning first=192 second=71 amount=-1 -kerning first=245 second=118 amount=-1 -kerning first=231 second=86 amount=-2 -kerning first=253 second=232 amount=-1 -kerning first=121 second=248 amount=-1 -kerning first=86 second=226 amount=-1 -kerning first=221 second=195 amount=-1 -kerning first=253 second=246 amount=-1 -kerning first=68 second=195 amount=-2 -kerning first=84 second=214 amount=-1 -kerning first=244 second=87 amount=-2 -kerning first=84 second=192 amount=-2 -kerning first=119 second=46 amount=-3 -kerning first=232 second=89 amount=-4 -kerning first=221 second=244 amount=-4 -kerning first=47 second=47 amount=-4 -kerning first=87 second=99 amount=-2 -kerning first=242 second=253 amount=-1 -kerning first=121 second=234 amount=-1 -kerning first=194 second=71 amount=-1 -kerning first=65 second=84 amount=-2 -kerning first=255 second=245 amount=-1 -kerning first=89 second=192 amount=-1 -kerning first=87 second=197 amount=-1 -kerning first=119 second=244 amount=-1 -kerning first=221 second=193 amount=-1 -kerning first=111 second=87 amount=-2 -kerning first=118 second=227 amount=-1 -kerning first=68 second=193 amount=-2 -kerning first=195 second=89 amount=-1 -kerning first=232 second=119 amount=-1 -kerning first=82 second=89 amount=-1 -kerning first=65 second=87 amount=-1 -kerning first=75 second=211 amount=-1 -kerning first=87 second=243 amount=-2 -kerning first=210 second=87 amount=-1 -kerning first=244 second=253 amount=-1 -kerning first=86 second=229 amount=-1 -kerning first=75 second=194 amount=1 -kerning first=193 second=71 amount=-1 -kerning first=242 second=118 amount=-1 -kerning first=253 second=245 amount=-1 -kerning first=255 second=235 amount=-1 -kerning first=248 second=89 amount=-4 -kerning first=255 second=111 amount=-1 -kerning first=84 second=213 amount=-1 -kerning first=86 second=196 amount=-3 -kerning first=84 second=198 amount=-2 -kerning first=87 second=65 amount=-1 -kerning first=118 second=225 amount=-1 -kerning first=221 second=248 amount=-4 -kerning first=86 second=233 amount=-2 -kerning first=234 second=89 amount=-4 -kerning first=212 second=87 amount=-1 -kerning first=111 second=253 amount=-1 -kerning first=248 second=119 amount=-1 -kerning first=253 second=235 amount=-1 -kerning first=244 second=118 amount=-1 -kerning first=89 second=198 amount=-1 -kerning first=121 second=242 amount=-1 -kerning first=86 second=97 amount=-1 -kerning first=119 second=248 amount=-1 -kerning first=253 second=111 amount=-1 -kerning first=84 second=79 amount=-1 -kerning first=89 second=232 amount=-4 -kerning first=221 second=234 amount=-4 -kerning first=192 second=89 amount=-1 -kerning first=234 second=119 amount=-1 -kerning first=89 second=246 amount=-4 -kerning first=233 second=89 amount=-4 -kerning first=245 second=255 amount=-1 -kerning first=75 second=197 amount=1 -kerning first=79 second=87 amount=-1 -kerning first=118 second=232 amount=-1 -kerning first=121 second=101 amount=-1 -kerning first=119 second=234 amount=-1 -kerning first=99 second=87 amount=-2 -kerning first=245 second=221 amount=-4 -kerning first=111 second=118 amount=-1 -kerning first=246 second=89 amount=-4 -kerning first=86 second=195 amount=-3 -kerning first=118 second=246 amount=-1 -kerning first=87 second=192 amount=-1 -kerning first=197 second=221 amount=-1 -kerning first=114 second=246 amount=-1 -kerning first=194 second=89 amount=-1 -kerning first=233 second=119 amount=-1 -kerning first=255 second=44 amount=-4 -kerning first=235 second=221 amount=-4 -kerning first=86 second=244 amount=-2 -kerning first=255 second=233 amount=-1 -kerning first=86 second=224 amount=-1 -kerning first=246 second=119 amount=-1 -kerning first=75 second=65 amount=1 -kerning first=230 second=87 amount=-2 -kerning first=243 second=89 amount=-4 -kerning first=245 second=86 amount=-2 -kerning first=86 second=193 amount=-3 -kerning first=89 second=245 amount=-4 -kerning first=193 second=89 amount=-1 -kerning first=253 second=44 amount=-4 -kerning first=197 second=86 amount=-3 -kerning first=221 second=242 amount=-4 -kerning first=242 second=255 amount=-1 -kerning first=235 second=86 amount=-2 -kerning first=253 second=233 amount=-1 -kerning first=243 second=119 amount=-1 -kerning first=118 second=245 amount=-1 -kerning first=242 second=221 amount=-4 -kerning first=87 second=198 amount=-1 -kerning first=121 second=243 amount=-1 -kerning first=221 second=194 amount=-1 -kerning first=119 second=242 amount=-1 -kerning first=68 second=194 amount=-2 -kerning first=114 second=245 amount=-1 -kerning first=255 second=46 amount=-4 -kerning first=89 second=235 amount=-4 -kerning first=87 second=232 amount=-2 -kerning first=196 second=221 amount=-1 -kerning first=221 second=101 amount=-4 -kerning first=86 second=248 amount=-2 -kerning first=75 second=214 amount=-1 -kerning first=101 second=221 amount=-4 -kerning first=89 second=111 amount=-4 -kerning first=87 second=246 amount=-2 -kerning first=232 second=87 amount=-2 -kerning first=244 second=255 amount=-1 -kerning first=231 second=89 amount=-4 -kerning first=245 second=121 amount=-1 -kerning first=195 second=84 amount=-2 -kerning first=86 second=230 amount=-1 -kerning first=75 second=192 amount=1 -kerning first=118 second=235 amount=-1 -kerning first=119 second=101 amount=-1 -kerning first=255 second=244 amount=-1 -kerning first=244 second=221 amount=-4 -kerning first=118 second=111 amount=-1 -kerning first=242 second=86 amount=-2 -kerning first=118 second=226 amount=-1 -kerning first=253 second=46 amount=-4 -kerning first=114 second=111 amount=-1 -kerning first=86 second=234 amount=-2 -kerning first=195 second=87 amount=-1 -kerning first=196 second=86 amount=-3 -kerning first=221 second=99 amount=-4 -kerning first=111 second=255 amount=-1 -kerning first=101 second=86 amount=-2 -kerning first=221 second=197 amount=-1 -kerning first=253 second=244 amount=-1 -kerning first=118 second=100 amount=-1 -kerning first=111 second=221 amount=-4 -kerning first=248 second=87 amount=-2 -kerning first=84 second=212 amount=-1 -kerning first=68 second=197 amount=-2 -kerning first=244 second=86 amount=-2 -kerning first=76 second=84 amount=-1 -kerning first=84 second=196 amount=-2 -kerning first=65 second=221 amount=-1 -kerning first=75 second=213 amount=-1 -kerning first=87 second=245 amount=-2 -kerning first=221 second=243 amount=-4 -kerning first=86 second=231 amount=-2 -kerning first=75 second=198 amount=1 -kerning first=242 second=121 amount=-1 -kerning first=234 second=87 amount=-2 -kerning first=197 second=71 amount=-1 -kerning first=192 second=84 amount=-2 -kerning first=255 second=248 amount=-1 -kerning first=89 second=196 amount=-1 -kerning first=221 second=65 amount=-1 -kerning first=119 second=243 amount=-1 -kerning first=118 second=229 amount=-1 -kerning first=111 second=86 amount=-2 -kerning first=68 second=65 amount=-2 -kerning first=89 second=233 amount=-4 -kerning first=87 second=235 amount=-2 -kerning first=192 second=87 amount=-1 -kerning first=118 second=44 amount=-4 -kerning first=65 second=86 amount=-3 -kerning first=86 second=242 amount=-2 -kerning first=75 second=79 amount=-1 -kerning first=87 second=111 amount=-2 -kerning first=233 second=87 amount=-2 -kerning first=244 second=121 amount=-1 -kerning first=248 second=253 amount=-1 -kerning first=194 second=84 amount=-2 -kerning first=253 second=248 amount=-1 -kerning first=118 second=233 amount=-1 -kerning first=255 second=234 amount=-1 -kerning first=84 second=216 amount=-1 -kerning first=246 second=87 amount=-2 -kerning first=86 second=194 amount=-3 -kerning first=84 second=195 amount=-2 -kerning first=118 second=97 amount=-1 -kerning first=86 second=101 amount=-2 -kerning first=194 second=87 amount=-1 -kerning first=216 second=87 amount=-1 -kerning first=99 second=221 amount=-4 -kerning first=121 second=232 amount=-1 -kerning first=111 second=121 amount=-1 -kerning first=253 second=234 amount=-1 -kerning first=196 second=71 amount=-1 -kerning first=248 second=118 amount=-1 -kerning first=193 second=84 amount=-2 -kerning first=89 second=195 amount=-1 -kerning first=121 second=246 amount=-1 -kerning first=221 second=192 amount=-1 -kerning first=243 second=87 amount=-2 -kerning first=68 second=192 amount=-2 -kerning first=84 second=193 amount=-2 -kerning first=118 second=46 amount=-4 -kerning first=89 second=244 amount=-4 -kerning first=193 second=87 amount=-1 -kerning first=246 second=253 amount=-1 -kerning first=86 second=99 amount=-2 -kerning first=230 second=221 amount=-4 -kerning first=99 second=86 amount=-2 -kerning first=255 second=242 amount=-1 -kerning first=245 second=89 amount=-4 -kerning first=86 second=197 amount=-3 -kerning first=89 second=193 amount=-1 -kerning first=87 second=196 amount=-1 -kerning first=118 second=244 amount=-1 -kerning first=118 second=224 amount=-1 -kerning first=197 second=89 amount=-1 -kerning first=114 second=244 amount=-1 -kerning first=87 second=233 amount=-2 -kerning first=235 second=89 amount=-4 -kerning first=86 second=243 amount=-2 -kerning first=214 second=87 amount=-1 -kerning first=245 second=119 amount=-1 -kerning first=243 second=253 amount=-1 -kerning first=231 second=87 amount=-2 -kerning first=255 second=101 amount=-1 -kerning first=246 second=118 amount=-1 -kerning first=65 second=71 amount=-1 -kerning first=86 second=228 amount=-1 -kerning first=221 second=198 amount=-1 -kerning first=121 second=245 amount=-1 -kerning first=230 second=86 amount=-2 -kerning first=253 second=242 amount=-1 -kerning first=68 second=198 amount=-2 -kerning first=84 second=210 amount=-1 -kerning first=86 second=65 amount=-3 -kerning first=221 second=232 amount=-4 -kerning first=235 second=119 amount=-1 -kerning first=89 second=248 amount=-4 -kerning first=232 second=221 amount=-4 -kerning first=221 second=246 amount=-4 -kerning first=211 second=87 amount=-1 -kerning first=121 second=235 amount=-1 -kerning first=119 second=232 amount=-1 -kerning first=253 second=101 amount=-1 -kerning first=243 second=118 amount=-1 -kerning first=118 second=248 amount=-1 -kerning first=242 second=89 amount=-4 -kerning first=87 second=195 amount=-1 -kerning first=121 second=111 amount=-1 -kerning first=119 second=246 amount=-1 -kerning first=118 second=230 amount=-1 -kerning first=114 second=248 amount=-1 -kerning first=195 second=221 amount=-1 -kerning first=89 second=234 amount=-4 -kerning first=196 second=89 amount=-1 -kerning first=82 second=221 amount=-1 -kerning first=75 second=212 amount=-1 -kerning first=101 second=89 amount=-4 -kerning first=87 second=244 amount=-2 -kerning first=232 second=86 amount=-2 -kerning first=248 second=255 amount=-1 -kerning first=86 second=227 amount=-1 -kerning first=75 second=196 amount=1 -kerning first=242 second=119 amount=-1 -kerning first=118 second=234 amount=-1 -kerning first=248 second=221 amount=-4 -kerning first=255 second=243 amount=-1 -kerning first=244 second=89 amount=-4 -kerning first=86 second=192 amount=-3 -kerning first=87 second=193 amount=-1 -kerning first=221 second=245 amount=-4 -kerning first=101 second=119 amount=-1 -kerning first=195 second=86 amount=-3 -kerning first=234 second=221 amount=-4 diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Regular-32.png b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Regular-32.png deleted file mode 100644 index d538a061..00000000 Binary files a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/Metropolis-Regular-32.png and /dev/null differ diff --git a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/SIL Open Font License.txt b/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/SIL Open Font License.txt deleted file mode 100644 index 2608640a..00000000 --- a/Projekte/jme-common/src/main/resources/Interface/Fonts/Metropolis/SIL Open Font License.txt +++ /dev/null @@ -1,43 +0,0 @@ -Copyright (c) 2015, Chris Simpson, with Reserved Font Name: "Metropolis". - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. - -The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the copyright statement(s). - -"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. - -"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. - -5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/Projekte/jme-common/src/main/resources/Interface/Lemur/pp-styles.groovy b/Projekte/jme-common/src/main/resources/Interface/Lemur/pp-styles.groovy deleted file mode 100644 index c8c8de4e..00000000 --- a/Projekte/jme-common/src/main/resources/Interface/Lemur/pp-styles.groovy +++ /dev/null @@ -1,201 +0,0 @@ -// Styling of Lemur components -// For documentation, see -// https://github.com/jMonkeyEngine-Contributions/Lemur/wiki/Styling - -import com.simsilica.lemur.Button -import com.simsilica.lemur.Button.ButtonAction -import com.simsilica.lemur.Command -import com.simsilica.lemur.HAlignment -import com.simsilica.lemur.Insets3f -import com.simsilica.lemur.component.QuadBackgroundComponent -import com.simsilica.lemur.component.TbtQuadBackgroundComponent - -def bgColor = color(0.25, 0.5, 0.5, 1) -def buttonEnabledColor = color(0.8, 0.9, 1, 1) -def buttonDisabledColor = color(0.8, 0.9, 1, 0.2) -def buttonBgColor = color(0, 0.75, 0.75, 1) -def sliderColor = color(0.6, 0.8, 0.8, 1) -def sliderBgColor = color(0.5, 0.75, 0.75, 1) -def gradientColor = color(0.5, 0.75, 0.85, 0.5) -def tabbuttonEnabledColor = color(0.4, 0.45, 0.5, 1) - -def gradient = TbtQuadBackgroundComponent.create( - texture(name: "/com/simsilica/lemur/icons/bordered-gradient.png", - generateMips: false), - 1, 1, 1, 126, 126, - 1f, false) - -def doubleGradient = new QuadBackgroundComponent(gradientColor) -doubleGradient.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png", - generateMips: false) - -selector("pp") { - font = font("Interface/Fonts/Metropolis/Metropolis-Regular-32.fnt") -} - -selector("label", "pp") { - insets = new Insets3f(2, 2, 2, 2) - color = buttonEnabledColor -} - -selector("header", "pp") { - font = font("Interface/Fonts/Metropolis/Metropolis-Bold-42.fnt") - insets = new Insets3f(2, 2, 2, 2) - color = color(1, 0.5, 0, 1) - textHAlignment = HAlignment.Center -} - -selector("container", "pp") { - background = gradient.clone() - background.setColor(bgColor) -} - -selector("slider", "pp") { - background = gradient.clone() - background.setColor(bgColor) -} - -def pressedCommand = new Command