From 70c213fe0d0e21b067f8c922bb06d270589a6aae Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Tue, 12 Jan 2021 00:36:18 +0300 Subject: [PATCH] Added localization, LayerTestGUI hiding and fixed two bugs - Re-added localization - Currently en-US, ru-RU - Switch with L - Used in LayerTestGUI and the new LayerAbout - Added LayerAbout - Contains game named and version - Localized - TestLayerGUI is hidden by default - Switch visiblity with F3 - Fixed alignment of text inside Labels - Fixed crash reports not showing suppressed exceptions and causes --- .../progressia/client/ClientProxy.java | 3 + .../progressia/client/ClientState.java | 4 +- .../progressia/client/graphics/GUI.java | 42 ++++++++--- .../progressia/client/graphics/gui/Label.java | 14 +++- .../client/localization/Localizer.java | 4 ++ .../client/localization/MutableString.java | 11 ++- .../common/util/crash/CrashReports.java | 15 +++- .../windcorp/progressia/test/LayerAbout.java | 42 +++++++++++ .../progressia/test/LayerTestGUI.java | 72 ++++++++++--------- .../progressia/test/TestPlayerControls.java | 46 +++++++++--- .../resources/assets/languages/en-US.lang | 25 ++++++- .../resources/assets/languages/ru-RU.lang | 23 +++++- 12 files changed, 238 insertions(+), 63 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/test/LayerAbout.java diff --git a/src/main/java/ru/windcorp/progressia/client/ClientProxy.java b/src/main/java/ru/windcorp/progressia/client/ClientProxy.java index 86d1302..c942b4c 100644 --- a/src/main/java/ru/windcorp/progressia/client/ClientProxy.java +++ b/src/main/java/ru/windcorp/progressia/client/ClientProxy.java @@ -26,6 +26,7 @@ import ru.windcorp.progressia.client.graphics.font.GNUUnifontLoader; import ru.windcorp.progressia.client.graphics.font.Typefaces; import ru.windcorp.progressia.client.graphics.texture.Atlases; import ru.windcorp.progressia.client.graphics.world.WorldRenderProgram; +import ru.windcorp.progressia.client.localization.Localizer; import ru.windcorp.progressia.common.resource.ResourceManager; import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.server.ServerState; @@ -43,6 +44,8 @@ public class ClientProxy implements Proxy { } catch (InterruptedException e) { throw CrashReports.report(e, "ClientProxy failed"); } + + Localizer.getInstance().setLanguage("en-US"); TestContent.registerContent(); diff --git a/src/main/java/ru/windcorp/progressia/client/ClientState.java b/src/main/java/ru/windcorp/progressia/client/ClientState.java index 47a3141..f37016d 100644 --- a/src/main/java/ru/windcorp/progressia/client/ClientState.java +++ b/src/main/java/ru/windcorp/progressia/client/ClientState.java @@ -5,7 +5,7 @@ import ru.windcorp.progressia.client.graphics.GUI; import ru.windcorp.progressia.client.graphics.world.LayerWorld; import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.server.ServerState; -import ru.windcorp.progressia.test.LayerTestGUI; +import ru.windcorp.progressia.test.LayerAbout; import ru.windcorp.progressia.test.LayerTestUI; import ru.windcorp.progressia.test.TestContent; @@ -37,7 +37,7 @@ public class ClientState { GUI.addBottomLayer(new LayerWorld(client)); GUI.addTopLayer(new LayerTestUI()); - GUI.addTopLayer(new LayerTestGUI()); + GUI.addTopLayer(new LayerAbout()); } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/GUI.java b/src/main/java/ru/windcorp/progressia/client/graphics/GUI.java index 5650846..00148dd 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/GUI.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/GUI.java @@ -18,6 +18,7 @@ package ru.windcorp.progressia.client.graphics; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.google.common.eventbus.Subscribe; @@ -31,7 +32,15 @@ import ru.windcorp.progressia.client.graphics.input.bus.Input; public class GUI { - private static final List LAYERS = new ArrayList<>(); + private static final List LAYERS = Collections.synchronizedList(new ArrayList<>()); + private static final List UNMODIFIABLE_LAYERS = Collections.unmodifiableList(LAYERS); + + @FunctionalInterface + private interface LayerStackModification { + void affect(List layers); + } + + private static final List MODIFICATION_QUEUE = Collections.synchronizedList(new ArrayList<>()); private static class ModifiableInput extends Input { @Override @@ -44,21 +53,34 @@ public class GUI { private GUI() {} - public synchronized static void addBottomLayer(Layer layer) { - LAYERS.add(layer); + public static void addBottomLayer(Layer layer) { + modify(layers -> layers.add(layer)); } - public synchronized static void addTopLayer(Layer layer) { - LAYERS.add(0, layer); + public static void addTopLayer(Layer layer) { + modify(layers -> layers.add(0, layer)); } - public synchronized static void removeLayer(Layer layer) { - LAYERS.remove(layer); + public static void removeLayer(Layer layer) { + modify(layers -> layers.remove(layer)); } - public synchronized static void render() { - for (int i = LAYERS.size() - 1; i >= 0; --i) { - LAYERS.get(i).render(); + private static void modify(LayerStackModification mod) { + MODIFICATION_QUEUE.add(mod); + } + + public static List getLayers() { + return UNMODIFIABLE_LAYERS; + } + + public static void render() { + synchronized (LAYERS) { + MODIFICATION_QUEUE.forEach(action -> action.affect(LAYERS)); + MODIFICATION_QUEUE.clear(); + + for (int i = LAYERS.size() - 1; i >= 0; --i) { + LAYERS.get(i).render(); + } } } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/gui/Label.java b/src/main/java/ru/windcorp/progressia/client/graphics/gui/Label.java index cbe3623..6824649 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/gui/Label.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/gui/Label.java @@ -4,6 +4,7 @@ import glm.mat._4.Mat4; import glm.vec._2.i.Vec2i; import ru.windcorp.progressia.client.graphics.flat.RenderTarget; import ru.windcorp.progressia.client.graphics.font.Font; +import ru.windcorp.progressia.client.localization.MutableString; import java.util.function.Supplier; @@ -14,6 +15,8 @@ public class Label extends Component { private Vec2i currentSize; private Supplier contents; + private MutableString.Listener mutableStringListener = null; + private float maxWidth = Float.POSITIVE_INFINITY; public Label(String name, Font font, Supplier contents) { @@ -26,6 +29,13 @@ public class Label extends Component { public Label(String name, Font font, String contents) { this(name, font, () -> contents); } + + public Label(String name, Font font, MutableString contents) { + this(name, font, contents::get); + + this.mutableStringListener = this::update; + contents.addListener(mutableStringListener); + } public void update() { currentText = contents.get(); @@ -52,8 +62,10 @@ public class Label extends Component { @Override protected void assembleSelf(RenderTarget target) { + float startX = getX() + font.getAlign() * (getWidth() - currentSize.x); + target.pushTransform( - new Mat4().identity().translate(getX(), getY(), -1000) // TODO wtf is this magic <--- + new Mat4().identity().translate(startX, getY(), -1000) // TODO wtf is this magic <--- .scale(2) ); diff --git a/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java b/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java index f780065..cfed80a 100644 --- a/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java +++ b/src/main/java/ru/windcorp/progressia/client/localization/Localizer.java @@ -56,6 +56,10 @@ public class Localizer { } public synchronized String getValue(String key) { + if (data == null) { + throw new IllegalStateException("Localizer not yet initialized"); + } + if (data.containsKey(key)) { return data.get(key); } else if (fallBackData.containsKey(key)) { diff --git a/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java b/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java index f0a01e8..7ea617e 100644 --- a/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java +++ b/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java @@ -1,6 +1,7 @@ package ru.windcorp.progressia.client.localization; import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -16,6 +17,8 @@ public abstract class MutableString { protected final Collection> listeners = Collections.synchronizedCollection(new LinkedList<>()); + + private Collection myListeners = null; protected void pokeListeners() { //TODO extract as weak bus listener class @@ -44,7 +47,13 @@ public abstract class MutableString { protected void listen(Object obj) { if (obj instanceof MutableString) { - ((MutableString) obj).addListener(this::update); + if (myListeners == null) { + myListeners = new ArrayList<>(); + } + + Listener listener = this::update; + myListeners.add(listener); + ((MutableString) obj).addListener(listener); } } diff --git a/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java b/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java index 404ef95..6b12468 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java +++ b/src/main/java/ru/windcorp/progressia/common/util/crash/CrashReports.java @@ -2,11 +2,14 @@ package ru.windcorp.progressia.common.util.crash; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.util.StringBuilderWriter; import ru.windcorp.jputil.chars.StringUtil; import java.io.BufferedWriter; import java.io.IOException; +import java.io.PrintWriter; +import java.io.Writer; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -244,14 +247,22 @@ public class CrashReports { } output.append("Reported Throwable:\n"); - appendStackTrace(output, throwable.getStackTrace(), throwable.toString()); + + // Formatting to a human-readable string + Writer sink = new StringBuilderWriter(output); + try { + throwable.printStackTrace(new PrintWriter(sink)); + } catch (Exception e) { + // PLAK + } + output.append('\n'); } private static void appendStackTrace(StringBuilder output, StackTraceElement[] stackTrace, String header) { output.append(header).append('\n'); for (StackTraceElement element : stackTrace) { - output.append(" ").append(element).append('\n'); + output.append("\tat ").append(element).append('\n'); } } diff --git a/src/main/java/ru/windcorp/progressia/test/LayerAbout.java b/src/main/java/ru/windcorp/progressia/test/LayerAbout.java new file mode 100644 index 0000000..dda74a8 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/test/LayerAbout.java @@ -0,0 +1,42 @@ +package ru.windcorp.progressia.test; + +import ru.windcorp.progressia.client.graphics.Colors; +import ru.windcorp.progressia.client.graphics.font.Font; +import ru.windcorp.progressia.client.graphics.font.Typeface; +import ru.windcorp.progressia.client.graphics.gui.GUILayer; +import ru.windcorp.progressia.client.graphics.gui.Label; +import ru.windcorp.progressia.client.graphics.gui.Panel; +import ru.windcorp.progressia.client.graphics.gui.layout.LayoutAlign; +import ru.windcorp.progressia.client.graphics.gui.layout.LayoutVertical; +import ru.windcorp.progressia.client.localization.MutableStringLocalized; + +public class LayerAbout extends GUILayer { + + public LayerAbout() { + super("LayerAbout", new LayoutAlign(1, 1, 5)); + + Panel panel = new Panel("ControlDisplays", new LayoutVertical(5)); + + Font font = new Font().withColor(Colors.WHITE).deriveOutlined().withAlign(Typeface.ALIGN_RIGHT); + Font aboutFont = font.withColor(0xFF37A3E6).deriveBold(); + + panel.addChild(new Label( + "About", aboutFont, + new MutableStringLocalized("LayerAbout.Title") + )); + + panel.addChild(new Label( + "Version", font, + new MutableStringLocalized("LayerAbout.Version").format("pre-TechDemo") + )); + + panel.addChild(new Label( + "DebugHint", font, + new MutableStringLocalized("LayerAbout.DebugHint") + )); + + getRoot().addChild(panel); + + } + +} diff --git a/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java b/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java index c2a32a6..dbed22d 100755 --- a/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java +++ b/src/main/java/ru/windcorp/progressia/test/LayerTestGUI.java @@ -34,6 +34,8 @@ import ru.windcorp.progressia.client.graphics.gui.Label; import ru.windcorp.progressia.client.graphics.gui.Panel; import ru.windcorp.progressia.client.graphics.gui.layout.LayoutAlign; import ru.windcorp.progressia.client.graphics.gui.layout.LayoutVertical; +import ru.windcorp.progressia.client.localization.Localizer; +import ru.windcorp.progressia.client.localization.MutableStringLocalized; import ru.windcorp.progressia.common.Units; import ru.windcorp.progressia.common.util.dynstr.DynamicStrings; import ru.windcorp.progressia.server.Server; @@ -46,48 +48,47 @@ public class LayerTestGUI extends GUILayer { Panel panel = new Panel("ControlDisplays", new LayoutVertical(5)); - Collection