Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PIL import Image, ImageDraw, ImageFont
- import math
- import os
- import errno
- import re
- def readFile(drawHidden,showTraps,showClones,showInfo,fileName,tileset,tD,tilesetType,imageDimension):
- f = open(fileName,"rb")
- tws = open("CCLP1-MS.tws","rb")
- c = tws.read(4)
- if bytearray(c) != b'\x35\x33\x9B\x99':
- print "TWS exists, but is not valid"
- ruleset = "MS"
- if tws.read(1) == 1:
- ruleset = "Lynx"
- tws.seek(2,1)
- c = ord(tws.read(1)) #Should be 0, but reads bit in case TWS header is later expanded
- tws.seek(c,1)
- c = ord(tws.read(1)) + ord(tws.read(1))*256 + ord(tws.read(1))*256**2 + ord(tws.read(1))*256**3 #Skips past optional header
- tws.seek(c,1)
- levels = 0
- path = fileName[:-4] + "/"
- try:
- os.makedirs(path)
- except OSError as exception:
- if exception.errno != errno.EEXIST:
- print "Cannot create directory for set"
- raise
- c = f.read(4)
- if bytearray(c) != b'\xAC\xAA\x02\x00':
- print "File exists, but is not a valid CC data file."
- return
- levels = ord(f.read(1)) + ord(f.read(1))*256
- levelCounter = 1
- bestTimes = [-1] * levels
- twsPasswords = [None] * levels
- twsLevelCounter = levels
- while True:
- if twsLevelCounter == 0:
- break
- twsBytes = ord(tws.read(1)) + ord(tws.read(1))*256 + ord(tws.read(1))*256**2 + ord(tws.read(1))*256**3
- if twsBytes == 6:
- tws.seek(6,1)
- if twsBytes == 4294967295:
- break
- else:
- twsLevel = ord(tws.read(1)) + ord(tws.read(1))*256
- twsPasswords[twsLevel-1] = tws.read(1) + tws.read(1) + tws.read(1) + tws.read(1)
- tws.seek(6,1)
- bestTimes[twsLevel-1] = ord(tws.read(1)) + ord(tws.read(1))*256 + ord(tws.read(1))*256**2 + ord(tws.read(1))*256**3
- tws.seek(twsBytes-16,1)
- twsLevelCounter -= 1
- print twsPasswords
- print bestTimes
- while levelCounter <= levels:
- exportMap = Image.new("RGBA",(tD*32,tD*32+112),"black")
- bytesInLevel = ord(f.read(1)) + ord(f.read(1))*256
- levelNumber = ord(f.read(1)) + ord(f.read(1))*256
- levelTime = ord(f.read(1)) + ord(f.read(1))*256
- chipCount = ord(f.read(1)) + ord(f.read(1))*256
- f.seek(2,1) #Skip map detail
- topLayer = [0] * 1024
- bottomLayer = [0] * 1024
- topLayerBytes = ord(f.read(1)) + ord(f.read(1))*256
- tileCounter = 0
- while True:
- nextTile = ord(f.read(1))
- topLayerBytes -= 1
- if nextTile == 255:
- repeat = ord(f.read(1))
- repeatTile = ord(f.read(1))
- topLayerBytes -= 2
- else:
- repeat = 1
- repeatTile = nextTile
- while repeat > 0:
- repeat -= 1
- topLayer[tileCounter] = repeatTile
- tileCounter += 1
- if tileCounter == 1024:
- if topLayerBytes == 0:
- break
- else:
- print "Ayyy this shit is fucked"
- bottomLayerBytes = ord(f.read(1)) + ord(f.read(1))*256
- bottomLayerBytesConst = bottomLayerBytes
- tileCounter = 0
- while True:
- nextTile = ord(f.read(1))
- bottomLayerBytes -= 1
- if nextTile == 255:
- repeat = ord(f.read(1))
- repeatTile = ord(f.read(1))
- bottomLayerBytes -= 2
- else:
- repeat = 1
- repeatTile = nextTile
- while repeat > 0:
- repeat -= 1
- bottomLayer[tileCounter] = repeatTile
- tileCounter += 1
- if tileCounter == 1024:
- if bottomLayerBytes == 0:
- break
- else:
- print "Ayyy this shit is fucked"
- for x in range(1024):
- if bottomLayer[x] != 0:
- if topLayer[x]//16 >= 3:
- if bottomLayer[x]//16 >= 3:
- region = tileset.crop((0,0,tD,tD))
- exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
- region = tileset.crop(((bottomLayer[x]//16)*tD,(bottomLayer[x] % 16)*tD,(bottomLayer[x]//16)*tD + tD,(bottomLayer[x] % 16)*tD + tD))
- exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
- elif drawHidden == True:
- region = tileset.crop(((topLayer[x]//16)*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + tD,(topLayer[x] % 16)*tD + tD))
- exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
- if bottomLayer[x]//16 >= 3:
- region = tileset.crop((tD//4,tD//4,3*tD//4,3*tD//4))
- exportMap.paste(region,((x%32)*tD+tD//4,(x//32)*tD+tD//4,(x%32)*tD+3*tD//4,(x//32)*tD+3*tD//4),region)
- region = tileset.crop(((bottomLayer[x]//16)*tD+tD//4,(bottomLayer[x] % 16)*tD+tD//4,(bottomLayer[x]//16)*tD + 3*tD//4,(bottomLayer[x] % 16)*tD + 3*tD//4))
- exportMap.paste(region,((x%32)*tD+tD//4,(x//32)*tD+tD//4,(x%32)*tD+3*tD//4,(x//32)*tD+3*tD//4),region)
- continue
- if tilesetType == 1:
- if topLayer[x]//16 >= 3 and bottomLayer[x] == 0:
- region = tileset.crop((0,0,tD,tD))
- exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
- region = tileset.crop(((topLayer[x]//16)*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + tD,(topLayer[x] % 16)*tD + tD))
- exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
- if tilesetType == 2:
- if topLayer[x]//16 >= 3 and bottomLayer[x] != 0:
- region = tileset.crop(((topLayer[x]//16)*tD+3*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + 4*tD,(topLayer[x] % 16)*tD + tD))
- exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
- else:
- region = tileset.crop(((topLayer[x]//16)*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + tD,(topLayer[x] % 16)*tD + tD))
- exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
- extraBytes = ord(f.read(1)) + ord(f.read(1))*256
- hint = ""
- while extraBytes != 0:
- c = ord(f.read(1))
- if c == 1:
- f.seek(3,1) #Ignore level time field
- extraBytes -= 4
- if c == 2:
- f.seek(3,1) #Ignore chip count field
- extraBytes -= 4
- if c == 3:
- titleLength = ord(f.read(1))
- title = f.read(titleLength)[:-1]
- extraBytes -= (2 + titleLength)
- if c == 4:
- trapLength = ord(f.read(1))
- extraBytes -= (2 + trapLength)
- if showTraps == False:
- f.seek(trapLength,1)
- else:
- while trapLength != 0:
- draw = ImageDraw.Draw(exportMap)
- x1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- y1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- x2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- y2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- f.seek(2,1)
- draw.line([(x1,y1),(x2,y2)],width=1,fill="#ff0000")
- trapLength -= 10
- if c == 5:
- cloneLength = ord(f.read(1))
- extraBytes -= (2 + cloneLength)
- if showClones == False:
- f.seek(cloneLength,1)
- else:
- while cloneLength != 0:
- draw = ImageDraw.Draw(exportMap)
- x1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- y1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- x2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- y2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
- draw.line([(x1,y1),(x2,y2)],width=1,fill="#ff0000")
- cloneLength -= 8
- if c == 6:
- passwordLength = ord(f.read(1))
- password = ""
- i = 0
- while i < passwordLength:
- password += chr(ord(f.read(1))^0x99)
- i+=1
- extraBytes -= (2 + passwordLength)
- if c == 7:
- hintLength = ord(f.read(1))
- hint = f.read(hintLength)[:-1]
- extraBytes -= (2 + hintLength)
- if c == 8:
- passwordLength = ord(f.read(1))
- extraBytes -= (2 + passwordLength)
- if c == 9:
- unknownLength = ord(f.read(1))
- f.seek(unknownLength,1)
- extraBytes -= (2 + unknownLength)
- if c == 10:
- monsterLength = ord(f.read(1))
- f.seek(monsterLength,1)
- extraBytes -= (2 + monsterLength)
- if showInfo == True:
- draw = ImageDraw.Draw(exportMap)
- draw.text((0,0), str(levelNumber) + ". ", font=boldFont)
- draw.text((draw.textsize(str(levelNumber) + ". ",font=boldFont)[0],0),title,font=normalFont)
- draw.text((0,16),"Password: ", font=boldFont)
- draw.text((draw.textsize("Password: ",font=boldFont)[0],16),password,font=normalFont)
- draw.text((0,32),"Time: ", font=boldFont)
- draw.text((draw.textsize("Time: ",font=boldFont)[0],32),str(levelTime),font=normalFont)
- if password[:-1] == twsPasswords[levelNumber - 1]:
- draw.text((0,48),"Best time: ", font=boldFont)
- if bestTimes[levelNumber - 1] == -1:
- draw.text((draw.textsize("Best time: ",font=boldFont)[0],32),"---",font=normalFont)
- else:
- bestTimeText = str(int(math.ceil(999 - bestTimes[levelNumber-1]/20)))
- if levelTime == 0:
- draw.text((draw.textsize("Best time: ",font=normalFont)[0],48),"(" + bestTimeText + ")",font=normalFont)
- else:
- draw.text((draw.textsize("Best time: ",font=normalFont)[0],48),bestTimeText,font=normalFont)
- draw.text((0,64),"Chips: ", font=boldFont)
- draw.text((draw.textsize("Chips: ",font=boldFont)[0],64),str(chipCount),font=normalFont)
- if hint != "":
- draw.text((0,80),"Hint: ", font=boldFont)
- hintLabelSize = draw.textsize("Hint: ",font=boldFont)[0]
- if (draw.textsize(hint,font=normalFont)[0] + hintLabelSize < tD*32 and imageDimension == -1) or (draw.textsize(hint,font=normalFont)[0] + hintLabelSize < 1024 and imageDimension >= 1024):
- draw.text((draw.textsize("Hint: ",font=boldFont)[0],80),hint,font=normalFont)
- else:
- exportMap = exportMap.crop((0,0,tD*32,tD*32))
- if imageDimension != -1:
- exportMap = exportMap.resize((imageDimension,imageDimension))
- title = re.sub(r'([^\s\w]|_)+', '', title)
- exportMap.save(path + str(levelCounter) + " - " + title + ".png")
- print title + " map has been saved!"
- levelCounter += 1
- print fileName + " processed successfully."
- f.close()
- while True:
- fileName = raw_input("Type level set filename, or enter nothing for entire directory: ")
- try:
- openFile = open(fileName,"rb")
- break
- except IOError:
- if fileName == "":
- break
- print "Invalid filename"
- while True:
- tilesetName = raw_input("Type tileset filename: ")
- try:
- tileset = Image.open(tilesetName)
- except IOError:
- print "Invalid filename"
- else:
- if tileset.size[1] % 16 != 0:
- print "Invalid tileset dimensions"
- continue
- tD = tileset.size[1]//16
- if tileset.size[0] == tD*7:
- tileset = tileset.convert("RGBA")
- tilesetType = 1
- break
- elif tileset.size[0] == tD*13:
- tileset = tileset.convert("RGBA")
- tilesetType = 2
- break
- else:
- print "Invalid tileset dimensions"
- continue
- while True:
- tilesetMoreName = raw_input("Type extended tileset filename, or enter nothing if extended tileset does not exist (will disable blue wall and invisible wall options): ")
- try:
- tilesetMore = Image.open(tilesetMoreName)
- except IOError:
- if tilesetMoreName == "":
- break
- print "Invalid filename"
- else:
- if tilesetMore.size[0] != tD or tilesetMore.size[1] != tD*4:
- print "Invalid tileset dimensions"
- continue
- tilesetMore = tilesetMore.convert("RGBA")
- break
- if tilesetType == 1:
- pixdata = tileset.load()
- bottomRight = pixdata[tileset.size[0]-1,tileset.size[0]-1]
- for y in range(16*tD):
- for x in range(4*tD,7*tD):
- if pixdata[x, y] == bottomRight:
- pixdata[x, y] = (0, 0, 0, 0)
- if tilesetType == 2:
- pixdata = tileset.load()
- for y in range(tileset.size[1]):
- for x in range(7*tD,10*tD):
- if (pixdata[x+tD*3,y][0] + pixdata[x+tD*3,y][1] + pixdata[x+tD*3,y][2])/3 < 128:
- pixdata[x, y] = (0, 0, 0, 0)
- imageDimension = -1
- if raw_input("Use custom image dimension?: ").upper() == "Y":
- while True:
- imageDimension = raw_input("Input size in pixels. Any value less than 1024 will disable level info option: ")
- try:
- imageDimension = int(imageDimension)
- except ValueError:
- print "Input not an integer"
- else:
- if imageDimension < 32:
- print "Dimensions must be larger than 32 x 32 pixels"
- else:
- break
- trapsQ = raw_input("Show trap button connections?: ")
- clonesQ = raw_input("Show clone button connections?: ")
- blueQ = invisibleQ = "n"
- if tilesetMoreName != "":
- blueQ = raw_input("Show blue walls?: ")
- invisibleQ = raw_input("Show invisible walls?: ")
- hiddenQ = raw_input("Show hidden tiles?: ")
- showInfo = False
- if ((imageDimension == -1 and tD*32 >= 1024) or imageDimension >= 1024):
- while True:
- infoQ = raw_input("Show level info at bottom?: ")
- if infoQ.upper() != "Y":
- showInfo = False
- break
- try:
- normalFont = ImageFont.truetype("LiberationSans-Regular.ttf", 16)
- boldFont = ImageFont.truetype("LiberationSans-Bold.ttf", 16)
- except IOError:
- print "Font file not found. Make sure font.png file packaged with program is in same directory."
- else:
- showInfo = True
- break
- if hiddenQ.upper() == "Y":
- drawHidden = True
- else:
- drawHidden = False
- if trapsQ.upper() == "Y":
- showTraps = True
- else:
- showTraps = False
- if hiddenQ.upper() == "Y":
- showClones = True
- else:
- showClones = False
- if blueQ.upper() == "Y":
- region = tilesetMore.crop((0,tD*2,tD,tD*3))
- tileset.paste(region,(tD,tD*14,tD*2,tD*15))
- region = tilesetMore.crop((0,tD*3,tD,tD*4))
- tileset.paste(region,(tD,tD*15,tD*2,tD*16))
- if invisibleQ.upper() == "Y":
- region = tilesetMore.crop((0,0,tD,tD))
- tileset.paste(region,(tD*2,tD*12,tD*3,tD*13))
- region = tilesetMore.crop((0,tD,tD,tD*2))
- tileset.paste(region,(0,tD*5,tD,tD*6))
- if fileName != "":
- readFile(drawHidden, showTraps, showClones, showInfo, fileName, tileset, tD, tilesetType, imageDimension)
- else:
- files_in_dir = os.listdir(os.path.dirname(os.path.realpath(__file__)))
- print files_in_dir
- for file_in_dir in files_in_dir:
- if file_in_dir[-4:] == ".dat" or file_in_dir[-4:] == ".ccl":
- readFile(drawHidden, showTraps, showClones, showInfo, file_in_dir, tileset, tilesetMore,tD,tilesetType,imageDimension)
Advertisement
Add Comment
Please, Sign In to add comment