def copy_texture(tex_src): global TexOutWAD global IWAD global OutWAD global TexturesToRename global SwitchesToCopy tex_src_name = tex_src.name tex_dst = Texture1Texture() tex_dst.name = tex_src_name tex_dst.width = tex_src.width tex_dst.height = tex_src.height # проверяем, что имя не занято. если занято, переименовываем. n2_tpl = tex_dst.name for i in range(1000): # 0 to 999 # и заодно проверяем чтобы в иваде не было такой текстуры if TexOutWAD.check_name_exists(n2_tpl) or TexIWAD.check_name_exists(n2_tpl): n2_tpl = tex_dst.name[0:5]+('%03d'%i) continue break if n2_tpl != tex_dst.name: print(' * texture name conflict, renamed %s -> %s' % (tex_dst.name, n2_tpl)) TexturesToRename[tex_dst.name] = n2_tpl tex_dst.name = n2_tpl # теперь смотрим патчи. # патчи ищутся по хэшу, если в выхлопном файле есть патч с таким же хэшем, он юзается. # подозреваю, что этот момент может и будет приводить к всяким приколам... гыгы. (с) # по сути мы повторяем функционал calc_texture_hash, только пошагово. for patch in tex_src.patches: patch_file = global_get_last_file(patch.name, False) # считается, что если patch_file не нашёлся в PWADах, значит он есть в IWAD и тупо надо использовать его имя как есть. patch_dst = Texture1Patch() patch_dst.originx = patch.originx patch_dst.originy = patch.originy if patch_file is None: patch_dst.name = patch.name tex_dst.patches.append(patch_dst) continue patch_md5 = hashlib.md5(patch_file.data).hexdigest() found = False for out_lump in OutWAD: if out_lump.md5 == patch_md5: print(' * reusing patch %s for %s' % (out_lump.name, patch.name)) patch_dst.name = out_lump.name tex_dst.patches.append(patch_dst) found = True break if found: continue # патч не нашёлся в выхлопном ваде. копируем патч (и переименовываем, если накладывается имя) out_lump = WADLump() out_lump.md5 = patch_md5 out_lump.name = patch_file.name out_lump.data = patch_file.data n2_tpl = out_lump.name for i in range(1000): # 0 to 999 out_file2 = OutWAD.get_lump(n2_tpl) if out_file2 is None: out_file2 = IWAD.get_lump(n2_tpl) if out_file2 is not None: n2_tpl = out_lump.name[0:5]+('%03d'%i) continue break if n2_tpl != out_lump.name: print(' * patch name conflict, renamed %s -> %s' % (out_lump.name, n2_tpl)) out_lump.name = n2_tpl OutWAD.append(out_lump) patch_dst.name = out_lump.name tex_dst.patches.append(patch_dst) tex_dst.md5 = calc_texture_hash(tex_dst, OutWAD) TexOutWAD.append(tex_dst) return tex_dst
# enumerate flats in the out wad (if any). we'll need hashes. FlatsOutWAD = [] markers = ['F_START', 'F_END', 'FF_START', 'FF_END'] for j in range(2): nums = OutWAD.get_nums_between(markers[j*2], markers[j*2+1]) for num in nums: FlatsOutWAD.append(OutWAD[num]) print('%d flats already present in output WAD.' % (len(FlatsOutWAD))) # check if we even have a flat directory yet ff_num = OutWAD.get_num_for_name('FF_START') if ff_num < 0: ff_start = WADLump() ff_start.name = 'FF_START' ff_start.md5 = '' ff_end = WADLump() ff_end.name = 'FF_END' ff_end.md5 = '' OutWAD.append(ff_start) ff_num = len(OutWAD) OutWAD.append(ff_end) else: ff_num += 1 # проверяем, чтобы здесь не пытались копировать анимированные флэты. # если попытались, то выпиливаем флэты из общего списка и впиливаем в отдельный. i = -1