quiznos00

MapMaker Source

Sep 29th, 2015
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.25 KB | None | 0 0
  1. from PIL import Image, ImageDraw, ImageFont
  2. import math
  3. import os
  4. import errno
  5. import re
  6.  
  7. def readFile(drawHidden,showTraps,showClones,showInfo,fileName,tileset,tD,tilesetType,imageDimension):
  8.  
  9.     f = open(fileName,"rb")
  10.     tws = open("CCLP1-MS.tws","rb")
  11.  
  12.     c = tws.read(4)
  13.     if bytearray(c) != b'\x35\x33\x9B\x99':
  14.         print "TWS exists, but is not valid"
  15.     ruleset = "MS"
  16.     if tws.read(1) == 1:
  17.         ruleset = "Lynx"
  18.     tws.seek(2,1)
  19.     c = ord(tws.read(1)) #Should be 0, but reads bit in case TWS header is later expanded
  20.     tws.seek(c,1)
  21.     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
  22.     tws.seek(c,1)
  23.  
  24.     levels = 0
  25.     path = fileName[:-4] + "/"
  26.  
  27.     try:
  28.         os.makedirs(path)
  29.     except OSError as exception:
  30.         if exception.errno != errno.EEXIST:
  31.             print "Cannot create directory for set"
  32.             raise
  33.  
  34.     c = f.read(4)
  35.     if bytearray(c) != b'\xAC\xAA\x02\x00':
  36.         print "File exists, but is not a valid CC data file."
  37.         return
  38.  
  39.     levels = ord(f.read(1)) + ord(f.read(1))*256
  40.     levelCounter = 1
  41.     bestTimes = [-1] * levels
  42.     twsPasswords = [None] * levels
  43.     twsLevelCounter = levels
  44.  
  45.     while True:
  46.         if twsLevelCounter == 0:
  47.             break
  48.         twsBytes = ord(tws.read(1)) + ord(tws.read(1))*256 + ord(tws.read(1))*256**2 + ord(tws.read(1))*256**3
  49.         if twsBytes == 6:
  50.             tws.seek(6,1)
  51.         if twsBytes == 4294967295:
  52.             break
  53.         else:
  54.             twsLevel = ord(tws.read(1)) + ord(tws.read(1))*256
  55.             twsPasswords[twsLevel-1] = tws.read(1) + tws.read(1) + tws.read(1) + tws.read(1)
  56.             tws.seek(6,1)
  57.             bestTimes[twsLevel-1] = ord(tws.read(1)) + ord(tws.read(1))*256 + ord(tws.read(1))*256**2 + ord(tws.read(1))*256**3
  58.             tws.seek(twsBytes-16,1)
  59.         twsLevelCounter -= 1
  60.  
  61.     print twsPasswords
  62.     print bestTimes
  63.  
  64.     while levelCounter <= levels:
  65.         exportMap = Image.new("RGBA",(tD*32,tD*32+112),"black")
  66.         bytesInLevel = ord(f.read(1)) + ord(f.read(1))*256
  67.         levelNumber = ord(f.read(1)) + ord(f.read(1))*256
  68.         levelTime = ord(f.read(1)) + ord(f.read(1))*256
  69.         chipCount = ord(f.read(1)) + ord(f.read(1))*256
  70.  
  71.         f.seek(2,1) #Skip map detail
  72.  
  73.         topLayer = [0] * 1024
  74.         bottomLayer = [0] * 1024
  75.         topLayerBytes = ord(f.read(1)) + ord(f.read(1))*256
  76.         tileCounter = 0
  77.         while True:
  78.             nextTile = ord(f.read(1))
  79.             topLayerBytes -= 1
  80.             if nextTile == 255:
  81.                 repeat = ord(f.read(1))
  82.                 repeatTile = ord(f.read(1))
  83.                 topLayerBytes -= 2
  84.             else:
  85.                 repeat = 1
  86.                 repeatTile = nextTile
  87.             while repeat > 0:
  88.                 repeat -= 1
  89.                 topLayer[tileCounter] = repeatTile
  90.                 tileCounter += 1
  91.             if tileCounter == 1024:
  92.                 if topLayerBytes == 0:
  93.                     break
  94.                 else:
  95.                     print "Ayyy this shit is fucked"
  96.  
  97.         bottomLayerBytes = ord(f.read(1)) + ord(f.read(1))*256
  98.         bottomLayerBytesConst = bottomLayerBytes
  99.         tileCounter = 0
  100.         while True:
  101.             nextTile = ord(f.read(1))
  102.             bottomLayerBytes -= 1
  103.             if nextTile == 255:
  104.                 repeat = ord(f.read(1))
  105.                 repeatTile = ord(f.read(1))
  106.                 bottomLayerBytes -= 2
  107.             else:
  108.                 repeat = 1
  109.                 repeatTile = nextTile
  110.             while repeat > 0:
  111.                 repeat -= 1
  112.                 bottomLayer[tileCounter] = repeatTile
  113.                 tileCounter += 1
  114.             if tileCounter == 1024:
  115.                 if bottomLayerBytes == 0:
  116.                     break
  117.                 else:
  118.                     print "Ayyy this shit is fucked"
  119.  
  120.         for x in range(1024):
  121.             if bottomLayer[x] != 0:
  122.                 if topLayer[x]//16 >= 3:
  123.                     if bottomLayer[x]//16 >= 3:
  124.                         region = tileset.crop((0,0,tD,tD))
  125.                         exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
  126.                     region = tileset.crop(((bottomLayer[x]//16)*tD,(bottomLayer[x] % 16)*tD,(bottomLayer[x]//16)*tD + tD,(bottomLayer[x] % 16)*tD + tD))
  127.                     exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
  128.                 elif drawHidden == True:
  129.                     region = tileset.crop(((topLayer[x]//16)*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + tD,(topLayer[x] % 16)*tD + tD))
  130.                     exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
  131.                     if bottomLayer[x]//16 >= 3:
  132.                         region = tileset.crop((tD//4,tD//4,3*tD//4,3*tD//4))
  133.                         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)
  134.                     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))
  135.                     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)
  136.                     continue
  137.             if tilesetType == 1:
  138.                 if topLayer[x]//16 >= 3 and bottomLayer[x] == 0:
  139.                     region = tileset.crop((0,0,tD,tD))
  140.                     exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
  141.                 region = tileset.crop(((topLayer[x]//16)*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + tD,(topLayer[x] % 16)*tD + tD))
  142.                 exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
  143.             if tilesetType == 2:
  144.                 if topLayer[x]//16 >= 3 and bottomLayer[x] != 0:
  145.                     region = tileset.crop(((topLayer[x]//16)*tD+3*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + 4*tD,(topLayer[x] % 16)*tD + tD))
  146.                     exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
  147.                 else:
  148.                     region = tileset.crop(((topLayer[x]//16)*tD,(topLayer[x] % 16)*tD,(topLayer[x]//16)*tD + tD,(topLayer[x] % 16)*tD + tD))
  149.                     exportMap.paste(region,((x%32)*tD,(x//32)*tD,(x%32)*tD+tD,(x//32)*tD+tD),region)
  150.  
  151.  
  152.         extraBytes = ord(f.read(1)) + ord(f.read(1))*256
  153.         hint = ""
  154.  
  155.         while extraBytes != 0:
  156.             c = ord(f.read(1))
  157.             if c == 1:
  158.                 f.seek(3,1) #Ignore level time field
  159.                 extraBytes -= 4
  160.             if c == 2:
  161.                 f.seek(3,1) #Ignore chip count field
  162.                 extraBytes -= 4
  163.             if c == 3:
  164.                 titleLength = ord(f.read(1))
  165.                 title = f.read(titleLength)[:-1]
  166.                 extraBytes -= (2 + titleLength)
  167.             if c == 4:
  168.                 trapLength = ord(f.read(1))
  169.                 extraBytes -= (2 + trapLength)
  170.                 if showTraps == False:
  171.                     f.seek(trapLength,1)
  172.                 else:
  173.                     while trapLength != 0:
  174.                         draw = ImageDraw.Draw(exportMap)
  175.                         x1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  176.                         y1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  177.                         x2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  178.                         y2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  179.                         f.seek(2,1)
  180.                         draw.line([(x1,y1),(x2,y2)],width=1,fill="#ff0000")
  181.                         trapLength -= 10
  182.             if c == 5:
  183.                 cloneLength = ord(f.read(1))
  184.                 extraBytes -= (2 + cloneLength)
  185.                 if showClones == False:
  186.                     f.seek(cloneLength,1)
  187.                 else:
  188.                     while cloneLength != 0:
  189.                         draw = ImageDraw.Draw(exportMap)
  190.                         x1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  191.                         y1 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  192.                         x2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  193.                         y2 = (ord(f.read(1)) + ord(f.read(1))*256)*tD+tD/2
  194.                         draw.line([(x1,y1),(x2,y2)],width=1,fill="#ff0000")
  195.                         cloneLength -= 8
  196.             if c == 6:
  197.                 passwordLength = ord(f.read(1))
  198.                 password = ""
  199.                 i = 0
  200.                 while i < passwordLength:
  201.                     password += chr(ord(f.read(1))^0x99)
  202.                     i+=1
  203.                 extraBytes -= (2 + passwordLength)
  204.             if c == 7:
  205.                 hintLength = ord(f.read(1))
  206.                 hint = f.read(hintLength)[:-1]
  207.                 extraBytes -= (2 + hintLength)
  208.             if c == 8:
  209.                 passwordLength = ord(f.read(1))
  210.                 extraBytes -= (2 + passwordLength)
  211.             if c == 9:
  212.                 unknownLength = ord(f.read(1))
  213.                 f.seek(unknownLength,1)
  214.                 extraBytes -= (2 + unknownLength)
  215.             if c == 10:
  216.                 monsterLength = ord(f.read(1))
  217.                 f.seek(monsterLength,1)
  218.                 extraBytes -= (2 + monsterLength)
  219.  
  220.         if showInfo == True:
  221.             draw = ImageDraw.Draw(exportMap)
  222.             draw.text((0,0), str(levelNumber) + ". ", font=boldFont)
  223.             draw.text((draw.textsize(str(levelNumber) + ". ",font=boldFont)[0],0),title,font=normalFont)
  224.             draw.text((0,16),"Password: ", font=boldFont)
  225.             draw.text((draw.textsize("Password: ",font=boldFont)[0],16),password,font=normalFont)
  226.             draw.text((0,32),"Time: ", font=boldFont)
  227.             draw.text((draw.textsize("Time: ",font=boldFont)[0],32),str(levelTime),font=normalFont)
  228.             if password[:-1] == twsPasswords[levelNumber - 1]:
  229.                 draw.text((0,48),"Best time: ", font=boldFont)
  230.                 if bestTimes[levelNumber - 1] == -1:
  231.                     draw.text((draw.textsize("Best time: ",font=boldFont)[0],32),"---",font=normalFont)
  232.                 else:
  233.                     bestTimeText = str(int(math.ceil(999 - bestTimes[levelNumber-1]/20)))
  234.                     if levelTime == 0:
  235.                         draw.text((draw.textsize("Best time: ",font=normalFont)[0],48),"(" + bestTimeText + ")",font=normalFont)
  236.                     else:
  237.                         draw.text((draw.textsize("Best time: ",font=normalFont)[0],48),bestTimeText,font=normalFont)
  238.             draw.text((0,64),"Chips: ", font=boldFont)
  239.             draw.text((draw.textsize("Chips: ",font=boldFont)[0],64),str(chipCount),font=normalFont)
  240.             if hint != "":
  241.                 draw.text((0,80),"Hint: ", font=boldFont)
  242.                 hintLabelSize = draw.textsize("Hint: ",font=boldFont)[0]
  243.                 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):
  244.                     draw.text((draw.textsize("Hint: ",font=boldFont)[0],80),hint,font=normalFont)
  245.         else:
  246.             exportMap = exportMap.crop((0,0,tD*32,tD*32))
  247.  
  248.         if imageDimension != -1:
  249.             exportMap = exportMap.resize((imageDimension,imageDimension))
  250.  
  251.         title = re.sub(r'([^\s\w]|_)+', '', title)
  252.         exportMap.save(path + str(levelCounter) + " - " + title + ".png")
  253.         print title + " map has been saved!"
  254.         levelCounter += 1
  255.  
  256.     print fileName + " processed successfully."
  257.     f.close()
  258.  
  259. while True:
  260.     fileName = raw_input("Type level set filename, or enter nothing for entire directory: ")
  261.     try:
  262.         openFile = open(fileName,"rb")
  263.         break
  264.     except IOError:
  265.         if fileName == "":
  266.             break
  267.         print "Invalid filename"
  268.  
  269. while True:
  270.     tilesetName = raw_input("Type tileset filename: ")
  271.     try:
  272.         tileset = Image.open(tilesetName)
  273.     except IOError:
  274.         print "Invalid filename"
  275.     else:
  276.         if tileset.size[1] % 16 != 0:
  277.             print "Invalid tileset dimensions"
  278.             continue
  279.         tD = tileset.size[1]//16
  280.         if tileset.size[0] == tD*7:
  281.             tileset = tileset.convert("RGBA")
  282.             tilesetType = 1
  283.             break
  284.         elif tileset.size[0] == tD*13:
  285.             tileset = tileset.convert("RGBA")
  286.             tilesetType = 2
  287.             break
  288.         else:
  289.             print "Invalid tileset dimensions"
  290.             continue
  291.  
  292. while True:
  293.     tilesetMoreName = raw_input("Type extended tileset filename, or enter nothing if extended tileset does not exist (will disable blue wall and invisible wall options): ")
  294.     try:
  295.         tilesetMore = Image.open(tilesetMoreName)
  296.     except IOError:
  297.         if tilesetMoreName == "":
  298.             break
  299.         print "Invalid filename"
  300.     else:
  301.         if tilesetMore.size[0] != tD or tilesetMore.size[1] != tD*4:
  302.             print "Invalid tileset dimensions"
  303.             continue
  304.         tilesetMore = tilesetMore.convert("RGBA")
  305.         break
  306.  
  307. if tilesetType == 1:
  308.     pixdata = tileset.load()
  309.     bottomRight = pixdata[tileset.size[0]-1,tileset.size[0]-1]
  310.  
  311.     for y in range(16*tD):
  312.         for x in range(4*tD,7*tD):
  313.             if pixdata[x, y] == bottomRight:
  314.                 pixdata[x, y] = (0, 0, 0, 0)
  315. if tilesetType == 2:
  316.     pixdata = tileset.load()
  317.     for y in range(tileset.size[1]):
  318.         for x in range(7*tD,10*tD):
  319.             if (pixdata[x+tD*3,y][0] + pixdata[x+tD*3,y][1] + pixdata[x+tD*3,y][2])/3 < 128:
  320.                 pixdata[x, y] = (0, 0, 0, 0)
  321.  
  322. imageDimension = -1
  323. if raw_input("Use custom image dimension?: ").upper() == "Y":
  324.     while True:
  325.         imageDimension = raw_input("Input size in pixels. Any value less than 1024 will disable level info option: ")
  326.         try:
  327.             imageDimension = int(imageDimension)
  328.         except ValueError:
  329.             print "Input not an integer"
  330.         else:
  331.             if imageDimension < 32:
  332.                 print "Dimensions must be larger than 32 x 32 pixels"
  333.             else:
  334.                 break
  335.  
  336. trapsQ = raw_input("Show trap button connections?: ")
  337. clonesQ = raw_input("Show clone button connections?: ")
  338. blueQ = invisibleQ = "n"
  339. if tilesetMoreName != "":
  340.     blueQ = raw_input("Show blue walls?: ")
  341.     invisibleQ = raw_input("Show invisible walls?: ")
  342. hiddenQ = raw_input("Show hidden tiles?: ")
  343. showInfo = False
  344. if ((imageDimension == -1 and tD*32 >= 1024) or imageDimension >= 1024):
  345.     while True:
  346.         infoQ = raw_input("Show level info at bottom?: ")
  347.         if infoQ.upper() != "Y":
  348.             showInfo = False
  349.             break
  350.         try:
  351.             normalFont = ImageFont.truetype("LiberationSans-Regular.ttf", 16)
  352.             boldFont = ImageFont.truetype("LiberationSans-Bold.ttf", 16)
  353.         except IOError:
  354.             print "Font file not found. Make sure font.png file packaged with program is in same directory."
  355.         else:
  356.             showInfo = True
  357.             break
  358.  
  359. if hiddenQ.upper() == "Y":
  360.     drawHidden = True
  361. else:
  362.     drawHidden = False
  363. if trapsQ.upper() == "Y":
  364.     showTraps = True
  365. else:
  366.     showTraps = False
  367. if hiddenQ.upper() == "Y":
  368.     showClones = True
  369. else:
  370.     showClones = False
  371. if blueQ.upper() == "Y":
  372.     region = tilesetMore.crop((0,tD*2,tD,tD*3))
  373.     tileset.paste(region,(tD,tD*14,tD*2,tD*15))
  374.     region = tilesetMore.crop((0,tD*3,tD,tD*4))
  375.     tileset.paste(region,(tD,tD*15,tD*2,tD*16))
  376. if invisibleQ.upper() == "Y":
  377.     region = tilesetMore.crop((0,0,tD,tD))
  378.     tileset.paste(region,(tD*2,tD*12,tD*3,tD*13))
  379.     region = tilesetMore.crop((0,tD,tD,tD*2))
  380.     tileset.paste(region,(0,tD*5,tD,tD*6))
  381.  
  382. if fileName != "":
  383.     readFile(drawHidden, showTraps, showClones, showInfo, fileName, tileset, tD, tilesetType, imageDimension)
  384. else:
  385.     files_in_dir = os.listdir(os.path.dirname(os.path.realpath(__file__)))
  386.     print files_in_dir
  387.     for file_in_dir in files_in_dir:
  388.         if file_in_dir[-4:] == ".dat" or file_in_dir[-4:] == ".ccl":
  389.             readFile(drawHidden, showTraps, showClones, showInfo, file_in_dir, tileset, tilesetMore,tD,tilesetType,imageDimension)
Advertisement
Add Comment
Please, Sign In to add comment