From b2f5af9a8411700ffa4f324423b8348a2eff8e9a Mon Sep 17 00:00:00 2001 From: Forwolk Date: Fri, 27 Jul 2018 13:29:31 +0300 Subject: [PATCH] Seed based random generator --- core/src/main/java/mc/core/world/Chunk.java | 2 +- core/src/main/java/mc/core/world/Region.java | 2 +- core/src/main/java/mc/core/world/World.java | 11 ++++ .../generated_world/SeedRandomGenerator.java | 23 ++++++++ .../SeedRandomGeneratorTest.java | 58 +++++++++++++++++++ 5 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 generated_world/src/main/java/mc/world/generated_world/SeedRandomGenerator.java create mode 100644 generated_world/src/test/java/mc/world/generated_world/SeedRandomGeneratorTest.java diff --git a/core/src/main/java/mc/core/world/Chunk.java b/core/src/main/java/mc/core/world/Chunk.java index 6d7f889..4138f4d 100644 --- a/core/src/main/java/mc/core/world/Chunk.java +++ b/core/src/main/java/mc/core/world/Chunk.java @@ -20,7 +20,7 @@ import mc.core.block.Block; * +-------------+----------------+------------+ * * Total: 16 bits header (2 bytes) + 24 * block_count bits (3 * block_count bytes) - * Max size: 12290 bytes (~12 Mb per chunk) + * Max size: 12290 bytes (~12 Kb per chunk) * */ /* 16x16x16 */ diff --git a/core/src/main/java/mc/core/world/Region.java b/core/src/main/java/mc/core/world/Region.java index 2e35834..efee50a 100644 --- a/core/src/main/java/mc/core/world/Region.java +++ b/core/src/main/java/mc/core/world/Region.java @@ -11,7 +11,7 @@ package mc.core.world; * | biome_map | 256x256 0-32 | 2097152 | * +-------------+----------------+------------+ * - * Total: 2097152 bits (262144 bytes = 256 Mb) + * Total: 2097152 bits (256 Kb) * */ public interface Region { diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 2c0f69a..e0e7df2 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -25,7 +25,18 @@ import java.util.UUID; * +-------------+----------------+------------+ * | seed | long | 64 | * +-------------+----------------+------------+ + * | type | 0-255 | 8 | + * +-------------+----------------+------------+ * + * /worlds/ + * --> []/world_uuid/ + * --> world.dat + * --> []/r.X.Z/ + * --> biomes.dat + * --> []chunk_x_y_z.dat + * --> entities.dat + * --> /playerdata/ + * --> []player_uuid.dat */ public interface World { diff --git a/generated_world/src/main/java/mc/world/generated_world/SeedRandomGenerator.java b/generated_world/src/main/java/mc/world/generated_world/SeedRandomGenerator.java new file mode 100644 index 0000000..a466791 --- /dev/null +++ b/generated_world/src/main/java/mc/world/generated_world/SeedRandomGenerator.java @@ -0,0 +1,23 @@ +package mc.world.generated_world; + +public final class SeedRandomGenerator { + + public static double random (int x, int y, int seed) { + x = Math.abs(x - y) + 1; + y = Math.abs(y - x) + 1; + for (int i = 0; i < 40; i ++) { + int a1 = x % 13; + int a2 = x % 31; + int a3 = x % 89; + int a4 = y % 359; + int a5 = y % 7; + int a6 = y % 313; + int a7 = y % 8461; + int a8 = y % 105467; + int a9 = x % 105943; + y = x + seed; + x += a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9; + } + return ((x + y) % 100000) / 100000d; + } +} diff --git a/generated_world/src/test/java/mc/world/generated_world/SeedRandomGeneratorTest.java b/generated_world/src/test/java/mc/world/generated_world/SeedRandomGeneratorTest.java new file mode 100644 index 0000000..795654a --- /dev/null +++ b/generated_world/src/test/java/mc/world/generated_world/SeedRandomGeneratorTest.java @@ -0,0 +1,58 @@ +package mc.world.generated_world; + +import org.junit.Test; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; + +import static org.junit.Assert.*; + +public class SeedRandomGeneratorTest { + @Test + public void randomTest() throws Exception { + double maxDiff = 0; + double maxDisp = 0; + for (int i = 0; i < 100; i ++) { + double mid = 0; + double disp = 0; + int seed = (int) (Math.random() * Integer.MAX_VALUE); + for (int x = -1000; x < 1000; x++) { + for (int y = -1000; y < 1000; y++) { + double rnd = SeedRandomGenerator.random(x, y, seed); + mid += rnd; + disp += (rnd - 0.5) * (rnd - 0.5); + } + } + mid = mid/4000000; + disp = Math.sqrt(disp)/4000000; + if (maxDiff < Math.abs(mid - 0.5)) { + maxDiff = Math.abs(mid - 0.5); + } + if (maxDisp < disp) { + maxDisp = disp; + } + System.out.printf("Iteration %d.\t mid: %.3f, \tdisp %.6f\n", i + 1, mid, disp); + } + System.out.printf("Max diff: %.3f\n", maxDiff); + System.out.printf("Max disp: %.6f\n", maxDisp); + + assertTrue(maxDiff > 0); + } + + @Test + public void generateImage () throws Exception { + int h = 500; + int w = 500; + BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + + int seed = (int) (Math.random() * Integer.MAX_VALUE) / 1024; + for (int x = 0; x < w; x ++) { + for (int y = 0; y < h; y ++) { + image.setRGB(x, y, (int) (0xffffff * SeedRandomGenerator.random(x, y, seed))); + } + } + ImageIO.write(image, "bmp", new File("out", "seed_random.png")); + } + +} \ No newline at end of file