From 47381bde3b4d7a9ee9780786c9a993f2b63a488a Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Sun, 24 Jul 2011 10:19:31 +0200 Subject: Bring po update out of cmake again MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This solves two issues at once: * CMake would delete po files during ‘make clean’ because it thought they were autogenerated and not just managed * the only gettext tools readily available in Windows are so old they don't support options like --package-name The change also moves minetest.pot down one level, so we don't need to special case ‘en’ anymore. The downside is of course that you need some sane POSIX shell to update the po files. --- util/updatepo.sh | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 util/updatepo.sh (limited to 'util') diff --git a/util/updatepo.sh b/util/updatepo.sh new file mode 100755 index 000000000..bcfa4c4de --- /dev/null +++ b/util/updatepo.sh @@ -0,0 +1,65 @@ +#!/bin/sh + +# Update/create minetest po files + +# an auxiliary function to abort processing with an optional error +# message +abort() { + test -n "$1" && echo >&2 "$1" + exit 1 +} + +# The po/ directory is assumed to be parallel to the directory where +# this script is. Relative paths are fine for us so we can just +# use the following trick (works both for manual invocations and for +# script found from PATH) +scriptisin="$(dirname "$(which "$0")")" + +# The script is executed from the parent of po/, which is also the +# parent of the script directory and of the src/ directory. +# We go through $scriptisin so that it can be executed from whatever +# directory and still work correctly +cd "$scriptisin/.." + +test -e po || abort "po/ directory not found" +test -d po || abort "po/ is not a directory!" + +# Get a list of the languages we have to update/create + +cd po || abort "couldn't change directory to po!" + +# This assumes that we won't have dirnames with space, which is +# the case for language codes, which are the only subdirs we expect to +# find in po/ anyway. If you put anything else there, you need to suffer +# the consequences of your actions, so we don't do sanity checks +langs="" + +for lang in * ; do + if test ! -d $lang; then + continue + fi + langs="$langs $lang" +done + +# go back +cd .. + +# First thing first, update the .pot template. We place it in the po/ +# directory at the top level. You a recent enough xgettext that supports +# --package-name +potfile=po/minetest.pot +xgettext --package-name=minetest -F -n -o $potfile src/*.cpp src/*.h + +# Now iterate on all languages and create the po file if missing, or update it +# if it exists already +for lang in $langs ; do # note the missing quotes around $langs + pofile=po/$lang/minetest.po + if test -e $pofile; then + echo "[$lang]: updating strings" + msgmerge -F -U $pofile $potfile + else + # This will ask for the translator identity + echo "[$lang]: NEW strings" + msginit -l $lang -o $pofile -i $potfile + fi +done -- cgit v1.2.3 From edbcf7c0394758663712edf66d30bd578df6cc16 Mon Sep 17 00:00:00 2001 From: Wolfgang Fellger Date: Sat, 30 Jul 2011 20:35:55 +0200 Subject: * support for content types extension in minetestmapper --- util/colors.txt | 47 ++++++++------- util/minetestmapper.py | 158 +++++++++++++++++++++++++++---------------------- 2 files changed, 114 insertions(+), 91 deletions(-) (limited to 'util') diff --git a/util/colors.txt b/util/colors.txt index c16fd3e23..2dceb9134 100644 --- a/util/colors.txt +++ b/util/colors.txt @@ -1,21 +1,26 @@ -0 128 128 128 -1 107 134 51 -2 39 66 106 -3 255 255 0 -4 86 58 31 -5 48 95 8 -6 102 129 38 -7 178 178 0 -8 101 84 36 -9 39 66 106 -12 104 78 42 -13 210 194 156 -14 117 86 41 -15 128 79 0 -16 118 118 118 -18 123 123 123 -19 199 199 199 -20 183 183 222 -21 103 78 42 -22 108 138 108 -23 90 90 90 +0 128 128 128 # CONTENT_STONE +800 107 134 51 # CONTENT_GRASS +2 39 66 106 # CONTENT_WATER +3 255 255 0 # CONTENT_TORCH +801 86 58 31 # CONTENT_TREE +802 48 95 8 # CONTENT_LEAVES +803 102 129 38 # CONTENT_GRASS_FOOTSTEPS +804 178 178 0 # CONTENT_MESE +805 101 84 36 # CONTENT_MUD +9 39 66 106 # CONTENT_WATERSOURCE +808 104 78 42 # CONTENT_WOOD +809 210 194 156 # CONTENT_SAND +e 117 86 41 # CONTENT_SIGN_WALL +f 128 79 0 # CONTENT_CHEST +10 118 118 118 # CONTENT_FURNACE +80a 123 123 123 # CONTENT_COBBLE +80b 199 199 199 # CONTENT_STEEL +80c 183 183 222 # CONENT_GLASS +15 103 78 42 # CONTENT_FENCE +80d 219 202 178 # CONTENT_MOSSYCOBBLE +80e 78 154 6 # CONTENT_GRAVEL +80f 204 0 0 # CONTENT_SANDSTONE +810 211 215 207 # CONTENT_CACTUS +811 170 50 25 # CONTENT_BRICK +812 104 78 42 # CONTENT_CLAY +813 58 105 18 # CONTENT_PAPYRUS diff --git a/util/minetestmapper.py b/util/minetestmapper.py index 162ceb204..868f82c76 100755 --- a/util/minetestmapper.py +++ b/util/minetestmapper.py @@ -13,6 +13,7 @@ # 2011-06-02: j0gge: command line parameters, coordinates, players, ... # 2011-06-04: celeron55: added #!/usr/bin/python2 and converted \r\n to \n # to make it easily executable on Linux +# 2011-07-30: WF: Support for content types extension, refactoring # Requires Python Imaging Library: http://www.pythonware.com/products/pil/ @@ -27,6 +28,33 @@ import string import time import getopt import sys +import array + +CONTENT_WATER = [2, 9] + +TRANSLATION_TABLE = { + 1: 0x800, # CONTENT_GRASS + 4: 0x801, # CONTENT_TREE + 5: 0x802, # CONTENT_LEAVES + 6: 0x803, # CONTENT_GRASS_FOOTSTEPS + 7: 0x804, # CONTENT_MESE + 8: 0x805, # CONTENT_MUD + 10: 0x806, # CONTENT_CLOUD + 11: 0x807, # CONTENT_COALSTONE + 12: 0x808, # CONTENT_WOOD + 13: 0x809, # CONTENT_SAND + 18: 0x80a, # CONTENT_COBBLE + 19: 0x80b, # CONTENT_STEEL + 20: 0x80c, # CONTENT_GLASS + 22: 0x80d, # CONTENT_MOSSYCOBBLE + 23: 0x80e, # CONTENT_GRAVEL + 24: 0x80f, #CONTENT_SANDSTONE + 25: 0x810, #CONTENT_CACTUS + 26: 0x811, #CONTENT_BRICK + 27: 0x812, #CONTENT_CLAY + 28: 0x813, #CONTENT_PAPYRUS + 29: 0x814 #CONTENT_BOOKSHELF +} def hex_to_int(h): i = int(h, 16) @@ -70,7 +98,7 @@ except getopt.GetoptError, err: sys.exit(2) path = "../world/" -output = "uloste.png" +output = "map.png" border = 0 scalecolor = "black" bgcolor = "white" @@ -119,14 +147,14 @@ colors = {} f = file("colors.txt") for line in f: values = string.split(line) - colors[int(values[0])] = (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() xlist = [] zlist = [] # List all sectors to memory and calculate the width and heigth of the resulting picture. -try: +if os.path.exists(path + "sectors2"): for filename in os.listdir(path + "sectors2"): for filename2 in os.listdir(path + "sectors2/" + filename): x = hex_to_int(filename) @@ -137,9 +165,8 @@ try: continue xlist.append(x) zlist.append(z) -except OSError: - pass -try: + +if os.path.exists(path + "sectors"): for filename in os.listdir(path + "sectors"): x = hex4_to_int(filename[:4]) z = hex4_to_int(filename[-4:]) @@ -149,8 +176,6 @@ try: continue xlist.append(x) zlist.append(z) -except OSError: - pass minx = min(xlist) minz = min(zlist) @@ -171,7 +196,54 @@ stuff = {} starttime = time.time() def data_is_air(d): - return (d == 254 or d == 126) + return d in [126, 127, 254] + +def read_blocknum(mapdata, version, datapos): + if version == 20: + if mapdata[datapos] < 0x80: + return mapdata[datapos] + else: + return (mapdata[datapos] << 4) | (mapdata[datapos + 0x2000] >> 4) + elif 16 <= version < 20: + return TRANSLATION_TABLE.get(mapdata[datapos], mapdata[datapos]) + else: + raise Exception("Unsupported map format: " + str(version)) + +def read_mapdata(f, version, pixellist, water): + global stuff # oh my :-) + + dec_o = zlib.decompressobj() + try: + mapdata = array.array("B", dec_o.decompress(f.read())) + except: + mapdata = [] + + f.close() + + if(len(mapdata) < 4096): + print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata)) + else: + chunkxpos = xpos * 16 + chunkypos = ypos * 16 + chunkzpos = zpos * 16 + blocknum = 0 + datapos = 0 + for (x, z) in reversed(pixellist): + for y in reversed(range(16)): + datapos = x + y * 16 + z * 256 + blocknum = read_blocknum(mapdata, version, datapos) + if not data_is_air(blocknum) and blocknum in colors: + if blocknum in CONTENT_WATER: + water[(x, z)] += 1 + # Add dummy stuff for drawing sea without seabed + stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)]) + else: + pixellist.remove((x, z)) + # Memorize information on the type and height of the block and for drawing the picture. + stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)]) + break + 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) # Go through all sectors. for n in range(len(xlist)): @@ -238,6 +310,7 @@ for n in range(len(xlist)): ylist.sort() + # Make a list of pixels of the sector that are to be looked for. pixellist = [] water = {} @@ -260,7 +333,8 @@ for n in range(len(xlist)): f = file(filename, "rb") - version = f.read(1) + # Let's just memorize these even though it's not really necessary. + version = ord(f.read(1)) flags = f.read(1) # Checking day and night differs -flag @@ -269,35 +343,7 @@ for n in range(len(xlist)): f.close() continue - dec_o = zlib.decompressobj() - try: - mapdata = dec_o.decompress(f.read()) - except: - mapdata = [] - - f.close() - - if(len(mapdata) < 4096): - print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata)) - else: - chunkxpos = xpos * 16 - chunkypos = ypos * 16 - chunkzpos = zpos * 16 - for (x, z) in reversed(pixellist): - for y in reversed(range(16)): - datapos = x + y * 16 + z * 256 - if(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) in colors): - if(ord(mapdata[datapos]) == 2 or ord(mapdata[datapos]) == 9): - water[(x, z)] += 1 - # Add dummy stuff for drawing sea without seabed - stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)]) - else: - pixellist.remove((x, z)) - # Memorize information on the type and height of the block and for drawing the picture. - stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)]) - break - elif(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) not in colors): - print "strange block: " + xhex + "/" + zhex + "/" + yhex + " x: " + str(x) + " y: " + str(y) + " z: " + str(z) + " palikka: " + str(ord(mapdata[datapos])) + 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. if(len(pixellist) == 0): @@ -307,38 +353,10 @@ for n in range(len(xlist)): for (ypos, filename) in ylist2: f = file(filename, "rb") - version = f.read(1) + version = ord(f.read(1)) flags = f.read(1) - - dec_o = zlib.decompressobj() - try: - mapdata = dec_o.decompress(f.read()) - except: - mapdata = [] - - f.close() - if(len(mapdata) < 4096): - print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata)) - else: - chunkxpos = xpos * 16 - chunkypos = ypos * 16 - chunkzpos = zpos * 16 - for (x, z) in reversed(pixellist): - for y in reversed(range(16)): - datapos = x + y * 16 + z * 256 - if(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) in colors): - if(ord(mapdata[datapos]) == 2 or ord(mapdata[datapos]) == 9): - water[(x, z)] += 1 - # Add dummy stuff for drawing sea without seabed - stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)]) - else: - pixellist.remove((x, z)) - # Memorize information on the type and height of the block and for drawing the picture. - stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, ord(mapdata[datapos]), water[(x, z)]) - break - elif(not data_is_air(ord(mapdata[datapos])) and ord(mapdata[datapos]) not in colors): - print "outo palikka: " + xhex + "/" + zhex + "/" + yhex + " x: " + str(x) + " y: " + str(y) + " z: " + str(z) + " palikka: " + str(ord(mapdata[datapos])) + 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. if(len(pixellist) == 0): @@ -375,7 +393,7 @@ for (x, z) in stuff.iterkeys(): c1 = stuff[(x - 1, z)][1] c2 = stuff[(x, z + 1)][1] c = stuff[(x, z)][1] - if c1 != 2 and c1 != 9 and c2 != 2 and c2 != 9 and c != 2 and c != 9: + if c1 not in CONTENT_WATER and c2 not in CONTENT_WATER and c not in CONTENT_WATER: y1 = stuff[(x - 1, z)][0] y2 = stuff[(x, z + 1)][0] y = stuff[(x, z)][0] -- cgit v1.2.3 From 4681392bace0f72bdbff21c2bb805e04e010e43f Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sat, 30 Jul 2011 21:05:33 +0200 Subject: * PEP 8 compliance --- util/minetestmapper.py | 715 ++++++++++++++++++++++++++----------------------- 1 file changed, 373 insertions(+), 342 deletions(-) (limited to 'util') diff --git a/util/minetestmapper.py b/util/minetestmapper.py index 868f82c76..5b175512c 100755 --- a/util/minetestmapper.py +++ b/util/minetestmapper.py @@ -9,93 +9,101 @@ # Made by Jogge, modified by celeron55 # 2011-05-29: j0gge: initial release -# 2011-05-30: celeron55: simultaneous support for sectors/sectors2, removed +# 2011-05-30: celeron55: simultaneous support for sectors/sectors2, removed # 2011-06-02: j0gge: command line parameters, coordinates, players, ... # 2011-06-04: celeron55: added #!/usr/bin/python2 and converted \r\n to \n # to make it easily executable on Linux # 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/ # Some speed-up: ...lol, actually it slows it down. -#import psyco ; psyco.full() +#import psyco ; psyco.full() #from psyco.classes import * import zlib -import Image, ImageDraw, ImageFont, ImageColor import os import string import time import getopt import sys import array +from PIL import Image, ImageDraw, ImageFont, ImageColor CONTENT_WATER = [2, 9] TRANSLATION_TABLE = { - 1: 0x800, # CONTENT_GRASS - 4: 0x801, # CONTENT_TREE - 5: 0x802, # CONTENT_LEAVES - 6: 0x803, # CONTENT_GRASS_FOOTSTEPS - 7: 0x804, # CONTENT_MESE - 8: 0x805, # CONTENT_MUD - 10: 0x806, # CONTENT_CLOUD - 11: 0x807, # CONTENT_COALSTONE - 12: 0x808, # CONTENT_WOOD - 13: 0x809, # CONTENT_SAND - 18: 0x80a, # CONTENT_COBBLE - 19: 0x80b, # CONTENT_STEEL - 20: 0x80c, # CONTENT_GLASS - 22: 0x80d, # CONTENT_MOSSYCOBBLE - 23: 0x80e, # CONTENT_GRAVEL - 24: 0x80f, #CONTENT_SANDSTONE - 25: 0x810, #CONTENT_CACTUS - 26: 0x811, #CONTENT_BRICK - 27: 0x812, #CONTENT_CLAY - 28: 0x813, #CONTENT_PAPYRUS - 29: 0x814 #CONTENT_BOOKSHELF -} + 1: 0x800, # CONTENT_GRASS + 4: 0x801, # CONTENT_TREE + 5: 0x802, # CONTENT_LEAVES + 6: 0x803, # CONTENT_GRASS_FOOTSTEPS + 7: 0x804, # CONTENT_MESE + 8: 0x805, # CONTENT_MUD + 10: 0x806, # CONTENT_CLOUD + 11: 0x807, # CONTENT_COALSTONE + 12: 0x808, # CONTENT_WOOD + 13: 0x809, # CONTENT_SAND + 18: 0x80a, # CONTENT_COBBLE + 19: 0x80b, # CONTENT_STEEL + 20: 0x80c, # CONTENT_GLASS + 22: 0x80d, # CONTENT_MOSSYCOBBLE + 23: 0x80e, # CONTENT_GRAVEL + 24: 0x80f, # CONTENT_SANDSTONE + 25: 0x810, # CONTENT_CACTUS + 26: 0x811, # CONTENT_BRICK + 27: 0x812, # CONTENT_CLAY + 28: 0x813, # CONTENT_PAPYRUS + 29: 0x814} # CONTENT_BOOKSHELF + def hex_to_int(h): - i = int(h, 16) - if(i > 2047): - i -= 4096 - return i + i = int(h, 16) + if(i > 2047): + i -= 4096 + return i + def hex4_to_int(h): - i = int(h, 16) - if(i > 32767): - i -= 65536 - return i + i = int(h, 16) + if(i > 32767): + i -= 65536 + return i + def int_to_hex3(i): - if(i < 0): - return "%03X" % (i + 4096) - else: - return "%03X" % i + if(i < 0): + return "%03X" % (i + 4096) + else: + return "%03X" % i + def int_to_hex4(i): - if(i < 0): - return "%04X" % (i + 65536) - else: - return "%04X" % i + if(i < 0): + return "%04X" % (i + 65536) + else: + return "%04X" % i + def limit(i, l, h): - if(i > h): - i = h - if(i < l): - i = l - return i + if(i > h): + i = h + if(i < l): + i = l + return i + def usage(): - print "TODO: Help" + print "TODO: Help" 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: - # print help information and exit: - print str(err) # will print something like "option -a not recognized" - usage() - sys.exit(2) + # print help information and exit: + print str(err) # will print something like "option -a not recognized" + usage() + sys.exit(2) path = "../world/" output = "map.png" @@ -114,68 +122,72 @@ sector_zmin = -1500 / 16 sector_zmax = 1500 / 16 for o, a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() - elif o in ("-i", "--input"): - path = a - elif o in ("-o", "--output"): - output = a - elif o == "--bgcolor": - bgcolor = ImageColor.getrgb(a) - elif o == "--scalecolor": - scalecolor = ImageColor.getrgb(a) - elif o == "--playercolor": - playercolor = ImageColor.getrgb(a) - elif o == "--origincolor": - origincolor = ImageColor.getrgb(a) - elif o == "--drawscale": - drawscale = True - border = 40 - elif o == "--drawplayers": - drawplayers = True - elif o == "--draworigin": - draworigin = True - else: - assert False, "unhandled option" - -if path[-1:]!="/" and path[-1:]!="\\": - path = path + "/" + if o in ("-h", "--help"): + usage() + sys.exit() + elif o in ("-i", "--input"): + path = a + elif o in ("-o", "--output"): + output = a + elif o == "--bgcolor": + bgcolor = ImageColor.getrgb(a) + elif o == "--scalecolor": + scalecolor = ImageColor.getrgb(a) + elif o == "--playercolor": + playercolor = ImageColor.getrgb(a) + elif o == "--origincolor": + origincolor = ImageColor.getrgb(a) + elif o == "--drawscale": + drawscale = True + border = 40 + elif o == "--drawplayers": + drawplayers = True + elif o == "--draworigin": + draworigin = True + else: + assert False, "unhandled option" + +if path[-1:] != "/" and path[-1:] != "\\": + path = path + "/" # Load color information for the blocks. colors = {} f = file("colors.txt") for line in f: - values = string.split(line) - colors[int(values[0], 16)] = (int(values[1]), int(values[2]), int(values[3])) + values = string.split(line) + colors[int(values[0], 16)] = ( + int(values[1]), + int(values[2]), + int(values[3])) f.close() xlist = [] 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"): - for filename in os.listdir(path + "sectors2"): - for filename2 in os.listdir(path + "sectors2/" + filename): - x = hex_to_int(filename) - z = hex_to_int(filename2) - if x < sector_xmin or x > sector_xmax: - continue - if z < sector_zmin or z > sector_zmax: - continue - xlist.append(x) - zlist.append(z) + for filename in os.listdir(path + "sectors2"): + for filename2 in os.listdir(path + "sectors2/" + filename): + x = hex_to_int(filename) + z = hex_to_int(filename2) + if x < sector_xmin or x > sector_xmax: + continue + if z < sector_zmin or z > sector_zmax: + continue + xlist.append(x) + zlist.append(z) if os.path.exists(path + "sectors"): - for filename in os.listdir(path + "sectors"): - x = hex4_to_int(filename[:4]) - z = hex4_to_int(filename[-4:]) - if x < sector_xmin or x > sector_xmax: - continue - if z < sector_zmin or z > sector_zmax: - continue - xlist.append(x) - zlist.append(z) + for filename in os.listdir(path + "sectors"): + x = hex4_to_int(filename[:4]) + z = hex4_to_int(filename[-4:]) + if x < sector_xmin or x > sector_xmax: + continue + if z < sector_zmin or z > sector_zmax: + continue + xlist.append(x) + zlist.append(z) minx = min(xlist) minz = min(zlist) @@ -185,7 +197,7 @@ maxz = max(zlist) w = (maxx - minx) * 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) draw = ImageDraw.Draw(im) @@ -195,271 +207,290 @@ stuff = {} starttime = time.time() + def data_is_air(d): - return d in [126, 127, 254] + return d in [126, 127, 254] + def read_blocknum(mapdata, version, datapos): - if version == 20: - if mapdata[datapos] < 0x80: - return mapdata[datapos] - else: - return (mapdata[datapos] << 4) | (mapdata[datapos + 0x2000] >> 4) - elif 16 <= version < 20: - return TRANSLATION_TABLE.get(mapdata[datapos], mapdata[datapos]) - else: - raise Exception("Unsupported map format: " + str(version)) + if version == 20: + if mapdata[datapos] < 0x80: + return mapdata[datapos] + else: + return (mapdata[datapos] << 4) | (mapdata[datapos + 0x2000] >> 4) + elif 16 <= version < 20: + return TRANSLATION_TABLE.get(mapdata[datapos], mapdata[datapos]) + else: + raise Exception("Unsupported map format: " + str(version)) + def read_mapdata(f, version, pixellist, water): - global stuff # oh my :-) - - dec_o = zlib.decompressobj() - try: - mapdata = array.array("B", dec_o.decompress(f.read())) - except: - mapdata = [] - - f.close() - - if(len(mapdata) < 4096): - print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + str(len(mapdata)) - else: - chunkxpos = xpos * 16 - chunkypos = ypos * 16 - chunkzpos = zpos * 16 - blocknum = 0 - datapos = 0 - for (x, z) in reversed(pixellist): - for y in reversed(range(16)): - datapos = x + y * 16 + z * 256 - blocknum = read_blocknum(mapdata, version, datapos) - if not data_is_air(blocknum) and blocknum in colors: - if blocknum in CONTENT_WATER: - water[(x, z)] += 1 - # Add dummy stuff for drawing sea without seabed - stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)]) - else: - pixellist.remove((x, z)) - # Memorize information on the type and height of the block and for drawing the picture. - stuff[(chunkxpos + x, chunkzpos + z)] = (chunkypos + y, blocknum, water[(x, z)]) - break - 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) + global stuff # oh my :-) + + dec_o = zlib.decompressobj() + try: + mapdata = array.array("B", dec_o.decompress(f.read())) + except: + mapdata = [] + + f.close() + + if(len(mapdata) < 4096): + print "bad: " + xhex + "/" + zhex + "/" + yhex + " " + \ + str(len(mapdata)) + else: + chunkxpos = xpos * 16 + chunkypos = ypos * 16 + chunkzpos = zpos * 16 + blocknum = 0 + datapos = 0 + for (x, z) in reversed(pixellist): + for y in reversed(range(16)): + datapos = x + y * 16 + z * 256 + blocknum = read_blocknum(mapdata, version, datapos) + if not data_is_air(blocknum) and blocknum in colors: + if blocknum in CONTENT_WATER: + water[(x, z)] += 1 + # Add dummy stuff for drawing sea without seabed + stuff[(chunkxpos + x, chunkzpos + z)] = ( + chunkypos + y, blocknum, water[(x, z)]) + else: + pixellist.remove((x, z)) + # Memorize information on the type and height of + # the block and for drawing the picture. + stuff[(chunkxpos + x, chunkzpos + z)] = ( + chunkypos + y, blocknum, water[(x, z)]) + break + 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) # Go through all sectors. for n in range(len(xlist)): - #if n > 500: - # break - if n % 200 == 0: - nowtime = time.time() - dtime = nowtime - starttime - try: - n_per_second = 1.0 * n / dtime - except ZeroDivisionError: - n_per_second = 0 - if n_per_second != 0: - seconds_per_n = 1.0 / n_per_second - time_guess = seconds_per_n * len(xlist) - remaining_s = time_guess - dtime - remaining_minutes = int(remaining_s / 60) - remaining_s -= remaining_minutes * 60; - print("Processing sector "+str(n)+" of "+str(len(xlist)) - +" ("+str(round(100.0*n/len(xlist), 1))+"%)" - +" (ETA: "+str(remaining_minutes)+"m " - +str(int(remaining_s))+"s)") - - xpos = xlist[n] - zpos = zlist[n] - - xhex = int_to_hex3(xpos) - zhex = int_to_hex3(zpos) - xhex4 = int_to_hex4(xpos) - zhex4 = int_to_hex4(zpos) - - sector1 = xhex4.lower() + zhex4.lower() - sector2 = xhex.lower() + "/" + zhex.lower() - - ylist = [] - - sectortype = "" - - try: - for filename in os.listdir(path + "sectors/" + sector1): - if(filename != "meta"): - pos = int(filename, 16) - if(pos > 32767): - pos -= 65536 - ylist.append(pos) - sectortype = "old" - except OSError: - pass - - if sectortype != "old": - try: - for filename in os.listdir(path + "sectors2/" + sector2): - if(filename != "meta"): - pos = int(filename, 16) - if(pos > 32767): - pos -= 65536 - ylist.append(pos) - sectortype = "new" - except OSError: - pass - - if sectortype == "": - continue - - ylist.sort() - - - # Make a list of pixels of the sector that are to be looked for. - pixellist = [] - water = {} - for x in range(16): - for z in range(16): - pixellist.append((x, z)) - water[(x, z)] = 0 - - # Go through the Y axis from top to bottom. - ylist2=[] - for ypos in reversed(ylist): - - yhex = int_to_hex4(ypos) - - filename = "" - if sectortype == "old": - filename = path + "sectors/" + sector1 + "/" + yhex.lower() - else: - filename = path + "sectors2/" + sector2 + "/" + yhex.lower() - - f = file(filename, "rb") - - # Let's just memorize these even though it's not really necessary. - version = ord(f.read(1)) - flags = f.read(1) - - # Checking day and night differs -flag - if not ord(flags) & 2: - ylist2.append((ypos,filename)) - f.close() - continue - - 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. - if(len(pixellist) == 0): - break - - if len(pixellist) > 0: - for (ypos, filename) in ylist2: - f = file(filename, "rb") - - version = ord(f.read(1)) - flags = f.read(1) - - 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. - if(len(pixellist) == 0): - break + #if n > 500: + # break + if n % 200 == 0: + nowtime = time.time() + dtime = nowtime - starttime + try: + n_per_second = 1.0 * n / dtime + except ZeroDivisionError: + n_per_second = 0 + if n_per_second != 0: + seconds_per_n = 1.0 / n_per_second + time_guess = seconds_per_n * len(xlist) + remaining_s = time_guess - dtime + remaining_minutes = int(remaining_s / 60) + remaining_s -= remaining_minutes * 60 + print("Processing sector " + str(n) + " of " + str(len(xlist)) + + " (" + str(round(100.0 * n / len(xlist), 1)) + "%)" + + " (ETA: " + str(remaining_minutes) + "m " + + str(int(remaining_s)) + "s)") + + xpos = xlist[n] + zpos = zlist[n] + + xhex = int_to_hex3(xpos) + zhex = int_to_hex3(zpos) + xhex4 = int_to_hex4(xpos) + zhex4 = int_to_hex4(zpos) + + sector1 = xhex4.lower() + zhex4.lower() + sector2 = xhex.lower() + "/" + zhex.lower() + + ylist = [] + + sectortype = "" + + try: + for filename in os.listdir(path + "sectors/" + sector1): + if(filename != "meta"): + pos = int(filename, 16) + if(pos > 32767): + pos -= 65536 + ylist.append(pos) + sectortype = "old" + except OSError: + pass + + if sectortype != "old": + try: + for filename in os.listdir(path + "sectors2/" + sector2): + if(filename != "meta"): + pos = int(filename, 16) + if(pos > 32767): + pos -= 65536 + ylist.append(pos) + sectortype = "new" + except OSError: + pass + + if sectortype == "": + continue + + ylist.sort() + + # Make a list of pixels of the sector that are to be looked for. + pixellist = [] + water = {} + for x in range(16): + for z in range(16): + pixellist.append((x, z)) + water[(x, z)] = 0 + + # Go through the Y axis from top to bottom. + ylist2 = [] + for ypos in reversed(ylist): + + yhex = int_to_hex4(ypos) + + filename = "" + if sectortype == "old": + filename = path + "sectors/" + sector1 + "/" + yhex.lower() + else: + filename = path + "sectors2/" + sector2 + "/" + yhex.lower() + + f = file(filename, "rb") + + # Let's just memorize these even though it's not really necessary. + version = ord(f.read(1)) + flags = f.read(1) + + # Checking day and night differs -flag + if not ord(flags) & 2: + ylist2.append((ypos, filename)) + f.close() + continue + + 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. + if(len(pixellist) == 0): + break + + if len(pixellist) > 0: + for (ypos, filename) in ylist2: + f = file(filename, "rb") + + version = ord(f.read(1)) + flags = f.read(1) + + 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. + if(len(pixellist) == 0): + break print "Drawing image" # Drawing the picture starttime = time.time() n = 0 for (x, z) in stuff.iterkeys(): - if n % 500000 == 0: - nowtime = time.time() - dtime = nowtime - starttime - try: - n_per_second = 1.0 * n / dtime - except ZeroDivisionError: - n_per_second = 0 - if n_per_second != 0: - listlen = len(stuff) - seconds_per_n = 1.0 / n_per_second - time_guess = seconds_per_n * listlen - remaining_s = time_guess - dtime - remaining_minutes = int(remaining_s / 60) - remaining_s -= remaining_minutes * 60; - print("Drawing pixel "+str(n)+" of "+str(listlen) - +" ("+str(round(100.0*n/listlen, 1))+"%)" - +" (ETA: "+str(remaining_minutes)+"m " - +str(int(remaining_s))+"s)") - n += 1 - - (r, g, b) = colors[stuff[(x,z)][1]] - # Comparing heights of a couple of adjacent blocks and changing brightness accordingly. - try: - c1 = stuff[(x - 1, z)][1] - c2 = stuff[(x, z + 1)][1] - c = stuff[(x, z)][1] - if c1 not in CONTENT_WATER and c2 not in CONTENT_WATER and c not in CONTENT_WATER: - y1 = stuff[(x - 1, z)][0] - y2 = stuff[(x, z + 1)][0] - y = stuff[(x, z)][0] - - d = ((y - y1) + (y - y2)) * 12 - else: - d = 0 - - if(d > 36): - d = 36 - - r = limit(r + d, 0, 255) - g = limit(g + d, 0, 255) - b = limit(b + d, 0, 255) - except: - pass - - # Water - if(stuff[(x,z)][2] > 0): - r=int(r * .15 + colors[2][0] * .85) - g=int(g * .15 + colors[2][1] * .85) - b=int(b * .15 + colors[2][2] * .85) - - impix[x - minx * 16 + border, h - 1 - (z - minz * 16) + border] = (r, g, b) + if n % 500000 == 0: + nowtime = time.time() + dtime = nowtime - starttime + try: + n_per_second = 1.0 * n / dtime + except ZeroDivisionError: + n_per_second = 0 + if n_per_second != 0: + listlen = len(stuff) + seconds_per_n = 1.0 / n_per_second + time_guess = seconds_per_n * listlen + remaining_s = time_guess - dtime + remaining_minutes = int(remaining_s / 60) + remaining_s -= remaining_minutes * 60 + print("Drawing pixel " + str(n) + " of " + str(listlen) + + " (" + str(round(100.0 * n / listlen, 1)) + "%)" + + " (ETA: " + str(remaining_minutes) + "m " + + str(int(remaining_s)) + "s)") + n += 1 + + (r, g, b) = colors[stuff[(x, z)][1]] + # Comparing heights of a couple of adjacent blocks and changing + # brightness accordingly. + try: + c1 = stuff[(x - 1, z)][1] + c2 = stuff[(x, z + 1)][1] + c = stuff[(x, z)][1] + if c1 not in CONTENT_WATER and c2 not in CONTENT_WATER and \ + c not in CONTENT_WATER: + y1 = stuff[(x - 1, z)][0] + y2 = stuff[(x, z + 1)][0] + y = stuff[(x, z)][0] + + d = ((y - y1) + (y - y2)) * 12 + else: + d = 0 + + if(d > 36): + d = 36 + + r = limit(r + d, 0, 255) + g = limit(g + d, 0, 255) + b = limit(b + d, 0, 255) + except: + pass + + # Water + if(stuff[(x, z)][2] > 0): + r = int(r * .15 + colors[2][0] * .85) + g = int(g * .15 + colors[2][1] * .85) + b = int(b * .15 + colors[2][2] * .85) + + impix[x - minx * 16 + border, h - 1 - (z - minz * 16) + border] = (r, g, b) 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() if drawscale: - draw.text((24, 0), "X", font = font, fill = scalecolor) - draw.text((2, 24), "Z", font = font, fill = scalecolor) + draw.text((24, 0), "X", font=font, fill=scalecolor) + draw.text((2, 24), "Z", font=font, fill=scalecolor) - 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.line((minx * -16 + n * 16 + border, 0, minx * -16 + n * 16 + border, border - 1), fill = scalecolor) + 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.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): - draw.text((2, h - 1 - (n * 16 - minz * 16) + border), str(n * 16), 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) + 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.line((0, h - 1 - (n * 16 - minz * 16) + border, border - 1, + h - 1 - (n * 16 - minz * 16) + border), fill=scalecolor) if drawplayers: - try: - for filename in os.listdir(path + "players"): - f = file(path + "players/" + filename) - lines = f.readlines() - name="" - position=[] - for line in lines: - p = string.split(line) - if p[0] == "name": - name = p[2] - print filename + ": name = " + name - if p[0] == "position": - position = string.split(p[2][1:-1], ",") - print filename + ": position = " + p[2] - if len(name) > 0 and len(position) == 3: - x=(int(float(position[0]) / 10 - minx * 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.text((x + 2 + border, z + 2 + border), name, font = font, fill = playercolor) - f.close() - except OSError: - pass + try: + for filename in os.listdir(path + "players"): + f = file(path + "players/" + filename) + lines = f.readlines() + name = "" + position = [] + for line in lines: + p = string.split(line) + if p[0] == "name": + name = p[2] + print filename + ": name = " + name + if p[0] == "position": + position = string.split(p[2][1:-1], ",") + print filename + ": position = " + p[2] + if len(name) > 0 and len(position) == 3: + x = (int(float(position[0]) / 10 - minx * 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.text((x + 2 + border, z + 2 + border), name, + font=font, fill=playercolor) + f.close() + except OSError: + pass print "Saving" im.save(output) -- cgit v1.2.3 From 75816150ec3f95a3d0f60f3b70d281e5d83c584c Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sat, 30 Jul 2011 21:12:49 +0200 Subject: * honor environment variables, use utf-8 --- util/minetestmapper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'util') diff --git a/util/minetestmapper.py b/util/minetestmapper.py index 5b175512c..cf2a5776d 100755 --- a/util/minetestmapper.py +++ b/util/minetestmapper.py @@ -1,5 +1,5 @@ -#!/usr/bin/python2 -# -*- coding: windows-1252 -*- +#!/usr/bin/env python +# -*- coding: utf-8 -*- # This program is free software. It comes without any warranty, to # the extent permitted by applicable law. You can redistribute it -- cgit v1.2.3 From 0fb208e63c18c74d32e53651820e02f41aaad76c Mon Sep 17 00:00:00 2001 From: Constantin Wenger Date: Tue, 2 Aug 2011 12:38:47 +0200 Subject: updated po update script to detect wgettext and N_ --- util/updatepo.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'util') diff --git a/util/updatepo.sh b/util/updatepo.sh index bcfa4c4de..fbf1aad00 100755 --- a/util/updatepo.sh +++ b/util/updatepo.sh @@ -48,7 +48,7 @@ cd .. # directory at the top level. You a recent enough xgettext that supports # --package-name potfile=po/minetest.pot -xgettext --package-name=minetest -F -n -o $potfile src/*.cpp src/*.h +xgettext --package-name=minetest -kN_ -kwgettext -F -n -o $potfile src/*.cpp src/*.h # Now iterate on all languages and create the po file if missing, or update it # if it exists already -- cgit v1.2.3 From dd9909a574514f59eb527db682a4e8d85350ead9 Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Wed, 3 Aug 2011 08:37:56 +0200 Subject: minetestmapper can be run from any directory If it doesn't find colors.txt locally, it looks for the one in the directory of the script itself. --- util/minetestmapper.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'util') diff --git a/util/minetestmapper.py b/util/minetestmapper.py index cf2a5776d..e13a1bdc3 100755 --- a/util/minetestmapper.py +++ b/util/minetestmapper.py @@ -152,7 +152,10 @@ if path[-1:] != "/" and path[-1:] != "\\": # Load color information for the blocks. colors = {} -f = file("colors.txt") +try: + f = file("colors.txt") +except IOError: + f = file(os.path.join(os.path.dirname(__file__), "colors.txt")) for line in f: values = string.split(line) colors[int(values[0], 16)] = ( -- cgit v1.2.3