예제 #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
예제 #2
0

# 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