на главную
об игре

Моддинг и Тюнинг Empire: Total War

Начало моддинга в Empire: Total War

Статья от Лиса из Тарговиска

Распаковщик от Alpaca и Sinople:
Распаковать удалось с легкостью, на скрине трапперы сражаются на стороне британцев (также известных, как лоялисты) :
http://radikal.ru/F/s39.radikal.ru/i084/0902/1a/7a35a7a33451.jpg.html
Ссылка на распаковщик - http://imperialtw.narod.ru/moding/Emp_unpacker.zip
Открывать файл архиватором (Лис: у меня винрар 3.5, открыл без труда)
Пользоваться:
1.Перенести распаковщик в data папку, запустить .bat файл.
2. Все распакованное будет в папке unpacked
*Требуется Python (Лис: библиотека языка, можно взять - http://www.python.org/ftp/python/3.0.1/python-3.0.1.msi

Провел тест на работоспособность.
Необходимо:
1. Установить Python. Ссылка выше.
2. Перенести файлы распаковщика по адресу (у меня) C:\Program Files\Steam\steamapps\common\empire total war demo\data
3. Открыть файл emp_unpacker.py, кликнув на него правой кнопкой мыши и выбрав Edit with IDLE.
Откроется два окна. Python Shell не трогайте. Из второго окна стираете все, заменив на:

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)
4. Сохраняете, запускаете бат-файл emp_unpacker.py -u all.bat

После распаковки не забудьте переименовать demo1.pack в demo1.pack_backup, затем перенести файлы в корневую директорию, здесь вы уже сможете их модифицировать.

Небольшие видоизменения игры:

Пехота стреляет тремя рядами:
http://s49.radikal.ru/i125/0902/a3/7c88c6c90928t.jpg

Найдите юнита, который вы хотите изменить







fire_volley

Измените на:







rank_fire
У вас не хватает двух букв, так как rank_fire короче, чем fire_volley. Рекомендуют добавить две буквы к имени генерала. (Лис: как это сделать вы поймете далее)

Изменить количество солдат в отряде:
Найти:

и заменить на


Затем найти:

William Howe
и заменить на

William How

Опыт отряда:
Найти:






rank_fire
square_formation
ring_bayonets



Ноль изменить на 3. Никаких иных изменений не требуется.

Добавление кораблей в игру:
Делается это в файле battle_of_lagos.xml
Мануала нет, видимо это делается элементарно копи-пастом.
britain









Со всеми вопросами по этому посту сюда: Моддинг и Тюнинг для ETW, Делимся опытом, туторами, советами - http://imperiall.1bb.ru/index.php?showtopic=3802

Другиии инструкции по моддингу Empire: Total War: Пособие для моддера ETW, Инструкции для начинающего моддера - http://imperiall.1bb.ru/index.php?showtopic=3805

Комментарии:  169
Ваш комментарий

аааааааааааааааааа мои молитвы были услышанны

мне надо мод, чтобы персонажи не старели так быстро, а то проходит только полгода, а для них это год.надо
мод, чтоб для них полгода были годом

Ко всем.
Подскажите как можно редактировать количество и тип войск в городах, а так же начальные постройки в городе. Чтоб при начале основной компании сразу был доступен город с нужными тебе постройками и войсками. Для игры Medieval 2 достаточно было внести соответствующие изменения в файл descr_strat. Как это сделать в Empire? Какой файл требутся редактировать? И какой прогой?
P.S.: очень надо, т.к. хочу восстановить историческую справедливость.

Отличный мод XVIII век, особенно для тех, кто играет за наших =) Даже живей ДартМода, постоянно фиксится и дорабатывается, есть под все версии, 5-ая работает и на 1.3 и на 1.3.1 Рестайлятся полностью линейки, от портретов, показателей, иконок, флагов, до звуков, граф. эфектов и т.д. и т.п. Кому нужно - пишите в личку - дам ссылку на всё и на то, где с автором можно пообщаться =)

Это возможно но надо много ума и времени так как эта фигня заключена в интерфейс игры а это всякие панельки на экране и пиктограммы, если увеличить ширину пиктограммы войск и указать куда будут вставлятся эти лишние иконки с отрядами то наверняка это получится. Я уже выявил файлы содержащие интерфейс но у меня просто нехватает ума хотя бы что-то сделать так что я это оставлю. Мне просто не хватает масштабности битв а вить в истории в битвах участвовали по двадцать тысяч а то и по шестьдесят тысяч солдат в каждой армии, на телеканале истории Viasat History показывали на компьютерной графике очень масштабную историческую битву между Наполеоном и какой-то армии Британии с участием где-то всего ста шестидести тысяч человек! А в ETW такое просто невозможно, а увеличение кол-ва солдат в отряде либо приводит к жестким тормозам либо всё равно не масштабно. Кстати вот исход той битвы: Наполеон своим(примерно 40 тысячным) войском гнал на холм как он считал остатки от 50 тысячной армии но за холмом была очень неприятная засада, как только войско Наполеона дошло почти на самый холм оттуда появилось многотысячное войско Британии где-то в 70 тысяч солдат, стройная,огромная длинная и очень широкая линия солдат погнала французов с холма и армия Наполеона почти полностью была уничтожена. "Наполеон просто не увидел такое огромное войско Британцев" - слова с телеканала. Я полностью уверен что если бы он увидел армию то сейчас мы бы жили без Великобритании так как у Наполеона чертовски высоко было развито тактическое умение и он неоднократно побеждал армии превосходащие его войско в 4 раза(в частности нашу русскую и австрийскую). Скажите спасибо нашим суровым зимам за то что именно они остановили Наполеона и похоронили его войско.
Разве вы не хотите такие битвы каждый день у вас на мониторах?

Буду над этим потеть пока не сдохну)

Когда играю в Империю заметил что в битвах не хватает криков бойцов при попадании в них пули или ядра или попадании их на вражеский штык! Это было реализовано в тотал вар 2. Нет ли мода исправляющий этот недостаток?

И так. Мод поставил, игра запустилась, наслажаюсь. На пятом ходу пришлось отбивать нападение Польши, как толь ко стало грузится сражение, тут же вылет. Проверил еще пять раз, тоже самое. Скачал мод "Терра Инкогнита", с ним таже картина. Стоят все обновления, патч 1.6. Моды ставлю как описано в инструкциях, ничего не нарушаю. Короче задолбался я с этим делом, уже и желание даже отпало их ставить. Единственый мод который не вызвалал глюков, это AUM добовляющий 72 новых юнита.

Играю за Персию. В стартовых войсках у них есть два вида фаллахов - фехтовальщики и стрелки. Но в ветке найма они отсутствуют! Пробывал исследовать все технологии, изучал ветку строений в малых городах (где есть выбор - простое губернаторство или военное), завоевал полмира - от Индии до атлантики. Так и не появились в найме. Хотя в стартовых войсках есть. Вопрос - как откорректировать ветку найма. Патч 5. Заходил в db через PFM, в списке юнитов фаллахи есть, но вот какая колонка отвечает за найм, не знаю. Может нужно менять параметры в папке зданий? Какие мнения?

Ребят, а есть какие-нибудь моды, меняющие глобальную карту?

ЗАГРУЗИТЬ ВСЕ КОММЕНТАРИИ
Новое на форуме Empire: Total War