* PEP 8 compliance

This commit is contained in:
Nils Dagsson Moskopp 2011-07-30 21:05:33 +02:00
parent 17830c5894
commit 4681392bac

@ -14,6 +14,7 @@
# 2011-06-04: celeron55: added #!/usr/bin/python2 and converted \r\n to \n # 2011-06-04: celeron55: added #!/usr/bin/python2 and converted \r\n to \n
# to make it easily executable on Linux # to make it easily executable on Linux
# 2011-07-30: WF: Support for content types extension, refactoring # 2011-07-30: WF: Support for content types extension, refactoring
# 2011-07-30: erlehmann: PEP 8 compliance.
# Requires Python Imaging Library: http://www.pythonware.com/products/pil/ # Requires Python Imaging Library: http://www.pythonware.com/products/pil/
@ -22,13 +23,13 @@
#from psyco.classes import * #from psyco.classes import *
import zlib import zlib
import Image, ImageDraw, ImageFont, ImageColor
import os import os
import string import string
import time import time
import getopt import getopt
import sys import sys
import array import array
from PIL import Image, ImageDraw, ImageFont, ImageColor
CONTENT_WATER = [2, 9] CONTENT_WATER = [2, 9]
@ -48,13 +49,13 @@ TRANSLATION_TABLE = {
20: 0x80c, # CONTENT_GLASS 20: 0x80c, # CONTENT_GLASS
22: 0x80d, # CONTENT_MOSSYCOBBLE 22: 0x80d, # CONTENT_MOSSYCOBBLE
23: 0x80e, # CONTENT_GRAVEL 23: 0x80e, # CONTENT_GRAVEL
24: 0x80f, #CONTENT_SANDSTONE 24: 0x80f, # CONTENT_SANDSTONE
25: 0x810, #CONTENT_CACTUS 25: 0x810, # CONTENT_CACTUS
26: 0x811, #CONTENT_BRICK 26: 0x811, # CONTENT_BRICK
27: 0x812, #CONTENT_CLAY 27: 0x812, # CONTENT_CLAY
28: 0x813, #CONTENT_PAPYRUS 28: 0x813, # CONTENT_PAPYRUS
29: 0x814 #CONTENT_BOOKSHELF 29: 0x814} # CONTENT_BOOKSHELF
}
def hex_to_int(h): def hex_to_int(h):
i = int(h, 16) i = int(h, 16)
@ -62,24 +63,28 @@ def hex_to_int(h):
i -= 4096 i -= 4096
return i return i
def hex4_to_int(h): def hex4_to_int(h):
i = int(h, 16) i = int(h, 16)
if(i > 32767): if(i > 32767):
i -= 65536 i -= 65536
return i return i
def int_to_hex3(i): def int_to_hex3(i):
if(i < 0): if(i < 0):
return "%03X" % (i + 4096) return "%03X" % (i + 4096)
else: else:
return "%03X" % i return "%03X" % i
def int_to_hex4(i): def int_to_hex4(i):
if(i < 0): if(i < 0):
return "%04X" % (i + 65536) return "%04X" % (i + 65536)
else: else:
return "%04X" % i return "%04X" % i
def limit(i, l, h): def limit(i, l, h):
if(i > h): if(i > h):
i = h i = h
@ -87,10 +92,13 @@ def limit(i, l, h):
i = l i = l
return i return i
def usage(): def usage():
print "TODO: Help" print "TODO: Help"
try: try:
opts, args = getopt.getopt(sys.argv[1:], "hi:o:", ["help", "input=", "output=", "bgcolor=", "scalecolor=", "origincolor=", "playercolor=", "draworigin", "drawplayers", "drawscale"]) opts, args = getopt.getopt(sys.argv[1:], "hi:o:", ["help", "input=",
"output=", "bgcolor=", "scalecolor=", "origincolor=",
"playercolor=", "draworigin", "drawplayers", "drawscale"])
except getopt.GetoptError, err: except getopt.GetoptError, err:
# print help information and exit: # print help information and exit:
print str(err) # will print something like "option -a not recognized" print str(err) # will print something like "option -a not recognized"
@ -139,7 +147,7 @@ for o, a in opts:
else: else:
assert False, "unhandled option" assert False, "unhandled option"
if path[-1:]!="/" and path[-1:]!="\\": if path[-1:] != "/" and path[-1:] != "\\":
path = path + "/" path = path + "/"
# Load color information for the blocks. # Load color information for the blocks.
@ -147,13 +155,17 @@ colors = {}
f = file("colors.txt") f = file("colors.txt")
for line in f: for line in f:
values = string.split(line) values = string.split(line)
colors[int(values[0], 16)] = (int(values[1]), int(values[2]), int(values[3])) colors[int(values[0], 16)] = (
int(values[1]),
int(values[2]),
int(values[3]))
f.close() f.close()
xlist = [] xlist = []
zlist = [] zlist = []
# List all sectors to memory and calculate the width and heigth of the resulting picture. # List all sectors to memory and calculate the width and heigth of the
# resulting picture.
if os.path.exists(path + "sectors2"): if os.path.exists(path + "sectors2"):
for filename in os.listdir(path + "sectors2"): for filename in os.listdir(path + "sectors2"):
for filename2 in os.listdir(path + "sectors2/" + filename): for filename2 in os.listdir(path + "sectors2/" + filename):
@ -185,7 +197,7 @@ maxz = max(zlist)
w = (maxx - minx) * 16 + 16 w = (maxx - minx) * 16 + 16
h = (maxz - minz) * 16 + 16 h = (maxz - minz) * 16 + 16
print "w="+str(w)+" h="+str(h) print "w=" + str(w) + " h=" + str(h)
im = Image.new("RGB", (w + border, h + border), bgcolor) im = Image.new("RGB", (w + border, h + border), bgcolor)
draw = ImageDraw.Draw(im) draw = ImageDraw.Draw(im)
@ -195,9 +207,11 @@ stuff = {}
starttime = time.time() starttime = time.time()
def data_is_air(d): def data_is_air(d):
return d in [126, 127, 254] return d in [126, 127, 254]
def read_blocknum(mapdata, version, datapos): def read_blocknum(mapdata, version, datapos):
if version == 20: if version == 20:
if mapdata[datapos] < 0x80: if mapdata[datapos] < 0x80:
@ -209,6 +223,7 @@ def read_blocknum(mapdata, version, datapos):
else: else:
raise Exception("Unsupported map format: " + str(version)) raise Exception("Unsupported map format: " + str(version))
def read_mapdata(f, version, pixellist, water): def read_mapdata(f, version, pixellist, water):
global stuff # oh my :-) global stuff # oh my :-)
@ -221,7 +236,8 @@ def read_mapdata(f, version, pixellist, water):
f.close() f.close()
if(len(mapdata) < 4096): if(len(mapdata) < 4096):
print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata)) print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + \
str(len(mapdata))
else: else:
chunkxpos = xpos * 16 chunkxpos = xpos * 16
chunkypos = ypos * 16 chunkypos = ypos * 16
@ -236,14 +252,18 @@ def read_mapdata(f, version, pixellist, water):
if blocknum in CONTENT_WATER: if blocknum in CONTENT_WATER:
water[(x, z)] += 1 water[(x, z)] += 1
# Add dummy stuff for drawing sea without seabed # Add dummy stuff for drawing sea without seabed
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)]) stuff[(chunkxpos + x, chunkzpos + z)] = (
chunkypos + y, blocknum, water[(x, z)])
else: else:
pixellist.remove((x, z)) pixellist.remove((x, z))
# Memorize information on the type and height of the block and for drawing the picture. # Memorize information on the type and height of
stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)]) # the block and for drawing the picture.
stuff[(chunkxpos + x, chunkzpos + z)] = (
chunkypos + y, blocknum, water[(x, z)])
break break
elif not data_is_air(blocknum) and blocknum not in colors: elif not data_is_air(blocknum) and blocknum not in colors:
print "strange block: %s/%s/%s x: %d y: %d z: %d block id: %x" % (xhex, zhex, yhex, x, y, z, blocknum) print "strange block: %s/%s/%s x: %d y: %d z: %d \
block id: %x" % (xhex, zhex, yhex, x, y, z, blocknum)
# Go through all sectors. # Go through all sectors.
for n in range(len(xlist)): for n in range(len(xlist)):
@ -261,11 +281,11 @@ for n in range(len(xlist)):
time_guess = seconds_per_n * len(xlist) time_guess = seconds_per_n * len(xlist)
remaining_s = time_guess - dtime remaining_s = time_guess - dtime
remaining_minutes = int(remaining_s / 60) remaining_minutes = int(remaining_s / 60)
remaining_s -= remaining_minutes * 60; remaining_s -= remaining_minutes * 60
print("Processing sector "+str(n)+" of "+str(len(xlist)) print("Processing sector " + str(n) + " of " + str(len(xlist))
+" ("+str(round(100.0*n/len(xlist), 1))+"%)" + " (" + str(round(100.0 * n / len(xlist), 1)) + "%)"
+" (ETA: "+str(remaining_minutes)+"m " + " (ETA: " + str(remaining_minutes) + "m "
+str(int(remaining_s))+"s)") + str(int(remaining_s)) + "s)")
xpos = xlist[n] xpos = xlist[n]
zpos = zlist[n] zpos = zlist[n]
@ -310,7 +330,6 @@ for n in range(len(xlist)):
ylist.sort() ylist.sort()
# Make a list of pixels of the sector that are to be looked for. # Make a list of pixels of the sector that are to be looked for.
pixellist = [] pixellist = []
water = {} water = {}
@ -320,7 +339,7 @@ for n in range(len(xlist)):
water[(x, z)] = 0 water[(x, z)] = 0
# Go through the Y axis from top to bottom. # Go through the Y axis from top to bottom.
ylist2=[] ylist2 = []
for ypos in reversed(ylist): for ypos in reversed(ylist):
yhex = int_to_hex4(ypos) yhex = int_to_hex4(ypos)
@ -339,13 +358,14 @@ for n in range(len(xlist)):
# Checking day and night differs -flag # Checking day and night differs -flag
if not ord(flags) & 2: if not ord(flags) & 2:
ylist2.append((ypos,filename)) ylist2.append((ypos, filename))
f.close() f.close()
continue continue
read_mapdata(f, version, pixellist, water) read_mapdata(f, version, pixellist, water)
# After finding all the pixels in the sector, we can move on to the next sector without having to continue the Y axis. # After finding all the pixels in the sector, we can move on to
# the next sector without having to continue the Y axis.
if(len(pixellist) == 0): if(len(pixellist) == 0):
break break
@ -358,7 +378,8 @@ for n in range(len(xlist)):
read_mapdata(f, version, pixellist, water) read_mapdata(f, version, pixellist, water)
# After finding all the pixels in the sector, we can move on to the next sector without having to continue the Y axis. # After finding all the pixels in the sector, we can move on
# to the next sector without having to continue the Y axis.
if(len(pixellist) == 0): if(len(pixellist) == 0):
break break
@ -380,20 +401,22 @@ for (x, z) in stuff.iterkeys():
time_guess = seconds_per_n * listlen time_guess = seconds_per_n * listlen
remaining_s = time_guess - dtime remaining_s = time_guess - dtime
remaining_minutes = int(remaining_s / 60) remaining_minutes = int(remaining_s / 60)
remaining_s -= remaining_minutes * 60; remaining_s -= remaining_minutes * 60
print("Drawing pixel "+str(n)+" of "+str(listlen) print("Drawing pixel " + str(n) + " of " + str(listlen)
+" ("+str(round(100.0*n/listlen, 1))+"%)" + " (" + str(round(100.0 * n / listlen, 1)) + "%)"
+" (ETA: "+str(remaining_minutes)+"m " + " (ETA: " + str(remaining_minutes) + "m "
+str(int(remaining_s))+"s)") + str(int(remaining_s)) + "s)")
n += 1 n += 1
(r, g, b) = colors[stuff[(x,z)][1]] (r, g, b) = colors[stuff[(x, z)][1]]
# Comparing heights of a couple of adjacent blocks and changing brightness accordingly. # Comparing heights of a couple of adjacent blocks and changing
# brightness accordingly.
try: try:
c1 = stuff[(x - 1, z)][1] c1 = stuff[(x - 1, z)][1]
c2 = stuff[(x, z + 1)][1] c2 = stuff[(x, z + 1)][1]
c = stuff[(x, z)][1] c = stuff[(x, z)][1]
if c1 not in CONTENT_WATER and c2 not in CONTENT_WATER and c not in CONTENT_WATER: if c1 not in CONTENT_WATER and c2 not in CONTENT_WATER and \
c not in CONTENT_WATER:
y1 = stuff[(x - 1, z)][0] y1 = stuff[(x - 1, z)][0]
y2 = stuff[(x, z + 1)][0] y2 = stuff[(x, z + 1)][0]
y = stuff[(x, z)][0] y = stuff[(x, z)][0]
@ -412,38 +435,44 @@ for (x, z) in stuff.iterkeys():
pass pass
# Water # Water
if(stuff[(x,z)][2] > 0): if(stuff[(x, z)][2] > 0):
r=int(r * .15 + colors[2][0] * .85) r = int(r * .15 + colors[2][0] * .85)
g=int(g * .15 + colors[2][1] * .85) g = int(g * .15 + colors[2][1] * .85)
b=int(b * .15 + colors[2][2] * .85) b = int(b * .15 + colors[2][2] * .85)
impix[x - minx * 16 + border, h - 1 - (z - minz * 16) + border] = (r, g, b) impix[x - minx * 16 + border, h - 1 - (z - minz * 16) + border] = (r, g, b)
if draworigin: if draworigin:
draw.ellipse((minx * -16 - 5 + border, h - minz * -16 - 6 + border, minx * -16 + 5 + border, h - minz * -16 + 4 + border), outline = origincolor) draw.ellipse((minx * -16 - 5 + border, h - minz * -16 - 6 + border,
minx * -16 + 5 + border, h - minz * -16 + 4 + border),
outline=origincolor)
font = ImageFont.load_default() font = ImageFont.load_default()
if drawscale: if drawscale:
draw.text((24, 0), "X", font = font, fill = scalecolor) draw.text((24, 0), "X", font=font, fill=scalecolor)
draw.text((2, 24), "Z", font = font, fill = scalecolor) draw.text((2, 24), "Z", font=font, fill=scalecolor)
for n in range(int(minx / -4) * -4, maxx, 4): for n in range(int(minx / -4) * -4, maxx, 4):
draw.text((minx * -16 + n * 16 + 2 + border, 0), str(n * 16), font = font, fill = scalecolor) draw.text((minx * -16 + n * 16 + 2 + border, 0), str(n * 16),
draw.line((minx * -16 + n * 16 + border, 0, minx * -16 + n * 16 + border, border - 1), fill = scalecolor) font=font, fill=scalecolor)
draw.line((minx * -16 + n * 16 + border, 0,
minx * -16 + n * 16 + border, border - 1), fill=scalecolor)
for n in range(int(maxz / 4) * 4, minz, -4): for n in range(int(maxz / 4) * 4, minz, -4):
draw.text((2, h - 1 - (n * 16 - minz * 16) + border), str(n * 16), font = font, fill = scalecolor) draw.text((2, h - 1 - (n * 16 - minz * 16) + border), str(n * 16),
draw.line((0, h - 1 - (n * 16 - minz * 16) + border, border - 1, h - 1 - (n * 16 - minz * 16) + border), fill = scalecolor) font=font, fill=scalecolor)
draw.line((0, h - 1 - (n * 16 - minz * 16) + border, border - 1,
h - 1 - (n * 16 - minz * 16) + border), fill=scalecolor)
if drawplayers: if drawplayers:
try: try:
for filename in os.listdir(path + "players"): for filename in os.listdir(path + "players"):
f = file(path + "players/" + filename) f = file(path + "players/" + filename)
lines = f.readlines() lines = f.readlines()
name="" name = ""
position=[] position = []
for line in lines: for line in lines:
p = string.split(line) p = string.split(line)
if p[0] == "name": if p[0] == "name":
@ -453,10 +482,12 @@ if drawplayers:
position = string.split(p[2][1:-1], ",") position = string.split(p[2][1:-1], ",")
print filename + ": position = " + p[2] print filename + ": position = " + p[2]
if len(name) > 0 and len(position) == 3: if len(name) > 0 and len(position) == 3:
x=(int(float(position[0]) / 10 - minx * 16)) x = (int(float(position[0]) / 10 - minx * 16))
z=int(h - (float(position[2]) / 10 - minz * 16)) z = int(h - (float(position[2]) / 10 - minz * 16))
draw.ellipse((x - 2 + border, z - 2 + border, x + 2 + border, z + 2 + border), outline = playercolor) draw.ellipse((x - 2 + border, z - 2 + border,
draw.text((x + 2 + border, z + 2 + border), name, font = font, fill = playercolor) x + 2 + border, z + 2 + border), outline=playercolor)
draw.text((x + 2 + border, z + 2 + border), name,
font=font, fill=playercolor)
f.close() f.close()
except OSError: except OSError:
pass pass