Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.11 KB | None | 0 0
  1. import math
  2. import random
  3. import gzip
  4.  
  5. random.seed()
  6. X,Y,Z = 256,256,128
  7.  
  8. def main():
  9.     #loadColors()
  10.     print("loading...")
  11.     input = gzip.open("input.dat", "rb")
  12.     header = input.read(485)
  13.     global bytes
  14.     bytes = bytearray(input.read(X*Y*Z))
  15.     footer = input.read()
  16.     input.close()
  17.    
  18.     generateMap()
  19.    
  20.     print("writing...")
  21.     input = gzip.open("server_level.dat", "wb")
  22.     input.write(header + bytes + footer)
  23.     input.close()
  24.     print("finished!")
  25.  
  26. def generateMap():
  27.     oceanServ();
  28.  
  29. def oceanServ():
  30.     plasmaFractal(128, 4, 2, 10, 1)
  31.     undergroundDebris(92, 128)
  32.     fillWater(256)
  33.     cylinder(10,128,128,255,1,0,2)
  34.     for x in range(X):
  35.         for y in range(Y):
  36.             bytes[p(x, y, 32)] = 7
  37.  
  38. def undergroundDebris(height, amount):
  39.     print("spreading debris...")
  40.     for i in range(amount):
  41.         sphere(random.randint(1,4), random.randint(0,X), random.randint(0,Y), random.randint(0,height), 0, random.randint(14,16))
  42.  
  43. def count(t):
  44.     number = 0
  45.     print("counting blocks...")
  46.     for x in range(X):
  47.         for y in range(Y):
  48.             for z in range(Z):
  49.                 if bytes[Y*(X*z+x)+y] == t:
  50.                     number += 1
  51.     print(number)
  52.  
  53. def replace(f, t):
  54.     number = 0
  55.     print("counting blocks...")
  56.     for x in range(X):
  57.         for y in range(Y):
  58.             for z in range(Z):
  59.                 if bytes[Y*(X*z+x)+y] == f:
  60.                     bytes[Y*(X*z+x)+y] = t
  61.  
  62. def p(x, y, z):
  63.     return Y*(X*z+x)+y
  64.    
  65. def plasmaFractal(h, roughness, seed, scale, t):
  66.     print("building plasma fractal:")
  67.     print("   calculating...")
  68.     grid = []
  69.     for i in range(X+1):
  70.         temp = []
  71.         for j in range(Y+1):
  72.             temp.append(0)
  73.         grid.append(temp)
  74.     grid[0][Y] += (random.random()-0.5)*seed
  75.     grid[X][0] += (random.random()-0.5)*seed
  76.     grid[0][0] += (random.random()-0.5)*seed
  77.     grid[X][Y] += (random.random()-0.5)*seed
  78.    
  79.     for i in range(7, -1, -1):
  80.         step = int(math.pow(2,i))
  81.         for x1 in range(step, X, step*2):
  82.             for y1 in range(step, Y, step*2):
  83.                 grid[x1][y1] = (grid[x1-step][y1-step] + grid[x1+step][y1+step] + grid[x1+step][y1-step] + grid[x1-step][y1+step])/4 + variance(math.pow(1.6,7-i), roughness)
  84.         for x1 in range(step, X, step*2):
  85.             for y1 in range(0, Y+step, step*2):
  86.                 grid[x1][y1] = (grid[x1+step][y1] + grid[x1-step][y1])*0.5
  87.         for x1 in range(0, X+step, step*2):
  88.             for y1 in range(step, Y, step*2):
  89.                 grid[x1][y1] = (grid[x1][y1+step] + grid[x1][y1-step])*0.5
  90.     print("   constructing...")
  91.     for x1 in range(X):
  92.         for y1 in range(Y):
  93.             f = (grid[x1][y1] + grid[x1+1][y1+1] + grid[x1+1][y1] + grid[x1][y1+1])/4 + variance(256, roughness)
  94.             f = round(f*scale + h)
  95.             if f < 0:
  96.                 f = 0
  97.             elif f > Z:
  98.                 f = Z
  99.             if f:
  100.                 column(f,x1,y1,t, 12)
  101.            
  102. def variance(step, roughness):
  103.     return roughness/(step)*(random.random()-0.5)
  104.                
  105. def sphere(r, x1, y1, z1, inner, t):
  106.     print("building sphere...")
  107.     for x in range(x1-r, x1+r):
  108.         for y in range(y1-r, y1+r):
  109.             for z in range(z1-r, z1+r):
  110.                 radius = (x-x1)*(x-x1) + (y-y1)*(y-y1) + (z-z1)*(z-z1)
  111.                 if radius < r*r and (radius >= inner*inner or not inner):
  112.                     if t:
  113.                         bytes[Y*(X*z+x)+y] = t
  114.                     else:
  115.                         bytes[Y*(X*z+x)+y] = colorPat(x,y,z)
  116.  
  117. def cylinder(r, x1, y1, z1, h, inner, t):
  118.     print("building cylinder...")
  119.     for z in range(h):
  120.         for x in range(x1-r,x1+r):
  121.             for y in range(y1-r,y1+r):
  122.                 radius = (x-x1)*(x-x1) + (y-y1)*(y-y1)
  123.                 if radius < r*r and (radius >= inner*inner or not inner):
  124.                     bytes[X*Y*(z+z1)+Y*x+y] = t
  125.  
  126. def rect(x1,y1,z1, x2,y2,z2, t):
  127.     for x in range(int(x1), int(x2)):
  128.         for y in range(int(y1), int(y2)):
  129.             for z in range(int(z1), int(z2)):
  130.                 bytes[Y*(X*z+x)+y] = t
  131.  
  132. def blockWater():
  133.     print("blocking water...")
  134.     for z in range(int(Z/2-2),int(Z/2)):
  135.         for x in range(X):
  136.             bytes[X*Y*z+Y*x] = 7
  137.             bytes[X*Y*z+Y*x+(X-1)] = 7
  138.         for y in range(Y):
  139.             bytes[X*Y*z+y] = 7
  140.             bytes[X*Y*z+Y*(Y-1)+y] = 7
  141.  
  142. def fillMap(height, t):
  143.     print("filling with water...")
  144.     for x in range(X):
  145.         for y in range(Y):
  146.             for z in range(int(height)):
  147.                 bytes[Y*(X*z+x)+y] = t
  148.  
  149. def column(h, x, y, t, c):
  150.     for z in range(h):
  151.         if z > h-32:
  152.             g = 3
  153.         else:
  154.             g = t
  155.         bytes[Y*(X*z+x)+y] = g
  156.     if c:
  157.         bytes[X*Y*(h-1)+Y*x+y] = c
  158.         bytes[X*Y*(h-2)+Y*x+y] = c
  159.         bytes[X*Y*(h-3)+Y*x+y] = c
  160.  
  161. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement