Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » X2-ASM - это проcто! | страница 2
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 2 из 12
На страницу: Пред.  1, 2, 3, ... 10, 11, 12  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал X2: The Threat: «X2-ASM - это проcто!»
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31404

Зарегистрирован: 26.10.2003
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.



Вот и всё, никаких ненужных ограничений не будет Улыбка
    Добавлено: 20:06 24-01-2006   
Zman
 65 EGP


Репутация: 12
Сообщения: 54
Откуда: Galaxy far, far away...
Зарегистрирован: 17.01.2006
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
    Добавлено: 23:09 24-01-2006   
Zman
 65 EGP


Репутация: 12
Сообщения: 54
Откуда: Galaxy far, far away...
Зарегистрирован: 17.01.2006
AlexYar :

Просто у тебя недостаточно информации по устройству игры.


ну тут все не сложнее, чем в других местах, например в Riven Машем и улыбаемся!
_________________
THX2U
    Добавлено: 23:22 24-01-2006   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31404

Зарегистрирован: 26.10.2003
Zman :
во-первых откуда у нас будет несколько файлов 00х07, если ты говоришь что мод всегда один ?


А ты не думаешь, что моддеры иногда делают патчи для своих модов? Гы-гы И даже если в основной версии был файл озвучки на 5 мегабайт, то в следующем патче для добавления всего одного звучка требование заново закидывать в инет 5 мегабайт по модему как-то не улыбает Улыбка А людям не улыбает скачивать лишние 5 мег.

Zman :
4) если НЕ получилось, пытаемся читать из 00407 00307 00207 00107
то есть сверху вниз по нумерации, это легче реализовать...другими словами - использовать первый доступный файл при поиске сверху вниз


А где смысл так усложнять, если можно прочесть сразу нужный файл по номеру stream? Улыбка Т.е. зачем воротить поиск и перебор, если stream нам прямо указывает на нужный файл?

Zman :
а если ориентироваться только на pageid/voicemessageid - это минимум исправлений.


И минимум возможностей для моддера. Смысл тогда делать эту фичу, если она выстроит сразу кучу стен вокруг себя?

Уж лучше напрячь мозги, потрудиться, но родить полнофункциональную вещь. Пусть даже на это уйдет много времени (куда нам торопиться?) Улыбка

Zman :
наверное надо для экспериментов поставить отдельную инсталляцию заново, а то побью сейвы блин...


Ну, это надо было сделать в первую очередь. Лично у меня 5 папок с разными х2 По-секрету... Гы-гы И то приходится периодически ставить заново оригинальную игру, так как по запарке частенько перезаписываешь оригинальные файлы моженными (вкладку в файл менеджере перепутать легко).
    Добавлено: 00:39 25-01-2006   
Himmel
 80 EGP


Репутация: 15
Сообщения: 77
Откуда: Family Pride
Зарегистрирован: 28.11.2005
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.
    Добавлено: 00:57 25-01-2006   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31404

Зарегистрирован: 26.10.2003
Himmel :
Так ведь изначально неизвестно, какой stream нам нужен, в SpeakText говорится Page и ID, вот и просматриваем xml-ы до первого совпадения Page/ID, тут уже берем stream и нужный dat.


Ды не просматриваем мы хмл-ы вообще, так как игра их только один раз грузит при старте новой игры или загрузке сохраненки!
Т.е. они всегда в памяти находятся, соот-но игре сразу известно, какому ИД с нужной страницы соответсвует какой стрим.

Поэтому при работе команды СпикТекст игры сама знает, какой стрим смотреть.

Ты же сам это подтвердил правкой хмл-ника. Т.е. игра уже умеет отличать стримы друг от друга, осталось только научить её смотреть звуковые дат-ы, соответсвующие этим стримам.

Если Шадди смог научить игру писать хмл-ники и искать нужные файлы, то мне слабо верится, что с реализацией своей озвучки могут быть какие-то трудности.

Вобщем, подождем что скажет CheckerTwo, а то мы уже тут много наговорили, а работа стоит.
    Добавлено: 01:28 25-01-2006   
Himmel
 80 EGP


Репутация: 15
Сообщения: 77
Откуда: Family Pride
Зарегистрирован: 28.11.2005
Ок, понятно.
А как хранятся загруженные указатели? Там stream для каждого ID прописан или для PAGE ? (Это для реализации того, о чем ты и сам говорил - в 00NXX.xml только те ID, которые изменены в существующей странице.)
    Добавлено: 01:45 25-01-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
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? Предложи вариант алгоритма.
Этот ассемблер задумывался как маленький утиль к программе добавления кораблей. Т.е. для поддержки маленьких патчей. Ну никак не для полной трансляции Улыбка
Zman :

