ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» X2-ASM - это проcто! | страница 2 |
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
|
AlexYar
1847 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) ![Лучший пилот вселенной Х года 2005 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X3: Reunion (+30 EGP)](/conference/images/ranks/medals/x3_mods.gif) ![Знаток Х3: Reunion (+15 EGP)](/conference/images/ranks/medals/x3_turn.gif) ![Знаток игр 2010 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток игр 2011 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Заслуженный знаток игр (+25 EGP)](/conference/images/ranks/medals/kdi_znatok.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Знаток игр 2016 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Лучший пилот вселенной Х года 2017 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Знаток игр 2017 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31503
Зарегистрирован: 26.10.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
AlexYar : |
Работу с приоритетами можно скатать с функций считывания файл-описателей из папки T.Т.е. сделать по образу и подобию.
|
Уточню. Как таковых приоритетов там нет. Просто данные обновляются. И какой файл считан последним, тот и главнее (так как он перезаписал значения предыдущего по повторяющимся адресам).
Т.е. обеспечить приоритет 00207.xml над 00007.xml проще пареной репы - просто считать его последним! Т.е. читать по такому порядку:
1. Считываем 00007.xml
2. Проверяем наличие 00207, если есть - считываем его.
3. Проверяем наличие 00307, если есть - считываем его.
4. Проверяем наличие 00407, если есть - считываем его.
5. Проверяем наличие 00507, ОПА! Нет его! Останавливаем проверки и считывания.
Аналогично игра считывает и файлы описатели из папки T, а так же каталоги *.cat/*.dat в корне игры (01,02,03,04,05 и т.д.). Т.е. берет по порядку возрастания. Если порядок нарушен (нет следующего), то больше не считывает. К примеру, если есть 01,02,03,05 , то 05 прочитан не будет. Это с cat/dat.
А с описателями из папки Т - *0001, *0002, *0003, *.0004 и т.д. Если после 70004, к примеру, идет 70006, то он считан не будет.
Но с описателями проще - там есть команда скриптредактора, которой можно принудительно в нужный момент считать любой файл-описатель, хоть 79999.xml. Поэтому описания с одного и того же адреса (page и id) можно менять хоть 10 раз в секунду. Это дает огромные возможности. К примеру - в консольных командах можно организовать индикаторы, которые будут изменяться по мере работы скрипта. К примеру - на верфях в реальном времени отображать ход выполнения работ по строительству или ремонту кораблей (типа как индикатор установки программ).
Для файлов-разметки такой команды в скриптредакторе нет, да она и не нужна. Достаточно просто считывать файлы разметки по порядку возрастания цифр в имени. А файл с самим звуком будет браться тот, какой поток указан для PAGE.
Еще раз уплотню формулировку задачи.
1. Обеспечить считывание файлов разметки в порядке возрастания цифр в имени (сперва 00007, затем 00207, затем 00307 и т.д.)
Подозреваю, что игра сама разберется, где чего обновить в своих данных.
2. Обеспечить считывание звукового dat-файла в соответсвии с номером STREAM в файле разметки. (stream2 - 00207.dat; stream3 - 003.dat и т.д.).
Но! Если в файле разметки 00207.xml будет такой текст:
<page id="101" stream="2">
<t id="1" s="0" l="2202"/>
</page>
То это значит, что из звукового файла 00207.dat проговариваться будет только текст с page 101 и ID 1. Текст с page 101 но с ID 2 должен проигрываться как и раньше, т.е. из звукового файла 00107.dat.
Это очень важно, нельзя привязывать STREAM ко всей PAGE ни в коем случае! Только сам ID должен быть привязан к номеру STREAM.
Вот и всё, никаких ненужных ограничений не будет
|
|
|
Zman
65 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
AlexYar : |
Т.е. обеспечить приоритет 00207.xml над 00007.xml проще пареной репы - просто считать его последним!
|
проблема не в алгоритме
проблема в том инструменте, который мы имеем
написать там каждую лишнюю строку правильно и отладить чтобы работало - это pain in the a$$ и потеря времени, поэтому надо идти по кратчайшему пути с минимумом кода
AlexYar : |
Т.е. читать по такому порядку:
1. Считываем 00007.xml
2. Проверяем наличие 00207, если есть - считываем его.
3. Проверяем наличие 00307, если есть - считываем его.
4. Проверяем наличие 00407, если есть - считываем его.
5. Проверяем наличие 00507, ОПА! Нет его! Останавливаем проверки и считывания.
|
во-первых откуда у нас будет несколько файлов 00х07, если ты говоришь что мод всегда один ? то есть добавится сверху один файл...
во-вторых, я предлагаю другой подход:
1) нам дали page_id, voice_sample_id
2) пытаемся играть его из 00507
3) если получилось, выходим
4) если НЕ получилось, пытаемся читать из 00407 00307 00207 00107
то есть сверху вниз по нумерации, это легче реализовать...
другими словами - использовать первый доступный файл при поиске сверху вниз
а в случае только одно дополнительного файла совсем просто - сначала читаем из 00207, если нет - то из 00107.
прочелся кусок из файла или нет - по-моему функции MOV_* возвращают результат, должно быть легко для проверки...
AlexYar : |
А с описателями из папки Т - *0001, *0002, *0003, *.0004 и т.д. Если после 70004, к примеру, идет 70006, то он считан не будет.
|
зачем нам рассматривать какие-то левые варианты, когда появляются файлы, пронумерованные не по очереди ? лишние усложнения ИМХО.
раз уж мы сами мод создаем, надо давать правильные названия файлам и проблема отпадет!
AlexYar : |
2. Обеспечить считывание звукового dat-файла в соответсвии с номером STREAM в файле разметки. (stream2 - 00207.dat; stream3 - 003.dat и т.д.).
|
после того, как я посмотрел как используется этот номер стрима внутри кода, мне все меньше хочется на него ориентироваться... при вызове всех процедур MOV_*, которые непосредственно реализованы внутри x2.exe параметр стрим - не фигурирует, его поддержки нету по всему TX_AUDIO классу, он намертво забивается в одном месте и все, так что нам придется много чего переписывать.
а если ориентироваться только на pageid/voicemessageid - это минимум исправлений.
AlexYar : |
Вот и всё, никаких ненужных ограничений не будет
|
то, что ты называешь ограничениями, я называю типизацией
но не будем вдаваться в ненужную полемику...
AlexYar : |
Ну вот 1.4 как раз у тебя и не встал. Торговые станции и Доки оборудования продаются на верфях? Миссии по вторжению ксенонов есть? На станциях доп.слоты в консоли есть?
|
все это есть и работает...
даже команда "speak text" в меню есть, а в файле xml ee нет
наверное надо для экспериментов поставить отдельную инсталляцию заново, а то побью сейвы блин...
_________________ THX2U |
|
|
Zman
65 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
AlexYar : |
Просто у тебя недостаточно информации по устройству игры.
|
ну тут все не сложнее, чем в других местах, например в Riven
_________________ THX2U |
|
|
AlexYar
1847 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) ![Лучший пилот вселенной Х года 2005 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X3: Reunion (+30 EGP)](/conference/images/ranks/medals/x3_mods.gif) ![Знаток Х3: Reunion (+15 EGP)](/conference/images/ranks/medals/x3_turn.gif) ![Знаток игр 2010 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток игр 2011 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Заслуженный знаток игр (+25 EGP)](/conference/images/ranks/medals/kdi_znatok.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Знаток игр 2016 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Лучший пилот вселенной Х года 2017 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Знаток игр 2017 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31503
Зарегистрирован: 26.10.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zman : |
во-первых откуда у нас будет несколько файлов 00х07, если ты говоришь что мод всегда один ?
|
А ты не думаешь, что моддеры иногда делают патчи для своих модов? И даже если в основной версии был файл озвучки на 5 мегабайт, то в следующем патче для добавления всего одного звучка требование заново закидывать в инет 5 мегабайт по модему как-то не улыбает А людям не улыбает скачивать лишние 5 мег.
Zman : |
4) если НЕ получилось, пытаемся читать из 00407 00307 00207 00107
то есть сверху вниз по нумерации, это легче реализовать...другими словами - использовать первый доступный файл при поиске сверху вниз
|
А где смысл так усложнять, если можно прочесть сразу нужный файл по номеру stream? Т.е. зачем воротить поиск и перебор, если stream нам прямо указывает на нужный файл?
Zman : |
а если ориентироваться только на pageid/voicemessageid - это минимум исправлений.
|
И минимум возможностей для моддера. Смысл тогда делать эту фичу, если она выстроит сразу кучу стен вокруг себя?
Уж лучше напрячь мозги, потрудиться, но родить полнофункциональную вещь. Пусть даже на это уйдет много времени (куда нам торопиться?)
Zman : |
наверное надо для экспериментов поставить отдельную инсталляцию заново, а то побью сейвы блин...
|
Ну, это надо было сделать в первую очередь. Лично у меня 5 папок с разными х2 И то приходится периодически ставить заново оригинальную игру, так как по запарке частенько перезаписываешь оригинальные файлы моженными (вкладку в файл менеджере перепутать легко).
|
|
|
Himmel
80 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 15 Сообщения: 77 Откуда: Family Pride Зарегистрирован: 28.11.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
AlexYar : |
К видеокартинке "нуаз" добавляется (помеха), это точно. А чтобы к голосу звук - не замечал ни разу (даже сам хотел приделать).
|
Вот это легко услышать, если в 000xx.xml поставить для page 1271 stream=2. Одни только sfx включения/выключения и останутся.
Zman : |
... я предлагаю другой подход:
1) нам дали page_id, voice_sample_id...
... использовать первый доступный файл при поиске сверху вниз
|
Можно использовать и такой подход, он, к тому же, должен быстрее обрабатываться, т.к. при прямом порядке, даже если файл найден, нужно проверять все последующие.
AlexYar : |
А где смысл так усложнять, если можно прочесть сразу нужный файл по номеру stream?
|
Так ведь изначально неизвестно, какой stream нам нужен, в SpeakText говорится Page и ID, вот и просматриваем xml-ы до первого совпадения Page/ID, тут уже берем stream и нужный dat.
|
|
|
AlexYar
1847 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) ![Лучший пилот вселенной Х года 2005 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X3: Reunion (+30 EGP)](/conference/images/ranks/medals/x3_mods.gif) ![Знаток Х3: Reunion (+15 EGP)](/conference/images/ranks/medals/x3_turn.gif) ![Знаток игр 2010 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток игр 2011 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Заслуженный знаток игр (+25 EGP)](/conference/images/ranks/medals/kdi_znatok.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Знаток игр 2016 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Лучший пилот вселенной Х года 2017 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Знаток игр 2017 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31503
Зарегистрирован: 26.10.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Himmel : |
Так ведь изначально неизвестно, какой stream нам нужен, в SpeakText говорится Page и ID, вот и просматриваем xml-ы до первого совпадения Page/ID, тут уже берем stream и нужный dat.
|
Ды не просматриваем мы хмл-ы вообще, так как игра их только один раз грузит при старте новой игры или загрузке сохраненки!
Т.е. они всегда в памяти находятся, соот-но игре сразу известно, какому ИД с нужной страницы соответсвует какой стрим.
Поэтому при работе команды СпикТекст игры сама знает, какой стрим смотреть.
Ты же сам это подтвердил правкой хмл-ника. Т.е. игра уже умеет отличать стримы друг от друга, осталось только научить её смотреть звуковые дат-ы, соответсвующие этим стримам.
Если Шадди смог научить игру писать хмл-ники и искать нужные файлы, то мне слабо верится, что с реализацией своей озвучки могут быть какие-то трудности.
Вобщем, подождем что скажет CheckerTwo, а то мы уже тут много наговорили, а работа стоит.
|
|
|
Himmel
80 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 15 Сообщения: 77 Откуда: Family Pride Зарегистрирован: 28.11.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
Ок, понятно.
А как хранятся загруженные указатели? Там stream для каждого ID прописан или для PAGE ? (Это для реализации того, о чем ты и сам говорил - в 00NXX.xml только те ID, которые изменены в существующей странице.)
|
|
|
CheckerTwo
550 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) ![Автор программы под Х3: Reunion (+25 EGP)](/conference/images/ranks/medals/x3_prog.gif) Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zman : |
основная проблема в том, что у тебя везде идет работа с текущим указателем стека, отсюда появляются такие несуразности как
Код: |
...
push 0
push SP[5] ; arg2
push SP[5] ; arg1
push 2
create_array
push 2
...
|
то есть пушится тот же самый аргумент, а на самом деле разные переменные...
|
Не понял. Что значит - "везде идет работа с текущим указателем стека"? А с чем, по-твоему, работает стековая машина? Какие же тут несуразности? Вон даже комментарии написаны - вытаскиваются разные аргументы функции. Ты про стековые машины слышал? Я не понял. Честно. Это не у меня проблема. Это компилятор ES-КС генреит такой код для виртуальной машины.
Zman : |
а вот как в полноценном (это не наезд! ) дизасме выглядит :
...
то есть при входе в новую функцию указатель стека замораживается в EBP и потом от него легче плясать, а так у тебя в каждой новой строке - новое смещение непонятно куда... слишком много надо держать в голове, в итоге "за деревьями леса не видно"
это просто мысли вслух, я понимаю, что такое написать - надо отдельно помучиться... но мы бы все выиграли, имея более удобный инструмент...
|
Zman : |
проблема не в алгоритме
проблема в том инструменте, который мы имеем
написать там каждую лишнюю строку правильно и отладить чтобы работало - это pain in the a$$ и потеря времени, поэтому надо идти по кратчайшему пути с минимумом кода
|
Ты бы почитал топик Shaddie. http://www.elite-games.ru/conference/viewtopic.php?t=23632
Он делал патчи obj-а HEX-редактором. А тут все какие-то все стоны. Тут не так, это не эдак. Это что, нынче вижуал-среда так разлагает что ли?
То, что у нас инструменты еще не совсем те, какие хотелось бы - это ты правильно заметил. Имеешь право. Ну так взялся бы и сделал какой-нибудь язычек высокого уровня для obj-файлов. Тока без обид. Это я так, шутейно отбиваюсь...
Хех. Для полноценных процессоров существуют не только полноценные дизассемблеры, но и документации на систему команд и полноценные компиляторы и отладчики. Что есть у нас? Засекреченная ES-ом инфа о КС, неизвестная система команд некоей виртуальной стековой машины, полное отсутствие документации на стандартные системные функции и подсистему поддержки функционирования патчей. До сих пор часть команд этой стековой машины до конца непонятна или остается на уровне догадок. Вот ты говоришь - хорошо знаешь ассемблер. Замечательно. Вот бы помог разобраться с движком игрухи. Там белых пятен - куда ни плюнь.
В полноценном процессоре есть регистр ВР. В стековой машине он разве есть? Попроси ES, что бы они ввели в систему команд работу с переменными через базовый указатель, а я тебе напишу асм/дизассемблер, как ты хочешь, т.е. с относительной адресацией. Или ты предлагаешь ассемблеру пытаться вычислить текущий стек? Так это невозможно по причине того, что информация о нем недоступна на момент трансляции патча. Смотри - кусок патча Shaddie:
Код: |
; Устанавливаем счетчик команд на адрес
; значения 5000 в WareTypeBestStoreOfResource
$ = 000096C6h
.if StoreFactor > 7FFFh
jump WriteStoreFactor_2
.else
push StoreFactor
mov SP[6],SP[0]
.endif
|
Он правит obj поверх живого кода. Какой тут текущий и базовый адрес стека? Как ассемблеру узнать что это такое SP[6]? И если я напишу конструкцию вида mov tmp1,sp[0], то откуда ассемблер получит инфу о BP и SP? Предложи вариант алгоритма.
Этот ассемблер задумывался как маленький утиль к программе добавления кораблей. Т.е. для поддержки маленьких патчей. Ну никак не для полной трансляции
То, что файлы, сгенеренные дизассемблером не транслируются - я знаю. И ограниченная длина строки - это не самая страшная причина этого. Что ж ты думаешь я не пробовал транслировать сгенеренные дизассемблером файлы, что ль? Основная причина невозможности перетрансляции - полное отсутствие представления работы механизма поддержки патчей в obj-файлах. И, кстати, по этой же причине невозможно полноценное и однозначное дизассемблирование obj-ей. Т.е. 100% нельзя сказать отработается конкретный кусок кода или нет. После того, как недавно ввел в дизассемблер трассировщик команд, стало немного понятнее - т.е. там где прошелся трассировщик и проставил значения текущего стека - этот код скорее всего доступен для игрухи. Но не факт.
AlexYar : |
Вобщем, подождем что скажет CheckerTwo, а то мы уже тут много наговорили, а работа стоит.
|
Ни в коем случае! Если каждый раз ждать Чекера, работа вообще не сдвинется с места. У меня проблемы на работе. Времени - только по ночам. Если чего в утиле поправить-подравнять - это сделаю.
Так что находите компромиссы и двигайте. По внутренним потрохам obj-ей лучше всех разбирается Shaddie. У меня довольно поверхностное представление.
Zman - респект. Давай копай и глубже!
|
|
|
AlexYar
1847 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) ![Лучший пилот вселенной Х года 2005 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X3: Reunion (+30 EGP)](/conference/images/ranks/medals/x3_mods.gif) ![Знаток Х3: Reunion (+15 EGP)](/conference/images/ranks/medals/x3_turn.gif) ![Знаток игр 2010 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток игр 2011 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Заслуженный знаток игр (+25 EGP)](/conference/images/ranks/medals/kdi_znatok.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Знаток игр 2016 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Лучший пилот вселенной Х года 2017 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Знаток игр 2017 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31503
Зарегистрирован: 26.10.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Himmel : |
А как хранятся загруженные указатели? Там stream для каждого ID прописан или для PAGE ?
|
А это надо у программеров спросить. Если стрим хранится только для всей page в целом - то это попа Ну в крайнем случае тогда сделать хоть так чтобы работало.
Но то что Zman предлагал (для фиксированных page) - вообще не подходит, так как никакой старой озвучки поменять будет невозможно, и озвучку к новым секторам сделать будет тоже невозможно, да и вообще ничего путного сделать будет невозможно.
Не должна новая озвучка ничем ограничиваться. Смысл тогда вообще какой от этой работы будет?
|
|
|
CheckerTwo
550 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) ![Автор программы под Х3: Reunion (+25 EGP)](/conference/images/ranks/medals/x3_prog.gif) Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Меня вот настараживают функции работы со звуковым файлом. Надо бы проанализировать реальную возможность такого патча. Дело в том, что вызовы функций MOV_GetVoiceLength, MOV_GetVoiceStream, MOV_GetVoiceStart вообще не используют вычисляемый (в функции SetVoicestream1) номер звукового файла. Что из этого может следовать? Эти функции, используя значение SFX_GetLanguage, сами вычисляют номер файла? Если это так, то подменить номер звукового файла можно будет только переключением на "левый язык"...
|
|
|
AlexYar
1847 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) ![Лучший пилот вселенной Х года 2005 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X3: Reunion (+30 EGP)](/conference/images/ranks/medals/x3_mods.gif) ![Знаток Х3: Reunion (+15 EGP)](/conference/images/ranks/medals/x3_turn.gif) ![Знаток игр 2010 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток игр 2011 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Заслуженный знаток игр (+25 EGP)](/conference/images/ranks/medals/kdi_znatok.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Знаток игр 2016 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Лучший пилот вселенной Х года 2017 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Знаток игр 2017 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31503
Зарегистрирован: 26.10.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Я знаю, где может скрываться ответ на наш вопрос. Гляньте ХБТФ, там второй стрим игра использует вместе с первым
|
|
|
Zman
65 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
CheckerTwo : |
Меня вот настараживают функции работы со звуковым файлом. Надо бы проанализировать реальную возможность такого патча. Дело в том, что вызовы функций MOV_GetVoiceLength, MOV_GetVoiceStream, MOV_GetVoiceStart вообще не используют вычисляемый (в функции SetVoicestream1) номер звукового файла. Что из этого может следовать? Эти функции, используя значение SFX_GetLanguage, сами вычисляют номер файла? Если это так, то подменить номер звукового файла можно будет только переключением на "левый язык"...
|
ты прав, есть такое подозрение (см. ниже исходник)
но я уже придумал способ как это все проверить
на днях сделаю и мы будем знать точно что делается внутри этих функций, то есть какие файлы открываются при задании конкретных входных параметров
AlexYar : |
(для фиксированных page) - вообще не подходит, так как никакой старой озвучки поменять будет невозможно
|
пару дней назад в моем представлении было то, что мы хотим создавать новые файлы, а не менять старые звуки. Теперь картина более ясная, будем думать... по прежнему я прошу всех всказываться здесь открыто
AlexYar : |
Если стрим хранится только для всей page в целом - то это попа
|
попа еще глубже, чем ты думаешь
см. внизу исходник
CheckerTwo : |
Что значит - "везде идет работа с текущим указателем стека"? А с чем, по-твоему, работает стековая машина? Какие же тут несуразности? Вон даже комментарии написаны - вытаскиваются разные аргументы функции. Ты про стековые машины слышал? Я не понял. Честно. Это не у меня проблема. Это компилятор ES-КС генреит такой код для виртуальной машины.
|
как оно работает я понимаю, я говорил о этом, чтобы при генерации исзодника в дизасме попытаться это записывать в другом виде, более приемлемом для чтения, нечто похоже на кусок, что я приводил (с BP)
BP регистра нет, но в теории мы можем его виртуально создавать и генерить текст под него, как будто он есть . То есть при входе в новую функцию он равен 0, относительно него идут локальные переменные или параметры из вызывающей функции... а при компиляции делать обратный процесс...
мне как раз бы хотелось видеть компилятор для целого файла, а не для патчей, тогда отпадет махохизм с абсолютными адресами и "правкой по живому"
Ладно, я понял, что ты это делать не будешь , имеешь право!
и так уже огромная работа проведена, я это хорошо понимаю и всем респект однозначный...
тогда просьба по минимуму - напиши сюда табличку как выглядит стек при входе в функцию и когда выделяем локальные переменные, а то я все сомневаюсь каждый раз правильно ли я все понимаю
AlexYar : |
Ды не просматриваем мы хмл-ы вообще, так как игра их только один раз грузит при старте новой игры или загрузке сохраненки
|
откуда такая уверенность ? когда ты выполняешь команду speak text, тогда и грузится, каждый раз! смотри исходник внизу...
CheckerTwo : |
Ну так взялся бы и сделал какой-нибудь язычек высокого уровня для obj-файлов
|
нефиг делать
я сегодня переставил все с 0, поставил all-in-one + english pack.
нашлись недостающие команды, также код в x2story.obj действительно другой (хотя куски от старого кода там видны! они тоже поверх затирают )
ок, вот вам на языке высокого уровня код интересующей нас функции:
AlexYar, Himmel, CheckerTwo, Shaddie - можете посмотреть и делать выводы о порядке загрузки файлов. Однозначный вывод что стрим на мало поможет.предлагайте ваши вариант (у меня уже есть наметки, но пока рано говорить)...
Код: |
//;================================================================================
function TX_AUDIO.SpeakWithPriorityAndNoise( Arg1, Arg2, Arg3, Arg4 );
Arg1 = page id,
Arg2 = sample id,
Arg3 = priority,
Arg4 = 1-> with noise, 0 -> w/o noise
if TCLIENT.GetKilled <> 0 then Exit;
L00001758: if (Arg1 <> -1) and (Arg2<>0) then goto L000017A8;
L00001780:
L00001782:
//--
Loc1 := MOV_GetVoiceLength( SFX_GetLanguage(), Arg1, Arg2 );
L000017A8: if TX_AUDIO.current_speak_sample >= 0 then goto L00001806;
L000017B8: if TX_AUDIO.current_speak_sample >= 0 then goto L00001802;
TI_Delay(1);
Loc2 := Loc2+1;
if Loc2 - 1 <= 15 then goto L000017FC;
Loc1 := 0;
Exit;
L000017FC: // ? L000017B8
L00001802:
L00001806: if TX_AUDIO.current_speak_sample <= 0 then goto L000018BA;
if TX_AUDIO.current_speak_prio > Arg3 then goto L000018BA;
TX_AUDIO.current_speak_sample := -1;
TI_Interrupt(1);
if TX_AUDIO.current_voicestream = 0 then goto L00001858;
MOV_StopMovie( TX_AUDIO.current_voicestream );
L00001858: if TX_AUDIO.current_speak_sample <> -1 then goto L000018A0;
TI_Delay(1);
Loc3 := Loc3 + 1;
if Loc3 - 1 <= 10 then goto L0000189A;
TX_AUDIO.current_speak_sample := 0;
L0000189A: goto L00001858;
L000018A0: goto L000018BA;
L000018AA:
Loc1 := 0;
Exit;
L000018BA:
TX_AUDIO.current_speak_sample := Arg2;
TX_AUDIO.current_speak_page := Arg1;
TX_AUDIO.current_speak_prio := Arg3;
if (Arg1 <> 0) or (Arg2 <> 0) then goto L0000192E
L000018FC:
L000018FE: //--
TX_AUDIO.current_voicestream := 0;
TMONITORCONTROL.StopSubTitleText();
Loc1 := 0;
Exit;
L0000192E: if Loc1 < 0 then goto L000019A8;
TX_AUDIO.current_voicestream := TX_AUDIO.voicestreams[ MOV_GetVoiceStream( SFX_GetLanguage(), Arg1 ) ];
Loc2 := MOV_GetVoiceStart( SFX_GetLanguage(), Arg1, Arg2 );
Loc3 := Loc2 + MOV_GetVoiceLength( SFX_GetLanguage() );
// Loc2 = start of message, Loc3 = end of message, not length!
goto L000019FE;
L000019A8:
TX_AUDIO.current_voicestream := 0;
SE_ReadText( Arg1, Arg2 );
if Loc4 = 0 then goto L000019F0;
Loc2 := 0;
Loc3 := SE_StringLen( Loc4 ) * 100;
goto L000019FA;
L000019F0:
Loc2 := -1;
L000019FA:
L000019FE: if Loc2 < 0 then goto L00001E60;
if TX_AUDIO.current_speak_page <> 1271 then goto L00001A32;
if (Arg4 and 1) = 0 then goto L00001B10; // skip noise
L00001A32:
L00001A34: //
if TX_AUDIO.au_IdleFaceState > 1 then goto L00001B10; // skip noise
L00001A50:
L00001A52: // go, skip noise
// play noise here
// play random 3 noises
L00001A70: // skipped
L00001A92:
L00001AB4:
L00001ADC:
L00001AF0:
L00001B0E:
L00001B10:
// what is the speech script???
L00001B66: if ( TX_AUDIO.current_speak_sample <> Arg2) or
( TX_AUDIO.current_speak_page <> Arg1) then goto L00001CDC;
L00001B8E:
L00001B90: //--
if (Arg1=0) and (Arg2=0) then goto L00001BDA;
L00001BBA:
L00001BBC: //--
if TX_AUDIO.current_speak_prio <= -50 then goto L00001C2C;
L00001BDA:
L00001BDC:
if (TCLIENT.GetGameFeatures() and 00020000h) <> 0 then goto L00001C28;
// skip subtitles
TMONITORCONTROL.ShowSubTitleText( arg1, arg2, arg4, arg3 );
L00001C28:
L00001C2C: if TX_AUDIO.current_voicestream = 0 then goto L00001C64;
if MOV_PlayMovieVoice( TX_AUDIO.current_voicestream, SFX_GetLanguage(), Arg1, Arg2 ) = 0 then goto L00001C64;
L00001C64:
L00001C66:
// got here if stream=0 or MOV_PlayMovieVoice() <> 0
if (Arg1=0) and (Arg2=0) then goto L00001CDC;
L00001C90:
L00001C92: //--
if SP_Speak( SE_ReadText( Arg1, Arg2 ) ) <> 0 then goto L00001CDC;
Loc3 := Loc2 + 1;
TI_WaitForInterrupt( Loc3 - Loc2, 1 );
L00001CDC: if (TX_AUDIO.current_speak_sample = Arg2) and
(TX_AUDIO.current_speak_page = Arg1) then goto L00001D32;
L00001D04:
L00001D06: //--
TX_AUDIO.current_speak_sample := 0;
TX_AUDIO.current_speak_page := 0;
Loc1 := 0;
Exit;
L00001D32: if not (TX_AUDIO.current_speak_page = 1271) and
((Arg4 and 1)<>0) and (TX_AUDIO.au_IdleFaceState=0) then goto L00001E60;
// skip noise
L00001D58:
L00001D5A:
L00001D76:
L00001D78:
case SE_Random(4) of
L00001D96: 1: SFX_PlaySample( 930, 0, 0, 250, 10, 64 );
goto L00001E5E
L00001DB8: 2: SFX_PlaySample( 931, 0, 0, 250, 10, 64 );
goto L00001E5E
L00001DDA: 3: SFX_PlaySample( 932, 0, 0, 250, 10, 64 );
goto L00001E5E
L00001DFC: 4: SFX_PlaySample( 933, 0, 0, 250, 10, 64 );
goto L00001E5E
L00001E24:
L00001E38: // case 0..4
end; // case
L00001E5E:
L00001E60:
TX_AUDIO.current_speak_sample := 0;
TX_AUDIO.current_speak_page := 0;
Loc1 := 1;
Exit; // finally :-)
|
_________________ THX2U |
|
|
Zman
65 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
пояснения:
эта функция одна из двух, ктоторые используются всеми скриптами для вывода голоса.
сразу после метки L0000192E идет загрузка параметров сообщения из файла mov\000LL.xml
(то есть данные о начале и длине нашего сообщения в файле .дат)
как видите стрим не используется при нахождении этих данных!
именно поэтому имя файла может быть только одним: mov\000LL.xml
if TX_AUDIO.current_speak_page <> 1271 это проверка на номер страницы 1271 (сообщения внутри станции типа Welcome to the station)
непосредственно загрузка и проигрыш сообщения - сразу после метки L00001C2C
здесь стрим используется как параметр, но нет уверенности как он внутри отрабатывается, это я собираюсь проверять
все остальное - проверки, обрывание текущего сообщения, играть или не играть щелчки до/после сообщения итд.
вот в таком аспекте
_________________ THX2U |
|
|
AlexYar
1847 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) ![Лучший пилот вселенной Х года 2005 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X3: Reunion (+30 EGP)](/conference/images/ranks/medals/x3_mods.gif) ![Знаток Х3: Reunion (+15 EGP)](/conference/images/ranks/medals/x3_turn.gif) ![Знаток игр 2010 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток игр 2011 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Заслуженный знаток игр (+25 EGP)](/conference/images/ranks/medals/kdi_znatok.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Знаток игр 2016 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Лучший пилот вселенной Х года 2017 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Знаток игр 2017 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31503
Зарегистрирован: 26.10.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zman : |
можете посмотреть и делать выводы о порядке загрузки файлов.
|
Шутки у тебя дураЦЦкие Лично мне этот код как китайский язык.
Я вот думаю, а если просто создать новую команду скриптредактора Speak Text, которой добавить аргумент - "номер стрима", а в команде сделать его обработку в месте составления имени файла. Так будет проще?
Т.е. если аргумент STREAM = 4 , значит читать данное сообщение надо из 00407.xml и 00407.dat. Если null, значит 00007 и 00107 соотвественно (т.е. стандарт).
|
|
|
Zman
65 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
AlexYar : |
Лично мне этот код как китайский язык.
|
теперь понимаешь каково это все на асме читать, тем более "в hex править по живому" ? ( шепотом про Shaddie )
ладно, вычеркиваем тебя из списка
AlexYar : |
Я вот думаю, а если просто создать новую команду скриптредактора Speak Text, которой добавить аргумент - "номер стрима", а в команде сделать его обработку в месте составления имени файла. Так будет проще?
|
1) я думаю это будет намного сложнее...
2) мне пока неизвестно как связаны команды в скриптах с их обработчиками в x2story.obj... создать новую команду и прописать ее в 440001.xml это ясно, а где в x2story её прописывать ? ткните носом, я уверен что тут уже пробегало, но искать влом
3) мне бы хотелось чтобы одной и той же старой командой можно было играть дополнительные звуки, а не отдельной... так совместимость лучше будет
AlexYar : |
Если null, значит 00007 и 00107 соотвественно (т.е. стандарт).
|
стандарт - 1
кстати говоря есть одна потенциальная проблема!
допустим мы решили проблему, можно добавлять свои файлы, как ты говоришь несколько патчей на свой мод
допустим мы дошли до 9 го файла, получаем на русском языке
mov\00907.dat
проблема в том, что такой файл уже есть, видимо там кат-сцены для игры забиты. придется тогда ограничится 008LL.dat 008LL.xml
вообщем мое предложение по алгоритму в силе (с учетом ограничения до 8) -
1) x=8
2) пробовать читать mov\00xLL.xml
3) если успешно, перейти на 5)
4) х-1, перейти на 2)
5) читать из mov\00xLL.dat
6) проиграть звук
это конечно все при условии, что это можно реализовать
но это уже дело техники...
_________________ THX2U |
|
|
AlexYar
1847 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) ![Лучший пилот вселенной Х года 2005 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X3: Reunion (+30 EGP)](/conference/images/ranks/medals/x3_mods.gif) ![Знаток Х3: Reunion (+15 EGP)](/conference/images/ranks/medals/x3_turn.gif) ![Знаток игр 2010 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток игр 2011 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Заслуженный знаток игр (+25 EGP)](/conference/images/ranks/medals/kdi_znatok.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Знаток игр 2016 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Лучший пилот вселенной Х года 2017 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Знаток игр 2017 года (+50 EGP)](/conference/images/ranks/medals/kdi_znatok_god.png) ![Знаток Elite: Dangerous (+15 EGP)](/conference/images/ranks/medals/ed_expert.png) Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31503
Зарегистрирован: 26.10.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zman : |
1) я думаю это будет намного сложнее...
|
Зато намного универсальнее Можно будет из одного скрипта по одному page и id проигрывать несколько вариантов озвучки.
Zman : |
2) мне пока неизвестно как связаны команды в скриптах с их обработчиками в x2story.obj... создать новую команду и прописать ее в 440001.xml это ясно, а где в x2story её прописывать ? ткните носом, я уверен что тут уже пробегало, но искать влом
|
Тема "Добавляем новые команды скриптредактора". В первом сообщении темы куча примеров. Добавлена 31 новая команда и еще несколько фич.
Zman : |
3) мне бы хотелось чтобы одной и той же старой командой можно было играть дополнительные звуки, а не отдельной... так совместимость лучше будет
|
Неа. Так совестимость наоборот сильно пострадает, так как изменится формат и назначение команды. Это повлечет баги сразу во всех скриптах и обж-миссиях, которые используют старую команду.
Я в курсе. Но null забить в редакторе скриптов - одна кнопка, тогда как единицу вбить - несколько меню надо пролопатить.
Привычка у меня такой - на два шага веперёд смотреть
Zman : |
mov\00907.dat
проблема в том, что такой файл уже есть, видимо там кат-сцены для игры забиты. придется тогда ограничится 008LL.dat 008LL.xml
|
Что мешает не добавлять в начало файла два нуля? Пусть новая озвучка будет не в 00207, а в 207.xml и 207.dat
Вот тебе и обход ограничений. Можно добавлять хоть до 12345678907.dat
Zman : |
вообщем мое предложение по алгоритму в силе (с учетом ограничения до 8) -
1) x=82) пробовать читать mov\00xLL.xml3) если успешно, перейти на 5)4) х-1, перейти на 2)
5) читать из mov\00xLL.dat6) проиграть звук
|
Такой метод считывания на порядки занимает больше времени, чем предложенный мной - напрямую в команде "спик текст" указывать номер стрима, либо вообще сразу номер файла. Во! И никаких лишних пассов игре делать не придется
|
|
|
Zman
65 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
AlexYar, я твой подход понял
хочется всего и сразу много, и чтобы было универсально и при этом совместимо со всем старым . При этом ты совершенно забываешь, что мы в тех рамках, которые наложены движком и всей внутренней организацией этой системы. Вот например:
AlexYar : |
Что мешает не добавлять в начало файла два нуля? Пусть новая озвучка будет не в 00207, а в 207.xml и 207.dat
Вот тебе и обход ограничений. Можно добавлять хоть до 12345678907.dat
|
ограничение в том, что в движок передается число, например 207, движок открывает этот файл, при этом используется форматирование строки по шаблону "%05d", для не-программистов перевожу:
десятичное представление числа из 5-ти позиций с лидирующими нулями.
то есть из 207 будет строка "00207"
отсюда и все файлы по типу ххххх.xml
или ты и x2.exe хочешь править ?
нет, ну я конечно и это тоже могу, но если идти таким путем, будет лучше заново новую игру написать и "ничем себя не ограничивать", при этом избавить себя же от мазохизма
так что давай поближе к земле летай...
AlexYar : |
напрямую в команде "спик текст" указывать номер стрима, либо вообще сразу номер файла. Во! И никаких лишних пассов игре делать не придется
|
вот исходник не смотришь, а такие заявления делаешь
нельзя сделать простыми средствами так, чтобы сохранить все старое нетронутым и совемстимым, при этом добавить универсальные новые возможности, чем-то придется жертвовать...
вообщем я твою точку зрения уже понял, спорить дальше не вижу смысла.
сначала я проверю кое-что, соберу еще инфы, после этого сообщу новости.
некоторое время меня не будет.
другие предложения/соображения по алгоритмам есть у кого ?
P.S. исправил формат - на самом деле конечно же "%05d.xml", по запарке написал...
_________________ THX2U |
|
|
Himmel
80 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 15 Сообщения: 77 Откуда: Family Pride Зарегистрирован: 28.11.2005
![Вы не можете голосовать](images/tool_cool.gif) |
|
Только не смейтесь...
Смотрите, шум добавляется для Page 1271 или по Arg4. Но что-то я не помню, чтобы что-то пищало в прочих сообщениях, кроме Page 1271. Есть ли способ использовать Arg4 для номера stream в TX_AUDIO.SpeakWithPriorityAndNoise, переписав функцию ?
Или...
Есть ли возможность организовать (т.е. научить его понимать) пусть даже единственный 000NN.xml подобным образом (уж его-то можно в мод запихать, он весит-то всего ничего):
<page id="119">
<stream="1">
<t id="1" s="134719" l="14341"/>
<t id="3" s="149560" l="9840"/>
</stream>
<stream=2>
<t id="2" s="159900" l="14352"/>
</stream>
</page>
Тогда и 000XX.xml один останется, и для любого набора сообщений из Page можно произвольный stream взять. А 8 стримов - вполне разумное число...
P.S. XBTF у меня уже нет, а вот в XT 00244.dat использовался для Intro, и только.
|
|
|
CheckerTwo
550 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) ![Автор программы под Х3: Reunion (+25 EGP)](/conference/images/ranks/medals/x3_prog.gif) Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Zman : |
BP регистра нет, но в теории мы можем его виртуально создавать и генерить текст под него, как будто он есть . То есть при входе в новую функцию он равен 0, относительно него идут локальные переменные или параметры из вызывающей функции... а при компиляции делать обратный процесс...
|
Не получится.
Ну т.е. при дизассемблировании это сделать можно - уже примерно так и сделано ужо. А для компиляции не получится.
Zman : |
мне как раз бы хотелось видеть компилятор для целого файла, а не для патчей, тогда отпадет махохизм с абсолютными адресами и "правкой по живому"
|
Пока не разобрали по косточкам, как работают патчи, не получится. Да я же не против того, чтоб иметь полноценный инструмент. Я же то ж не мазохист.
Zman : |
Ладно, я понял, что ты это делать не будешь ,
|
Вот прям сейчас - не буду. Потому что 1.информации мало 2.времени свободного тоже мало.
Zman : |
имеешь право! и так уже огромная работа проведена, я это хорошо понимаю и всем респект однозначный...
|
Извини, если обидел.
Zman : |
тогда просьба по минимуму - напиши сюда табличку как выглядит стек при входе в функцию и когда выделяем локальные переменные, а то я все сомневаюсь каждый раз правильно ли я все понимаю
|
Фактически, 99% команд могут работать исключительно только с данными на вершине стека. Исключением являются, пожалуй, только 2 команды - mov sp[N],sp[0] и push sp[N]. На какой глубине находится нужная тебе локальная переменная - нужно следить самому. Как там Shaddie разбирается в скриптах - я до сих пор не понял.
Вот к примеру есть вызов функции:
Код: |
push <str> ; строка - сообщение
push <val> ; число
push 2 ; число параметров
call58 global.OutText ;
pop
|
Внутри этой функции OutText стек будет представляться следующим образом:
SP[0] - адрес возврата из функции
SP[1] - 2d - число параметров функции
SP[2] - первый параметр функции
SP[3] - второй параметр функции
Далее, OutText начинается командой setmem. Эта команда стек не трогает, она говорит интерпретатору, что данная функция будет использовать стек вот такой глубины под локальные переменные. Возможно по этой команде интерпритатор резервирует память под стек. Точнее не "под локальные переменные", а максимально возможный стек, используемый функцией. Ведь в стековой машине вся работа ведется на вершине стека, а это - сплошь временные переменные - копии локальных. Ну и все. Далее push-ами устанавливаешь началные значения локальных переменных. В нужный момент их копию вытаскиваешь наверх, или сохраняешь их. Для всех команд есть простое правило: команды, сохраняющие значение в стеке, сначала инкрементируют указатель стека, затем записывают в стек значение. Команды, которые вытаскивают из стека число, сначала читают его из стека, задем делают декремент указателя стека. Вроде так. На бумажке разлиновал текущий стек - и пошел...
Zman : |
CheckerTwo : |
Ну так взялся бы и сделал какой-нибудь язычек высокого уровня для obj-файлов
|
нефиг делать
|
Че, серьезно что ль? Ну если так, то надо формировать список требований к языку. Ежели чего - мы тут поможем... советом...
|
|
|
Zman
65 EGP
![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006
![Вы не можете голосовать](images/tool_cool.gif) |
|
CheckerTwo : |
Пока не разобрали по косточкам, как работают патчи, не получится.
|
есть у меня одна мысль по поводу патчей, но нету времени проверять (надо опять все переставлять)
если кто-то хочет помочь, плиз помогите, доступно даже для НЕпрограммистов !
нужно сделать следующее:
1) установить с нуля в чистое место версию 1.0 US
2) диазссемблировать x2story.obj в x2story.asm
3) скопировать x2story.asm как x2story10.asm, x2story.pat как x2story10.pat
4) запустить патч x2patch11_US.exe
5) НЕ ЗАПУСКАТЬ ИГРУ!!!
6) диазссемблировать x2story.obj в x2story.asm
7) скопировать x2story.asm в x2story11_norun.asm, x2story.pat как x2story11_norun.pat
8) запустить игру, начать новую игру и выйти
9) диазссемблировать x2story.obj в x2story.asm
а) скопировать x2story.asm в x2story11_run.asm, x2story.pat как x2story11_run.pat
если я ошибся с расширением .pat - то найдите нужный выходной файл, там сегмент PTCH сохраняется, внутри два столбика цифр
в результате получится 6 файлов:
x2story10.asm
x2story11_norun.asm
x2story11_run.asm
x2story10.pat
x2story11_norun.pat
x2story11_run.pat
теперь если есть желание поковыряться глубже самим:
внутри сегмента PTCH имеется массив по два числа
number1 | number2
....
итд
я быстренько посмотрел эти цифры и мой предварительный вывод такой:
number1 - абсолютный адрес в старом файле x2story.obj, в сегменте кода
number2 - абсолютный адрес в новом файле, после приложения патча
смысл этого массива скорее всего такой - допустим был старый код:
Код: |
L000005:
push 1
push 2
call some_function
if SP[0]<>0 then jump L000005
|
потом в новой версии x2story.obj они дописали какие-то куски кода, допустим вот так:
Код: |
push 0
pop
L000005:
push 1
push 2
call some_function
if SP[0]<>0 then jump L000005
|
то есть смещение метки L0000005 увеличилось, потому что код разросся!
я думаю первое число - это адреса меток переходов в старом файле.
если перекомпилировать весь исходник, то L000005 автоматически будет уже по адресу 00000009 (добавлено две команды по два байта = +4), для чего же тогда второе число ?
второе число - это смещение этой же метки в новом файле, то есть смещенное на +4 в нашем примере
вопрос - зачем это нужно, если при копиляции всего файла все автоматом сместится ?
единственное логическое объяснение у меня - это то, что те строки, которые ссылались на эту метку, НЕ ОБНОВЛЯЮТСЯ АВТОМАТОМ.
то есть последняя строка в примере jump L00000005 по прежнему ссылается на старый абсолютный адрес 0000005. И я думаю что приложение патча состоит в том, чтобы пройтись по старому файлу, найти ссылки на этот адрес и поменять их на новый, то есть с 00005 на 00009 в нашем примере.
логики никакой, но ИМХО это похоже на правду, анализ чисел об этом говорит...
ЛИБО!!, это адреса начала функций, на которые есть ссылка где-то еще, то есть ранее они были по первому адресу, теперь по второму. Когда пропатченная игра запускается первый раз, этот массив просматривается по одному и ссылки на старые адреса замещаются новыми. Это может быть и не в x2story.obj, а где-то еще... короче там, где раньше использовались старые значения.
патч всегда делается один раз, потом только стоит проверка на версию патча.
один из этих двух вариантов точно!
внимательно смотрите файл -
1) все новые значения больше, то есть код увеличивается и смещения растут
2) все значения в пределах размера кода x2story.asm / obj
вот чтобы это проверить и нужно провести все описанные манипуляции
затем посмотреть файлы:
x2story10.asm должен содержать метки, либо начало функций по всем адресам, перечисленным в первом столбике файла x2story11.pat
то есть когда выполняется патч с 1.0 на 1.1 ссылки на эти адреса будут заменены на новое значение - из второго столбика
после этого можно думать дальше...
если я прав, то новые патчи (в смысле наши самодельные), должны по этому же принципу дописывать еще один массив в сегмент PTCH, с тем чтобы корректно перенести измененные смещения. тогда будет вам и совместимость и полная компиляция и тд
_________________ THX2U |
|
|
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Мои радости прямо пропорциональны следствиям из времен года, помноженных на литраж выпитого и кубический объем выкуренного. ($atana)
|
» X2-ASM - это проcто! | страница 2 |
|