From 5538ca6aa69e861d13ed0ac013f372e5d2849635 Mon Sep 17 00:00:00 2001 From: Dustin Norberg Date: Wed, 30 Sep 2026 13:20:56 -0400 Subject: [PATCH] Render Legacy glyph pages and base-25 desk numerals --- docs/ASSET_PROVENANCE.md | 3 +- docs/SYMBOL_SEMANTICS.md | 7 +- gradle.properties | 2 +- .../rivencraft/client/ClientEvents.java | 22 ++ .../client/SymbolPageItemRenderer.java | 47 ++++ .../rivencraft/client/SymbolPageTextures.java | 240 ++++++++++++++++++ .../client/screen/BookBinderScreen.java | 2 +- .../client/screen/DescriptiveBookScreen.java | 16 +- .../client/screen/NotebookScreen.java | 29 +-- .../client/screen/WritingDeskScreen.java | 11 +- .../gametest/WritingDataGameTests.java | 21 ++ .../dnorberg/rivencraft/item/PageItem.java | 21 +- .../rivencraft/writing/SymbolDefinition.java | 15 +- .../writing/SymbolDisplayMetadata.java | 10 +- .../rivencraft/writing/SymbolNumerals.java | 30 +++ .../rivencraft/writing/SymbolPoems.java | 21 ++ .../assets/rivencraft/lang/en_us.json | 1 + .../assets/rivencraft/models/item/page.json | 26 +- .../models/item/page_symbol_biome_native.json | 4 - .../page_symbol_celestial_normal_time.json | 4 - .../item/page_symbol_feature_caves.json | 4 - .../item/page_symbol_lighting_normal.json | 4 - .../item/page_symbol_terrain_standard.json | 4 - .../item/page_symbol_weather_normal.json | 4 - .../textures/gui/symbolcomponents.png | Bin 0 -> 12477 bytes .../item/page_symbol_biome_native.png | Bin 12141 -> 0 bytes .../page_symbol_celestial_normal_time.png | Bin 11991 -> 0 bytes .../item/page_symbol_feature_caves.png | Bin 12239 -> 0 bytes .../item/page_symbol_lighting_normal.png | Bin 12567 -> 0 bytes .../item/page_symbol_terrain_standard.png | Bin 12669 -> 0 bytes .../item/page_symbol_weather_normal.png | Bin 11988 -> 0 bytes .../rivencraft/symbols/biome/native.json | 3 +- .../symbols/celestial/normal_time.json | 3 +- .../rivencraft/symbols/feature/caves.json | 3 +- .../rivencraft/symbols/lighting/normal.json | 3 +- .../rivencraft/symbols/terrain/standard.json | 3 +- .../rivencraft/symbols/weather/normal.json | 3 +- 37 files changed, 457 insertions(+), 109 deletions(-) create mode 100644 src/main/java/net/dnorberg/rivencraft/client/SymbolPageItemRenderer.java create mode 100644 src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java create mode 100644 src/main/java/net/dnorberg/rivencraft/writing/SymbolNumerals.java create mode 100644 src/main/java/net/dnorberg/rivencraft/writing/SymbolPoems.java delete mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json delete mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json delete mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json delete mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json delete mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json delete mode 100644 src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json create mode 100644 src/main/resources/assets/rivencraft/textures/gui/symbolcomponents.png delete mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_biome_native.png delete mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_celestial_normal_time.png delete mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_feature_caves.png delete mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_lighting_normal.png delete mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_terrain_standard.png delete mode 100644 src/main/resources/assets/rivencraft/textures/item/page_symbol_weather_normal.png diff --git a/docs/ASSET_PROVENANCE.md b/docs/ASSET_PROVENANCE.md index ba85adb..b5979ad 100644 --- a/docs/ASSET_PROVENANCE.md +++ b/docs/ASSET_PROVENANCE.md @@ -23,7 +23,8 @@ project's GNU LGPL v3 license. Rivencraft itself uses the same license. | `assets/rivencraft/textures/block/ink_mixer_top.png`, `ink_mixer_side.png`, `ink_mixer_bottom.png` | `assets/mystcraft/textures/blocks/inkmixer_top.png`, `inkmixer_side.png`, `inkmixer_bottom.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only; Rivencraft supplies its own block model | | `assets/rivencraft/textures/item/linking_book_unwritten.png` | `assets/mystcraft/textures/items/unlinked.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Namespace/path rename only | | `assets/rivencraft/textures/item/page_link_panel.png` | `page_background.png` and `PageBuilder.BasicPageSprite` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Reproduces the legacy 160 px scale, black panel at `(25,30)`–`(135,75)`, and 128 px resample | -| `assets/rivencraft/textures/item/page_symbol*.png` and `page_unresolved.png` | `page_background.png`, `textures/symbolcomponents.png`, `WordData`, `ModSymbols`, and `PageBuilder.PageSprite` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Static 1.21.1 renditions of the legacy runtime-composed four-word symbol pages; `normal_time` uses the legacy Full Length poem | +| `assets/rivencraft/textures/gui/symbolcomponents.png` | `assets/mystcraft/textures/symbolcomponents.png` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Byte-identical shared 512×512 component sheet for client-side page composition | +| Runtime-composed symbol pages (`SymbolPageTextures`) | `page_background.png`, `textures/symbolcomponents.png`, `WordData`, `ModSymbols`, and `PageBuilder.PageSprite` | `9bc8ddc061845df0cd5ea47f4fdef773cff786ae` | Replaces the six pre-generated symbol PNGs; layers four poem words on the shared page background and caches bounded client textures | Mystcraft Legacy identifies XCompWiz as its project developer and includes the full LGPL v3 text in its root `LICENSE` file. Rivencraft's root `LICENSE` diff --git a/docs/SYMBOL_SEMANTICS.md b/docs/SYMBOL_SEMANTICS.md index 6b4ffd8..5c91404 100644 --- a/docs/SYMBOL_SEMANTICS.md +++ b/docs/SYMBOL_SEMANTICS.md @@ -11,12 +11,17 @@ Milestone 5 issue #29 adds typed meaning to the existing data-pack symbol catalo "semantics": { "role": "terrain", "value": "example:highlands" - } + }, + "poem": "Terrain Form Tradition Flow" } ``` `name` and `description` are translation keys. `category` is for display and sorting; it does not determine grammar. `semantics.role` and its typed `value` are server-owned. The terrain value above names an Age runtime profile that a later compiler must resolve and validate. A syntactically valid resource ID alone does not guarantee the profile or feature exists. +`poem` is optional, client-safe artwork metadata: exactly four alphabetic words, ordered top, right, bottom, left. The client layers their glyphs from the shared Legacy component sheet at runtime. GUI thumbnails use the full transparent artwork over their page backgrounds; item icons use the same artwork reduced from 16 to 13 pixels across, over the page texture. Unregistered words use a stable generated component combination; when a symbol has no poem, the six original built-in IDs retain their Legacy poems and other IDs produce four stable fallback words. This affects appearance only, never Age generation. Generated images are cached up to 256 entries and discarded on resource reload. + +The Writing Desk's 88 collection tabs use Legacy's number components, chiefly the bottom row of `symbolcomponents.png`, rather than word sigils. Legacy's `ModWords.constructNumber` combines four unit marks (1–4) with four five-step marks (5–20) to form 1–24 and uses a separate zero mark. Rivencraft extends these marks positionally in base 25 for tabs 25–88 (for example, 25 is 1 followed by 0). Hovering still reveals the decimal number for accessibility. The former arbitrary-word glyph generator remains useful for rendering text: on page-free Descriptive Books, the generated Age description now appears as a sequence of layered word glyphs instead of Minecraft's enchantment font. The Age name stays readable. + | Role | Value type and allowed values | | --- | --- | | `terrain` | Canonical namespaced Age profile ID. | diff --git a/gradle.properties b/gradle.properties index 91ea795..ee7c787 100644 --- a/gradle.properties +++ b/gradle.properties @@ -36,7 +36,7 @@ mod_name=Rivencraft # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=LGPL-3.0-or-later # The mod version. Rivencraft uses the x.y.z.b policy documented in README.md. -mod_version=0.4.1.0 +mod_version=0.4.1.5 immersive_portals_version=6.0.7 # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # This should match the base package used for the mod sources. diff --git a/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java b/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java index 7cb2c55..a6732af 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java +++ b/src/main/java/net/dnorberg/rivencraft/client/ClientEvents.java @@ -13,6 +13,10 @@ import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; +import net.neoforged.neoforge.client.event.RegisterClientReloadListenersEvent; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.dnorberg.rivencraft.client.screen.NotebookScreen; import net.dnorberg.rivencraft.client.screen.WritingDeskScreen; import net.dnorberg.rivencraft.client.screen.BookBinderScreen; @@ -38,6 +42,24 @@ public final class ClientEvents { event.register(ModMenus.INK_MIXER.get(), InkMixerScreen::new); } + @SubscribeEvent + public static void registerPageItemRenderer(RegisterClientExtensionsEvent event) { + event.registerItem(new IClientItemExtensions() { + private final SymbolPageItemRenderer renderer = new SymbolPageItemRenderer(); + + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return renderer; + } + }, ModItems.PAGE.get()); + } + + @SubscribeEvent + public static void registerPageTextureReload(RegisterClientReloadListenersEvent event) { + event.registerReloadListener((net.minecraft.server.packs.resources.ResourceManagerReloadListener) + manager -> SymbolPageTextures.clear()); + } + @SubscribeEvent public static void clientSetup(FMLClientSetupEvent event) { event.enqueueWork(() -> ItemProperties.register( diff --git a/src/main/java/net/dnorberg/rivencraft/client/SymbolPageItemRenderer.java b/src/main/java/net/dnorberg/rivencraft/client/SymbolPageItemRenderer.java new file mode 100644 index 0000000..2a37c9a --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/client/SymbolPageItemRenderer.java @@ -0,0 +1,47 @@ +package net.dnorberg.rivencraft.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.dnorberg.rivencraft.Rivencraft; +import net.dnorberg.rivencraft.item.PageItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; + +/** Flat page model whose symbol artwork is resolved from the stack at render time. */ +public final class SymbolPageItemRenderer extends BlockEntityWithoutLevelRenderer { + public SymbolPageItemRenderer() { + super(Minecraft.getInstance().getBlockEntityRenderDispatcher(), Minecraft.getInstance().getEntityModels()); + } + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext context, PoseStack pose, + MultiBufferSource buffers, int light, int overlay) { + ResourceLocation texture = switch (PageItem.content(stack).kind()) { + case BLANK -> texture("page"); + case LINK_PANEL -> texture("page_link_panel"); + case UNRESOLVED_SYMBOL -> texture("page_unresolved"); + case SYMBOL -> SymbolPageTextures.forItem(stack); + }; + VertexConsumer vertices = buffers.getBuffer(RenderType.entityCutoutNoCull(texture)); + var matrix = pose.last().pose(); + vertex(vertices, matrix, 0, 0, 0, 1, light, overlay); + vertex(vertices, matrix, 1, 0, 1, 1, light, overlay); + vertex(vertices, matrix, 1, 1, 1, 0, light, overlay); + vertex(vertices, matrix, 0, 1, 0, 0, light, overlay); + } + + private static void vertex(VertexConsumer vertices, org.joml.Matrix4f matrix, + float x, float y, float u, float v, int light, int overlay) { + vertices.addVertex(matrix, x, y, 0.5F).setColor(255, 255, 255, 255) + .setUv(u, v).setOverlay(overlay).setLight(light).setNormal(0, 0, 1); + } + + private static ResourceLocation texture(String name) { + return ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "textures/item/" + name + ".png"); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java b/src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java new file mode 100644 index 0000000..38a2799 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java @@ -0,0 +1,240 @@ +package net.dnorberg.rivencraft.client; + +import com.mojang.blaze3d.platform.NativeImage; +import java.io.IOException; +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Random; +import net.dnorberg.rivencraft.Rivencraft; +import net.dnorberg.rivencraft.item.PageItem; +import net.dnorberg.rivencraft.registry.ModDataComponents; +import net.dnorberg.rivencraft.writing.PageContent; +import net.dnorberg.rivencraft.writing.SymbolDisplayMetadata; +import net.dnorberg.rivencraft.writing.SymbolPoems; +import net.dnorberg.rivencraft.writing.SymbolNumerals; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.world.item.ItemStack; + +/** Client-only, bounded cache of Legacy-style page compositions; no per-symbol PNGs. */ +public final class SymbolPageTextures { + private static final int SIZE = 128; + private static final int GLYPH = 51; + // A 16 px item icon displays a 13 px symbol: three pixels narrower overall. + private static final int ITEM_SYMBOL_SIZE = 13; + private static final int ICON_SIZE = 16; + private static final int CACHE_LIMIT = 256; + private static final ResourceLocation BASE = texture("item/page"); + private static final ResourceLocation COMPONENTS = texture("gui/symbolcomponents"); + private static final ResourceLocation FALLBACK = texture("item/page_symbol"); + private static final Map CACHE = new LinkedHashMap<>(16, .75F, true); + private static final Map WORD_CACHE = new LinkedHashMap<>(16, .75F, true); + private static NativeImage base; + private static NativeImage components; + private static int nextId; + + // WordData from Mystcraft Legacy 0.13.7.06. Other words get a stable generated glyph. + private static final Map WORDS = Map.ofEntries( + Map.entry("Terrain", new int[] {6,10,12,13,16,19,24,25,27}), + Map.entry("Form", new int[] {4,6,8,9,10,11,13,14,16,23}), + Map.entry("Tradition", new int[] {4,6,7,8,9,14,17,18,20}), + Map.entry("Flow", new int[] {4,7,12,13,17,18}), + Map.entry("Constraint", new int[] {5,6,9,11,13,20,22,23}), + Map.entry("Nature", new int[] {5,6,8,10,11,12,15,16,17,22}), + Map.entry("Sustain", new int[] {6,16,19,20,21,23}), + Map.entry("Ethereal", new int[] {4,6,8,13,14,16,18,21,23}), + Map.entry("Dynamic", new int[] {4,5,6,12,13,17,18,22,23}), + Map.entry("Cycle", new int[] {4,5,7,16,17,18}), + Map.entry("Balance", new int[] {4,6,9,10,16,19}), + Map.entry("Transform", new int[] {4,5,6,8,11,14,18,20,21}), + Map.entry("Time", new int[] {4,5,7,12,13,19,20,21,22,23}), + Map.entry("System", new int[] {10,12,14,15,16,20,21,22}), + Map.entry("Void", new int[] {4,5,6,16,17,18,23}) + ); + + private SymbolPageTextures() {} + + /** Transparent full-size artwork for GUI thumbnails drawn over their own page background. */ + public static ResourceLocation forPage(ItemStack stack) { + return forPage(stack, false); + } + + /** Full page texture with artwork reduced by three pixels at 16 px item-icon scale. */ + public static ResourceLocation forItem(ItemStack stack) { + return forPage(stack, true); + } + + private static ResourceLocation forPage(ItemStack stack, boolean item) { + PageContent content = PageItem.content(stack); + if (content.kind() == PageContent.Kind.UNRESOLVED_SYMBOL) return texture("item/page_unresolved"); + if (content.kind() != PageContent.Kind.SYMBOL) return FALLBACK; + SymbolDisplayMetadata metadata = stack.get(ModDataComponents.PAGE_SYMBOL_DISPLAY.get()); + ResourceLocation id = content.symbol().orElseThrow().id(); + return forSymbol(id, metadata == null ? "" : metadata.poem(), item); + } + + private static ResourceLocation forSymbol(ResourceLocation id, String poem, boolean item) { + if (poem.length() > 96 || !poem.matches("[A-Za-z]+(?: [A-Za-z]+){3}")) poem = ""; + if (poem.isEmpty()) poem = SymbolPoems.builtIn(id); + String key = id + "|" + poem + (item ? "|item" : "|thumbnail"); + ResourceLocation cached = CACHE.get(key); + if (cached != null) return cached; + try { + loadSources(Minecraft.getInstance().getResourceManager()); + NativeImage image = compose(id, poem, item); + ResourceLocation location = ResourceLocation.fromNamespaceAndPath( + Rivencraft.MOD_ID, "generated/page_" + nextId++); + Minecraft.getInstance().getTextureManager().register(location, new DynamicTexture(image)); + CACHE.put(key, location); + if (CACHE.size() > CACHE_LIMIT) { + String eldest = CACHE.keySet().iterator().next(); + Minecraft.getInstance().getTextureManager().release(CACHE.remove(eldest)); + } + return location; + } catch (IOException exception) { + Rivencraft.LOGGER.error("Could not compose symbol page {}", id, exception); + return FALLBACK; + } + } + + public static void clear() { + var textures = Minecraft.getInstance().getTextureManager(); + CACHE.values().forEach(textures::release); + CACHE.clear(); + WORD_CACHE.clear(); + if (base != null) base.close(); + if (components != null) components.close(); + base = null; + components = null; + } + + private static void loadSources(ResourceManager manager) throws IOException { + if (base != null && components != null) return; + try (InputStream page = manager.getResourceOrThrow(BASE).open(); + InputStream sheet = manager.getResourceOrThrow(COMPONENTS).open()) { + base = NativeImage.read(page); + components = NativeImage.read(sheet); + } + } + + private static NativeImage compose(ResourceLocation id, String poem, boolean item) { + // GUI variants have no parchment layer, so their untouched pixels must be transparent. + NativeImage image = new NativeImage(SIZE, SIZE, true); + if (item) { + for (int y = 0; y < SIZE; y++) for (int x = 0; x < SIZE; x++) { + image.setPixelRGBA(x, y, base.getPixelRGBA(x * base.getWidth() / SIZE, + y * base.getHeight() / SIZE)); + } + } + String[] words = poem.isBlank() ? generatedWords(id) : poem.split(" "); + int[] offsetsX = {38, 77, 38, 0}; + int[] offsetsY = {0, 38, 77, 38}; + int glyphSize = item ? GLYPH * ITEM_SYMBOL_SIZE / ICON_SIZE : GLYPH; + for (int word = 0; word < 4; word++) { + int originX = item ? scaleForItem(offsetsX[word]) : offsetsX[word]; + int originY = item ? scaleForItem(offsetsY[word]) : offsetsY[word]; + for (int component : glyphs(words[word])) { + for (int y = 0; y < glyphSize; y++) for (int x = 0; x < glyphSize; x++) { + int pixel = components.getPixelRGBA((component % 8) * 64 + x * 64 / glyphSize, + (component / 8) * 64 + y * 64 / glyphSize); + int alpha = pixel >>> 24; + if (alpha != 0) image.blendPixel(originX + x, originY + y, + (alpha << 24) | 0x001A212B); + } + } + } + return image; + } + + private static int scaleForItem(int coordinate) { + return SIZE / 2 + Math.round((coordinate - SIZE / 2F) * ITEM_SYMBOL_SIZE / ICON_SIZE); + } + + private static String[] generatedWords(ResourceLocation id) { + String stem = id.toString(); + return new String[] {stem + 'a', stem + 'b', stem + 'c', stem + 'd'}; + } + + private static int[] glyphs(String word) { + int[] known = WORDS.get(word); + if (known != null) return known; + String key = word.toLowerCase(Locale.ROOT); + int[] cached = WORD_CACHE.get(key); + if (cached != null) return cached; + Random random = new Random(key.hashCode()); + int[] components = new int[random.nextInt(10) + 3]; + for (int index = 0; index < components.length; index++) components[index] = random.nextInt(20) + 4; + WORD_CACHE.put(key, components); + if (WORD_CACHE.size() > CACHE_LIMIT) WORD_CACHE.remove(WORD_CACHE.keySet().iterator().next()); + return components; + } + + /** Draw a word as a layered Legacy glyph, or a number with Legacy's number components. */ + public static void drawWordGlyph(GuiGraphics graphics, String word, int x, int y, int size) { + if (word.matches("[0-9]+")) { + try { + drawNumeral(graphics, Integer.parseInt(word), x, y, size); + return; + } catch (NumberFormatException ignored) { + // Oversized numerals still receive a stable word glyph. + } + } + graphics.setColor(0.13F, 0.10F, 0.08F, 1F); + for (int component : glyphs(word)) drawComponent(graphics, component, x, y, size); + graphics.setColor(1F, 1F, 1F, 1F); + } + + /** Legacy's single-number marks; numbers above 24 use positional base 25. */ + public static void drawNumeral(GuiGraphics graphics, int number, int x, int y, int size) { + int[] digits = SymbolNumerals.digitsFor(number); + int digitSize = digits.length == 1 ? size : Math.max(8, size * 3 / 4); + graphics.setColor(0.13F, 0.10F, 0.08F, 1F); + for (int digit : digits) { + for (int component : SymbolNumerals.componentsForDigit(digit)) + drawComponent(graphics, component, x, y + (size - digitSize) / 2, digitSize); + x += digitSize + 1; + } + graphics.setColor(1F, 1F, 1F, 1F); + } + + /** Render translated prose as a sequence of word glyphs within a fixed-width book page. */ + public static int drawGlyphText(GuiGraphics graphics, String text, int x, int y, int maxWidth) { + int cursor = x; + boolean drew = false; + for (String word : text.split("[^\\p{L}\\p{N}]+")) { + if (word.isEmpty()) continue; + int width = word.matches("[0-9]+") ? numeralWidth(word, 12) : 12; + if (cursor != x && cursor + width > x + maxWidth) { + cursor = x; + y += 13; + } + drawWordGlyph(graphics, word, cursor, y, 12); + cursor += width + 3; + drew = true; + } + return y + (drew ? 13 : 0); + } + + private static int numeralWidth(String word, int size) { + try { + int count = SymbolNumerals.digitsFor(Integer.parseInt(word)).length; + return count == 1 ? size : count * (size * 3 / 4 + 1) - 1; + } catch (NumberFormatException ignored) { + return size; + } + } + + private static void drawComponent(GuiGraphics graphics, int component, int x, int y, int size) { + graphics.blit(COMPONENTS, x, y, size, size, + (component % 8) * 64, (component / 8) * 64, 64, 64, 512, 512); + } + + private static ResourceLocation texture(String path) { + return ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "textures/" + path + ".png"); + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java b/src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java index b1f80b6..7c90bf0 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java +++ b/src/main/java/net/dnorberg/rivencraft/client/screen/BookBinderScreen.java @@ -146,7 +146,7 @@ public final class BookBinderScreen extends AbstractContainerScreen { } case LINK_PANEL -> graphics.fill(x + 5, y + 6, x + 22, y + 17, 0xFF000000); case SYMBOL, UNRESOLVED_SYMBOL -> graphics.blit(NotebookScreen.symbolTexture(page), - x + 1, y + 5, 24, 24, 16, 16, 96, 96, 128, 128); + x + 1, y + 5, 24, 24, 0, 0, 128, 128, 128, 128); } } diff --git a/src/main/java/net/dnorberg/rivencraft/client/screen/DescriptiveBookScreen.java b/src/main/java/net/dnorberg/rivencraft/client/screen/DescriptiveBookScreen.java index 189bc49..2b938b0 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/screen/DescriptiveBookScreen.java +++ b/src/main/java/net/dnorberg/rivencraft/client/screen/DescriptiveBookScreen.java @@ -5,6 +5,7 @@ import java.util.Locale; import net.dnorberg.rivencraft.book.AgeReference; import net.dnorberg.rivencraft.book.AgeTraits; import net.dnorberg.rivencraft.client.ClientBookExploreOverlay; +import net.dnorberg.rivencraft.client.SymbolPageTextures; import net.dnorberg.rivencraft.network.UseDescriptiveBookPayload; import net.dnorberg.rivencraft.network.BindDescriptiveBookPayload; import net.dnorberg.rivencraft.network.ModNetworking; @@ -37,7 +38,6 @@ import org.jetbrains.annotations.Nullable; public final class DescriptiveBookScreen extends Screen implements ExplorableBookScreen { private static final int BOOK_TEXT_COLOR = 0xFF3B281B; private static final int UNRESOLVED_TEXT_COLOR = 0xFF9B302C; - private static final ResourceLocation ENCHANTMENT_FONT = ResourceLocation.withDefaultNamespace("alt"); private static final int BOOK_WIDTH = 327; private static final int BOOK_HEIGHT = 199; private static final int LINK_PANEL_X = 173; @@ -211,7 +211,7 @@ public final class DescriptiveBookScreen extends Screen implements ExplorableBoo Component profileName = generationProfile.getNamespace().equals("rivencraft") ? Component.translatable("generator.rivencraft." + generationProfile.getPath()) : Component.literal(generationProfile.toString()); - detailsY = drawWrappedWithoutShadow(graphics, + detailsY = drawDescription(graphics, Component.translatable("screen.rivencraft.age.generator", profileName), x, detailsY, 110) + 2; } @@ -415,10 +415,16 @@ public final class DescriptiveBookScreen extends Screen implements ExplorableBoo } private int drawTrait(GuiGraphics graphics, String key, Component value, int x, int y) { - return drawWrappedWithoutShadow(graphics, + return drawDescription(graphics, Component.translatable("screen.rivencraft.age.trait." + key, value), x, y, 110) + 2; } + private int drawDescription(GuiGraphics graphics, Component text, int x, int y, int maxWidth) { + return pageFree && age != null + ? SymbolPageTextures.drawGlyphText(graphics, text.getString(), x, y, maxWidth) + : drawWrappedWithoutShadow(graphics, text, x, y, maxWidth); + } + private static Component traitName(String group, Enum value) { return Component.translatable("trait.rivencraft." + group + "." + value.name().toLowerCase(Locale.ROOT)); @@ -429,9 +435,7 @@ public final class DescriptiveBookScreen extends Screen implements ExplorableBoo } private int drawWrappedWithoutShadow(GuiGraphics graphics, Component text, int x, int y, int maxWidth, int color) { - Component displayed = pageFree && age != null && pageIndex == 0 - ? text.copy().withStyle(style -> style.withFont(ENCHANTMENT_FONT)) : text; - for (FormattedCharSequence line : font.split(displayed, maxWidth)) { + for (FormattedCharSequence line : font.split(text, maxWidth)) { graphics.drawString(font, line, x, y, color, false); y += font.lineHeight; } diff --git a/src/main/java/net/dnorberg/rivencraft/client/screen/NotebookScreen.java b/src/main/java/net/dnorberg/rivencraft/client/screen/NotebookScreen.java index 90a0b3d..b3b0791 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/screen/NotebookScreen.java +++ b/src/main/java/net/dnorberg/rivencraft/client/screen/NotebookScreen.java @@ -3,6 +3,7 @@ package net.dnorberg.rivencraft.client.screen; import java.util.Locale; import net.dnorberg.rivencraft.Rivencraft; import net.dnorberg.rivencraft.item.PageItem; +import net.dnorberg.rivencraft.client.SymbolPageTextures; import net.dnorberg.rivencraft.menu.NotebookMenu; import net.dnorberg.rivencraft.registry.ModItems; import net.minecraft.client.gui.GuiGraphics; @@ -26,14 +27,6 @@ public final class NotebookScreen extends AbstractContainerScreen private static final int PAGE_STEP_Y = 41; private static final int PAGE_COLUMNS = 5; private static final ResourceLocation PAGE_ATLAS = texture("gui/notebook_pages"); - private static final ResourceLocation GENERIC_SYMBOL = texture("item/page_symbol"); - private static final ResourceLocation UNRESOLVED_SYMBOL = texture("item/page_unresolved"); - private static final ResourceLocation STANDARD_TERRAIN = texture("item/page_symbol_terrain_standard"); - private static final ResourceLocation NATIVE_BIOMES = texture("item/page_symbol_biome_native"); - private static final ResourceLocation NORMAL_LIGHTING = texture("item/page_symbol_lighting_normal"); - private static final ResourceLocation NORMAL_WEATHER = texture("item/page_symbol_weather_normal"); - private static final ResourceLocation NORMAL_TIME = texture("item/page_symbol_celestial_normal_time"); - private static final ResourceLocation CAVES = texture("item/page_symbol_feature_caves"); private EditBox textInput; private boolean draggingScrollbar; private boolean surfaceClickPendingRelease; @@ -262,7 +255,7 @@ public final class NotebookScreen extends AbstractContainerScreen case BLANK -> { } case LINK_PANEL -> graphics.fill(x + 5, y + 6, x + 25, y + 20, 0xFF000000); case SYMBOL, UNRESOLVED_SYMBOL -> graphics.blit(symbolTexture(page), x + 1, y + 6, - 28, 28, 16, 16, 96, 96, 128, 128); + 28, 28, 0, 0, 128, 128, 128, 128); } } if (dimmed) { @@ -274,23 +267,7 @@ public final class NotebookScreen extends AbstractContainerScreen } static ResourceLocation symbolTexture(ItemStack page) { - var content = PageItem.content(page); - if (content.kind() == net.dnorberg.rivencraft.writing.PageContent.Kind.UNRESOLVED_SYMBOL) { - return UNRESOLVED_SYMBOL; - } - return symbolTexture(content.symbol().orElseThrow().id()); - } - - static ResourceLocation symbolTexture(ResourceLocation id) { - return switch (id.toString()) { - case "rivencraft:terrain/standard" -> STANDARD_TERRAIN; - case "rivencraft:biome/native" -> NATIVE_BIOMES; - case "rivencraft:lighting/normal" -> NORMAL_LIGHTING; - case "rivencraft:weather/normal" -> NORMAL_WEATHER; - case "rivencraft:celestial/normal_time" -> NORMAL_TIME; - case "rivencraft:feature/caves" -> CAVES; - default -> GENERIC_SYMBOL; - }; + return SymbolPageTextures.forPage(page); } private static ResourceLocation texture(String path) { diff --git a/src/main/java/net/dnorberg/rivencraft/client/screen/WritingDeskScreen.java b/src/main/java/net/dnorberg/rivencraft/client/screen/WritingDeskScreen.java index a2f6fea..4ddca24 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/screen/WritingDeskScreen.java +++ b/src/main/java/net/dnorberg/rivencraft/client/screen/WritingDeskScreen.java @@ -5,6 +5,7 @@ import java.util.Locale; import java.util.ArrayList; import java.util.Comparator; import net.dnorberg.rivencraft.Rivencraft; +import net.dnorberg.rivencraft.client.SymbolPageTextures; import net.dnorberg.rivencraft.item.PageItem; import net.dnorberg.rivencraft.menu.WritingDeskMenu; import net.dnorberg.rivencraft.block.entity.WritingDeskBlockEntity; @@ -148,7 +149,8 @@ public final class WritingDeskScreen extends AbstractContainerScreen= 177 && localY < 186) graphics.renderTooltip(font, Component.translatable("screen.rivencraft.writing_desk.next_tabs"), mouseX, mouseY); + else if (mouseX < leftPos + 34 && localY >= 29 && localY < 177) { + int tab = menu.firstVisibleTab() + (localY - 29) / 37; + graphics.renderTooltip(font, Component.translatable("screen.rivencraft.writing_desk.tab_symbol", + tab + 1), mouseX, mouseY); + } } } @@ -270,7 +277,7 @@ public final class WritingDeskScreen extends AbstractContainerScreen { } case LINK_PANEL -> graphics.fill(x + 5, y + 6, x + 25, y + 20, 0xFF000000); case SYMBOL, UNRESOLVED_SYMBOL -> graphics.blit(NotebookScreen.symbolTexture(page), x + 1, y + 6, - 28, 28, 16, 16, 96, 96, 128, 128); + 28, 28, 0, 0, 128, 128, 128, 128); } } diff --git a/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java b/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java index d83dc84..d8c176f 100644 --- a/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java +++ b/src/main/java/net/dnorberg/rivencraft/gametest/WritingDataGameTests.java @@ -3,6 +3,7 @@ package net.dnorberg.rivencraft.gametest; import com.google.gson.JsonParser; import com.mojang.serialization.JsonOps; import io.netty.buffer.Unpooled; +import java.util.Arrays; import java.util.List; import java.util.UUID; import net.dnorberg.rivencraft.book.AgeReference; @@ -11,6 +12,8 @@ import net.dnorberg.rivencraft.writing.PageContent; import net.dnorberg.rivencraft.writing.SymbolCatalog; import net.dnorberg.rivencraft.writing.SymbolDefinition; import net.dnorberg.rivencraft.writing.SymbolSemantics; +import net.dnorberg.rivencraft.writing.SymbolPoems; +import net.dnorberg.rivencraft.writing.SymbolNumerals; import net.dnorberg.rivencraft.writing.SymbolReference; import net.dnorberg.rivencraft.writing.WritingEntry; import net.dnorberg.rivencraft.writing.NotebookContents; @@ -109,6 +112,20 @@ public final class WritingDataGameTests { helper.assertValueEqual(builtIn.schemaVersion(), 2, "Built-in symbol must use semantic schema v2"); helper.assertValueEqual(builtIn.semantics().orElseThrow().role(), SymbolSemantics.Role.TERRAIN, "Built-in terrain symbol must declare its grammar role"); + helper.assertValueEqual(builtIn.poem(), "Terrain Form Tradition Flow", + "Built-in page artwork must carry its four-word Legacy poem"); + helper.assertValueEqual(SymbolPoems.builtIn(reference("rivencraft:terrain/standard").id()), builtIn.poem(), + "Pre-artwork saved starter pages must retain their original poem"); + helper.assertTrue(Arrays.equals(SymbolNumerals.componentsForDigit(0), new int[] {1}), + "Zero must use Legacy's dedicated number mark"); + helper.assertTrue(Arrays.equals(SymbolNumerals.componentsForDigit(1), new int[] {56}), + "One must use Legacy's first bottom-row mark"); + helper.assertTrue(Arrays.equals(SymbolNumerals.componentsForDigit(24), new int[] {63, 59}), + "Twenty-four must combine Legacy's five and unit marks"); + helper.assertTrue(Arrays.equals(SymbolNumerals.digitsFor(25), new int[] {1, 0}), + "Twenty-five must start a second base-25 place"); + helper.assertTrue(Arrays.equals(SymbolNumerals.digitsFor(88), new int[] {3, 13}), + "Last writing-desk tab must retain its numeric value"); String display = "\"name\":\"symbol.example.test\"," + "\"description\":\"symbol.example.test.description\"," @@ -146,6 +163,10 @@ public final class WritingDataGameTests { .encodeStart(JsonOps.INSTANCE, clientJson).result().orElseThrow(); helper.assertFalse(encoded.getAsJsonObject().has("semantics"), "Client display payload must never contain generation semantics"); + helper.assertValueEqual(encoded.getAsJsonObject().get("poem").getAsString(), builtIn.poem(), + "Client display payload must carry page artwork metadata"); + rejectDefinition(helper, "{\"schema_version\":2," + display + + ",\"semantics\":{\"role\":\"weather\",\"value\":\"normal\"},\"poem\":\"only two\"}", "poem"); helper.succeed(); } diff --git a/src/main/java/net/dnorberg/rivencraft/item/PageItem.java b/src/main/java/net/dnorberg/rivencraft/item/PageItem.java index d715233..bfb8579 100644 --- a/src/main/java/net/dnorberg/rivencraft/item/PageItem.java +++ b/src/main/java/net/dnorberg/rivencraft/item/PageItem.java @@ -8,10 +8,10 @@ import net.dnorberg.rivencraft.writing.PageContent; import net.dnorberg.rivencraft.writing.SymbolCatalog; import net.dnorberg.rivencraft.writing.SymbolDisplayMetadata; import net.dnorberg.rivencraft.writing.SymbolReference; +import net.dnorberg.rivencraft.writing.SymbolPoems; import net.minecraft.ChatFormatting; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; -import net.minecraft.world.item.component.CustomModelData; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -42,7 +42,7 @@ public final class PageItem extends Item { page.set(ModDataComponents.PAGE_SYMBOL_DISPLAY.get(), new SymbolDisplayMetadata( reference.id(), key, key + ".description", net.minecraft.resources.ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, path.split("/")[0]), - true)); + true, SymbolPoems.builtIn(reference.id()))); return page; } @@ -118,7 +118,6 @@ public final class PageItem extends Item { private static ItemStack create(PageContent content) { ItemStack stack = new ItemStack(ModItems.PAGE.get()); stack.set(ModDataComponents.PAGE_CONTENT.get(), content); - stack.set(DataComponents.CUSTOM_MODEL_DATA, new CustomModelData(modelIndex(content))); if (content.kind() == PageContent.Kind.SYMBOL) { stack.set(ModDataComponents.PAGE_SYMBOL_DISPLAY.get(), SymbolCatalog.display(content.symbol().orElseThrow())); @@ -134,20 +133,4 @@ public final class PageItem extends Item { : Component.translatable("item.rivencraft.page.unresolved"); } - private static int modelIndex(PageContent content) { - return switch (content.kind()) { - case BLANK -> 0; - case LINK_PANEL -> 1; - case UNRESOLVED_SYMBOL -> 2; - case SYMBOL -> switch (content.symbol().orElseThrow().id().toString()) { - case "rivencraft:terrain/standard" -> 100; - case "rivencraft:biome/native" -> 101; - case "rivencraft:lighting/normal" -> 102; - case "rivencraft:weather/normal" -> 103; - case "rivencraft:celestial/normal_time" -> 104; - case "rivencraft:feature/caves" -> 105; - default -> 3; - }; - }; - } } diff --git a/src/main/java/net/dnorberg/rivencraft/writing/SymbolDefinition.java b/src/main/java/net/dnorberg/rivencraft/writing/SymbolDefinition.java index d7ec70a..321956c 100644 --- a/src/main/java/net/dnorberg/rivencraft/writing/SymbolDefinition.java +++ b/src/main/java/net/dnorberg/rivencraft/writing/SymbolDefinition.java @@ -15,18 +15,20 @@ public record SymbolDefinition( String nameTranslationKey, String descriptionTranslationKey, ResourceLocation category, - Optional semantics + Optional semantics, + String poem ) { public static final int CURRENT_SCHEMA_VERSION = 2; private static final Pattern TRANSLATION_KEY = Pattern.compile("[a-z0-9_.-]+"); private static final Set V2_FIELDS = Set.of( - "schema_version", "name", "description", "category", "semantics"); + "schema_version", "name", "description", "category", "semantics", "poem"); public SymbolDefinition { Objects.requireNonNull(nameTranslationKey, "nameTranslationKey"); Objects.requireNonNull(descriptionTranslationKey, "descriptionTranslationKey"); Objects.requireNonNull(category, "category"); semantics = Objects.requireNonNull(semantics, "semantics"); + poem = Objects.requireNonNull(poem, "poem"); if (schemaVersion != 1 && schemaVersion != CURRENT_SCHEMA_VERSION) { throw new IllegalArgumentException("Unsupported schema_version " + schemaVersion); } @@ -38,6 +40,10 @@ public record SymbolDefinition( } validateTranslationKey(nameTranslationKey, "name"); validateTranslationKey(descriptionTranslationKey, "description"); + if (!poem.isEmpty() && (poem.length() > 96 + || !poem.matches("[A-Za-z]+(?: [A-Za-z]+){3}"))) { + throw new IllegalArgumentException("'poem' must contain exactly four alphabetic words"); + } } /** v1 remains display-only; v2 has an exact field set and typed semantics. */ @@ -66,11 +72,12 @@ public record SymbolDefinition( Optional semantics = version == CURRENT_SCHEMA_VERSION ? Optional.of(SymbolSemantics.parse(object.get("semantics"))) : Optional.empty(); - return new SymbolDefinition(version, name, description, category, semantics); + String poem = object.has("poem") ? requiredString(object, "poem") : ""; + return new SymbolDefinition(version, name, description, category, semantics, poem); } public SymbolDisplayMetadata display(ResourceLocation id) { - return new SymbolDisplayMetadata(id, nameTranslationKey, descriptionTranslationKey, category, true); + return new SymbolDisplayMetadata(id, nameTranslationKey, descriptionTranslationKey, category, true, poem); } static String requiredString(JsonObject object, String field) { diff --git a/src/main/java/net/dnorberg/rivencraft/writing/SymbolDisplayMetadata.java b/src/main/java/net/dnorberg/rivencraft/writing/SymbolDisplayMetadata.java index f462b20..1648f60 100644 --- a/src/main/java/net/dnorberg/rivencraft/writing/SymbolDisplayMetadata.java +++ b/src/main/java/net/dnorberg/rivencraft/writing/SymbolDisplayMetadata.java @@ -14,14 +14,16 @@ public record SymbolDisplayMetadata( String nameTranslationKey, String descriptionTranslationKey, ResourceLocation category, - boolean resolved + boolean resolved, + String poem ) { public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( ResourceLocation.CODEC.fieldOf("id").forGetter(SymbolDisplayMetadata::id), Codec.STRING.fieldOf("name").forGetter(SymbolDisplayMetadata::nameTranslationKey), Codec.STRING.fieldOf("description").forGetter(SymbolDisplayMetadata::descriptionTranslationKey), ResourceLocation.CODEC.fieldOf("category").forGetter(SymbolDisplayMetadata::category), - Codec.BOOL.fieldOf("resolved").forGetter(SymbolDisplayMetadata::resolved) + Codec.BOOL.fieldOf("resolved").forGetter(SymbolDisplayMetadata::resolved), + Codec.STRING.optionalFieldOf("poem", "").forGetter(SymbolDisplayMetadata::poem) ).apply(instance, SymbolDisplayMetadata::new)); public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ResourceLocation.STREAM_CODEC, SymbolDisplayMetadata::id, @@ -29,6 +31,7 @@ public record SymbolDisplayMetadata( ByteBufCodecs.STRING_UTF8, SymbolDisplayMetadata::descriptionTranslationKey, ResourceLocation.STREAM_CODEC, SymbolDisplayMetadata::category, ByteBufCodecs.BOOL, SymbolDisplayMetadata::resolved, + ByteBufCodecs.STRING_UTF8, SymbolDisplayMetadata::poem, SymbolDisplayMetadata::new ); @@ -38,7 +41,8 @@ public record SymbolDisplayMetadata( "symbol.rivencraft.unresolved", "symbol.rivencraft.unresolved.description", ResourceLocation.fromNamespaceAndPath(Rivencraft.MOD_ID, "unresolved"), - false + false, + "" ); } } diff --git a/src/main/java/net/dnorberg/rivencraft/writing/SymbolNumerals.java b/src/main/java/net/dnorberg/rivencraft/writing/SymbolNumerals.java new file mode 100644 index 0000000..27d2b2e --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/writing/SymbolNumerals.java @@ -0,0 +1,30 @@ +package net.dnorberg.rivencraft.writing; + +/** + * Number components from Mystcraft Legacy's ModWords#constructNumber. + * Legacy registers 0–25; larger Rivencraft tab numbers use positional base 25. + */ +public final class SymbolNumerals { + private SymbolNumerals() {} + + public static int[] digitsFor(int number) { + if (number < 0) throw new IllegalArgumentException("Numeral must be non-negative"); + if (number < 25) return new int[] {number}; + int count = 0; + for (int remaining = number; remaining > 0; remaining /= 25) count++; + int[] digits = new int[count]; + for (int remaining = number, index = count - 1; index >= 0; index--, remaining /= 25) + digits[index] = remaining % 25; + return digits; + } + + public static int[] componentsForDigit(int digit) { + if (digit < 0 || digit >= 25) throw new IllegalArgumentException("Numeral digit must be in [0, 24]"); + if (digit == 0) return new int[] {1}; + int fifths = digit / 5; + int remainder = digit % 5; + if (fifths == 0) return new int[] {55 + remainder}; + if (remainder == 0) return new int[] {59 + fifths}; + return new int[] {59 + fifths, 55 + remainder}; + } +} diff --git a/src/main/java/net/dnorberg/rivencraft/writing/SymbolPoems.java b/src/main/java/net/dnorberg/rivencraft/writing/SymbolPoems.java new file mode 100644 index 0000000..b61f566 --- /dev/null +++ b/src/main/java/net/dnorberg/rivencraft/writing/SymbolPoems.java @@ -0,0 +1,21 @@ +package net.dnorberg.rivencraft.writing; + +import net.minecraft.resources.ResourceLocation; + +/** Legacy poems for existing starter pages, including stacks saved before poem metadata existed. */ +public final class SymbolPoems { + private SymbolPoems() {} + + public static String builtIn(ResourceLocation id) { + if (!id.getNamespace().equals("rivencraft")) return ""; + return switch (id.getPath()) { + case "terrain/standard" -> "Terrain Form Tradition Flow"; + case "biome/native" -> "Constraint Nature Tradition Sustain"; + case "lighting/normal" -> "Ethereal Dynamic Cycle Balance"; + case "weather/normal" -> "Sustain Dynamic Tradition Balance"; + case "celestial/normal_time" -> "Transform Time System Balance"; + case "feature/caves" -> "Terrain Transform Void Flow"; + default -> ""; + }; + } +} diff --git a/src/main/resources/assets/rivencraft/lang/en_us.json b/src/main/resources/assets/rivencraft/lang/en_us.json index f29ed11..c8bb90b 100644 --- a/src/main/resources/assets/rivencraft/lang/en_us.json +++ b/src/main/resources/assets/rivencraft/lang/en_us.json @@ -42,6 +42,7 @@ "screen.rivencraft.writing_desk.all_categories": "All categories", "screen.rivencraft.writing_desk.previous_tabs": "Previous four tabs (Page Up)", "screen.rivencraft.writing_desk.next_tabs": "Next four tabs (Page Down)", + "screen.rivencraft.writing_desk.tab_symbol": "Tab %s", "screen.rivencraft.writing_desk.no_symbols": "No available symbols", "item.rivencraft.ink_vial.remaining": "Ink: %s/%s", "item.rivencraft.ink_vial.usage": "Use with paper in the other hand to prepare a Link Panel.", diff --git a/src/main/resources/assets/rivencraft/models/item/page.json b/src/main/resources/assets/rivencraft/models/item/page.json index 6ebfeba..776e88c 100644 --- a/src/main/resources/assets/rivencraft/models/item/page.json +++ b/src/main/resources/assets/rivencraft/models/item/page.json @@ -1,17 +1,13 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "rivencraft:item/page" - }, - "overrides": [ - { "predicate": { "custom_model_data": 1 }, "model": "rivencraft:item/page_link_panel" }, - { "predicate": { "custom_model_data": 2 }, "model": "rivencraft:item/page_unresolved" }, - { "predicate": { "custom_model_data": 3 }, "model": "rivencraft:item/page_symbol" }, - { "predicate": { "custom_model_data": 100 }, "model": "rivencraft:item/page_symbol_terrain_standard" }, - { "predicate": { "custom_model_data": 101 }, "model": "rivencraft:item/page_symbol_biome_native" }, - { "predicate": { "custom_model_data": 102 }, "model": "rivencraft:item/page_symbol_lighting_normal" }, - { "predicate": { "custom_model_data": 103 }, "model": "rivencraft:item/page_symbol_weather_normal" }, - { "predicate": { "custom_model_data": 104 }, "model": "rivencraft:item/page_symbol_celestial_normal_time" }, - { "predicate": { "custom_model_data": 105 }, "model": "rivencraft:item/page_symbol_feature_caves" } - ] + "parent": "builtin/entity", + "gui_light": "front", + "display": { + "ground": { "translation": [0, 2, 0], "scale": [0.5, 0.5, 0.5] }, + "head": { "rotation": [0, 180, 0], "translation": [0, 13, 7] }, + "thirdperson_righthand": { "translation": [0, 3, 1], "scale": [0.55, 0.55, 0.55] }, + "thirdperson_lefthand": { "translation": [0, 3, 1], "scale": [0.55, 0.55, 0.55] }, + "firstperson_righthand": { "rotation": [0, -90, 25], "translation": [1.13, 3.2, 1.13], "scale": [0.68, 0.68, 0.68] }, + "firstperson_lefthand": { "rotation": [0, 90, -25], "translation": [1.13, 3.2, 1.13], "scale": [0.68, 0.68, 0.68] }, + "fixed": { "rotation": [0, 180, 0] } + } } diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json deleted file mode 100644 index 251bac9..0000000 --- a/src/main/resources/assets/rivencraft/models/item/page_symbol_biome_native.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { "layer0": "rivencraft:item/page_symbol_biome_native" } -} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json deleted file mode 100644 index 38bb083..0000000 --- a/src/main/resources/assets/rivencraft/models/item/page_symbol_celestial_normal_time.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { "layer0": "rivencraft:item/page_symbol_celestial_normal_time" } -} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json deleted file mode 100644 index 621bce9..0000000 --- a/src/main/resources/assets/rivencraft/models/item/page_symbol_feature_caves.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { "layer0": "rivencraft:item/page_symbol_feature_caves" } -} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json deleted file mode 100644 index 747cbfb..0000000 --- a/src/main/resources/assets/rivencraft/models/item/page_symbol_lighting_normal.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { "layer0": "rivencraft:item/page_symbol_lighting_normal" } -} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json deleted file mode 100644 index 562ebd7..0000000 --- a/src/main/resources/assets/rivencraft/models/item/page_symbol_terrain_standard.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { "layer0": "rivencraft:item/page_symbol_terrain_standard" } -} diff --git a/src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json b/src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json deleted file mode 100644 index 07c4ed6..0000000 --- a/src/main/resources/assets/rivencraft/models/item/page_symbol_weather_normal.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { "layer0": "rivencraft:item/page_symbol_weather_normal" } -} diff --git a/src/main/resources/assets/rivencraft/textures/gui/symbolcomponents.png b/src/main/resources/assets/rivencraft/textures/gui/symbolcomponents.png new file mode 100644 index 0000000000000000000000000000000000000000..c067640a02e4f75b4e66b71063d5a9454d35bcb0 GIT binary patch literal 12477 zcmd^mXIK+kyY?iZD0L$W(p5qe1(e=(BS=6&K#^WHO?oqQlAzlP0SQgI3W!LR-V;SY zy428#5Q-p#V(5@>(D$74?sJ{<{rP@=7jVtYnzh!fnR&{6-_P*umceyaCSE2009X;a z*Ng!G3hqLIV+`QtXVAbdxPkZ^U;h&*>gN9r9x(i+fBhOjJNkLmkQ)cK9QV;R_Xhwr z!qFeZZRpu?u#xdT;-)s^1e6(&WzV-i9t!|x0K~Pcw}VEPCqnD3k-_t86v`hsyT343 zuADzH%eBIN(X%G`{JTfK*nBg&%BHW;y&7@sGiIFr#M!EzeP0w~;u_h{Z&M?5xj~aclq^n&ODpTP>DjPc3f>%b zFSLCIM{<-n;jH6+q&c?2E#b*`Xa#!fw{f{~YVqXjh!s7*KnbTuy>Ydog_VOp;*xG zBO4m8^u0QTN`)NtyFtRkB$vEuPHczT#Yk*V6vK+V_)iEzqva+0Fx+T9NZ$P37L+vC zQnam3npF=Hz%%b>uc>syZ0sIqv))yyH!*Ovm&%Dpg?1U|vjLpLPcT_=Rxf%ZH#2Uo zH^R|(^vox+oXL+68p&kxu3?o}aJYn1Y;wZe63D`xv*{k3cCa&i7}ilkgPZF~2p!x7 zz4f}Bc(iAm`7?*OwA5bJe1EYMl)B-iR=wu$L-%y zx3P*NpYoJAta!Gw2gk>f#Sk{}DT#(?tjr(QRH-vf0;IM?y#GnDtmoC1#>NT?02STxv0Vz%Y% z1vBaQtYgs#L47}6iPC%MwVp*fd zxZOGh3yBFV1rnODTM8JhuVqpPel4x4b_3J05N=WBV${xBNH}Jw!B8NXytSCr%D(&A zL|B0LUQYj%i?AK%SLtT&;VRq0%_6uyuCr}HE3SMq+|4-yKTV_PNhGoEDg^#uA?z}3 zww%153Qm(H?kTRjv}--VFWc03u-Fm4nFps7*$Oi6rx=;%2Ri>;c_xOd4?L|9l-=~O za3+_k{%VA-U`;h+dDe_)bNR0AN}25qzdHx(ntZVpjeA0MZ1Y(;@tLE5?#1&D2o8w1 zTeaJ)dz<;v;pI|Ozzt5$8`7Mw5+4;_>)E{BwCyU#?DhRMQl?XDM5(t`7NL2v)x3#hJ@+JY!3 z@+-r$xOJqYa>gBCc56iPb5b;-dvthwsDIL366Mbrv{!Zd@8!Eo6N%)!kRMYWK8~5S z^{CT|sCGV#mx0-|wo#$P10jR;>zo%KENyqz6+fTS@uFq2v~T7QI>f;PiPC`z=SFg* z(Dz`Zx=`fG75|lM&+Wp$bP-PCpLwBmgjOBah_|{ zL`6YNuI!*ly%gq}Sv*WdGe7jN0v!3;% z4Rgysj~@;fz`e(x+Ez*UIP18Grama%H)(S=zNgqO|C<-Ud<9o%Yxtx7=p3Ydr%tP`t-i{s%J@M;}9y^S8S-_b+h+H>2Dv7@2{AMmIQ!8y@!7LitY>!+Xuif8LnO=X(njq7gL&pftL+BL?f2w; zTBo=nn#Ee*Sarxr)BXn7t}bfU3F@2U_coTwA!bWk8bjZwr_8p}IVaxcc>xN}dy3hR zh1pGaQgj2YknQ2v1)rG~7co00Y%g9YaXF(e1{ex7#Bc3y%|>r{w4lG-ygpYZopV8V z{p%=G`j~WKVARSBa?DbaP%(GockZpSy11}B)XpV4ac4dL?^jvlI2G;^0v9*i=Ft zY~sd>&rTQy>aHtNJ2vzsh`b5ZT{9iAV<`#bNWy(S44aTzgRZMxB$}w%Vos#IYr2Q7 zvR%pbNFhfe=0tbwACuz)7&nWZ5R+++PB`0}>#lql38kQ2sg~)fXXjp$b*gN&8Z#5& z-0&SLya%rQHhw)mc7$}WREN;Gg%4AeDe3C}a*|C?WhdNikj>=rx4_ziMNYKQR5OlD zHg4~VQwyNL_(!C>*nN0qMq;Kl63ElLTV)YdN(G`L!1kF}lg-tZJG=wFgUicPU*`dq zK2(mxh>*sJ?oOy`Nn>~f{Qc z>`~zw@)r-vCsDzL0#@_67{i;?%}`N$(zwmk4z0?#T@0K`8?j=z{sx`|pw0A@@sIX4 zop~DOzEP=}MbbG1FFRHAB|4U@Pu>*`Mqrz-NSM4lBl^d-X`_@Yi49Ny9&W##BN(>_ zs#G^}i|***nwB&Vh;Sjdj*E||UQeW*f2J_v>Wj6ydWLuB;Ull({Zd&mtQZgi*t?&9 zD^?@ZMj@hW&$pq)bJV`h5Rr~JT0(D~fGJ!#FMhqs*`sNjA3*f&@;1-%G?c7r4*ppu z)5ea83%yhY$go$RX`8Lso=PGoaG`sEAciaJESTEB&V4MLTZAXnc#;af3B8@6llv=O zxU{t1*3Iayk83dq1MphT0T!cx$Gs2fi!dB328;;Dg%oXHkPYL~GUn%-w!LtghJHJa z(geQwEzeZ4Cr|jRUIl69Qf=1d3R4|90^y#Gy#rR^0dqJ$+7IQW13mU|WA zkCjX=)mY=q5s6~KYHbg5PG<6f^SuJ*05QN8npiM9^dg5)K`lkEJy~3;*YViH5$~-J^fGU;pCHZg2^QAk; zy-Wr+pX`du*M$jpd5M)5WX|Ire?Mck_?3?kSDBY@e*qYo)y&>7%BtGE2OTw zD0GLV-@67!q@R}=gRu`n{hx8T-tl59aA^QEJdWC>G`F{xoasQ+S>wy-RV6IVK#d+q1DoO^Ia2K8ELwY0uYM+}CiH z3rTrWh)Iy=X5`^OG${OajA1edx#OnQYr-7ofg`^*Zbv@W0z?%R5OZE>uejt6%+d( zkSme;5*d(%^be7=O@)&<4?yk|TfV*!RN%*jc&3~^ZAFNJUnfdSE1pwF zYT=&5b?UFTz-b*X3Ig}NG99ntY}*zpI6LChV#yhBnyFs!kT{}moAIm3VwOwhy0wes z`r7xD7`~_$3x}Ue1Y6ivsaMYc&neom;qfnsz757cWdbgwWdCmtS8aniVln`URyc>h zyQO5TL%kiy{?q7t%9C+(p_=!ikE;nv8-Q6$%tH!qVdA z6iX-1C*NH?J9BluQvWAI$^zTQU9@JcQL}^aiNis{2SEswdxN&I;CDV)V2NB#mLG(TGeB+UusUa0Z`0N^U+O)*N3Au!}p3{Vqz# zL28;YY?JafXBULrP>H|>_UYqbmtoH82BUg!dIOs&dOxZF?N8DX=>aHI|bpyLka^h*Ow?i`Gcn}~7oQ9)q^n&q5u^CfW zE9tvOF;56z7v4xS+E5)T<*tzLrDcCu8)x>k$NKZ$sOIfMS z3sI@R{s1l+rNwsno8Em18V<4VF)_lG7bHHpLeOs@lmEj6*z>`Rv zePEATbYza2h~8;XXb|TE5WH4_#M$yFoA9E^pzpjpC6E_zTVB!L<*N(l)sf4BQT#ScTRodC$9?>lvNPc@&O$q@8SBO?~dbj zG=4Qv-I2j}LCN6TLbA}nY%$0Yac@6)56%ugev@02*P)JCW_<$BbH@~7To(K1qh-#i z_q3+VbJIrd>Ede5eKahXyAL$z-ksXnj!TJQTx5BNgCpyQ>sic9nY&f7x{`jE8H4KQ z$oSJ72;*GluD1ka#n*8*54YPEajE@oHm1;GxpTN|gHtb|X||D_ek7vhzQq*uN8h7m zP1ctqeV&4lqJo{^V`ijxVBma12&=rb{9_DsnJJb600sRq@)~LI3&fzuLgrvW9IG?C zD%>ztB|i~F+(oI}p-=0viTLh`rDmUjp5~Yo@@{3GHo7yjGHfrfaEum65RJA%7>hmc zxEj8$5(q^Nh>xNf>m7wBshMTiXLDxYm-<(W8i{Kq{cJe3bV@2(hSGNeUNWq6| zsJB2U6wNf=zda&C$j2@|_74z87#H(JOc|`N!Mh@-O+{-|+rklvqRAP*taaqgT6hn9 z#{;J+nWOYA7LEuXqKg8qLu?@#&J(7vDMk&z!~G|S<`KM6&UO~KaNLhX$2z#QZmC+^ z3}OZ0XCg6cBrNhDx%fYm^6wpnN9<6XoGalcT-sp$6FfgoE!hzv;gr)G3wQNlI($pO z!w$t(n^c&`QcQs=C=IrK)9&*Z1a2Ug@-re3rfJ?GJ9@V$hv$_7li2VvUEF|eGwlqi zTj#1RgB43X>oDKT!R^Veh$NUdqg1{NtR;+nxap}LZs2el)Je4WT}do<9mn_gBO~xu z4g#&G&8cnMnO-O1tTP`eJ$#hOVran2&$XKn)Yq4N)B!M19P{DuNf9of)~LX?xk{3I zU&!5H#6RR~rj-#y1~BKSC!{`>d)tqpSu=OY5)Pxwhh`U^j=qAVx&O}1vJrf45j9Oc$(9MJH3Thr#iY>r z=kUD#M{`cp2f7%|OXmvPI+W$b*a82eM9kMb2dfxX8?R3=R_|!tq>i4f*U-WZbUl#e z3o7SItKyB#n4b~G#yF`_r4fs6y*v39_Zz_soe`<(CN=3U2S-dusTAjF&r8^)aC|ox zMCJI7O&RE1!woEdlFj$+7+KNDb_os&@A~+#siXnbcov~^n27*~S2yjZ5}xgN$jPpbK#gBNU) z@dqs4w-FEe8-?MpV$I(WXa(V+7V3ujTS3md&^?~mp>%pP*7|_qhaZlw*62WJ96kd< z+GzD9o)%TU%fLRQ29;OKiSX$kjGSxgG==!~~hkm6Af#oPinArrvO1PTfXR@uE1o_tMzT~L`Epq&^6PB10U zuEVd3)+o0XCmNgbo~p539fAuP_Nn=Y8sgA-9hrl*rNKCXIQ|#p94y5;jr`NNog4c$ zetsqTbg026{UhA_0X>u6{#xhS?xO<-S<=8RrivA*zWPMNc1jlDMd$7&!HaeMoF!&^ zqI3=Y*OKArH1eWx`=7$+3X!(Kt~jl@AIbAV^oBY@^k{F~*dppDXO>7|`1O$a;iiNr zogV)+yRK%--?-Z4ZZ6DITaZg`y#&hT8W9V~3ly1)t>!e6M33eW~ zBMi+Hx!7mU89JYX3{Luuf!E7we;y7`@KL)Nk7tYk#gpO-i_v{{+GB05X+0 z8~6B)ONNawHx2~NMPnbND2gYK5_S>~6T+A{Xr9}mBzA?eUSjCb$JqnbJtCkhNaRkI zar?u^SuS233-lOagpGp|d<1wmHffP$D}S=VM9(~(EVPu=$_J)XBJhOR-<=;Z0WNoA ztzAbWOgs*rC)w<5LaMazY4o^e5trodZcrr0i_7*pnNsHddPlh=i^KJ%4cj|zD73x< z3P{d+G#zi`wOWjQ0@#MHs3hRuYlo;X4AUX0GNRE(eh@+iJQ6-CZb!u^m37 zD6pO1k{nYE?YC$=Pz2b4y`vPJE-p0&k=-RByP-w*PAH!<0JSI6qdGYK*517ta#181EZ<%9yg%ct&;mp0lFuutlE}O z+%67{yU@N6-y)2t)GhVLEvIN^^fC%GRK=Hmxd-MeG?q{dnTKjR9iXhd1IL@d6zBrT zDRmJZz(YZ$0yjcUKa4}5(#S)`?F~BrOt!nX!(X%?CnRA++-r=(T*C>S<{J04L6R%A zzp=P%YgnAKP;Ay(=x`VIghv~J+s)t31k{Ga7uaFHST0W}omcp$aW&G5-L#$mh2|1| z9xrgPCH1watk7=?tyg#7zYp?Yi)@Abo+m;Z!FHSQp)CedZ*7rS#3PWBs$=#rO#)7Z z-Tf@2%cP*Jv#!Hz7)oAq$SEH^5aJ6}XB7qZUh9Ul+_EZuKSq=D!3Y;7DDy%Z`>HFQ zB8+0er2Em>kS0X@M(u_bK>~#Os=MjE@|&G5l~iOEB9&FjeCL*~9f8@~5hH>@@3>y- zN9lqP-A;Xpe%1b{{r+p^H)~QG6*}3clqCo^<;Cto4NAazoZiPBzl#b)UaTp3=3UGD zVI41Mv{g*qHrO&??^hOGlIP~;Wd$1}yO9+OVV(DW%CTEQB;BRhE}z5gwmm(&pr14} zo6o9kc=1Ll0{28ug80iJ7b`#X(6%<-lx2hjTU+dli~#ra#?6yt<2+nIQrjxOeijk# zkOGd55jl%MlxpKd9%qYH7Ia)^X&%Un;hvIeD}aL>GlTrmm`Ue)DdhCMocKY)`xN|5 zFbYMfCx+C#UU2)E8Ao0KBbu_(OeWQWAxyI^0dZ6(a3;f9ry;)1Gp2-eu>1O|p**9I z46pSwiW=#M3S&!@e0H&A163qeGg@P*j7dD zxb1Wf8e>Pr`Jwef)hLi({$*Fhksv3|*y^zOaT%4>+pm^pv$0Bx(rNumrNKa4VGc#g ze%1+P`oU~9YS!97IMfm(CPz!T$^^{$FGVaf>ty8yE0xTB8ws&b5#{db!g$LuZOw~u z-X*aTvXIt>Q06CcMWMhJ&06M!4;6qSKI z;C@#ttByn8hYQr7G+zN5@Tu_HZJos~S&=GL47g#Is-qT3S+aaCjRtb(c)eeALJ|kA zt{)ffd!E+mZG}aZa~SEje&58F-AOtfYdSke2pM7~HR)V)=M(1!J02@ZIErB1UiEeB z&;2WqX@b2$Njnxt!%vdlro>5xm)8v`+?wni4vukOTNdcnq-(x%$ZnN^{+Q;VbNH(`lG z{OK-Y#fj1V4ZPm)P5C1ZM0A&ulH;`)JEL68hU*yHUpWzUr$HoIrDXo5U$`)V2MZe_ zj#`;T5C@m>H5!ekZZk>^MJt9vvb^eDO{RqQl*orsPr-#U`HT+t_gEZS*qTso0YQH# z1vorcC{bNq)>*@68&=Y875CigXkFM_)SwC+nZv$8SCb+3F@vie<@ord_+%ASte66= z*^Ndgel5NM0DoLM`WE15!}X7z{)rxg~@>(u<#HMar-fi zZ}^3szm?Sf^d&SPt*r$~okbuHhB^5Apy?Ro^y%h#TdxA4jMH&qE# z+$@`&*-Emx(hNc4BRitPH;)r~kFY!TFaN6-J}k!&&Hvo+HyT5o1%u$7z>%(U?fv zT;6*qLSIVOMi@&iJdd+^w%)=_%6p?upLB;%My)^zyi{zXVgVPq?y#`Ju1BYWtS1gr zBa}hL+ULlu4>5o_|NQ74ezQRfLb^&C#!8G5RtQxfeZpys9BMUyoJFpHwIhSDjGYdb z^jY7PdXZ1r=7w@ZB$s-Mpc>HauXVoL$`9dro;L~3|D~|BZ*V@J08KzgOny|Qtq8$( zqtwYk{yzm4gfUtkItF!tY?a!Z4!DE<{pfxMNJgk=;aitgT)RIa0`yC*aolk8Wbzt3 z5;q=CPBCuh)Vc9r67qket^bdQ*?Gn+5!uh6&SE3~4C}b;j}qJd7*32dME~@ZG0B2- z!A?3$6k$x`It(U^5c=IEb|uZ~{vk)ZpZxhG!XKjusRLvex3B{`-~J#S5UB2QP;Qt% z_8lmvOYQeZF!RyxqeyVOUAmzU(mt*Z0$b2M_FyX)m0CE$^P+JoWa{3@l^!DVp+Z2o zHy~KJ6mr5$Dcg4fR?V(7ZZx#0)&)qxq7`{@kC%b%42y!hklg$C(l;Vh7elyjl5czh znyK$=4-8?9N_`f|SsWxuth*)G=~IZN`+xioLDj;F>z_gOmz=U3@dPBjpP!bWS7aP2 zvjKz@j${_@6k%SA@!S4>A|%*4C=5v`*%md=S!DG-591%)9!K9j%Il^d zNAi8S>}-YmHp0Rh=BEG5I*V8g=&dQ@N{`_I1uc6?JEyMZt4);$!fX&kir;@v)gvHj z{f8h;WSwa-Txym^o(HMhN_TCVdCVhy7KGuC>LW3#_SWh=Tv??p7Qt2oL*4AaP{e93 zw>9U)kMXDC7zP{=y2dyUd)QZ5%b{7}$8Rz^g^^Oo! z65heF=&-aArIuxnYaxkG(C?MEF}({nuB7Xg>x05|lAO%m#)FnM&%`5ItZ~=hC%X4# zm<)JU)faib_wY-c$ul>t*7i#d-Y=qb3^#m2x|(RRym9PrO`Zja6&Z+(9`Y+Eyc4}_ z(_QE=`(G)yt={}jnqGP2(IlJmU-GV1ymoM6Sk)Df^uBaXy{oyrg#|nJXQ9A5aE6sY z4g-<*tOC-x10UAoDJqt+F^0sjaXYzzxroKvZo)~-_oe(IuIWc3g zucAn4NiI;ZJObAX)6Khy~Bz;g~ zk#-Y@r#u_AxrW)zEd1|h2+ije!l>cM7pT@FpoTZuST)IdO^r&}STw8otvnA}PQP=h zn)_D@lohgd_qV6Fxm!h>Q+a|NsJ$BEGm(t)N*e7~3oD=dmJcEi9!Yv7&mSBM7tw{q zd4b}9+A;pRORYTrt})wWzE)uWTF9q5SbRD*WA@vdl!q~VtgOSslc1vPn^tp5DL9<_ z%V6L>^HSr7(lxv47(iI3(z^cZYfa^Zd#Xwa?--0FW*G^RxGQ|+y52>yBV%bT>AIw$?LQC=)NrE z(JZ4{>{j1I9m)laqJ1TrWq}5N7wZ*Iagh7nJI`;Lq`_8QRg~WWOB>L}4cq}&_TCCy z8Qit~c{KP2C4~$`z)TbJ!51{V+0UR`AgrYoz+T<;N4@ggwOc@osO$RGOE1Fryix9n z1URcbjCA|WQ5)|k214GobiLcS>>=)};JNI?4Szjk{_)`pJ%%DGWrrK@)o2%dj|RD7 z_#j8y9^l?nzK9b?yZXDLQZ;a+X{PrvUKb~K2BS>)#jB#c zC44UWaFrw(fn*lVOj9FykiJ)(JUCS_F-Wl2F#@^P`9m=vMxJT6iJ(kK#aLr_sCznY zSw6>BQKVgY-iXME8XfRf0=N&q6CPoqC{3ReGU3prVeabk57D6!2T#v zvLRB`Pt+bW9dc*lFgF4Qs*|0)$5s5T$~7m%b-dTll5b2-|ZIC=bSUuTyCaye^P`N2XvSclr{jPQE+> zW0g?TAuE2zYjA2Dht}65sltxCe9tp1UOL9X*%OS5WciOY3r~kk8f9MFMV-1{TfVJd z3i%peT_)w?eBZ)}+7j(f);j8RCr0G;VK{SB@9!{tq7?H-QpWNK&IjClw1dTK+JPkP!lvr!qY~q9@MfjA#&U%cWxZcj^;=)@ zF|*!PB2Dtv9Z&$f%5PxNgH;9=l&ulIa#1Hcx8~*0%h$bDV0y8*Z;(enFENFzJSUV{ zv{U`@s4Q{EV-C=F`?&LuD&Ua@lFID%I{2TpKJZbCMRuz4_5(shF!BW}&WQnB+ z$uBr{${Jb>%_uCUE)nVxMc#BuS-x{K?w(Qw|Ej|IlJ#(+mS#-g=NnnS#^nv%}wVGZOnO(gjdkIL(L%|3C{(`+k8BKo;~P=i|p|7Y`MH6>&j2cn!@Ev9=|w z%Lk0m>GGBwOig>kzUnnuEqFlTsTeN`jSKzzR4I6BDtwYbsadu8j2ERg;I=nMyr?P5 zo-6wM(4qHQ73B0wfl*O{=oLXBg-w^SM#}vVTGh6pfF|@-D;red2Jhw@&9_2BV=ce0 zQ8jT;!fucXu=;-!DxZ=c+`~6d{ko|~XdESe&l4QG^_U23uizyaA;rhP$_O%wnw$}< z?fyXV9&42A{WXisSJj4_n46f#l+!Z3YYlT-hGhQ@lqdAUVZ-coK!Ep$j{UUnhu3{) zxM;@6zi1<0krlqSDL)P=zJuWRlHQzWs9k21p|w}3OI|Z;y)*B@S2-nmg?I6j=CRha zHq^;;zwW*9_(Fdfgl{+G;-N_zH+ww}9t>8M|0g5;H%IL|xl41c=wfC>Vi>{yEdUVO M2G@%Iw0rP>0M@@m3IG5A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_biome_native.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_biome_native.png deleted file mode 100644 index cfd7e6aba9af9461c92e2432f5abb03b336a6082..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12141 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 AY5)KL diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_celestial_normal_time.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_celestial_normal_time.png deleted file mode 100644 index eb763e9d187eeafc22b894ceb852f7cc78921556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11991 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 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_lighting_normal.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_lighting_normal.png deleted file mode 100644 index e5a43dc39e6a7df0819fa37da092382e8353d57f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12567 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 diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_terrain_standard.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_terrain_standard.png deleted file mode 100644 index baacfc2984c3adf88d9eaf3d913da4bb9c1e33c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12669 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 L<;2QG^#lGNQzLvF diff --git a/src/main/resources/assets/rivencraft/textures/item/page_symbol_weather_normal.png b/src/main/resources/assets/rivencraft/textures/item/page_symbol_weather_normal.png deleted file mode 100644 index b3ad202f499392bf6e5bc6f3961961d06e4fcb7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11988 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