вот список ошибок

То, что файлы, сгенеренные дизассемблером не транслируются - я знаю. И ограниченная длина строки - это не самая страшная причина этого. Что ж ты думаешь я не пробовал транслировать сгенеренные дизассемблером файлы, что ль? Основная причина невозможности перетрансляции - полное отсутствие представления работы механизма поддержки патчей в obj-файлах. И, кстати, по этой же причине невозможно полноценное и однозначное дизассемблирование obj-ей. Т.е. 100% нельзя сказать отработается конкретный кусок кода или нет. После того, как недавно ввел в дизассемблер трассировщик команд, стало немного понятнее - т.е. там где прошелся трассировщик и проставил значения текущего стека - этот код скорее всего доступен для игрухи. Но не факт.

AlexYar :
Вобщем, подождем что скажет CheckerTwo, а то мы уже тут много наговорили, а работа стоит.

Расстроен Ни в коем случае! Если каждый раз ждать Чекера, работа вообще не сдвинется с места. У меня проблемы на работе. Времени - только по ночам. Если чего в утиле поправить-подравнять - это сделаю. Расстроен
Так что находите компромиссы и двигайте. По внутренним потрохам obj-ей лучше всех разбирается Shaddie. У меня довольно поверхностное представление.

Zman - респект. Давай копай и глубже! Улыбка
    Добавлено: 12:11 25-01-2006   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31404

Зарегистрирован: 26.10.2003
Himmel :
А как хранятся загруженные указатели? Там stream для каждого ID прописан или для PAGE ?


А это надо у программеров спросить. Если стрим хранится только для всей page в целом - то это попа Расстроен Ну в крайнем случае тогда сделать хоть так чтобы работало.

Но то что Zman предлагал (для фиксированных page) - вообще не подходит, так как никакой старой озвучки поменять будет невозможно, и озвучку к новым секторам сделать будет тоже невозможно, да и вообще ничего путного сделать будет невозможно.
Не должна новая озвучка ничем ограничиваться. Смысл тогда вообще какой от этой работы будет?
    Добавлено: 12:31 25-01-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Меня вот настараживают функции работы со звуковым файлом. Надо бы проанализировать реальную возможность такого патча. Дело в том, что вызовы функций MOV_GetVoiceLength, MOV_GetVoiceStream, MOV_GetVoiceStart вообще не используют вычисляемый (в функции SetVoicestream1) номер звукового файла. Что из этого может следовать? Эти функции, используя значение SFX_GetLanguage, сами вычисляют номер файла? Если это так, то подменить номер звукового файла можно будет только переключением на "левый язык"...
    Добавлено: 15:12 25-01-2006   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31404

Зарегистрирован: 26.10.2003
Я знаю, где может скрываться ответ на наш вопрос. Гляньте ХБТФ, там второй стрим игра использует вместе с первым Улыбка
    Добавлено: 18:18 25-01-2006   
Zman
 65 EGP


Репутация: 12
Сообщения: 54
Откуда: Galaxy far, far away...
Зарегистрирован: 17.01.2006
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
    Добавлено: 19:03 25-01-2006   
Zman
 65 EGP


Репутация: 12
Сообщения: 54
Откуда: Galaxy far, far away...
Зарегистрирован: 17.01.2006
пояснения:

эта функция одна из двух, ктоторые используются всеми скриптами для вывода голоса.

сразу после метки L0000192E идет загрузка параметров сообщения из файла mov\000LL.xml
(то есть данные о начале и длине нашего сообщения в файле .дат)

как видите стрим не используется при нахождении этих данных!
именно поэтому имя файла может быть только одним: mov\000LL.xml

if TX_AUDIO.current_speak_page <> 1271 это проверка на номер страницы 1271 (сообщения внутри станции типа Welcome to the station)

непосредственно загрузка и проигрыш сообщения - сразу после метки L00001C2C

здесь стрим используется как параметр, но нет уверенности как он внутри отрабатывается, это я собираюсь проверять

все остальное - проверки, обрывание текущего сообщения, играть или не играть щелчки до/после сообщения итд.

вот в таком аспекте Подмигиваю
_________________
THX2U
    Добавлено: 19:13 25-01-2006   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31404

Зарегистрирован: 26.10.2003
Zman :
можете посмотреть и делать выводы о порядке загрузки файлов.


Шутки у тебя дураЦЦкие Гы-гы Лично мне этот код как китайский язык.

Я вот думаю, а если просто создать новую команду скриптредактора Speak Text, которой добавить аргумент - "номер стрима", а в команде сделать его обработку в месте составления имени файла. Так будет проще?

