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
print(' * skipped flat %s (not in PWADs)' % (flat_src)) continue md5_src = hashlib.md5(file_src.data).hexdigest() # now check if we already have a flat with this hash in the output PWAD found = False for file_dst in FlatsOutWAD: md5_dst = hashlib.md5(file_dst.data).hexdigest() if md5_dst == md5_src and not hasattr(file_dst, 'anim'): # мы не копируем анимации здесь. если в выхлопном файле есть совпадение, но оно включено в анимацию, то мы его игнорируем. print(' * skipped flat %s (duplicate %s in output WAD)' % (flat_src, file_dst.name)) FlatsToRename[flat_src] = file_dst.name found = True break if not found: file_dst = WADLump() file_dst.name = file_src.name file_dst.data = file_src.data # check if there's a flat with the same name. rename if so. n2_tpl = file_dst.name for i in range(1000): # 0 to 999 file_dst2 = OutWAD.get_lump_between(n2_tpl, 'F_START', 'F_END') if file_dst2 is None: file_dst2 = OutWAD.get_lump_between(n2_tpl, 'FF_START', 'FF_END') # и за компанию нужно убедиться что мы не заменяем полностью флэт из ивада. потому что мы можем в итоге мержить несколько уровней, один из которых заменяет флэты, а другой нет. if file_dst2 is None: file_dst2 = IWAD.get_lump_between(n2_tpl, 'F_START', 'F_END') if file_dst2 is not None: n2_tpl = file_dst.name[0:5]+('%03d'%i) continue break if n2_tpl != file_dst.name: print(' * flat name conflict, renamed %s -> %s' % (file_dst.name, n2_tpl))