You are not logged in.
Здравствуйте. Я захотел сделать мод с новыми линиями метро (то есть туннели останутся те же, но поезда будут ходить по разному - одни только по центру, вторые из дюкса в бохан итд). Я знаю как менять координаты и уже сделал, для пробы, линию вокруг Алгонкина. Но вот какая проблема - при изменении количества строк в файле (я редактирую data/common/paths/TracksBronx.dat) игра виснет. А 853 строки мне явно мало, чтобы сделать новые линии. В файле есть номер маршрута (например в tracksbronx.dat это 851), и если написать новый маршрут после первого под другим номером, например 852 и дальше новый маршрут, игра не виснет, но и маршрут не работает.
На мапсе мне сказали, что надо править exe. Но как это сделать, я себе не представляю. Мне и нужно-то всего продублировать код с новым маршрутом... или что-то в этом роде...
Плиз, киньте какой-нибудь "ламерский" туториал или просто помогите запустить новый маршрут, если это не сложно. Спасибо.
Offline
А 851 - это точно номер маршрута? Просто в СА, например, число в начале файла маршрута поезда обозначало количество точек маршрута. Также там было необходимо оставлять в конце файла пустую строчку.
Offline
Спасибо! так и есть. Я изменил число и добавил строчку, и все работает.
А вот еще тогда два вопроса.
1. Можно ли активировать одновременно несколько независимых маршрутов? если записать их подряд в файле работает только первый.
и 2. Можно ли как нибудь изменить надпись "Вы находитесь на линии N, станция такая то" чтобы оно писало название линии?
2 3Doomer: да я теперь хоть сто тыщ этих строк могу сделать) благодаря этому форуму в целом и den_spb в частности
Last edited by cutik (12-09-2009 17:36)
Offline
1. Можно ли активировать одновременно несколько независимых маршрутов? если записать их подряд в файле работает только первый.
Насчет ГТА 4 сказать не могу, но в ГТА СА каждый маршрут поезда записан в отдельном файле (всего их 4 - data\paths\tracks.dat, tracks2.dat, tracks3.dat, tracks4.dat).
2 3Doomer: да я теперь хоть сто тыщ этих строк могу сделать)
На количество точек должен быть лимит. В СА, например, маршрут на 1082 точки работает без замечаний, но если приблизить количество к 2000, то появляются различные нестабильности.
Offline
Насчет ГТА 4 сказать не могу, но в ГТА СА каждый маршрут поезда записан в отдельном файле (всего их 4 - data\paths\tracks.dat, tracks2.dat, tracks3.dat, tracks4.dat).
Вот именно! В гта 4 так же. Видимо, формат путей поездов не изменился со сменой движка.
Так значит, нельзя добавить новый файл, или сделать несколько маршрутов в одном файле?
Offline
Offline
То есть, нужно написать скрипт, передающий координаты путей коду управляющему поездами? Или придется полностью переписать весь код, который не дает поездам сталкиваться, сажает нас внутрь на станциях, пишет название линии итд?
Offline
Второе - проще. Большую часть кода можно не трогать. В идеале - нужно переписать три-четыре функции.
В принципе, если разбор ~10 килобайт кода вызывает затруднения, можно просто попроавить ~40 мест, где делаются обращения к этим адресам и переписать одну тривиальную функцию (12 строчек).
Основная проблема в том, что в одной структуре хранятся трэки и для поездов и для самолетов, и не всегда можно отделить мух от котлет.
В любом случае, начинать копаться стоит вот отсюда:
.text:00AC1D40 __readTrackFiles
Offline
Это в script.img? Или в exe? сорри за ламерство, просто я только начинаю скриптить
Offline
Пологаю что в exe, поскольку:
1. код из иды
2. какие тривиальные функции в скрипт.имг??:)
GTA VC - ЭТО НАСТОЯЩАЯ ГТА!
Offline
А какой прогой можно открыть exe?
Ps. еще раз сорри за тупые вопросы
Offline
А какой прогой можно открыть exe?
Ps. еще раз сорри за тупые вопросы
olly debugger или IDA - вот самое лучшее только вот олли дебагер весит 1 мб, а ида 75 .
100 постов - 27 августа;
Offline
3Doomer прав. Ассемблер тебе не скриптинг(знаю по личному опыту )
GTA VC - ЭТО НАСТОЯЩАЯ ГТА!
Offline
Чтож делать? засада. И долго его учить? (ассемблер). Можно конечно что то сделать и с существующим лимитом, но линий там будет немного... и к тому же, поезда будут "мигрировать" с одной на другую.
Offline
Чтож делать? засада. И долго его учить? (ассемблер).
Это зависит только от тебя, можешь сидеть днями и ночами, или раз в день по паре часов, или вообще на***н бросить это дело
100 постов - 27 августа;
Offline
Чтож делать? засада. И долго его учить? (ассемблер). Можно конечно что то сделать и с существующим лимитом, но линий там будет немного... и к тому же, поезда будут "мигрировать" с одной на другую.
Вопрос некорректен. Зависит от того, что есть из базовых умений и сколько усилий хочется приложить.
Для меня, освоить новый ассемблер - порядка двух-трех часов (заглянуть в код, посмотреть в справочник на предмет архитектуры процессора, потом бегло пробежаться по именам команд). Но это для меня - я свободно читаю десятка полтора разных ассемблеров и вообще программирую более двадцати лет.
Если есть большое желание научиться разбираться в коде - это можно сделать за неделю.
(главное - читать правильную документацию и задавать правильные вопросы).
Чтобы оценить задачу в целом, можно сделать следующее:
1) добыть ida 5.2 (torrents.ru в помощь)
2) скачать мою свежую базу по IV: http://sannybuilder.com/forums/viewtopic.php?id=564
3) открыть базу в ida
4) нажать 'G' (появится окошко), ввести AC1D40
если увиденное вызывает суеверный ужас - забить на эту идею. Если нет - вооружаться книжкой по архитектуре x86 (самая лучшая - родной мануал от Intel) и задавать правильные вопросы.
Offline
Ну, в общем, частично о чем-то можно догадаться, а о чем-то - нет. То есть понятно, что самое левое - это номер строки, затем идет команда, затем ее параметры. Понятно, что передо мной процедура от начала и до конца. Можно догадаться, что стрелочки - это переходы от одного куска кода к другому, хотя непонятна разница между красной, синей и зеленой стрелочками. И, наверное, где-нибудь есть полный список этих команд (например, push, cmp и jzn) с описанием, чего они делают?
Offline
Хорошо.
Самое полное руководство по процессору находится здесь: http://www.intel.com/products/processor … /index.htm
В частности, volume 2 - очень подробное описание всех команд.
К сожалению, для новичка оно достаточвно сложное (если нет хотя бы общего представления, как работает процессор - разбираться с ним придется долго).
Есть много статей по ассемблеру начального уровня; начать можно с http://sannybuilder.com/forums/viewtopic.php?id=41
Еще полезно зайти в IDA в Options->General и поставить галочку Auto Comments
Стрелочки трех типов - это безусловные переходы (переход на другой адрес, который выполняется всегда; синие), условные переходы (переход, если выполняется какое-то условие; зеленые) и переход, если условие не выполняется (следующая команда после условного перехода; красные).
Впрочем, не будем терять лес за деревьями.
Наша задача - не просто разобрать ассемблер, а решить задачу с путями.
Посмотрим, как данный фрагмент выглядит на языке высокого уровня:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | void CTracksManager: :readTrackFiles () { if (m_trackData[0] == NULL) readTrackFile ("common:/data/paths/TracksQueens.dat", &m_trackData[0], &m_tracksSizes[0], &_14D17A8[0], &_14D1BD8[0], &_14D27C0[0], &_14D1FD0[0], &_14D16B8[0], &_14D2398[0], &_14D1C10[0]); if (m_trackData[1] == NULL) readTrackFile ("common:/data/paths/TracksQueens2.dat", &m_trackData[1], &m_tracksSizes[1], &_14D17A8[1], &_14D1BD8[1], &_14D27C0[1], &_14D1FD0[1], &_14D16B8[1], &_14D2398[1], &_14D1C10[1]); if (m_trackData[2] == NULL) readTrackFile ("common:/data/paths/TracksBronx.dat", &m_trackData[2], &m_tracksSizes[2], &_14D17A8[2], &_14D1BD8[2], &_14D27C0[2], &_14D1FD0[2], &_14D16B8[2], &_14D2398[2], &_14D1C10[2]); if (m_trackData[3] == NULL) readTrackFile ("common:/data/paths/TracksBronx2.dat", &m_trackData[3], &m_tracksSizes[3], &_14D17A8[3], &_14D1BD8[3], &_14D27C0[3], &_14D1FD0[3], &_14D16B8[3], &_14D2398[3], &_14D1C10[3]); if (m_trackData[4] == NULL) readTrackFile ("common:/data/paths/cablecar_northern.dat", &m_trackData[4], &m_tracksSizes[4], &_14D17A8[4], &_14D1BD8[4], &_14D27C0[4], &_14D1FD0[4], &_14D16B8[4], NULL, NULL); if (m_trackData[5] == NULL) readTrackFile ("common:/data/paths/cablecar_southern.dat", &m_trackData[5], &m_tracksSizes[5], &_14D17A8[5], &_14D1BD8[5], &_14D27C0[5], &_14D1FD0[5], &_14D16B8[5], NULL, NULL); if (m_trackData[6] == NULL) readTrackFile ("common:/data/paths/TracksPlaneOnGround1.dat", &m_trackData[6], &m_tracksSizes[6], &_14D17A8[6], &_14D1BD8[6], &_14D27C0[6], &_14D1FD0[6], &_14D16B8[6], NULL, NULL); if (m_trackData[7] == NULL) readTrackFile ("common:/data/paths/TracksPlaneOnGround2.dat", &m_trackData[7], &m_tracksSizes[7], &_14D17A8[7], &_14D1BD8[7], &_14D27C0[7], &_14D1FD0[7], &_14D16B8[7], NULL, NULL); if (m_trackData[8] == NULL) readTrackFile ("common:/data/paths/TracksPlaneInFlight.dat", &m_trackData[8], &m_tracksSizes[8], &_14D17A8[8], &_14D1BD8[8], &_14D27C0[8], &_14D1FD0[8], &_14D16B8[8], NULL, NULL); if (m_trackData[9] == NULL) readTrackFile ("common:/data/paths/TracksPlaneInFlight2.dat", &m_trackData[9], &m_tracksSizes[9], &_14D17A8[9], &_14D1BD8[9], &_14D27C0[9], &_14D1FD0[9], &_14D16B8[9], NULL, NULL); if (m_trackData[10] == NULL) readTrackFile ("common:/data/paths/TracksPlaneInFlight3.dat", &m_trackData[10], &m_tracksSizes[10], &_14D17A8[10], &_14D1BD8[10], &_14D27C0[10], &_14D1FD0[10], &_14D16B8[10], NULL, NULL); if (m_trackData[11] == NULL) readTrackFile ("common:/data/paths/TracksPlaneInFlight4.dat", &m_trackData[11], &m_tracksSizes[11], &_14D17A8[11], &_14D1BD8[11], &_14D27C0[11], &_14D1FD0[11], &_14D16B8[11], NULL, NULL); } |
Итак, мы превратили почти восемьсот байтов кода в 26 более-менее понятных строчек.
Что же мы в них видим?
Видим мы в них девять массивов (для двух из них, я понял, как они должны называться, для остальных - еще нет, поэтому воспользовался адресами в памяти). Массивы заполняются данными из файлов маршрутов.
В каждом массиве 12 элементов, шесть используются для поездов (и фуникулера), шесть - для самолетов.
Размеры массивов фиксированы, поэтому, чтобы добавить дополнительные маршруты, их придется переносить внутрь .asi и править все ссылки на них.
Если все еще не очень страшно - то будет продолжение.
Offline
Да нет, в общем-то все понятно. А asi создается какой прогой? Как можно использовать данные из asi в exe?
Offline
.asi - это самая обычная .dll, только переименованная (по историческим причинам).
Создавать ее можно в любой программе, которая умеет делать .dll (VisualStudio, Delphi, ...)
PS. продолжу чуть позже, когда нужно будет сделать в работе перерыв.
Offline
Два вопроса.
1. Почему при открытии базы данных IDA не спросила путь к gtaiv.exe? Получается, если я нажму "сохранить", все изменения сохранятся - где? В файле базы данных? Вообще, что это такое - база данных IDA, и зачем это нужно? Наконец, где тут кнопка для компиляции кода, или как это правильно сказать, в общем "чтобы сделать exe обратно".
2. Это необходимо - делать asi? Ведь по идее, можно просто добавить пару новых массивов, организовать для них чтение из файла (как для существующих), и прописать ссылки на них... Поправь меня, если я ошибаюсь.
Offline