From 9d5ff2a2cb12b9c15c356558cf1a0006ba24e95a Mon Sep 17 00:00:00 2001 From: Dustin Norberg Date: Thu, 22 Oct 2026 03:40:10 -0400 Subject: [PATCH] Complete authored sky colors and eclipses (#44) --- README.md | 18 +- dev images/Pasted image (2).png | Bin 61343 -> 0 bytes dev images/Pasted image.png | Bin 0 -> 43583 bytes gradle.properties | 2 +- .../book/AgeEnvironmentCompiler.java | 6 +- .../rivencraft/book/AgeGenerationPlan.java | 2 +- .../book/AgePersistenceGameTests.java | 17 +- .../rivencraft/book/AgeSkyProfile.java | 167 ++++++++++++++++-- .../book/EnvironmentWritingGameTests.java | 92 ++++++++-- .../client/RivencraftSkyEffects.java | 80 ++++++--- .../rivencraft/client/SymbolPageTextures.java | 29 ++- .../event/AgeCelestialAngleSync.java | 3 + .../rivencraft/registry/ModCreativeTabs.java | 2 +- .../rivencraft/writing/SymbolSemantics.java | 5 + .../rivencraft/writing/WritingGrammar.java | 20 ++- .../assets/rivencraft/lang/en_us.json | 70 ++++---- .../symbols/celestial_color/black.json | 1 - .../symbols/celestial_color/blue.json | 1 - .../symbols/celestial_color/green.json | 1 - .../symbols/celestial_color/orange.json | 1 - .../symbols/celestial_color/purple.json | 1 - .../symbols/celestial_color/red.json | 1 - .../symbols/celestial_color/white.json | 1 - .../symbols/celestial_color/yellow.json | 1 - .../rivencraft/symbols/color/black.json | 1 + .../rivencraft/symbols/color/blue.json | 1 + .../rivencraft/symbols/color/green.json | 1 + .../rivencraft/symbols/color/red.json | 1 + .../rivencraft/symbols/color/white.json | 1 + .../rivencraft/symbols/number/0.json | 1 + .../rivencraft/symbols/number/1.json | 1 + .../rivencraft/symbols/number/10.json | 1 + .../rivencraft/symbols/number/11.json | 1 + .../rivencraft/symbols/number/12.json | 1 + .../rivencraft/symbols/number/13.json | 1 + .../rivencraft/symbols/number/14.json | 1 + .../rivencraft/symbols/number/15.json | 1 + .../rivencraft/symbols/number/16.json | 1 + .../rivencraft/symbols/number/17.json | 1 + .../rivencraft/symbols/number/18.json | 1 + .../rivencraft/symbols/number/19.json | 1 + .../rivencraft/symbols/number/2.json | 1 + .../rivencraft/symbols/number/20.json | 1 + .../rivencraft/symbols/number/21.json | 1 + .../rivencraft/symbols/number/22.json | 1 + .../rivencraft/symbols/number/23.json | 1 + .../rivencraft/symbols/number/24.json | 1 + .../rivencraft/symbols/number/3.json | 1 + .../rivencraft/symbols/number/4.json | 1 + .../rivencraft/symbols/number/5.json | 1 + .../rivencraft/symbols/number/6.json | 1 + .../rivencraft/symbols/number/7.json | 1 + .../rivencraft/symbols/number/8.json | 1 + .../rivencraft/symbols/number/9.json | 1 + .../rivencraft/symbols/sky_color/black.json | 1 - .../rivencraft/symbols/sky_color/blue.json | 1 - .../rivencraft/symbols/sky_color/green.json | 1 - .../rivencraft/symbols/sky_color/orange.json | 1 - .../rivencraft/symbols/sky_color/purple.json | 1 - .../rivencraft/symbols/sky_color/red.json | 1 - .../rivencraft/symbols/sky_color/white.json | 1 - .../rivencraft/symbols/sky_color/yellow.json | 1 - 62 files changed, 431 insertions(+), 128 deletions(-) delete mode 100644 dev images/Pasted image (2).png create mode 100644 dev images/Pasted image.png delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/black.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/blue.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/green.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/orange.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/purple.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/red.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/white.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/yellow.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/color/black.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/color/blue.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/color/green.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/color/red.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/color/white.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/0.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/1.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/10.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/11.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/12.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/13.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/14.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/15.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/16.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/17.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/18.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/19.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/2.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/20.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/21.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/22.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/23.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/24.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/3.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/4.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/5.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/6.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/7.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/8.json create mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/number/9.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/black.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/blue.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/green.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/orange.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/purple.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/red.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/white.json delete mode 100644 src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/yellow.json diff --git a/README.md b/README.md index be26d23..6e9b5b3 100644 --- a/README.md +++ b/README.md @@ -124,14 +124,20 @@ the top or underside of one of its blocks. Insert a bound Linking or Descriptive Book to activate it; the book remains visible on the receptacle. A Linking Book aimed at its own dimension still opens a visual portal, but travel requires Intra Linking. -Sky writing includes eight color pages and a Static Sky page. Multiple sky-color -pages blend their colors, tinting the Age sky, book preview, and the fallback -surface of portals linked there. Multiple celestial-color pages blend for the -next written sun or moon. An Age may have no suns or moons at all; -Static Sky animates the sky with television-like noise. Sun and Moon pages add +Sky writing has shared Red, Green, Blue, White, and Black pages plus 25 D'ni +number pages (0–24). Put colors before a Sky, Sun, or Moon page to color that +target; trailing colors tint the sky. A number immediately before a color sets +its strength to number × 10. Without a number, a color gets a seeded random +strength from 0–24. RGB contributions add in any order, White brightens all +channels, Black subtracts from all channels, and omitted channels remain zero. +The resulting sky color also tints book previews and fallback portal surfaces. +An Age may have no suns or moons at all; Static Sky animates with fine-grained +television-like noise. Sun and Moon pages add independent bodies; preceding color, size, angle, period, phase, and direction pages configure the next body. The third and each subsequent sun add increasing -instability. Newly generated page-free Ages also choose a deterministic sky, +instability. Overlapping moon and sun discs produce an eclipse: the moon darkens, +the sun's color brightens at close alignment, and world and sky lighting dim. +Newly generated page-free Ages also choose a deterministic sky, color, and celestial arrangement from their Age seed; older saved Ages retain their previous sky. diff --git a/dev images/Pasted image (2).png b/dev images/Pasted image (2).png deleted file mode 100644 index 3bcb9aec0d6eb11b332ff0fa391df02716c648af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61343 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 R3C92c002ovPDHLkV1mujOv(TN literal 0 HcmV?d00001 diff --git a/gradle.properties b/gradle.properties index b2894e0..231477f 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.6.8.7 +mod_version=0.6.8.10 immersive_portals_version=6.0.7 terrablender_version=4.1.0.8 serene_seasons_version_id=pHEgQQUE diff --git a/src/main/java/net/dnorberg/rivencraft/book/AgeEnvironmentCompiler.java b/src/main/java/net/dnorberg/rivencraft/book/AgeEnvironmentCompiler.java index 82eb609..8f116a5 100644 --- a/src/main/java/net/dnorberg/rivencraft/book/AgeEnvironmentCompiler.java +++ b/src/main/java/net/dnorberg/rivencraft/book/AgeEnvironmentCompiler.java @@ -108,11 +108,7 @@ public final class AgeEnvironmentCompiler { /** An authored color is fixed; -1 means the biome or selected vanilla sky supplies it. */ public static int skyColor(AgeGenerationPlan plan) { - if (plan == null) return -1; - return AgeSkyProfile.mixColors(plan.activeSymbols().stream() - .filter(symbol -> symbol.semantics().role() == SymbolSemantics.Role.SKY_COLOR) - .map(symbol -> ((SymbolSemantics.ChoiceValue) symbol.semantics().value()).id()) - .map(AgeSkyProfile::color).toList()); + return AgeSkyProfile.authoredSkyColor(plan); } public static int selectedSkyColor(AgeGenerationPlan plan, ResourceLocation fallback, int biomeSkyColor) { diff --git a/src/main/java/net/dnorberg/rivencraft/book/AgeGenerationPlan.java b/src/main/java/net/dnorberg/rivencraft/book/AgeGenerationPlan.java index d16e993..b847b11 100644 --- a/src/main/java/net/dnorberg/rivencraft/book/AgeGenerationPlan.java +++ b/src/main/java/net/dnorberg/rivencraft/book/AgeGenerationPlan.java @@ -188,7 +188,7 @@ public record AgeGenerationPlan(int version, long ageSeed, OrderedWriting writin String raw = item.getString("Value"); SymbolSemantics.Value value = switch (role) { case TERRAIN, BIOME, BLOCK, FEATURE -> new SymbolSemantics.ResourceValue(ResourceLocation.parse(raw)); - case PERIOD_MODIFIER, ANGLE_MODIFIER, PHASE_MODIFIER, SIZE_MODIFIER -> + case PERIOD_MODIFIER, ANGLE_MODIFIER, PHASE_MODIFIER, SIZE_MODIFIER, COLOR_NUMBER -> new SymbolSemantics.NumberValue(Double.parseDouble(raw)); default -> new SymbolSemantics.ChoiceValue(raw); }; diff --git a/src/main/java/net/dnorberg/rivencraft/book/AgePersistenceGameTests.java b/src/main/java/net/dnorberg/rivencraft/book/AgePersistenceGameTests.java index 3bc3559..8dff0a2 100644 --- a/src/main/java/net/dnorberg/rivencraft/book/AgePersistenceGameTests.java +++ b/src/main/java/net/dnorberg/rivencraft/book/AgePersistenceGameTests.java @@ -125,9 +125,9 @@ public final class AgePersistenceGameTests { new AgeReference(UUID.randomUUID(), "Stable Writing"), stable); AgeDefinition defectiveAge = AgeRegistrySavedData.resolveOrCreate(helper.getLevel(), new AgeReference(UUID.randomUUID(), "Defective Writing"), defective); - helper.assertValueEqual(stableAge.instability().score(), 0, + helper.assertValueEqual(nonCelestialInstability(stableAge), 0, "Missing seeded branches do not add instability"); - helper.assertValueEqual(defectiveAge.instability().score(), 600, + helper.assertValueEqual(nonCelestialInstability(defectiveAge), 600, "Out-of-order and repeated terrain pages each add their saved penalty"); helper.assertTrue(defectiveAge.instability().breakdown().stream() .anyMatch(part -> part.reason().equals("duplicate") && part.pageIndex() == 3), @@ -184,9 +184,9 @@ public final class AgePersistenceGameTests { new AgeReference(UUID.randomUUID(), "Three " + structure), structureWriting(structure, 3)); AgeDefinition four = AgeRegistrySavedData.resolveOrCreate(helper.getLevel(), new AgeReference(UUID.randomUUID(), "Four " + structure), structureWriting(structure, 4)); - helper.assertValueEqual(three.instability().score(), 0, + helper.assertValueEqual(nonCelestialInstability(three), 0, "The first three " + structure + " pages retain Legacy's zero cost"); - helper.assertValueEqual(four.instability().score(), 100, + helper.assertValueEqual(nonCelestialInstability(four), 100, "The fourth " + structure + " page must add Legacy's 100-point cost"); helper.assertTrue(four.instability().breakdown().stream().anyMatch(part -> part.reason().equals("excess_" + structure) && part.pageIndex() == 8), @@ -216,7 +216,7 @@ public final class AgePersistenceGameTests { )); AgeDefinition bright = AgeRegistrySavedData.resolveOrCreate(helper.getLevel(), new AgeReference(UUID.randomUUID(), "Double Bright"), duplicateBright); - helper.assertValueEqual(bright.instability().score(), 1500, + helper.assertValueEqual(nonCelestialInstability(bright), 1500, "Each Bright Lighting page costs 500 and the extra controller costs another 500"); helper.assertValueEqual(bright.instability().breakdown().stream() .filter(part -> part.reason().equals("bright_lighting")).count(), 2L, @@ -420,6 +420,13 @@ public final class AgePersistenceGameTests { helper.succeed(); } + /** Isolate the writing-cost assertion from seed-completed extra-sun instability. */ + private static int nonCelestialInstability(AgeDefinition age) { + return age.instability().breakdown().stream() + .filter(part -> !part.reason().equals("extra_sun")) + .mapToInt(AgeInstability.Contribution::points).sum(); + } + private static CompoundTag entry( UUID id, String name, diff --git a/src/main/java/net/dnorberg/rivencraft/book/AgeSkyProfile.java b/src/main/java/net/dnorberg/rivencraft/book/AgeSkyProfile.java index 56b896f..52a56d6 100644 --- a/src/main/java/net/dnorberg/rivencraft/book/AgeSkyProfile.java +++ b/src/main/java/net/dnorberg/rivencraft/book/AgeSkyProfile.java @@ -48,7 +48,7 @@ public record AgeSkyProfile(Style style, int color, List bodies) { public static AgeSkyProfile compile(AgeGenerationPlan plan, AgeTraits traits) { if (plan == null) return new AgeSkyProfile(Style.INHERITED, -1, List.of()); Style style = Style.INHERITED; - int color = AgeEnvironmentCompiler.skyColor(plan); + int color = authoredSkyColor(plan); boolean customBodies = hasCustomCelestials(plan); List bodies = new ArrayList<>(); Set active = new HashSet<>(plan.activeSymbolIndices()); @@ -58,18 +58,32 @@ public record AgeSkyProfile(Style style, int color, List bodies) { float phase = seeded.celestialPhase(); float size = 1.0F; List bodyColors = new ArrayList<>(); + ColorAccumulator pendingColors = new ColorAccumulator(); + Integer colorMultiplier = null; boolean clockwise = true; for (AgeGenerationPlan.ResolvedSymbol symbol : plan.symbols()) { if (!active.contains(symbol.index())) continue; SymbolSemantics semantics = symbol.semantics(); + if (semantics.role() != SymbolSemantics.Role.COLOR + && semantics.role() != SymbolSemantics.Role.COLOR_NUMBER) colorMultiplier = null; switch (semantics.role()) { - case SKY -> style = switch (((SymbolSemantics.ChoiceValue) semantics.value()).id()) { - case "overworld" -> Style.OVERWORLD; - case "nether" -> Style.NETHER; - case "end" -> Style.END; - case "static" -> Style.STATIC; - default -> throw new IllegalArgumentException("Unknown sky style"); - }; + case SKY -> { + pendingColors.clear(); + style = switch (((SymbolSemantics.ChoiceValue) semantics.value()).id()) { + case "overworld" -> Style.OVERWORLD; + case "nether" -> Style.NETHER; + case "end" -> Style.END; + case "static" -> Style.STATIC; + default -> throw new IllegalArgumentException("Unknown sky style"); + }; + } + case COLOR_NUMBER -> colorMultiplier = (int) ((SymbolSemantics.NumberValue) + semantics.value()).amount(); + case COLOR -> { + pendingColors.add(((SymbolSemantics.ChoiceValue) semantics.value()).id(), + colorMultiplier == null ? randomColorNumber(plan.ageSeed(), symbol.index()) : colorMultiplier); + colorMultiplier = null; + } case PERIOD_MODIFIER -> period = ((SymbolSemantics.NumberValue) semantics.value()).amount(); case ANGLE_MODIFIER -> angle = (float) ((SymbolSemantics.NumberValue) semantics.value()).amount(); case PHASE_MODIFIER -> phase = (float) (((SymbolSemantics.NumberValue) semantics.value()).amount() / 360.0D); @@ -80,7 +94,8 @@ public record AgeSkyProfile(Style style, int color, List bodies) { .id().equals("clockwise"); case CELESTIAL -> { String choice = ((SymbolSemantics.ChoiceValue) semantics.value()).id(); - int bodyColor = bodyColors.isEmpty() ? 0xFFFFFF : mixColors(bodyColors); + int bodyColor = pendingColors.written() ? pendingColors.rgb() + : bodyColors.isEmpty() ? 0 : mixColors(bodyColors); if (choice.equals("normal_time")) { if (customBodies) { bodies.add(new Body(Kind.SUN, bodyColor, size, angle, period, phase, clockwise)); @@ -96,6 +111,7 @@ public record AgeSkyProfile(Style style, int color, List bodies) { phase = seeded.celestialPhase(); size = 1.0F; bodyColors.clear(); + pendingColors.clear(); clockwise = true; } default -> { } @@ -124,6 +140,74 @@ public record AgeSkyProfile(Style style, int color, List bodies) { | (int) ((blue + count / 2) / count); } + /** Shared color pages affect the next Sky or celestial page; trailing colors tint the sky. */ + public static int authoredSkyColor(AgeGenerationPlan plan) { + if (plan == null) return -1; + ColorAccumulator pending = new ColorAccumulator(); + Integer multiplier = null; + int skyColor = -1; + List legacyColors = new ArrayList<>(); + Set active = new HashSet<>(plan.activeSymbolIndices()); + for (AgeGenerationPlan.ResolvedSymbol symbol : plan.symbols()) { + if (!active.contains(symbol.index())) continue; + SymbolSemantics semantics = symbol.semantics(); + if (semantics.role() != SymbolSemantics.Role.COLOR + && semantics.role() != SymbolSemantics.Role.COLOR_NUMBER) multiplier = null; + switch (semantics.role()) { + case COLOR_NUMBER -> multiplier = (int) ((SymbolSemantics.NumberValue) semantics.value()).amount(); + case COLOR -> { + pending.add(((SymbolSemantics.ChoiceValue) semantics.value()).id(), + multiplier == null ? randomColorNumber(plan.ageSeed(), symbol.index()) : multiplier); + multiplier = null; + } + case SKY -> { + if (pending.written()) skyColor = pending.rgb(); + pending.clear(); + } + case CELESTIAL -> pending.clear(); + case SKY_COLOR -> legacyColors.add(color( + ((SymbolSemantics.ChoiceValue) semantics.value()).id())); + default -> { } + } + } + if (pending.written()) skyColor = pending.rgb(); + return skyColor != -1 ? skyColor : mixColors(legacyColors); + } + + private static int randomColorNumber(long ageSeed, int pageIndex) { + return new Random(ageSeed ^ (0x9E3779B97F4A7C15L * (pageIndex + 1L))).nextInt(25); + } + + private static final class ColorAccumulator { + private int red; + private int green; + private int blue; + private boolean written; + + void add(String color, int multiplier) { + int amount = multiplier * 10; + written = true; + switch (color) { + case "red" -> red += amount; + case "green" -> green += amount; + case "blue" -> blue += amount; + case "white" -> { red += amount; green += amount; blue += amount; } + case "black" -> { red -= amount; green -= amount; blue -= amount; } + default -> throw new IllegalArgumentException("Unknown shared color " + color); + } + } + + boolean written() { return written; } + + int rgb() { + return clamp(red) << 16 | clamp(green) << 8 | clamp(blue); + } + + void clear() { red = green = blue = 0; written = false; } + + private static int clamp(int channel) { return Math.max(0, Math.min(255, channel)); } + } + private static int randomColor(Random random) { int count = 1 + random.nextInt(3); List colors = new ArrayList<>(count); @@ -132,12 +216,30 @@ public record AgeSkyProfile(Style style, int color, List bodies) { } public static boolean hasCustomCelestials(AgeGenerationPlan plan) { - return plan != null && plan.activeSymbols().stream().anyMatch(symbol -> + return plan != null && (hasColorForCelestial(plan) || plan.activeSymbols().stream().anyMatch(symbol -> symbol.semantics().role() == SymbolSemantics.Role.CELESTIAL && !((SymbolSemantics.ChoiceValue) symbol.semantics().value()).id().equals("normal_time") || symbol.semantics().role() == SymbolSemantics.Role.CELESTIAL_COLOR || symbol.semantics().role() == SymbolSemantics.Role.SIZE_MODIFIER - || symbol.semantics().role() == SymbolSemantics.Role.DIRECTION_MODIFIER); + || symbol.semantics().role() == SymbolSemantics.Role.DIRECTION_MODIFIER)); + } + + private static boolean hasColorForCelestial(AgeGenerationPlan plan) { + Set active = new HashSet<>(plan.activeSymbolIndices()); + boolean pending = false; + for (AgeGenerationPlan.ResolvedSymbol symbol : plan.symbols()) { + if (!active.contains(symbol.index())) continue; + switch (symbol.semantics().role()) { + case COLOR -> pending = true; + case SKY -> pending = false; + case CELESTIAL -> { + if (pending) return true; + pending = false; + } + default -> { } + } + } + return false; } public boolean custom() { @@ -154,12 +256,53 @@ public record AgeSkyProfile(Style style, int color, List bodies) { / (24000.0D * body.period()) + body.phase(); float altitude = (float) Math.cos(orbit * Math.PI * 2.0D); if (altitude <= 0.0F) continue; - if (body.kind() == Kind.SUN) sunlight += altitude; + if (body.kind() == Kind.SUN) sunlight += altitude * (1.0F - 0.85F * eclipseFor(body, dayTime)); else moonlight += altitude * 0.18F; } return Math.min(1.0F, sunlight > 0.0F ? sunlight : moonlight); } + /** Disc overlap in the rendered sky, from first contact (0) to centered alignment (1). */ + public float eclipseFor(Body body, double dayTime) { + float strongest = 0.0F; + net.minecraft.world.phys.Vec3 bodyDirection = direction(body, dayTime); + for (Body other : bodies) { + if (other.kind() == body.kind()) continue; + double dot = Math.max(-1.0D, Math.min(1.0D, + bodyDirection.dot(direction(other, dayTime)))); + double separation = Math.acos(dot); + // The outer 32x32 quad is only glow. The opaque body occupies its + // central 8x8 pixels, so contact must use one quarter of its size. + double radius = Math.atan((body.kind() == Kind.SUN ? 30.0D : 20.0D) + * body.size() * 0.25D / 100.0D) + + Math.atan((other.kind() == Kind.SUN ? 30.0D : 20.0D) + * other.size() * 0.25D / 100.0D); + if (radius > 0.0D) strongest = Math.max(strongest, + (float) Math.max(0.0D, 1.0D - separation / radius)); + } + return strongest; + } + + public float eclipseAt(double dayTime) { + float strongest = 0.0F; + for (Body body : bodies) { + if (body.kind() == Kind.SUN && direction(body, dayTime).y > 0.0D) + strongest = Math.max(strongest, eclipseFor(body, dayTime)); + } + return strongest; + } + + private static net.minecraft.world.phys.Vec3 direction(Body body, double dayTime) { + double orbit = body.period() == 0.0D ? body.phase() + : (body.clockwise() ? 1.0D : -1.0D) * dayTime + / (24000.0D * body.period()) + body.phase(); + double tilt = orbit * Math.PI * 2.0D; + double bearing = Math.toRadians(body.angle()); + double lateral = Math.sin(tilt); + return new net.minecraft.world.phys.Vec3( + Math.sin(bearing) * lateral, Math.cos(tilt), Math.cos(bearing) * lateral); + } + public static int color(String name) { return switch (name) { case "red" -> COLORS[0]; diff --git a/src/main/java/net/dnorberg/rivencraft/book/EnvironmentWritingGameTests.java b/src/main/java/net/dnorberg/rivencraft/book/EnvironmentWritingGameTests.java index 3fa92d2..ec2b893 100644 --- a/src/main/java/net/dnorberg/rivencraft/book/EnvironmentWritingGameTests.java +++ b/src/main/java/net/dnorberg/rivencraft/book/EnvironmentWritingGameTests.java @@ -52,10 +52,11 @@ public final class EnvironmentWritingGameTests { public static void environmentPagesEnterCreativeAndJeiFeed(GameTestHelper helper) { Set expected = Set.of( "lighting/normal", "lighting/dark", "lighting/bright", - "sky/overworld", "sky/nether", "sky/end", "sky/static", "sky_color/purple", + "sky/overworld", "sky/nether", "sky/end", "sky/static", "color/red", "color/green", + "color/blue", "color/black", "color/white", "number/0", "number/24", "weather/normal", "weather/fast", "weather/slow", "weather/off", "weather/always", "weather/storm", "celestial/normal_time", "celestial/sun", - "celestial/moon", "celestial_color/red", "size/large", "angle/east", + "celestial/moon", "size/large", "angle/east", "direction/clockwise", "direction/counterclockwise", "season/no_seasons", "season/seasons", "season/eternal_winter", "season/eternal_summer", "season/eternal_fall", "season/eternal_spring", @@ -69,6 +70,9 @@ public final class EnvironmentWritingGameTests { helper.assertTrue(PageItem.bundledCreativeSymbols().containsAll(expected) && creative.containsAll(expected), "Every supported environment page must enter the creative index JEI also consumes"); + helper.assertValueEqual(PageItem.bundledCreativeSymbols().stream() + .filter(path -> path.startsWith("number/")).count(), 25L, + "Creative and JEI must expose all 25 D'ni number pages"); for (String path : expected) { var id = ResourceLocation.fromNamespaceAndPath("rivencraft", path); helper.assertTrue(SymbolCatalog.isKnown(new SymbolReference(id)) @@ -140,8 +144,8 @@ public final class EnvironmentWritingGameTests { @GameTest(template = "empty") public static void authoredStaticSkyColorSurvivesWritingAndFeedsPreview(GameTestHelper helper) { OrderedWriting writing = new OrderedWriting(List.of( - WritingEntry.linkPanel(), page("terrain/standard"), page("sky/static"), - page("sky_color/purple"), page("celestial/normal_time"))); + WritingEntry.linkPanel(), page("terrain/standard"), page("number/20"), + page("color/blue"), page("sky/static"), page("celestial/normal_time"))); AgeTraits seeded = AgeTraits.select(44L); AgeGenerationPlan plan = AgeGenerationPlan.compile(writing, 44L, AgeGenerationProfiles.STANDARD, seeded, helper.getLevel().registryAccess()); @@ -152,15 +156,15 @@ public final class EnvironmentWritingGameTests { "The static sky must select Rivencraft's custom renderer"); helper.assertValueEqual(AgeEnvironmentCompiler.selectedSkyColor(plan, BuiltinDimensionTypes.OVERWORLD_EFFECTS, 0xFF77AAFF), - 0x9870B9, "The authored color must tint the sky and preview consistently"); + 0x0000C8, "The authored color must tint the sky and preview consistently"); AgeGenerationPlan restored = AgeGenerationPlan.load(plan.save()); helper.assertTrue(AgeEnvironmentCompiler.staticSky(restored), "A saved Age must retain its static sky choice"); - helper.assertValueEqual(AgeEnvironmentCompiler.skyColor(restored), 0x9870B9, + helper.assertValueEqual(AgeEnvironmentCompiler.skyColor(restored), 0x0000C8, "A saved Age must retain its sky color choice"); AgeGenerationPlan coloredEnd = AgeGenerationPlan.compile(new OrderedWriting(List.of( - WritingEntry.linkPanel(), page("terrain/standard"), page("sky/end"), - page("sky_color/red"), page("celestial/normal_time"))), + WritingEntry.linkPanel(), page("terrain/standard"), page("number/15"), + page("color/red"), page("sky/end"), page("celestial/normal_time"))), 45L, AgeGenerationProfiles.STANDARD, AgeTraits.select(45L), helper.getLevel().registryAccess()); helper.assertValueEqual(AgeEnvironmentCompiler.skyEffects(coloredEnd, @@ -169,9 +173,10 @@ public final class EnvironmentWritingGameTests { "A color page must make non-Overworld skies renderable by the custom sky effect"); helper.assertValueEqual(AgeEnvironmentCompiler.selectedSkyColor(coloredEnd, BuiltinDimensionTypes.OVERWORLD_EFFECTS, 0xFF77AAFF), - 0xB74A50, "A color page must override the selected sky type's default tint"); + 0x960000, "A color page must override the selected sky type's default tint"); helper.assertTrue(PageItem.bundledCreativeSymbols().contains("sky/static") - && PageItem.bundledCreativeSymbols().contains("sky_color/purple"), + && PageItem.bundledCreativeSymbols().contains("color/blue") + && PageItem.bundledCreativeSymbols().contains("number/24"), "New sky pages must be available through the Creative and JEI page catalog"); helper.succeed(); } @@ -179,18 +184,17 @@ public final class EnvironmentWritingGameTests { @GameTest(template = "empty") public static void skyAndCelestialColorsBlendWithoutRequiringBodies(GameTestHelper helper) { OrderedWriting writing = new OrderedWriting(List.of( - WritingEntry.linkPanel(), page("terrain/standard"), page("sky/overworld"), - page("sky_color/red"), page("sky_color/blue"), - page("celestial_color/yellow"), page("celestial_color/blue"), page("celestial/sun"))); + WritingEntry.linkPanel(), page("terrain/standard"), + page("number/10"), page("color/red"), page("number/5"), page("color/blue"), + page("sky/overworld"), page("number/12"), page("color/green"), + page("number/7"), page("color/blue"), page("celestial/sun"))); helper.assertTrue(WritingGrammar.parse(writing).canCreate(), "Two sky colors and two colors for one sun must be valid writing"); AgeTraits traits = AgeTraits.select(46L); AgeGenerationPlan plan = AgeGenerationPlan.compile(writing, 46L, AgeGenerationProfiles.STANDARD, traits, helper.getLevel().registryAccess()); - int skyColor = AgeSkyProfile.mixColors(List.of( - AgeSkyProfile.color("red"), AgeSkyProfile.color("blue"))); - int sunColor = AgeSkyProfile.mixColors(List.of( - AgeSkyProfile.color("yellow"), AgeSkyProfile.color("blue"))); + int skyColor = 0x640032; + int sunColor = 0x007846; helper.assertValueEqual(AgeEnvironmentCompiler.skyColor(plan), skyColor, "Sky color pages must blend without discarding either page"); AgeSkyProfile profile = AgeSkyProfile.compile(plan, traits); @@ -206,6 +210,58 @@ public final class EnvironmentWritingGameTests { helper.succeed(); } + @GameTest(template = "empty") + public static void colorNumbersUseDniDigitsAndMissingChannelsRemainZero(GameTestHelper helper) { + OrderedWriting writing = new OrderedWriting(List.of( + WritingEntry.linkPanel(), page("number/12"), page("color/red"), + page("number/5"), page("color/white"), page("number/3"), page("color/black"), + page("sky/overworld"))); + AgeGenerationPlan plan = AgeGenerationPlan.compile(writing, 49L, + AgeGenerationProfiles.STANDARD, AgeTraits.select(49L), helper.getLevel().registryAccess()); + helper.assertValueEqual(AgeEnvironmentCompiler.skyColor(plan), 0x8C1414, + "White adds and Black subtracts from every channel; missing green and blue start at zero"); + helper.assertValueEqual(AgeEnvironmentCompiler.skyColor(AgeGenerationPlan.load(plan.save())), 0x8C1414, + "D'ni color multipliers must remain frozen in a saved Age plan"); + + OrderedWriting unnumbered = new OrderedWriting(List.of( + WritingEntry.linkPanel(), page("color/green"), page("sky/overworld"))); + AgeGenerationPlan randomPlan = AgeGenerationPlan.compile(unnumbered, 50L, + AgeGenerationProfiles.STANDARD, AgeTraits.select(50L), helper.getLevel().registryAccess()); + int color = AgeEnvironmentCompiler.skyColor(randomPlan); + helper.assertTrue((color & 0xFF00FF) == 0 && ((color >> 8) & 255) <= 240 + && ((color >> 8) & 255) % 10 == 0, + "An unnumbered color gets one seeded base-25 digit and leaves omitted channels at zero"); + helper.assertValueEqual(AgeEnvironmentCompiler.skyColor(AgeGenerationPlan.load(randomPlan.save())), color, + "A random color digit must not change when an Age is reloaded"); + helper.succeed(); + } + + @GameTest(template = "empty") + public static void alignedMoonEclipsesSunAndDimsLight(GameTestHelper helper) { + AgeSkyProfile.Body sun = new AgeSkyProfile.Body(AgeSkyProfile.Kind.SUN, + 0xCC8844, 1.0F, 0.0F, 1.0D, 0.0F, true); + AgeSkyProfile.Body moon = new AgeSkyProfile.Body(AgeSkyProfile.Kind.MOON, + 0xFFFFFF, 1.0F, 0.0F, 1.0D, 0.0F, true); + AgeSkyProfile clear = new AgeSkyProfile(AgeSkyProfile.Style.OVERWORLD, 0x6688AA, List.of(sun)); + AgeSkyProfile eclipse = new AgeSkyProfile(AgeSkyProfile.Style.OVERWORLD, 0x6688AA, + List.of(sun, moon)); + helper.assertValueEqual(eclipse.eclipseAt(0.0D), 1.0F, + "Centered sun and moon must produce a full eclipse"); + helper.assertTrue(eclipse.lightAt(0.0D) < clear.lightAt(0.0D), + "An eclipse must dim world skylight, not just the rendered sprites"); + AgeSkyProfile separated = new AgeSkyProfile(AgeSkyProfile.Style.OVERWORLD, 0x6688AA, + List.of(sun, new AgeSkyProfile.Body(AgeSkyProfile.Kind.MOON, + 0xFFFFFF, 1.0F, 0.0F, 1.0D, 0.5F, true))); + helper.assertValueEqual(separated.eclipseAt(0.0D), 0.0F, + "A moon on the far side of the sky must not eclipse the sun"); + AgeSkyProfile glowOnlyOverlap = new AgeSkyProfile(AgeSkyProfile.Style.OVERWORLD, 0x6688AA, + List.of(sun, new AgeSkyProfile.Body(AgeSkyProfile.Kind.MOON, + 0xFFFFFF, 1.0F, 0.0F, 1.0D, 0.04F, true))); + helper.assertValueEqual(glowOnlyOverlap.eclipseAt(0.0D), 0.0F, + "Overlapping glows must not count as an eclipse before the opaque discs touch"); + helper.succeed(); + } + @GameTest(template = "empty") public static void randomAndAuthoredCelestialsKeepIndependentOrbits(GameTestHelper helper) { AgeTraits traits = AgeTraits.select(12345L); @@ -217,7 +273,7 @@ public final class EnvironmentWritingGameTests { "Random Ages must obey the same celestial limits as authored Ages"); OrderedWriting writing = new OrderedWriting(List.of( WritingEntry.linkPanel(), page("terrain/standard"), page("sky/end"), - page("angle/east"), page("direction/counterclockwise"), page("celestial_color/red"), + page("angle/east"), page("direction/counterclockwise"), page("number/24"), page("color/red"), page("size/large"), page("period/half"), page("celestial/sun"), page("direction/clockwise"), page("celestial/moon"))); AgeGenerationPlan plan = AgeGenerationPlan.compile(writing, 12345L, AgeGenerationProfiles.STANDARD, diff --git a/src/main/java/net/dnorberg/rivencraft/client/RivencraftSkyEffects.java b/src/main/java/net/dnorberg/rivencraft/client/RivencraftSkyEffects.java index 3fb3b70..23de6ae 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/RivencraftSkyEffects.java +++ b/src/main/java/net/dnorberg/rivencraft/client/RivencraftSkyEffects.java @@ -1,6 +1,7 @@ package net.dnorberg.rivencraft.client; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferUploader; import com.mojang.blaze3d.vertex.DefaultVertexFormat; @@ -22,6 +23,7 @@ import net.minecraft.resources.ResourceLocation; /** An authored sky can use vanilla celestial rendering or Legacy-style moving TV static. */ public final class RivencraftSkyEffects extends DimensionSpecialEffects { private static final int GRID = 16; + private static final int STATIC_GRID = 48; private static final float RADIUS = 100.0F; private static final ResourceLocation SUN = ResourceLocation.withDefaultNamespace("textures/environment/sun.png"); private static final ResourceLocation MOON = ResourceLocation.withDefaultNamespace("textures/environment/moon_phases.png"); @@ -62,6 +64,8 @@ public final class RivencraftSkyEffects extends DimensionSpecialEffects { case STATIC -> 0x929292; default -> level.getBiome(camera.getBlockPosition()).value().getSkyColor(); }; + double time = level.getDayTime() + partialTick; + float eclipseShade = 1.0F - 0.65F * sky.eclipseAt(time); RenderSystem.depthMask(false); RenderSystem.disableCull(); @@ -70,20 +74,21 @@ public final class RivencraftSkyEffects extends DimensionSpecialEffects { FogRenderer.setupNoFog(); BufferBuilder vertices = Tesselator.getInstance().begin( VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + int grid = sky.style() == AgeSkyProfile.Style.STATIC ? STATIC_GRID : GRID; for (int axis = 0; axis < 3; axis++) { for (int sign : new int[]{-1, 1}) { - for (int x = 0; x < GRID; x++) { - for (int y = 0; y < GRID; y++) { + for (int x = 0; x < grid; x++) { + for (int y = 0; y < grid; y++) { int noise = sky.style() == AgeSkyProfile.Style.STATIC ? 65 + random.nextInt(160) : 255; - int red = ((tint >> 16) & 255) * noise / 255; - int green = ((tint >> 8) & 255) * noise / 255; - int blue = (tint & 255) * noise / 255; + int red = (int) (((tint >> 16) & 255) * noise / 255.0F * eclipseShade); + int green = (int) (((tint >> 8) & 255) * noise / 255.0F * eclipseShade); + int blue = (int) ((tint & 255) * noise / 255.0F * eclipseShade); int color = 0xFF000000 | red << 16 | green << 8 | blue; - float left = -RADIUS + x * (2 * RADIUS / GRID); - float right = -RADIUS + (x + 1) * (2 * RADIUS / GRID); - float bottom = -RADIUS + y * (2 * RADIUS / GRID); - float top = -RADIUS + (y + 1) * (2 * RADIUS / GRID); + float left = -RADIUS + x * (2 * RADIUS / grid); + float right = -RADIUS + (x + 1) * (2 * RADIUS / grid); + float bottom = -RADIUS + y * (2 * RADIUS / grid); + float top = -RADIUS + (y + 1) * (2 * RADIUS / grid); vertex(vertices, matrix, axis, sign, left, bottom, color); vertex(vertices, matrix, axis, sign, right, bottom, color); vertex(vertices, matrix, axis, sign, right, top, color); @@ -96,8 +101,11 @@ public final class RivencraftSkyEffects extends DimensionSpecialEffects { if (!sky.bodies().isEmpty()) { RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); - double time = level.getGameTime() + partialTick; - for (AgeSkyProfile.Body body : sky.bodies()) drawBody(pose, body, time); + // Draw suns first so an aligned moon can pass visibly in front of them. + for (AgeSkyProfile.Body body : sky.bodies()) + if (body.kind() == AgeSkyProfile.Kind.SUN) drawBody(pose, body, time, sky.eclipseFor(body, time)); + for (AgeSkyProfile.Body body : sky.bodies()) + if (body.kind() == AgeSkyProfile.Kind.MOON) drawBody(pose, body, time, sky.eclipseFor(body, time)); RenderSystem.disableBlend(); } setupFog.run(); @@ -106,7 +114,7 @@ public final class RivencraftSkyEffects extends DimensionSpecialEffects { return true; } - private static void drawBody(PoseStack pose, AgeSkyProfile.Body body, double time) { + private static void drawBody(PoseStack pose, AgeSkyProfile.Body body, double time, float eclipse) { pose.pushPose(); pose.mulPose(Axis.YP.rotationDegrees(body.angle())); double orbit = body.period() == 0 ? body.phase() @@ -115,24 +123,52 @@ public final class RivencraftSkyEffects extends DimensionSpecialEffects { pose.mulPose(Axis.XP.rotationDegrees((float) (orbit * 360.0D))); float size = (body.kind() == AgeSkyProfile.Kind.SUN ? 30.0F : 20.0F) * body.size(); int color = body.color(); + float red = ((color >> 16) & 255) / 255.0F; + float green = ((color >> 8) & 255) / 255.0F; + float blue = (color & 255) / 255.0F; + if (body.kind() == AgeSkyProfile.Kind.MOON) { + red *= 1.0F - eclipse; + green *= 1.0F - eclipse; + blue *= 1.0F - eclipse; + } else { + float corona = (float) Math.pow(eclipse, 8.0D) * 0.8F; + red += (1.0F - red) * corona; + green += (1.0F - green) * corona; + blue += (1.0F - blue) * corona; + } RenderSystem.setShader(GameRenderer::getPositionTexShader); RenderSystem.setShaderTexture(0, body.kind() == AgeSkyProfile.Kind.SUN ? SUN : MOON); - RenderSystem.setShaderColor(((color >> 16) & 255) / 255.0F, - ((color >> 8) & 255) / 255.0F, (color & 255) / 255.0F, 1.0F); + // Vanilla's sun/moon atlases have opaque dark pixels around the bright center. + // Additive blending makes those pixels invisible while retaining the halo. + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE); + RenderSystem.setShaderColor(red, green, blue, + body.kind() == AgeSkyProfile.Kind.SUN ? 0.84F : 0.88F + 0.12F * eclipse); float uMax = body.kind() == AgeSkyProfile.Kind.SUN ? 1.0F : 0.25F; float vMax = body.kind() == AgeSkyProfile.Kind.SUN ? 1.0F : 0.5F; - BufferBuilder vertices = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, - DefaultVertexFormat.POSITION_TEX); - Matrix4f matrix = pose.last().pose(); - vertices.addVertex(matrix, -size, RADIUS - 1.0F, -size).setUv(0.0F, 0.0F); - vertices.addVertex(matrix, size, RADIUS - 1.0F, -size).setUv(uMax, 0.0F); - vertices.addVertex(matrix, size, RADIUS - 1.0F, size).setUv(uMax, vMax); - vertices.addVertex(matrix, -size, RADIUS - 1.0F, size).setUv(0.0F, vMax); - BufferUploader.drawWithShader(vertices.buildOrThrow()); + drawTexturedQuad(pose.last().pose(), -size, size, 0.0F, uMax, 0.0F, vMax); + + // The 8x8 center of each 32x32 sprite is the actual body. Draw it last + // with ordinary alpha blending and full opacity so the sky and other + // celestial glows cannot show through it, including during an eclipse. + RenderSystem.defaultBlendFunc(); + RenderSystem.setShaderColor(red, green, blue, 1.0F); + drawTexturedQuad(pose.last().pose(), -size * 0.25F, size * 0.25F, + uMax * 0.375F, uMax * 0.625F, vMax * 0.375F, vMax * 0.625F); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); pose.popPose(); } + private static void drawTexturedQuad(Matrix4f matrix, float min, float max, + float uMin, float uMax, float vMin, float vMax) { + BufferBuilder vertices = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, + DefaultVertexFormat.POSITION_TEX); + vertices.addVertex(matrix, min, RADIUS - 1.0F, min).setUv(uMin, vMin); + vertices.addVertex(matrix, max, RADIUS - 1.0F, min).setUv(uMax, vMin); + vertices.addVertex(matrix, max, RADIUS - 1.0F, max).setUv(uMax, vMax); + vertices.addVertex(matrix, min, RADIUS - 1.0F, max).setUv(uMin, vMax); + BufferUploader.drawWithShader(vertices.buildOrThrow()); + } + private static void vertex(BufferBuilder vertices, Matrix4f matrix, int axis, int sign, float x, float y, int color) { float fixed = sign * RADIUS; diff --git a/src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java b/src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java index 4609632..910b421 100644 --- a/src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java +++ b/src/main/java/net/dnorberg/rivencraft/client/SymbolPageTextures.java @@ -138,6 +138,17 @@ public final class SymbolPageTextures { y * base.getHeight() / SIZE)); } } + String numberPath = id.getPath().startsWith("number/") + ? id.getPath().substring("number/".length()) : ""; + if (id.getNamespace().equals(Rivencraft.MOD_ID) + && numberPath.matches("(?:[0-9]|1[0-9]|2[0-4])")) { + int digit = Integer.parseInt(numberPath); + int glyphSize = item ? GLYPH * ITEM_SYMBOL_SIZE / ICON_SIZE : GLYPH; + int origin = item ? scaleForItem(38) : 38; + for (int component : SymbolNumerals.componentsForDigit(digit)) + blendComponent(image, component, origin, origin, glyphSize); + return image; + } String[] words = poem.isBlank() ? generatedWords(id) : poem.split(" "); int[] offsetsX = {38, 77, 38, 0}; int[] offsetsY = {0, 38, 77, 38}; @@ -146,18 +157,22 @@ public final class SymbolPageTextures { 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); - } + blendComponent(image, component, originX, originY, glyphSize); } } return image; } + private static void blendComponent(NativeImage image, int component, int originX, int originY, int glyphSize) { + 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); + } + } + private static int scaleForItem(int coordinate) { return SIZE / 2 + Math.round((coordinate - SIZE / 2F) * ITEM_SYMBOL_SIZE / ICON_SIZE); } diff --git a/src/main/java/net/dnorberg/rivencraft/event/AgeCelestialAngleSync.java b/src/main/java/net/dnorberg/rivencraft/event/AgeCelestialAngleSync.java index 8fda11d..15ff1dc 100644 --- a/src/main/java/net/dnorberg/rivencraft/event/AgeCelestialAngleSync.java +++ b/src/main/java/net/dnorberg/rivencraft/event/AgeCelestialAngleSync.java @@ -8,6 +8,7 @@ import net.dnorberg.rivencraft.network.AgeCelestialAnglePayload; import net.minecraft.server.level.ServerPlayer; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.registration.NetworkRegistry; /** Sends saved celestial angles when a client joins or enters an Age. */ public final class AgeCelestialAngleSync { @@ -34,6 +35,8 @@ public final class AgeCelestialAngleSync { } public static void send(ServerPlayer player, AgeDefinition age) { + // GameTest mock players (and clients without this channel) cannot receive this payload. + if (!NetworkRegistry.hasChannel(player.connection, AgeCelestialAnglePayload.TYPE.id())) return; PacketDistributor.sendToPlayer(player, new AgeCelestialAnglePayload( AgeDimensionService.dimensionKey(age), age.traits().celestialAngle(), AgeSkyProfile.forAge(age))); diff --git a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java index 8be925c..fecdef8 100644 --- a/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java +++ b/src/main/java/net/dnorberg/rivencraft/registry/ModCreativeTabs.java @@ -58,7 +58,7 @@ public final class ModCreativeTabs { .build()); private static final List CATEGORY_ORDER = List.of( - "terrain", "biome", "cave_biome", "biome_generation", "weather", "season", "lighting", "sky", "celestial", "block", "fluid", "feature", "environment", "corrupted"); + "terrain", "biome", "cave_biome", "biome_generation", "weather", "season", "lighting", "sky", "color", "number", "celestial", "block", "fluid", "feature", "environment", "corrupted"); public static final Map> SYMBOL_PAGES = registerSymbolPageTabs(); diff --git a/src/main/java/net/dnorberg/rivencraft/writing/SymbolSemantics.java b/src/main/java/net/dnorberg/rivencraft/writing/SymbolSemantics.java index 3e42e0f..a07ebe6 100644 --- a/src/main/java/net/dnorberg/rivencraft/writing/SymbolSemantics.java +++ b/src/main/java/net/dnorberg/rivencraft/writing/SymbolSemantics.java @@ -80,6 +80,8 @@ public record SymbolSemantics(Role role, Value value) { SKY("sky", Kind.CHOICE, "overworld", "nether", "end", "static"), SKY_COLOR("sky_color", Kind.CHOICE, "red", "orange", "yellow", "green", "blue", "purple", "white", "black"), + COLOR("color", Kind.CHOICE, "red", "green", "blue", "black", "white"), + COLOR_NUMBER("color_number", Kind.NUMBER), WEATHER("weather", Kind.CHOICE, "normal", "fast", "slow", "off", "always", "cloudy", "rain", "snow", "storm"), SEASON("season", Kind.CHOICE, @@ -116,6 +118,8 @@ public record SymbolSemantics(Role role, Value value) { return switch (this) { case PERIOD_MODIFIER -> number.amount() >= 0.0 && number.amount() <= 2.0; case SIZE_MODIFIER -> number.amount() >= 0.25 && number.amount() <= 3.0; + case COLOR_NUMBER -> number.amount() >= 0.0 && number.amount() <= 24.0 + && number.amount() == Math.floor(number.amount()); case ANGLE_MODIFIER, PHASE_MODIFIER -> number.amount() >= 0.0 && number.amount() < 360.0; default -> false; }; @@ -127,6 +131,7 @@ public record SymbolSemantics(Role role, Value value) { case CHOICE -> "one of " + choices.stream().sorted().toList(); case NUMBER -> this == PERIOD_MODIFIER ? "a finite number in [0, 2]" : this == SIZE_MODIFIER ? "a finite number in [0.25, 3]" + : this == COLOR_NUMBER ? "an integer D'ni digit in [0, 24]" : "a finite number in [0, 360) degrees"; }; } diff --git a/src/main/java/net/dnorberg/rivencraft/writing/WritingGrammar.java b/src/main/java/net/dnorberg/rivencraft/writing/WritingGrammar.java index 267b990..f7b3aed 100644 --- a/src/main/java/net/dnorberg/rivencraft/writing/WritingGrammar.java +++ b/src/main/java/net/dnorberg/rivencraft/writing/WritingGrammar.java @@ -45,6 +45,7 @@ public final class WritingGrammar { int lastStage = -1; int biomeCount = 0; ParsedSymbol pendingBlock = null; + ParsedSymbol pendingColorNumber = null; for (int index = 0; index < writing.entries().size(); index++) { WritingEntry entry = writing.entries().get(index); if (entry.kind() == WritingEntry.Kind.LINK_PANEL) { @@ -73,6 +74,18 @@ public final class WritingGrammar { Role role = semantics.orElseThrow().role(); ParsedSymbol parsed = new ParsedSymbol(index, reference, semantics.orElseThrow()); symbols.add(parsed); + if (pendingColorNumber != null && role != Role.COLOR && role != Role.COLOR_NUMBER) { + diagnostics.add(new Diagnostic(Code.MISPLACED_MODIFIER, pendingColorNumber.index(), + "A number page must be immediately followed by a color page")); + pendingColorNumber = null; + } + if (role == Role.COLOR_NUMBER) { + if (pendingColorNumber != null) diagnostics.add(new Diagnostic(Code.MISPLACED_MODIFIER, + pendingColorNumber.index(), "A number page must be immediately followed by a color page")); + pendingColorNumber = parsed; + } else if (role == Role.COLOR) { + pendingColorNumber = null; + } if (modifier(role)) { // Legacy modifier pages pop and combine an earlier modifier of the same // kind. Only the final pending value can be left dangling. @@ -115,13 +128,15 @@ public final class WritingGrammar { } if (role == Role.BIOME) biomeCount++; int stage = stage(role); - if (stage < lastStage && !modifier(role)) { + if (stage < lastStage && !modifier(role) && role != Role.COLOR && role != Role.COLOR_NUMBER) { diagnostics.add(new Diagnostic(Code.OUT_OF_ORDER, index, "Move this " + role.id() + " page before later grammar categories")); - } else { + } else if (role != Role.COLOR && role != Role.COLOR_NUMBER) { lastStage = stage; } } + if (pendingColorNumber != null) diagnostics.add(new Diagnostic(Code.DANGLING_MODIFIER, + pendingColorNumber.index(), "A number page must be followed by a color page")); if (panels == 0) diagnostics.add(new Diagnostic(Code.MISSING_PANEL, -1, "Add a Link Panel as the first page")); for (ParsedSymbol dangling : pendingModifiers.values()) { @@ -183,6 +198,7 @@ public final class WritingGrammar { case SEASON -> 4; case LIGHTING -> 5; case SKY, SKY_COLOR -> 6; + case COLOR, COLOR_NUMBER -> 6; case PERIOD_MODIFIER, ANGLE_MODIFIER, PHASE_MODIFIER, SIZE_MODIFIER, CELESTIAL_COLOR, DIRECTION_MODIFIER -> 7; case CELESTIAL -> 8; diff --git a/src/main/resources/assets/rivencraft/lang/en_us.json b/src/main/resources/assets/rivencraft/lang/en_us.json index c854865..20bc7ec 100644 --- a/src/main/resources/assets/rivencraft/lang/en_us.json +++ b/src/main/resources/assets/rivencraft/lang/en_us.json @@ -225,22 +225,42 @@ "symbol.rivencraft.sky.end.description": "Use the End sky and dark preview background.", "symbol.rivencraft.sky.static": "Static Sky", "symbol.rivencraft.sky.static.description": "Fill the sky with shifting television static.", - "symbol.rivencraft.sky_color.red": "Red Sky Color", - "symbol.rivencraft.sky_color.red.description": "Tint the sky and linked portal red.", - "symbol.rivencraft.sky_color.orange": "Orange Sky Color", - "symbol.rivencraft.sky_color.orange.description": "Tint the sky and linked portal orange.", - "symbol.rivencraft.sky_color.yellow": "Yellow Sky Color", - "symbol.rivencraft.sky_color.yellow.description": "Tint the sky and linked portal yellow.", - "symbol.rivencraft.sky_color.green": "Green Sky Color", - "symbol.rivencraft.sky_color.green.description": "Tint the sky and linked portal green.", - "symbol.rivencraft.sky_color.blue": "Blue Sky Color", - "symbol.rivencraft.sky_color.blue.description": "Tint the sky and linked portal blue.", - "symbol.rivencraft.sky_color.purple": "Purple Sky Color", - "symbol.rivencraft.sky_color.purple.description": "Tint the sky and linked portal purple.", - "symbol.rivencraft.sky_color.white": "White Sky Color", - "symbol.rivencraft.sky_color.white.description": "Tint the sky and linked portal white.", - "symbol.rivencraft.sky_color.black": "Black Sky Color", - "symbol.rivencraft.sky_color.black.description": "Tint the sky and linked portal near-black.", + "symbol.rivencraft.color.red": "Red Color", + "symbol.rivencraft.color.red.description": "Add red to the next Sky, Sun, or Moon. A number page directly before this page sets its strength.", + "symbol.rivencraft.color.green": "Green Color", + "symbol.rivencraft.color.green.description": "Add green to the next Sky, Sun, or Moon. A number page directly before this page sets its strength.", + "symbol.rivencraft.color.blue": "Blue Color", + "symbol.rivencraft.color.blue.description": "Add blue to the next Sky, Sun, or Moon. A number page directly before this page sets its strength.", + "symbol.rivencraft.color.white": "White Color", + "symbol.rivencraft.color.white.description": "Add equal brightness to red, green, and blue in the next Sky, Sun, or Moon.", + "symbol.rivencraft.color.black": "Black Color", + "symbol.rivencraft.color.black.description": "Subtract equal brightness from red, green, and blue in the next Sky, Sun, or Moon.", + "symbol.rivencraft.number.0": "D'ni 0", + "symbol.rivencraft.number.1": "D'ni 1", + "symbol.rivencraft.number.2": "D'ni 2", + "symbol.rivencraft.number.3": "D'ni 3", + "symbol.rivencraft.number.4": "D'ni 4", + "symbol.rivencraft.number.5": "D'ni 5", + "symbol.rivencraft.number.6": "D'ni 6", + "symbol.rivencraft.number.7": "D'ni 7", + "symbol.rivencraft.number.8": "D'ni 8", + "symbol.rivencraft.number.9": "D'ni 9", + "symbol.rivencraft.number.10": "D'ni 10", + "symbol.rivencraft.number.11": "D'ni 11", + "symbol.rivencraft.number.12": "D'ni 12", + "symbol.rivencraft.number.13": "D'ni 13", + "symbol.rivencraft.number.14": "D'ni 14", + "symbol.rivencraft.number.15": "D'ni 15", + "symbol.rivencraft.number.16": "D'ni 16", + "symbol.rivencraft.number.17": "D'ni 17", + "symbol.rivencraft.number.18": "D'ni 18", + "symbol.rivencraft.number.19": "D'ni 19", + "symbol.rivencraft.number.20": "D'ni 20", + "symbol.rivencraft.number.21": "D'ni 21", + "symbol.rivencraft.number.22": "D'ni 22", + "symbol.rivencraft.number.23": "D'ni 23", + "symbol.rivencraft.number.24": "D'ni 24", + "symbol.rivencraft.number.description": "Set the next color page to this D'ni number times 10. Without a number page, the Age chooses a random number from 0 to 24.", "symbol.rivencraft.weather.normal": "Normal Weather", "symbol.rivencraft.weather.normal.description": "Use the normal weather cycle.", "symbol.rivencraft.weather.fast": "Fast Weather", @@ -271,22 +291,6 @@ "symbol.rivencraft.celestial.sun.description": "Add one independently moving sun to the sky.", "symbol.rivencraft.celestial.moon": "Moon", "symbol.rivencraft.celestial.moon.description": "Add one independently moving moon to the sky.", - "symbol.rivencraft.celestial_color.red": "Red Celestial", - "symbol.rivencraft.celestial_color.red.description": "Color the next sun or moon red.", - "symbol.rivencraft.celestial_color.orange": "Orange Celestial", - "symbol.rivencraft.celestial_color.orange.description": "Color the next sun or moon orange.", - "symbol.rivencraft.celestial_color.yellow": "Yellow Celestial", - "symbol.rivencraft.celestial_color.yellow.description": "Color the next sun or moon yellow.", - "symbol.rivencraft.celestial_color.green": "Green Celestial", - "symbol.rivencraft.celestial_color.green.description": "Color the next sun or moon green.", - "symbol.rivencraft.celestial_color.blue": "Blue Celestial", - "symbol.rivencraft.celestial_color.blue.description": "Color the next sun or moon blue.", - "symbol.rivencraft.celestial_color.purple": "Purple Celestial", - "symbol.rivencraft.celestial_color.purple.description": "Color the next sun or moon purple.", - "symbol.rivencraft.celestial_color.white": "White Celestial", - "symbol.rivencraft.celestial_color.white.description": "Color the next sun or moon white.", - "symbol.rivencraft.celestial_color.black": "Black Celestial", - "symbol.rivencraft.celestial_color.black.description": "Blend black into the next sun or moon's color.", "symbol.rivencraft.size.small": "Small Celestial", "symbol.rivencraft.size.small.description": "Halve the apparent size of the next sun or moon.", "symbol.rivencraft.size.normal": "Normal Celestial Size", @@ -436,6 +440,8 @@ "itemGroup.rivencraft.pages.season": "Rivencraft Season Pages", "itemGroup.rivencraft.pages.lighting": "Rivencraft Lighting Pages", "itemGroup.rivencraft.pages.sky": "Rivencraft Sky Pages", + "itemGroup.rivencraft.pages.color": "Rivencraft Color Pages", + "itemGroup.rivencraft.pages.number": "Rivencraft Number Pages", "itemGroup.rivencraft.pages.celestial": "Rivencraft Celestial Pages", "itemGroup.rivencraft.pages.block": "Rivencraft Block Pages", "itemGroup.rivencraft.pages.fluid": "Rivencraft Fluid Pages", diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/black.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/black.json deleted file mode 100644 index d0b0d3c..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/black.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.black","description":"symbol.rivencraft.celestial_color.black.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"black"},"poem":"Transform Black Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/blue.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/blue.json deleted file mode 100644 index 96b6dc9..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/blue.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.blue","description":"symbol.rivencraft.celestial_color.blue.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"blue"},"poem":"Transform Blue Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/green.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/green.json deleted file mode 100644 index 446e47b..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/green.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.green","description":"symbol.rivencraft.celestial_color.green.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"green"},"poem":"Transform Green Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/orange.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/orange.json deleted file mode 100644 index 8eacabb..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/orange.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.orange","description":"symbol.rivencraft.celestial_color.orange.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"orange"},"poem":"Transform Orange Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/purple.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/purple.json deleted file mode 100644 index fea732b..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/purple.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.purple","description":"symbol.rivencraft.celestial_color.purple.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"purple"},"poem":"Transform Purple Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/red.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/red.json deleted file mode 100644 index 27e83cc..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/red.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.red","description":"symbol.rivencraft.celestial_color.red.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"red"},"poem":"Transform Red Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/white.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/white.json deleted file mode 100644 index e77160b..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/white.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.white","description":"symbol.rivencraft.celestial_color.white.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"white"},"poem":"Transform White Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/yellow.json b/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/yellow.json deleted file mode 100644 index 9195db9..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/celestial_color/yellow.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.celestial_color.yellow","description":"symbol.rivencraft.celestial_color.yellow.description","category":"rivencraft:celestial","semantics":{"role":"celestial_color","value":"yellow"},"poem":"Transform Yellow Illuminate Motion"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/color/black.json b/src/main/resources/data/rivencraft/rivencraft/symbols/color/black.json new file mode 100644 index 0000000..052cbcd --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/color/black.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.color.black","description":"symbol.rivencraft.color.black.description","category":"rivencraft:color","semantics":{"role":"color","value":"black"},"poem":"Ethereal Black Transform Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/color/blue.json b/src/main/resources/data/rivencraft/rivencraft/symbols/color/blue.json new file mode 100644 index 0000000..0da6f3a --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/color/blue.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.color.blue","description":"symbol.rivencraft.color.blue.description","category":"rivencraft:color","semantics":{"role":"color","value":"blue"},"poem":"Ethereal Blue Transform Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/color/green.json b/src/main/resources/data/rivencraft/rivencraft/symbols/color/green.json new file mode 100644 index 0000000..2803027 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/color/green.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.color.green","description":"symbol.rivencraft.color.green.description","category":"rivencraft:color","semantics":{"role":"color","value":"green"},"poem":"Ethereal Green Transform Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/color/red.json b/src/main/resources/data/rivencraft/rivencraft/symbols/color/red.json new file mode 100644 index 0000000..cee3390 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/color/red.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.color.red","description":"symbol.rivencraft.color.red.description","category":"rivencraft:color","semantics":{"role":"color","value":"red"},"poem":"Ethereal Red Transform Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/color/white.json b/src/main/resources/data/rivencraft/rivencraft/symbols/color/white.json new file mode 100644 index 0000000..3bbb62d --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/color/white.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.color.white","description":"symbol.rivencraft.color.white.description","category":"rivencraft:color","semantics":{"role":"color","value":"white"},"poem":"Ethereal White Transform Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/0.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/0.json new file mode 100644 index 0000000..ae18eef --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/0.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.0","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":0},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/1.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/1.json new file mode 100644 index 0000000..037bd28 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/1.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.1","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":1},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/10.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/10.json new file mode 100644 index 0000000..a0759a3 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/10.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.10","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":10},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/11.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/11.json new file mode 100644 index 0000000..6ab2bf6 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/11.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.11","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":11},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/12.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/12.json new file mode 100644 index 0000000..2135df2 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/12.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.12","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":12},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/13.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/13.json new file mode 100644 index 0000000..4ed3d96 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/13.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.13","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":13},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/14.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/14.json new file mode 100644 index 0000000..149834b --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/14.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.14","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":14},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/15.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/15.json new file mode 100644 index 0000000..86ddb12 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/15.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.15","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":15},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/16.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/16.json new file mode 100644 index 0000000..a6916b0 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/16.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.16","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":16},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/17.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/17.json new file mode 100644 index 0000000..e9ca846 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/17.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.17","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":17},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/18.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/18.json new file mode 100644 index 0000000..92b3ae5 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/18.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.18","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":18},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/19.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/19.json new file mode 100644 index 0000000..a02d5b5 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/19.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.19","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":19},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/2.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/2.json new file mode 100644 index 0000000..734585e --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/2.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.2","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":2},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/20.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/20.json new file mode 100644 index 0000000..461b8ba --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/20.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.20","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":20},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/21.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/21.json new file mode 100644 index 0000000..f914de9 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/21.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.21","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":21},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/22.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/22.json new file mode 100644 index 0000000..9562aa9 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/22.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.22","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":22},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/23.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/23.json new file mode 100644 index 0000000..57d961e --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/23.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.23","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":23},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/24.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/24.json new file mode 100644 index 0000000..994fcfa --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/24.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.24","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":24},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/3.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/3.json new file mode 100644 index 0000000..f4bcd8c --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/3.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.3","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":3},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/4.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/4.json new file mode 100644 index 0000000..88dcedb --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/4.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.4","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":4},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/5.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/5.json new file mode 100644 index 0000000..5c59dc4 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/5.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.5","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":5},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/6.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/6.json new file mode 100644 index 0000000..808ca43 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/6.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.6","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":6},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/7.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/7.json new file mode 100644 index 0000000..5687876 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/7.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.7","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":7},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/8.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/8.json new file mode 100644 index 0000000..de6249d --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/8.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.8","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":8},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/number/9.json b/src/main/resources/data/rivencraft/rivencraft/symbols/number/9.json new file mode 100644 index 0000000..e071072 --- /dev/null +++ b/src/main/resources/data/rivencraft/rivencraft/symbols/number/9.json @@ -0,0 +1 @@ +{"schema_version":2,"name":"symbol.rivencraft.number.9","description":"symbol.rivencraft.number.description","category":"rivencraft:number","semantics":{"role":"color_number","value":9},"poem":"Transform Time System Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/black.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/black.json deleted file mode 100644 index b0f51b2..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/black.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.black","description":"symbol.rivencraft.sky_color.black.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"black"},"poem":"Ethereal Black Sky Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/blue.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/blue.json deleted file mode 100644 index 347377a..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/blue.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.blue","description":"symbol.rivencraft.sky_color.blue.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"blue"},"poem":"Ethereal Blue Sky Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/green.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/green.json deleted file mode 100644 index 2619acc..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/green.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.green","description":"symbol.rivencraft.sky_color.green.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"green"},"poem":"Ethereal Green Sky Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/orange.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/orange.json deleted file mode 100644 index 8f291d1..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/orange.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.orange","description":"symbol.rivencraft.sky_color.orange.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"orange"},"poem":"Ethereal Orange Sky Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/purple.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/purple.json deleted file mode 100644 index f6a4451..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/purple.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.purple","description":"symbol.rivencraft.sky_color.purple.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"purple"},"poem":"Ethereal Purple Sky Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/red.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/red.json deleted file mode 100644 index ef0b764..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/red.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.red","description":"symbol.rivencraft.sky_color.red.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"red"},"poem":"Ethereal Red Sky Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/white.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/white.json deleted file mode 100644 index 257ff6d..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/white.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.white","description":"symbol.rivencraft.sky_color.white.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"white"},"poem":"Ethereal White Sky Balance"} diff --git a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/yellow.json b/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/yellow.json deleted file mode 100644 index d34aab8..0000000 --- a/src/main/resources/data/rivencraft/rivencraft/symbols/sky_color/yellow.json +++ /dev/null @@ -1 +0,0 @@ -{"schema_version":2,"name":"symbol.rivencraft.sky_color.yellow","description":"symbol.rivencraft.sky_color.yellow.description","category":"rivencraft:sky","semantics":{"role":"sky_color","value":"yellow"},"poem":"Ethereal Yellow Sky Balance"}