001    package net.minecraft.src;
002    
003    public abstract class GenLayer
004    {
005        /** seed from World#getWorldSeed that is used in the LCG prng */
006        private long worldGenSeed;
007    
008        /** parent GenLayer that was provided via the constructor */
009        protected GenLayer parent;
010    
011        /**
012         * final part of the LCG prng that uses the chunk X, Z coords along with the other two seeds to generate
013         * pseudorandom numbers
014         */
015        private long chunkSeed;
016    
017        /** base seed to the LCG prng provided via the constructor */
018        private long baseSeed;
019    
020        /**
021         * the first array item is a linked list of the bioms, the second is the zoom function, the third is the same as the
022         * first.
023         */
024        public static GenLayer[] initializeAllBiomeGenerators(long par0, WorldType par2WorldType)
025        {
026            GenLayerIsland var3 = new GenLayerIsland(1L);
027            GenLayerFuzzyZoom var9 = new GenLayerFuzzyZoom(2000L, var3);
028            GenLayerAddIsland var10 = new GenLayerAddIsland(1L, var9);
029            GenLayerZoom var11 = new GenLayerZoom(2001L, var10);
030            var10 = new GenLayerAddIsland(2L, var11);
031            GenLayerAddSnow var12 = new GenLayerAddSnow(2L, var10);
032            var11 = new GenLayerZoom(2002L, var12);
033            var10 = new GenLayerAddIsland(3L, var11);
034            var11 = new GenLayerZoom(2003L, var10);
035            var10 = new GenLayerAddIsland(4L, var11);
036            GenLayerAddMushroomIsland var16 = new GenLayerAddMushroomIsland(5L, var10);
037            byte var4 = 4;
038    
039            if (par2WorldType == WorldType.LARGE_BIOMES)
040            {
041                var4 = 6;
042            }
043    
044            GenLayer var5 = GenLayerZoom.func_75915_a(1000L, var16, 0);
045            GenLayerRiverInit var13 = new GenLayerRiverInit(100L, var5);
046            var5 = GenLayerZoom.func_75915_a(1000L, var13, var4 + 2);
047            GenLayerRiver var14 = new GenLayerRiver(1L, var5);
048            GenLayerSmooth var15 = new GenLayerSmooth(1000L, var14);
049            GenLayer var6 = GenLayerZoom.func_75915_a(1000L, var16, 0);
050            GenLayerBiome var17 = new GenLayerBiome(200L, var6, par2WorldType);
051            var6 = GenLayerZoom.func_75915_a(1000L, var17, 2);
052            Object var18 = new GenLayerHills(1000L, var6);
053    
054            for (int var7 = 0; var7 < var4; ++var7)
055            {
056                var18 = new GenLayerZoom((long)(1000 + var7), (GenLayer)var18);
057    
058                if (var7 == 0)
059                {
060                    var18 = new GenLayerAddIsland(3L, (GenLayer)var18);
061                }
062    
063                if (var7 == 1)
064                {
065                    var18 = new GenLayerShore(1000L, (GenLayer)var18);
066                }
067    
068                if (var7 == 1)
069                {
070                    var18 = new GenLayerSwampRivers(1000L, (GenLayer)var18);
071                }
072            }
073    
074            GenLayerSmooth var19 = new GenLayerSmooth(1000L, (GenLayer)var18);
075            GenLayerRiverMix var20 = new GenLayerRiverMix(100L, var19, var15);
076            GenLayerVoronoiZoom var8 = new GenLayerVoronoiZoom(10L, var20);
077            var20.initWorldGenSeed(par0);
078            var8.initWorldGenSeed(par0);
079            return new GenLayer[] {var20, var8, var20};
080        }
081    
082        public GenLayer(long par1)
083        {
084            this.baseSeed = par1;
085            this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
086            this.baseSeed += par1;
087            this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
088            this.baseSeed += par1;
089            this.baseSeed *= this.baseSeed * 6364136223846793005L + 1442695040888963407L;
090            this.baseSeed += par1;
091        }
092    
093        /**
094         * Initialize layer's local worldGenSeed based on its own baseSeed and the world's global seed (passed in as an
095         * argument).
096         */
097        public void initWorldGenSeed(long par1)
098        {
099            this.worldGenSeed = par1;
100    
101            if (this.parent != null)
102            {
103                this.parent.initWorldGenSeed(par1);
104            }
105    
106            this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
107            this.worldGenSeed += this.baseSeed;
108            this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
109            this.worldGenSeed += this.baseSeed;
110            this.worldGenSeed *= this.worldGenSeed * 6364136223846793005L + 1442695040888963407L;
111            this.worldGenSeed += this.baseSeed;
112        }
113    
114        /**
115         * Initialize layer's current chunkSeed based on the local worldGenSeed and the (x,z) chunk coordinates.
116         */
117        public void initChunkSeed(long par1, long par3)
118        {
119            this.chunkSeed = this.worldGenSeed;
120            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
121            this.chunkSeed += par1;
122            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
123            this.chunkSeed += par3;
124            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
125            this.chunkSeed += par1;
126            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
127            this.chunkSeed += par3;
128        }
129    
130        /**
131         * returns a LCG pseudo random number from [0, x). Args: int x
132         */
133        protected int nextInt(int par1)
134        {
135            int var2 = (int)((this.chunkSeed >> 24) % (long)par1);
136    
137            if (var2 < 0)
138            {
139                var2 += par1;
140            }
141    
142            this.chunkSeed *= this.chunkSeed * 6364136223846793005L + 1442695040888963407L;
143            this.chunkSeed += this.worldGenSeed;
144            return var2;
145        }
146    
147        /**
148         * Returns a list of integer values generated by this layer. These may be interpreted as temperatures, rainfall
149         * amounts, or biomeList[] indices based on the particular GenLayer subclass.
150         */
151        public abstract int[] getInts(int var1, int var2, int var3, int var4);
152    }