Beispiel #1
0
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
Beispiel #2
0
		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))