-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenLayer.py
308 lines (251 loc) · 11.3 KB
/
genLayer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
import numpy as np
from collections import Counter
from copy import deepcopy
class Main:
def __init__(self, seed=None):
if seed:
self.baseSeed = seed
self.baseSeed *= self.baseSeed * 6364136223846793005 + 1442695040888963407
self.baseSeed += seed
self.baseSeed *= self.baseSeed * 6364136223846793005 + 1442695040888963407
self.baseSeed += seed
self.baseSeed *= self.baseSeed * 6364136223846793005 + 1442695040888963407
self.baseSeed += seed
self.baseSeed = self.javaInt64(self.baseSeed)
def javaInt64(self, val):
return ((val + (1 << 63)) % (1 << 64)) - (1 << 63)
def initChunkSeed(self, chunk):
self.chunkSeed = self.worldGenSeed
self.chunkSeed *= (self.chunkSeed * 6364136223846793005 + 1442695040888963407)
self.chunkSeed += chunk[0]
self.chunkSeed *= (self.chunkSeed * 6364136223846793005 + 1442695040888963407)
self.chunkSeed += chunk[1]
self.chunkSeed=self.javaInt64(self.chunkSeed)
self.chunkSeed *= (self.chunkSeed * 6364136223846793005 + 1442695040888963407)
self.chunkSeed += chunk[0]
self.chunkSeed *= (self.chunkSeed * 6364136223846793005 + 1442695040888963407)
self.chunkSeed += chunk[1]
self.chunkSeed=self.javaInt64(self.chunkSeed)
def countIt(self, array):
dic = Counter(array)
print(list(array))
return [str(el) + " " + str(dic[el] / array.size) for el in dic]
def initWorldSeed(self, seed):
self.worldGenSeed = seed
for el in self.parent:
if el[1]:
el[0].initWorldSeed(seed)
self.worldGenSeed *= self.worldGenSeed * 6364136223846793005 + 1442695040888963407
self.worldGenSeed += self.baseSeed
self.worldGenSeed *= self.worldGenSeed * 6364136223846793005 + 1442695040888963407
self.worldGenSeed += self.baseSeed
self.worldGenSeed *= self.worldGenSeed * 6364136223846793005 + 1442695040888963407
self.worldGenSeed += self.baseSeed
self.worldGenSeed = self.javaInt64(self.worldGenSeed)
def nextIntGen(self, limit):
i = (self.chunkSeed >> 24) % limit
if i < 0:
i += limit
self.chunkSeed *= (self.chunkSeed * 6364136223846793005 + 1442695040888963407)
self.chunkSeed += self.worldGenSeed
self.chunkSeed = self.javaInt64(self.chunkSeed)
return i
def selectRandom(self, l):
return l[self.nextIntGen(len(l))]
def genlayer(self, seed, customized):
# customized hold 0 for normal, 1 for large and 2 for fully cuztomized, 4 for default1.1, then it holds biomeSize and river size then chunk composition
# first stack from 1:4096 to 1:256
initialLayer = g1.GenLayerIsland(1)
firstLayer = g4.GenLayerZoom(2000, initialLayer, 1, 1,1)
secondLayer = g3.GenLayerAddIsland(1, firstLayer, 1)
thirdLayer = g4.GenLayerZoom(2001, secondLayer, 0, 1,1)
genlayeraddisland1 = g3.GenLayerAddIsland(2, thirdLayer, 1)
genlayeraddisland1 = g3.GenLayerAddIsland(50, genlayeraddisland1, 1)
genlayeraddisland1 = g3.GenLayerAddIsland(70, genlayeraddisland1, 1)
genlayerremovetoomuchocean = g5.GenLayerRemoveTooMuchOcean(2, genlayeraddisland1, 1)
genlayeraddsnow = g6.GenLayerAddSnow(2, genlayerremovetoomuchocean, 1)
genlayeraddisland2 = g3.GenLayerAddIsland(3, genlayeraddsnow, 1)
genlayeredge = g7.GenLayerEdge(2, genlayeraddisland2, "COOL_WARM", 1)
genlayeredge = g7.GenLayerEdge(2, genlayeredge, "HEAT_ICE", 1)
genlayeredge = g7.GenLayerEdge(3, genlayeredge, "SPECIAL", 1)
genlayerzoom1 = g4.GenLayerZoom(2002, genlayeredge, 0, 1,1)
genlayerzoom1 = g4.GenLayerZoom(2003, genlayerzoom1, 0, 1,1)
genlayeraddisland3 = g3.GenLayerAddIsland(4, genlayerzoom1, 1)
genlayeraddmushroomisland = g8.GenLayerAddMushroomIsland(5, genlayeraddisland3, 1)
genlayerdeepocean = g9.GenLayerDeepOcean(4, genlayeraddmushroomisland, 1)
genlayerdeepocean.initWorldSeed(seed)
lvt71 = deepcopy(genlayerdeepocean)
# End first stack
# choosing type of generation
i, j = 4, 4
if customized[0] == 2:
i, j = customized[1], customized[2]
if customized[0] == 1:
i = 6
# end of choice
# starting biome stack
lvt81 = g11.GenLayerBiome(200, genlayerdeepocean, customized, 0) # 19
genlayer6 = g4.GenLayerZoom.magnify(1000, lvt81, 2, 0, 1,1) # 20 and 21
genlayerbiomeedge = g12.GenLayerBiomeEdge(1000, genlayer6, 1) # 22
# end Biome stack
# starting river stack
genlayerriverinit = g10.GenLayerRiverInit(100, lvt71, 0) # 23
lvt91 = g4.GenLayerZoom.magnify(1000, genlayerriverinit, 2, 0, 1,0) # 24 and 25
# merge point
genlayerriver = deepcopy(lvt91) # copy of 25 aka 36
# merging and starting hills/rare/shore/smooth chain
genlayerhills = g13.GenLayerHills(1000, genlayerbiomeedge, lvt91, 1)
genlayerhills = g16.GenLayerRareBiome(1001, genlayerhills, 1)
for k in range(i):
genlayerhills = g4.GenLayerZoom(1000 + k, genlayerhills, 0, 1,1)
if not k:
genlayerhills = g3.GenLayerAddIsland(3, genlayerhills, 1)
if k == 1 or i == 1:
genlayerhills = g17.GenLayerShore(1000, genlayerhills, 1)
genlayersmooth1 = g15.GenLayerSmooth(1000, genlayerhills, 1)
# end of biome chain
#finishing river
genpreriver=g4.GenLayerZoom.magnify(1000, genlayerriverinit, 2, 0, 1,1)
genlayer5 = g4.GenLayerZoom.magnify(1000, genpreriver, j, 0, 1,1) # 37,38,39,40
genlayerriver = g14.GenLayerRiver(1, genlayer5, 1)
genlayersmooth = g15.GenLayerSmooth(1000, genlayerriver, 1) # 42
# end river
# merging river with biome
genlayerrivermix = g18.GenLayerRiverMix(100, genlayersmooth1, genlayersmooth, 1)
# zooming
genlayer3 = g19.GenLayerVoronoiZoom(10, genlayerrivermix, 1)
# initializing
genlayer3.initWorldSeed(seed)
return [genlayerrivermix, genlayer3, genlayerrivermix][1]
def matchBiomes(self, master, indice, customized):
seed,biomeId, px, pz = master[indice]
genlayerFinal = self.genlayer(seed, customized)
l=genlayerFinal.getInts(px, pz, 1,1)
if biomeId==l[0]:
return True
print(l,master[indice])
return False
def isBiomeOceanic(self, biomeID):
return biomeID in [24, 10, 0]
def isValidId(self, id):
x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 127, 129, 130, 131, 132, 133, 134, 140, 149, 151, 155, 156,
157, 158, 160, 161, 162, 163, 164, 165, 166, 167]
return id in x
def sameClass(self, biomeA, biomeB):
flag = False
biomeClass = {"ocean": [0, 10, 24],
"plains": [1, 129],
"desert": [2, 17, 130],
"hills": [3, 20, 34, 131, 162],
"forest": [4, 18, 132, 157,27, 28, 29],
"taiga": [5, 19, 30, 31, 32, 33, 133, 158, 160, 161],
"swamp": [6, 134],
"river": [7, 11],
"hell": [8],
"end": [9],
"mushroom": [14, 15],
"mesa": [37, 38, 39],
"savanna": [35, 36],
"beach": [16, 26],
"stonebeach": [25],
"jungle": [21, 22, 23, 149, 151],
"savannaMutated": [163, 164],
"forestMutated": [155, 156],
"snow": [12, 13, 140],
"void": [127]}
for el in biomeClass:
if biomeB in biomeClass[el] and biomeA in biomeClass[el]:
flag = True
return flag
def getTempCategory(self, biome):
cold, medium, warm = 0, 1, 2
if biome in [30, 158, 12, 140, 11, 26, 127, 10]:
return cold # below 0.2
elif biome in [35, 163, 2, 130, 37, 165, 38, 166, 36, 39, 164, 167, 8, 17]:
return warm # above 1.0
else:
return medium
def biomesEqualOrMesaPlateau(self, biomeA, biomeB):
if biomeA == biomeB:
return True
else:
if self.isValidId(biomeA) and self.isValidId(biomeB):
if biomeA != 38 and biomeA != 39: # mesa rock and clear rock
return biomeA == biomeB or self.sameClass(biomeA, biomeB)
else:
return biomeB == 38 or biomeB == 39
else:
return False
def isSnowy(self, id):
return id in [10, 11, 12, 13, 26, 30, 31, 140, 158]
def selectModeOrRandom(self, j, l, k, i):
if (l == k and k == i):
return l
elif (j == l and j == k):
return j
elif (j == l and j == i):
return j
elif (j == k and j == i):
return j
elif (j == l and k != i):
return j
elif (j == k and l != i):
return j
elif (j == i and l != k):
return j
elif (l == k and j != i):
return l
elif (l == i and j != k):
return l
else:
return k if k == i and j != l else self.selectRandom([j, l, k, i])
import GenLayerIsland as g1
import GenLayerAddIsland as g3
import GenLayerZoom as g4
import GenLayerRemoveTooMuchOcean as g5
import GenLayerAddSnow as g6
import GenLayerEdge as g7
import GenLayerAddMushroomIsland as g8
import GenLayerDeepOcean as g9
import GenLayerRiverInit as g10
import GenLayerBiome as g11
import GenLayerBiomeEdge as g12
import GenLayerHills as g13
import GenLayerRiver as g14
import GenLayerSmooth as g15
import GenLayerRareBiome as g16
import GenLayerShore as g17
import GenLayerRiverMix as g18
import GenLayerVoronoiZoom as g19
import time
def show():
m = Main()
customized = [0, "", "", [""]]
seed = 1306145184061456995
genlayerFinal = m.genlayer(seed, customized)
l = genlayerFinal.getInts(-115, -96, 1, 1)
print(l)
if __name__ == "__main__":
m = Main()
customized = [0, "", "", [""]]
seed = -8538029006561530318
#seed=-3058911107724324904
l = [(seed,34,15477,10031),(2,501,52023),(134,380,5009),(24, 0,0),(129, 809, 541)] # deep ocean
print(m.matchBiomes(l, 0, customized))
flag=1
if flag:
l=[]
with open("biomes.txt","r") as top:
for el in top:
seed,id,x,z=map(int,el.rstrip().split(","))
l.append((seed,id,x,z))
i=0
t=time.time()
for el in l:
m.matchBiomes(l, i, customized)
i+=1
if i==1000:
print(t-time.time())
print(i)
print(t - time.time())