Advertisement
AbsoluteGamer

TextureEditor (Splitter/Merger)

Mar 14th, 2017
4,978
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.53 KB | None | 0 0
  1. # (c) Absolute Gamer 2017
  2. # YouTube: https://www.youtube.com/c/AbsoluteGamer
  3. # Discord: Absolute Gamer#0068
  4. # Site: http://abs0lute.altervista.org/
  5.  
  6. from PIL import Image
  7. import time,os,os.path
  8.  
  9. keys = []
  10. data = ''
  11.  
  12. # functions
  13.  
  14. def GetArray(key):
  15.     'Get plist array from key'
  16.     global data # grabbing sprite file data
  17.     try:
  18.         array = data.split('<key>'+key+'</key>')[1].split('<dict>')[1].split('</dict')[0].replace('    ','') # getting array from spitename
  19.     except IndexError: # catching IndexError if raised
  20.         return None # exiting function
  21.     return array # returning array
  22.  
  23. def GetSizeFromArray(array):
  24.     'Get sprite size from plist array'
  25.     size = array.split('<key>spriteSize</key>')[1].split('<string>')[1].split('</string')[0].replace('{','').replace('}','') # getting spriteSize from sprite array
  26.     x,y = int(size.split(',')[0]),int(size.split(',')[1]) # splitting data and getting x&y
  27.     return x,y # returning spriteSize
  28.  
  29. def GetPosFromArray(array):
  30.     'Get sprite pos from plist array'
  31.     size = array.split('<key>textureRect</key>')[1].split('<string>')[1].split('</string')[0].replace('{','').replace('}','') # getting sprite position from sprite array
  32.     x,y = int(size.split(',')[0]),int(size.split(',')[1]) # splitting data and getting x&y
  33.     return x,y # returning spriteSize
  34.  
  35. def IsSpriteRotated(array):
  36.     'Check if sprite is rotated on gamesheet'
  37.     string = array.split('<key>textureRotated</key>')[1] # getting bool from file
  38.     if ('false' in string): # checking if false
  39.         return False
  40.     return True
  41.  
  42. def GetGamesheetSize():
  43.     'Get size of Gamesheet'
  44.     strsize = GetArray('metadata').split('<key>size</key>\n<string>{')[1].split('}')[0].split(',')
  45.     return int(strsize[0]),int(strsize[1])
  46.  
  47. def SaveSprite(key):
  48.     global f
  49.     'Created image file form sprite in gamesheet'
  50.     array = GetArray(key) # getting data of the sprite
  51.     size = GetSizeFromArray(array) # getting sprite size
  52.     position = GetPosFromArray(array) # getting sprite position
  53.     rotated = IsSpriteRotated(array) # getting sprite rotation
  54.     gamesheet = Image.open(f+'.png','r') # opening gamesheet
  55.     if (rotated):
  56.         size = size[::-1]
  57.     img = Image.new('RGBA',size) # creating new image with size of target sprite
  58.     for x in range(size[0]):
  59.         for y in range(size[1]):
  60.             img.putpixel((x,y),
  61.                          gamesheet.getpixel((x+position[0],y+position[1])))
  62.             # creating image of the target sprite, pixel by pixel
  63.     img.save(f+'\\'+key) # saving file :D
  64.     img.close() # closing file
  65.     gamesheet.close() # closing gamesheet
  66.     return None
  67.  
  68. # main code:
  69.  
  70. print('Texture Editor by Absolute Gamer (2017)')
  71. print('Make sure to copy the gamesheets, both png & plist into the directory of the program!')
  72.  
  73. loaded = False
  74.  
  75. while 1:
  76.     print('\nOptions:')
  77.     print('1) Load texture')
  78.     if (loaded):
  79.         print('2) Split texture')
  80.         print('3) Merge texture')
  81.     ui = input('Enter valid number: ')
  82.  
  83.     if (ui == '1'): # load textures
  84.         loaded = True
  85.         f = input('Texture name (without the extention): ') # get texture name
  86.  
  87.         if not('-hd' in f) and not('-uhd' in f):
  88.             print('NOTE: You have chosen a low quality file') # warn user if non-hd file used
  89.  
  90.         print('Getting keys...')
  91.         fr = open(f+'.plist','r') # opening file with read permissions
  92.         data = fr.read() # reading file
  93.         fr.close() # closing file
  94.  
  95.         for i in data.split('<key>')[1:]:
  96.             if not(i.split('</key>')[0] in ['aliases','spriteOffset','spriteSize','spriteSourceSize','textureRect','textureRotated','frames']):
  97.                 if (i.split('</key>')[0] == 'metadata'):
  98.                     break # break loop if key = 'metadata'
  99.                 keys.append(i.split('</key>')[0]) # append key to array if not blacklisted
  100.         print('Done!')
  101.  
  102.         try:
  103.             if not os.path.isdir('merged'):
  104.                 os.makedirs('merged') # create folder if not exist
  105.                 print('Merged folder created')
  106.             if not os.path.isdir(f):
  107.                 os.makedirs(os.makedirs(f)) # create folder if not exist
  108.                 print('Gamesheet folder created')
  109.         except:
  110.             pass
  111.     if (ui == '2'): # split texture
  112.         print('Saving images...')
  113.         for i in keys:
  114.             SaveSprite(i) # for all keys, save sprite
  115.             print('Completed: '+i)
  116.         print('Rotating images...')
  117.         for i in keys: # rotate images needed
  118.             if IsSpriteRotated(GetArray(i)):
  119.                 img = Image.open(f+'\\'+i) # opening target image
  120.                 img.rotate(90, expand=True).save(f+'\\'+i) # rotating image
  121.                 img.close() # closing image
  122.                 print('Rotated: '+i)
  123.     if (ui == '3'):
  124.         print('Rotating images...')
  125.         for i in keys: # rotating images back if needed
  126.             if IsSpriteRotated(GetArray(i)):
  127.                 img = Image.open(f+'\\'+i) # opening target image
  128.                 img.rotate(-90, expand=True).save(f+'\\'+i) # rotating image by -90
  129.                 img.close() # closing image
  130.                 print('Rotated: '+i)
  131.  
  132.         new = Image.new('RGBA',GetGamesheetSize())
  133.  
  134.         for key in keys: # for all textures
  135.             targ = GetArray(key) # getting plist array from plist file
  136.             pos = GetPosFromArray(targ) # getting position of key on gamesheet
  137.             size = GetSizeFromArray(targ) # getting size of key on gamesheet
  138.             print('Completed: '+key)
  139.             rd = Image.open(f+'\\'+key) # opening image (made a stupid mistake earlier by opening the image per pixel, oops)
  140.             if (IsSpriteRotated(targ)): # if rotated, spaw x and y in the size variable
  141.                 size = size[::-1] # reverse tuple
  142.             for x in range(size[0]):
  143.                 for y in range(size[1]):
  144.                     new.putpixel((x+pos[0],y+pos[1]),rd.getpixel((x,y))) # add target image, pixel by pixel, to gamesheet by size and position
  145.             rd.close() # close target image
  146.         new.save('merged\\'+f+'.png') # save gamesheet in 'merged' folder
  147.         new.close() # close gamesheet
  148.  
  149.         print('Rotating images...')
  150.         for i in keys:
  151.             if IsSpriteRotated(GetArray(i)):
  152.                 img = Image.open(f+'\\'+i) # opening target image
  153.                 img.rotate(90, expand=True).save(f+'\\'+i) # rotating image by 90
  154.                 img.close() # closing image
  155.                 print('Rotated: '+i)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement