rendered paste body#!/usr/bin/pythonimport Image########################################################################################################## class for handling geodata# needs geodata file as param# new_geodata = geodata('filename-without-.dat')## methods: encode() header()# ########################################################################################################class geodata: class logger: def write(self,some_string): if self.dump: self.log_file.write(str(some_string)) return 0 def __init__(self,filename,to_file_bol=True): self.dump=to_file_bol if self.dump: self.log_file = open(filename+'.log','wb') def __del__(self): if self.dump: self.log_file.close() class geoimage: def _color_value(self,z): return z+50000 def putpixel(self,x,y,z): if self.dump: self.image.putpixel((x,y),self._color_value(z)) def __init__(self,filename,to_file_bol=True): self.filename=filename self.dump=to_file_bol if self.dump: self.image = Image.new('RGB', (2048,2048), (52390)) def __del__(self): if self.dump: self.image.save(self.filename+'.png') #################################################################################################### # # converts bytes hex values # #################################################################################################### def convert_to_hex(self,some_byte): if len(some_byte)==0: return 'FF' charval = ord(some_byte) hexval = hex(charval) hexstrlen = len(hexval) startpos = hexstrlen - 2 if hexval[startpos] == 'x': startpos += 1 return_hex = '0'+hexval[startpos] else: return_hex = hexval[startpos:hexstrlen] return return_hex #################################################################################################### # # test if z is > maxz if yes set maxz = z # #################################################################################################### def _maxz(self,z=None): if z: # getting max z if z!=0: if self.maxz == None: self.maxz = z else: if self.maxz < z: self.maxz = z return self.maxz #################################################################################################### # # test if z is < minz if yes set minz = z # #################################################################################################### def _minz(self,z=None): if z: # getting min z if self.minz == None: self.minz = z else: if self.minz > z: self.minz = z return self.minz #################################################################################################### # # getz z value from file # #################################################################################################### def _getz(self): # read bytes z2 = self.convert_to_hex(self.conv_file.read(1)) z1 = self.convert_to_hex(self.conv_file.read(1)) # converts to int z = int(z1+z2,16) # get the real z1 if z > 55000: z = z - 65336 # checking min/max z self._minz(z) self._maxz(z) # return value return z #################################################################################################### # # block 0000 handler # z1 min-z z2 max-z # #################################################################################################### def _handle_block0000(self): return_data = [] # getting the bytes for z1/z2 z1 = self._getz() z2 = self._getz() for sub_x in range(0,8): for sub_y in range(0,8): self.image.putpixel(self.x+sub_x,self.y+sub_y,z1) return z1,z2 #################################################################################################### # # block 0040 handler # return a 8x8 subcell # #################################################################################################### def _handle_block0040(self): # loop 64 times return_data = [] counter = 0 for sub_x in range(0,8): for sub_y in range(0,8): z = self._getz() / 2 self.image.putpixel(self.x+sub_x,self.y+sub_y,z) return_data.append(z) counter+=1 return return_data #################################################################################################### # # block 0041 handler # #################################################################################################### def _handle_block0041(self): return_data_sub = [] return_data = [] # loop 64 times for item in range(0,64): # get count of layers layercount = self._getz() for i in range(0,layercount): z = self._getz() / 2 return_data_sub.append(z) return_data.append(return_data_sub) counter = 0 for sub_x in range(0,8): for sub_y in range(0,8): self.image.putpixel(self.x+sub_x,self.y+sub_y,(max(return_data[counter]))) counter+=1 go_on=False while go_on==False: position = int(self.conv_file.tell()) testbyte1 = self.conv_file.read(1) testbyte2 = self.conv_file.read(1) if self.convert_to_hex(testbyte2) == '00': go_on=True self.conv_file.seek(position) return return_data #################################################################################################### # # Decodes the geodata # #################################################################################################### def decode(self): self.image = self.geoimage(self.filename) self.conv_file.seek(18) data=[] # make x loop for self.x in range(0,2048,8): # make y loop for self.y in range(0,2048,8): # reads data header block1 = self.conv_file.read(1) block2 = self.conv_file.read(1) block1_hex = self.convert_to_hex(block1) # handles the data if block1_hex == 'ff': self.log.write('x: %s y: %s block: 00 ERROR \n' %(str(self.x),str(self.y))) elif block1_hex == '00': # get data z1,z2 = self._handle_block0000() # check for water - z1!=z2 water if z1==z2: data.append([self.x,self.y,z1,'F']) else: for item in range(z1,z2,32): data.append([self.x,self.y,item,'W']) self.log.write('x: %s y: %s block: 00 ok \n' %(str(self.x),str(self.y))) elif block1_hex == '40': z_data = self._handle_block0040() self.log.write('x: %s y: %s block: 40 ok \n' %(str(self.x),str(self.y))) elif int(block1_hex,16)>=64 and int(block1_hex,16)<=254: z_data = self._handle_block0041() self.log.write('x: %s y: %s block: %s ok \n' %(str(self.x),str(self.y),block1_hex)) else: self.log.write('x: %s y: %s block00 %s ERROR??? \n' %(self(str.x),self(str.y),block1_hex)) # debug output self.log.write(' minz: %s maxz: %s \n' %(str(self._minz()),str(self._maxz()))) self.image = None return 'foobar' def header(self): position = int(self.conv_file.tell()) self.conv_file.seek(0) mapx = self.conv_file.read(1) mapx =int(self.convert_to_hex(mapx),16) mapy = self.conv_file.read(1) mapy = int(self.convert_to_hex(mapy),16) self.conv_file.seek(position) return mapx,mapy def __init__(self,filename,log=True,image=True): # init basic vars self.log=self.logger(filename,log) self.dump_image=image self.filename=filename self.minz=None self.maxz=None # open files self.conv_file = open(self.filename+'.dat','rb') def __del__(self): self.conv_file.close() self.log.write('** File closed\n\n') ########################################################################################################## Main Function#########################################################################################################field_of_silence = geodata('22_23_conv',False)field_of_silence.decode()field_of_silence = None#giants_cave = geodata('25_19_conv')#giants_cave.decode()#bla1= geodata('22_22_conv')#bla1.decode()#tower_of_insolence = geodata('23_18_conv')#tower_of_insolence.decode()