Т.е. если аргумент STREAM = 4 , значит читать данное сообщение надо из 00407.xml и 00407.dat. Если null, значит 00007 и 00107 соотвественно (т.е. стандарт).
    Добавлено: 21:02 25-01-2006   
Zman
 65 EGP


Репутация: 12
Сообщения: 54
Откуда: Galaxy far, far away...
Зарегистрирован: 17.01.2006
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
    Добавлено: 21:27 25-01-2006   
AlexYar
 1846 EGP


Рейтинг канала: 6(434)
Репутация: 328
Сообщения: 31404

Зарегистрирован: 26.10.2003
Zman :
1) я думаю это будет намного сложнее...


Зато намного универсальнее Улыбка Можно будет из одного скрипта по одному page и id проигрывать несколько вариантов озвучки.


Zman :
2) мне пока неизвестно как связаны команды в скриптах с их обработчиками в x2story.obj... создать новую команду и прописать ее в 440001.xml это ясно, а где в x2story её прописывать ? ткните носом, я уверен что тут уже пробегало, но искать влом


Тема "Добавляем новые команды скриптредактора". В первом сообщении темы куча примеров. Добавлена 31 новая команда и еще несколько фич.


Zman :
3) мне бы хотелось чтобы одной и той же старой командой можно было играть дополнительные звуки, а не отдельной... так совместимость лучше будет


Неа. Так совестимость наоборот сильно пострадает, так как изменится формат и назначение команды. Это повлечет баги сразу во всех скриптах и обж-миссиях, которые используют старую команду.

Zman :
стандарт - 1


Я в курсе. Но 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) проиграть звук


Такой метод считывания на порядки занимает больше времени, чем предложенный мной - напрямую в команде "спик текст" указывать номер стрима, либо вообще сразу номер файла. Во! И никаких лишних пассов игре делать не придется Гы-гы
    Добавлено: 00:28 26-01-2006   
Zman
 65 EGP


Репутация: 12
Сообщения: 54
Откуда: Galaxy far, far away...
Зарегистрирован: 17.01.2006
AlexYar, я твой подход понял Улыбка
хочется всего и сразу много, и чтобы было универсально и при этом совместимо со всем старым Улыбка. При этом ты совершенно забываешь, что мы в тех рамках, которые наложены движком и всей внутренней организацией этой системы. Вот например:

AlexYar :

Что мешает не добавлять в начало файла два нуля? Улыбка Пусть новая озвучка будет не в 00207, а в 207.xml и 207.dat
Вот тебе и обход ограничений. Можно добавлять хоть до 12345678907.dat

ограничение в том, что в движок передается число, например 207, движок открывает этот файл, при этом используется форматирование строки по шаблону "%05d", для не-программистов перевожу:
десятичное представление числа из 5-ти позиций с лидирующими нулями.
то есть из 207 будет строка "00207"
отсюда и все файлы по типу ххххх.xml

или ты и x2.exe хочешь править ? Улыбка
нет, ну я конечно и это тоже могу, но если идти таким путем, будет лучше заново новую игру написать и "ничем себя не ограничивать", при этом избавить себя же от мазохизма Улыбка

так что давай поближе к земле летай...

AlexYar :

напрямую в команде "спик текст" указывать номер стрима, либо вообще сразу номер файла. Во! И никаких лишних пассов игре делать не придется

вот исходник не смотришь, а такие заявления делаешь Улыбка

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

вообщем я твою точку зрения уже понял, спорить дальше не вижу смысла.

сначала я проверю кое-что, соберу еще инфы, после этого сообщу новости.
некоторое время меня не будет.

другие предложения/соображения по алгоритмам есть у кого ?


P.S. исправил формат - на самом деле конечно же "%05d.xml", по запарке написал...
_________________
THX2U
    Добавлено: 01:15 26-01-2006   
Himmel
 80 EGP


Репутация: 15
Сообщения: 77
Откуда: Family Pride
Зарегистрирован: 28.11.2005
Только не смейтесь...
Смотрите, шум добавляется для 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, и только.
    Добавлено: 03:30 26-01-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
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-файлов

нефиг делать Супер!

Че, серьезно что ль? Ну если так, то надо формировать список требований к языку. Ежели чего - мы тут поможем... советом...
Улыбка
    Добавлено: 17:44 26-01-2006   
Zman
 65 EGP


Репутация: 12
Сообщения: 54
Откуда: Galaxy far, far away...
Зарегистрирован: 17.01.2006
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
    Добавлено: 14:31 28-01-2006   
Канал X2: The Threat: «X2-ASM - это проcто!»
На страницу: Пред.  1, 2, 3, ... 10, 11, 12  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Идет третий этап завершения продолжения окончания начала установки windows...

  » X2-ASM - это проcто! | страница 2
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18