Haktar
Newbie | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Статья от Лиса из Тарговиска Распаковщик от Alpaca и Sinople: Распаковать удалось с легкостью, на скрине трапперы сражаются на стороне британцев (также известных, как лоялисты) : Ссылка на распаковщик Открывать файл архиватором (Лис: у меня винрар 3.5, открыл без труда) Пользоваться: 1.Перенести распаковщик в data папку, запустить .bat файл. 2. Все распакованное будет в папке unpacked *Требуется Python (Лис: библиотека языка, можно взять здесь ) Провел тест на работоспособность. Необходимо: 1. Установить Python. Ссылка выше. 2. Перенести файлы распаковщика по адресу (у меня) C:\Program Files\Steam\steamapps\common\empire total war demo\data 3. Открыть файл emp_unpacker.py, кликнув на него правой кнопкой мыши и выбрав Edit with IDLE. Откроется два окна. Python Shell не трогайте. Из второго окна стираете все, заменив на: [spoiler] Цитата: import struct, os, sys, re # For easy file reading and writing interactions def readLong(fhandle): return struct.unpack('l', fhandle.read(4))[0] def readShort(fhandle): return struct.unpack('h', fhandle.read(2))[0] def readByte(fhandle): return struct.unpack('B', fhandle.read(1))[0] def readBool(fhandle): val = fhandle.read(1) if val == "00": return False else: return True def writeLong(fhandle, value): fhandle.write(struct.pack('l',value)) def writeShort(fhandle, value): fhandle.write(struct.pack('h',value)) def writeByte(fhandle, value): fhandle.write(struct.pack('B',value)) def writeBool(fhandle, value): if value: fhandle.write('\x01') else: fhandle.write('\x00') def removeDir(path): # remove all files in a folder if not (os.path.isdir(path)): return True files = os.listdir(path) for x in files: fullpath=os.path.join(path, x) if os.path.isfile(fullpath): os.remove(fullpath) elif os.path.isdir(fullpath): removeDir(fullpath) os.rmdir(path) def parseArgs(args): pack = packFile('demo1.pack','unpacked') # create argument tree argtree = [] for arg in args[1:]: if arg.startswith('-'): argtree.append([arg,[]]) else: argtree[-1][1].append(arg) # wander the tree, top level always has hyphenated arguments for arg in argtree: # case 1: list if arg[0] == '-l': if len(arg[1]) > 0: for file in arg[1]: pack.printEyeCandy(str(file)) else: pack.printEyeCandy('./list.txt') # case 2: unpack elif arg[0] == '-u': for file in arg[1]: if file == 'all': for i in range(len(pack.files)): pack.exportFile(i) else: pack.exportFile(file) # case 3: unpack (regexp) elif arg[0] == '-ur': for file in arg[1]: pack.exportFile(file, True) # case 4: change pack elif arg[0] == '-p': for file in arg[1]: print() print('Changing pack to '+file) print() pack.newPack(file,pack.outputdir) # case 5: change output directory elif arg[0] == '-o': for file in arg[1]: print() print('Changing output directory to '+file) print() pack.changeOutputDir(file) class packFile: def __init__(self, path='', outputdir=None): self.handle = None if outputdir: removeDir(outputdir) self.newPack(path,outputdir) def newPack(self,path,outputdir=None): # safely open new pack if self.handle: self.handle.close() self.handle = None self.files = [] self.numFiles = 0 self.arr = 0 self.outputdir = outputdir self.defLength = 0 self.path = path self.readPackDefinition() def changeOutputDir(self,path): self.outputdir = path if self.outputdir != None: removeDir(self.outputdir) def packOpen(self): if not self.handle: self.handle = open(self.path,"rb") return self.handle def packClose(self): self.handle.close() def readPackDefinition(self): pack = self.packOpen() # skip empty bytes and stuff at the start pack.seek(16) self.defLength += 16 # read number of files self.numFiles = readLong(pack) self.defLength += 4 # read ?? self.arr = readLong(pack) self.defLength += 4 # store the offset of a certain file offset = 0 # read file metadata for i in range(self.numFiles): # read length of file length = readLong(pack) self.defLength += 4 # read file name char = '' filename = '' while char != b'\x00': char = pack.read(1) if (char != b'\x00'): filename += char.decode() self.defLength += 1 self.files.append((filename,length,offset)) offset += length def exportFile(self, arg, regexp = False): try: arg = int(arg) # option a: arg is an index list = [self.files[arg]] except: # option b: arg is a string if regexp: list = filter(lambda x: re.search(str(arg),x[0]),self.files) else: list = filter(lambda x: arg in x[0],self.files) for (path,length,offset) in list: print('Exporting '+path+', length: '+str(length)+', at offset: '+str(offset)) # create output directory dir = os.path.split(os.path.join(self.outputdir,path))[0] if not os.path.isdir(dir): os.makedirs(dir) output = open(os.path.join(self.outputdir,path),'wb') # open pack and go to offset pack = self.packOpen() pack.seek(self.defLength+offset) # copy content i = 0 # read MB-sized chunks as long as possible j = length//(2**20) while i < j: output.write(pack.read(2**20)) i+=1 i = 0 j = (length%(2**20))//(2**10) # read KB-sized chunks while i < j: output.write(pack.read(2**10)) i+=1 i = 0 j = length%(2**10) # read byte-sized chunks while i < j: output.write(pack.read(1)) i+=1 output.close() return True def printEyeCandy(self, outfile): output = open(outfile,'w') for (path,length,offset) in self.files: output.write(str(path)+'\r\n') output.close() # main parseArgs(sys.argv) | [/spoiler] 4. Сохраняете, запускаете бат-файл emp_unpacker.py -u all.bat После распаковки не забудьте переименовать demo1.pack в demo1.pack_backup, затем перенести файлы в корневую директорию, здесь вы уже сможете их модифицировать. Небольшие видоизменения игры: Пехота стреляет тремя рядами: Найдите юнита, который вы хотите изменить Цитата: <unit unit_category="infantry" num_soldiers="80" script_name="britain_euro_line_infantry_01"> <unit_type type="euro_line_infantry_britain"/> <position x="-108.22" y="501.29"/> <orientation radians="2.66"/> <width metres="29.58"/> <unit_capabilities> <firing_drill>fire_volley</firing_drill> | Измените на: Цитата: <unit unit_category="infantry" num_soldiers="80" script_name="britain_euro_line_infantry_01"> <unit_type type="euro_line_infantry_britain"/> <position x="-108.22" y="501.29"/> <orientation radians="2.66"/> <width metres="29.58"/> <unit_capabilities> <firing_drill>rank_fire</firing_drill> | У вас не хватает двух букв, так как rank_fire короче, чем fire_volley. Рекомендуют добавить две буквы к имени генерала. (Лис: как это сделать вы поймете далее) Изменить количество солдат в отряде: Найти: Цитата: <unit unit_category="infantry" num_soldiers="45" script_name="britain_euro_grenadiers_bearskin"> | и заменить на Цитата: <unit unit_category="infantry" num_soldiers="145" script_name="britain_euro_grenadiers_bearskin"> | Затем найти: Цитата: <general> <name>William Howe</name> | и заменить на Цитата: <general> <name>William How</name> | Опыт отряда: Найти: Цитата: <unit unit_category="infantry" num_soldiers="80" script_name="britain_euro_line_infantry_01"> <unit_type type="euro_line_infantry_britain"/> <position x="-108.22" y="501.29"/> <orientation radians="2.66"/> <width metres="29.58"/> <unit_capabilities> <firing_drill>rank_fire</firing_drill> <special_ability>square_formation</special_ability> <bayonet_type>ring_bayonets</bayonet_type> </unit_capabilities> <unit_experience level="0"/> | Ноль изменить на 3. Никаких иных изменений не требуется. Добавление кораблей в игру: Во втором посте показывают добавление кораблей в игру. Делается это в файле battle_of_lagos.xml Мануала нет, видимо это делается элементарно копи-пастом. Цитата: <faction>britain</faction> <deployment_area> <centre x="0.0" y="0.0"/> <width metres="2000.0"/> <height metres="2000.0"/> <orientation radians="0"/> </deployment_area> <camera_start_position x="-122" y="33.2" z="566.6" /> <camera_target_position x="-156" y="-31.7" z="384.4" /> | Упрощённый вариант распаковки архивов pack 1. Скачиваем программу Python - Скачать 2. Скачиваем архив распаковщика - Скачать 3. Распаковываем архив распаковщика, и копируем из него файлы emp_unpacker.py и emp_unpacker.py -u all.bat в папку C:\Program Files\Steam\steamapps\common\empire total war demo\data 4. Запускаем файл emp_unpacker.py -u all.bat, ждём распаковки. Распакованные файлы находяться в папке unpacked Как распаковать другие файлы с расширением .pack? 1. Повторяем 1-й, 2-й и 3-й пункт инструкции Упрощённый вариант распаковки архивов pack 2. Открываем файл emp_unpacker.py с помощью Блокнота. Ищём demo1. Заменяем эту строку на demo2, demo3 или другой пак, который вам надо распаковать. Запускаем emp_unpacker.py -u all.bat, ждём распаковки. Небольшой нюанс - перед тем как распаковывать, если вы уже распаковали demo1.pack, то папку unpacked переименуйте например в unpacked1 Со всеми вопросами по этому посту сюда: Моддинг и Тюнинг для ETW, Делимся опытом, туторами, советами Другиии инструкции по моддингу Empire: Total War: Пособие для моддера ETW, Инструкции для начинающего моддера
Если требуется разместить в сообщение большое количество текста, то обязательным является использование тега more (Подробнее...). Ссылки на торренты, порталы с торрентами и клиенты запрещены в этом форуме, для этого есть другой форум (Игры и Фильмы). Будьте добры ознакомится с правилами на будущее. | Всего записей: 15 | Зарегистр. 01-03-2009 | Отправлено: 01:21 01-03-2009 | Исправлено: RapSoldier, 12:24 01-03-2009 |
|