ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» X2-ASM - это проcто! | страница 3 |
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo : |
>нефиг делать
Че, серьезно что ль? Ну если так, то надо формировать список требований к языку.
|
нефиг делать - относилось к тому куску, который я уже перевел на высокий уровень . Писать полный интерпритатор для .обж файла... в теории - можно, но слишком много времени нужно
CheckerTwo : |
На какой глубине находится нужная тебе локальная переменная - нужно следить самому. Как там Shaddie разбирается в скриптах - я до сих пор не понял.
|
я посмторел его патчи, это действительно ОГРОМНЫЙ труд!
я попробовал нечто для себя написать, как я и думал основное время уходит именно на попытки записать/запомнить в какой позиции стека у тебя что лежит и следить чтобы он выравнивался. 95% времени!
остальные 5 собственно на творческий процесс
CheckerTwo : |
>BP регистра нет, но в теории мы можем его виртуально создавать и генерить текст под него, как будто он есть . То есть при входе в новую функцию он равен 0, относительно него идут локальные переменные или параметры из вызывающей функции... а при компиляции делать обратный процесс...
Не получится.
Ну т.е. при дизассемблировании это сделать можно - уже примерно так и сделано ужо. А для компиляции не получится.
|
в теории это сделать можно... (то, что на это нет времени - прекрасно тебя понимаю)
ты просил алгоритм описАть, ниже смотри алгоритм, подробно для тебя
значит для полного .асм файла, а не патча по живому ты сам знаешь как делать ? .
Начиная от каждого начала функции ведешь учет стека и соответственно можешь ссылаться на
Код: |
Arg1 = SP[current_stack_level+2]
Arg2 = SP[current_stack_level+2+1]
; or:
ArgN = SP[curernt_stack_level+2+N-1]
|
и так далее... то есть можно легко проследить что нужно написать вместо Arg1, согласен?
-1 может быть и лишнее, короче где-то в этом районе
теперь про патчи по абсолютным адресам...
вот пример в текущем вашем синтаксе:
Код: |
;00001C38: 0005 0008 | 0003 push SP[7] ; arg2
;00001C3C: 0005 0008 | 0004 push SP[7] ; arg1
;00001C40: 0009 | 0005 push 0
;00001C42: 005A 0000001F | 0006 callasm SFX_GetLanguage ; 0000001F
|
здесь видно, что в первой строке SP[7] на самом деле Arg2, то есть SP[0003+2+2], то есть по той же формуле (опять же -1 сам скорректируй, либо оно до, либо после вычитается)
соответственно если мы ПЕРЕД эти кодом добавлеям две свои строчки, например вот так
Код: |
$ = 00001C38h
push 1
push 2
;00001C38: 0005 0008 | 0003 push SP[7] ; arg2
;00001C3C: 0005 0008 | 0004 push SP[7] ; arg1
;00001C40: 0009 | 0005 push 0
;00001C42: 005A 0000001F | 0006 callasm SFX_GetLanguage ; 0000001F
|
то у тебя текущий стек увеличивается на 2, соответственно ты SP[7] должен заменить на SP[9] ВЕЗДЕ далее по тексту. Повторюсь - я пробовал, и это очень и очень неудобно
теперь как я предлагаю:
когда мы хотим врезать по-живому, мы вставляем нужный нам абсолютный адрес как $ = 000000123h, потому что точно знаем куда хотим вклиниться, что мешает сделать то же самое в отношении стека ?
добавляешь еще одну директиву в нужном нам месте:
.StackSize = 3
и при компиляции присваиваешь это число переменной, начинаешь плясать с этого места, и дальше все идет как будто мы компилим полный .асм от начала функции, а не кусок...
вот мой пример как это может тогда выглядеть:
старый код до исправления:
Код: |
;===============================
; we patch at absolute address:
$ = 00000E28h
.StackSize = 4 ; taken from listing, define current stack level manually
; assume that stack size = 4 now
push Arg2 ; actual SP[8], calc as StackSize + N + 2, (4+2+2=8), N - arg number
; stack size = 5 now
push Arg1 ; actual SP[8], (5+1+2=8)
; stack size = 6 now
push Loc1 ; actual SP[5], calc as StackSize - L, (6-1=5) L - local var number
; stack size = 7 now
push Loc3 ; actual SP[4], calc as StackSize - L, (7-3=4), L - local var number
; stack size = 8 now
push 4 ; param count for function
call SomeFunction
pop
|
теперь мы вставили перед эти кодом новую команду:
Код: |
;-------------------------------
; we patch at absolute address:
$ = 00000E28h
.StackSize = 4 ; stack level taken from listing!
push 1 ; new command inserted here!
; stack size = 5
push Arg2 ; actual SP[9], calc as StackSize + N + 1, (5+2+2=9), N - arg number
; so you dont have to replace SP[8] to SP[9] manually if stack was shifted!!!
; stack size = 6
push Arg1 ; actual SP[9], (6+1+2=9)
; stack size = 7
push Loc1 ; actual SP[6], calc as StackSize - L, (6-1=5) L - local var number
; stack size = 8
push Loc3 ; actual SP[5], calc as StackSize - L, (8-3=5), L - local var number
; stack size = 9
push 4
call SomeFunction
pop
|
то есть главный выигрыш - не надо исправлять все SP[?] если у тебя стек сместился!
мысль понятна ?
_________________ THX2U |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo
собрал все мои пожелания по dobj/x2asm в кучу:
(на английском, потому что я так дома записываю, а потом несу в интернет )
0) replace "jump L0000008" to "jump 0" in case/swtich
я ужн говорил - чтобы потом ручками не править...
кстати я понял как именно неправильно у них код генерится
когда идет switch, там генерится ровно в два раза больше адресов переходов, чем нужно , то есть надо 3, генерится 6!
первая половина нормально заполнена, а вторая половина эти самые нули
1) .def - add arguments/argcount to functions!
в файле *.def добавить БЫ количество аргументов, которые используется каждая функция (можно вытащить из текста, проанализировав последний/предпоследний push перед call)
2) add crlf after every "jump..."
пустую строку после каждого jump! читать неудобно (фиг с ним, с размером файла
3) replace/add "if SP[0]=0 then jump L00000E28" to "pop_jz L00000E28"
4) replace/add "if SP[0]<>0 then jump L00000E28" to "pop_jnz L00000E28"
предлагаю дополнительный синтакс для этих команд, более удобно читаемый, то есть вместо
Код: |
if SP[0]<>0 then jump L00000E28 |
писать
5) replace/add $ to .ORG
ввести дополнительный синтакс для асолютного адреса .ORG (как во всех ассемблерах)
6) BP frame (optional syntax):
- auto mode let disasm calculate BP and generate proper source
- manual mode for absolute patching: let user manually set BP value:
это то, что я вверху подробно расписал насчет стека
_________________ THX2U |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
если кому интересно:
вот дополнительная информация о функциях, кто откуда зовется и какие параметры используются (что связано с функциями MOV_* ), по прежнему есть много непонятных моментов, но мне уже удалось открыть мой mov\00244.xml путем некоторых исправлений!
Код: |
Restart
_Restart
TX_AUDIO.SetVoicestream1( LangID ) ; =LanguageID+100;
end
end
TX_AUDIO.Set
TX_AUDIO.SetLanguage( LangID ); ; get LangID from x2.exe
end
TX_AUDIO.SetLanguage( LangID );
MOV_FreeMovie( StreamID );
MOV_LoadVoiceInfo( LanguageID ); ; ?
SFX_GetVoiceLanguage( PageID );
MOV_LoadMovie( LanguageID+100, 272 ); ; ??
end;
TX_AUDIO.SpeakWithPriorityAndNoise:
* MOV_GetVoiceLength( LanguageID, PageID, SampleID ); ; load l param from mov\000LL.xml
MOV_StopMovie( StreamID ); ; stop if playing something
* MOV_GetVoiceStream( LanguageID, PageID ); ; get StreamID from mov\000LL.xml !
* MOV_GetVoiceStart( LanguageID, PageID, SampleID ); ; get s param from mov\000LL.xml
* MOV_PlayMovieVoice( StreamID, LanguageID, PageID, SampleID ) ; actual play
end;
MovieNotify
MOV_GetVoiceStream *1
MOV_GetVoiceLength *1 *2
MOV_GetVoiceStart *1
MOV_FreeVoiceInfo
MOV_LoadVoiceInfo
MOV_SetVolumeMovie
MOV_SetRateMovie
MOV_PlayMovieVoice *1
MOV_PlayMovieFrom *2
MOV_ConnectMovieToTexture
MOV_StopMovie *1 *2
MOV_FreeMovie *3
MOV_PlayMovie
MOV_LoadMovie *3
SFX_GetVoiceLanguage *3
*1 - used inside TX_AUDIO.SpeakWithPriorityAndNoise:
MOV_GetVoiceLength( LanguageID, PageID, SampleID );
MOV_StopMovie( StreamID );
MOV_GetVoiceStream( LanguageID, PageID );
MOV_GetVoiceStart( LanguageID, PageID, SampleID );
MOV_GetVoiceLength( LanguageID );
MOV_PlayMovieVoice( StreamID, LanguageID, PageID, SampleID )
*2 - used inside TX_AUDIO.PlaySpeechScript:
MOV_GetVoiceLength( LanguageID, PageID, SampleID );
MOV_StopMovie( Arg1 ); ?
MOV_PlayMovieFrom( 1,2,3,4,5,6,7 ); ???
*3 - used inside TX_AUDIO.SetLanguage
MOV_FreeMovie( StreamID );
MOV_LoadVoiceInfo( LanguageID );
SFX_GetVoiceLanguage( PageID );
MOV_LoadMovie( LanguageID+100, 272 ); ?
|
_________________ THX2U |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Zman : |
есть у меня одна мысль по поводу патчей, но нету времени проверять (надо опять все переставлять) ...
нужно сделать следующее:
|
Игруха не меняет obj. Вся инфа о текущем контексте процессов храниться в савках. Вопрос с таблицей патчей уже много раз поднимался. Для понимания механизма нужно дизассемблировать экзешник и смотреть, какие команды проверяются/корректируются по таблице PTCH. Возможно, что только команды переходов. Но в таблицах PTCH есть адреса, никак не связанные с переходами. В общем - мутно все, но у ES работает. Может быть, что перед сохранением, интерпретатор ждет, когда все процессы дойдут до команд переходов, только потом сохраняет контекст в савке.
Zman : |
добавляешь еще одну директиву в нужном нам месте:
.StackSize = 3
|
Да, так и хотел сделать. Но пока не сделал трассировщик и не выловил у себя кучу ошибок, это было вообще нереально...
Zman : |
0) replace "jump L0000008" to "jump 0" in case/swtich
|
Это уже есть.
Zman : |
1) .def - add arguments/argcount to functions!
|
Это уже доделываю
Zman : |
2) add crlf after every "jump..."
|
Это Shaddie забраковал.
А серьезно - если нужно - вставлю. Но. Сейчас процедуры друг от друга отделяются CRLF (после ret). Если вставить после jump - то в глазах запестрит. Потому что код весьма неоптимальный и лишних/левых переходов - масса. Из-за длинных процедур искать смысл будет сложнее. Мне так кажется.
Zman : |
3) replace/add "if SP[0]=0 then jump L00000E28" to "pop_jz L00000E28"
4) replace/add "if SP[0]<>0 then jump L00000E28" to "pop_jnz L00000E28"
|
Вот тут не согласен. Не с тем, что переобозвать нужно, а с тем, что это POP-команды. Это команды CMP сравнения. То что они вытаскивают операнд из стека - это и так понятно.
Привыкать к новой системе команд? Народ ругаться будет. Если край как не нравится написание команды, попробуй такую вещь:
Код: |
.macro pop_jz addr
if SP[0]=0 then jump addr
.endm
...
;
L100:
pop_jz L100
|
Zman : |
5) replace/add $ to .ORG
|
Это всегда было.
Zman : |
6) BP frame (optional syntax):
- auto mode let disasm calculate BP and generate proper source
- manual mode for absolute patching: let user manually set BP value:
|
Ладно, подумаем...
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo : |
Zman : |
2) add crlf after every "jump..."
|
Это Shaddie забраковал.
А серьезно - если нужно - вставлю. Но. Сейчас процедуры друг от друга отделяются CRLF (после ret). Если вставить после jump - то в глазах запестрит. Потому что код весьма неоптимальный и лишних/левых переходов - масса. Из-за длинных процедур искать смысл будет сложнее. Мне так кажется.
|
поясняю почему мне так кажется:
когда пытаешься понять смысл кода, приходится его разбивать на куски по 3-7 строк, которые соответствуют одному оператору выского уровня (примерно как я выше писал исходник), то есть все равно это пустые строки я ручками вставляю . Уже после этой черной работы я смотрю смысл кода. Вот такой я испорченный
предлагаю копромиссный вариант: сделай в дизасме дополнительный ключик, чтобы по умолчанию генерилось как сейчас, (для Shaddie-мазохиста ), а опционально так, как мне удобно
что касается функций, то давно уже известен простой способ отсечения:
как только надо сгенерить начало функции, добавляешь перед ним
;========================================= function XXX.YYY ===
XXX.YYY:
...
и все будет пучком
CheckerTwo : |
Zman : |
pop_jnz L00000E28"
|
Вот тут не согласен. Не с тем, что переобозвать нужно, а с тем, что это POP-команды. Это команды CMP сравнения. То что они вытаскивают операнд из стека - это и так понятно.
|
ну во-первых группа команд jz jnz ja jb je jne etc... как ты знаешь и относится к командам условного перехода.
во вторых это не рор и не смр, это все вместе , то что ни вытаскивают из стека - это тебе очевидно, после года разработки , а новым людям - нет.
В моем синтаксе я предлагаю объединить эти два смысла вместе, то есть сначала делается рор, а потом сравнение и переход. Общий смысл всех моих предложений - приблизить как можно больше к стандартным ассемблерам
CheckerTwo : |
Привыкать к новой системе команд? Народ ругаться будет.
|
я не призываю все поменять так, как мне вздумалось
я говорил о дополнительной опции, чтобы работали оба варианта при копиляции, и чтобы можно было генерить такой исходник
и потом, о каком народе ты говоришь ?
тут не больше 5-6 человек, кто этим реально пользуется...
CheckerTwo : |
Если край как не нравится написание команды, попробуй такую вещь:
Код: |
.macro pop_jz addr
if SP[0]=0 then jump addr
.endm
...
;
L100:
pop_jz L100
|
|
ну допустим для компиляции, а как насчет дизасма ?
после каждой генерации заменять по всему тексту наоборот ?
CheckerTwo : |
Zman : |
5) replace/add $ to .ORG
|
Это всегда было.
|
сорри, не знал...
пора тебе писать учебник, на худой конец мануал
(то что на форуме есть, я прочел)
CheckerTwo : |
Ладно, подумаем...
|
подумай плиз...
и пусть Shaddie свое мнение скажет, а то как-то ни одного комментария от него...
что я уже сделал - везде по ходу процедуры Speak...noise я добавил дебаговый вывод в файл MOV_* функций, то есть с какими параметрами они вызываются, теперь можно следить что именно запрашивается у х2.ехе
вот кусок:
Код: |
;-------- X2story.obj debug log, by Zman :-) ----------
TX_AUDIO.SpeakWithPriorityAndNoise.0000194E: MOV_GetVoiceStream( 44, 108 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001972: MOV_GetVoiceStart( 44, 108, 220120 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001990: MOV_GetVoiceLength( 44, 108, 220120 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001C4E: MOV_PlayMovieVoice( 144, 44, 108, 220120 );
...
|
теперь надо смотреть результаты, которые х2 возвращает, но с текущим синтаксом я это долго буду делать , там надо в начале процедуры стек сдвинуть вниз, соответственно все 300-500 строк, что ниже идут, вручную исправлять
внутри х2.ехе кстати (я посмотрел), в том месте, когда открывается "mov\000LL.xml" есть код, при котором если запрашиваемый файл не найден, то по умолчанию открывается "mov\00044.xml" - это там жестко прописано
_________________ THX2U |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
кстати вот что пишут на егософте по поводу патчей:
Purpose
To make patches which can be used with old save games, KC programs must be compiled with certain options. The code which is added after a previous patch, must be specially marked for the compiler, so that it can produce patch tables which can in turn be used by the runtime system to load an old savegame and correct jump addresses and reuse old loaded strings.
а вот по поводу noise и подпрограммы для вывода сообщения:
int PlaySpeechFaceDirect ( int speaker,
int duration,
int mood,
int picnoise
) [private]
PlaySpeechFaceDirect() called from PlaySpeachScript() or microquests return value indicates if playing was aborted or not (1=playing finished normally!)
speaker = pilot id (e.g 101,102, 201, 711 etc.)
duration= time in ms to play this speakers randomly
mood = one of MOOD_xxx states
picnoise= flags including: NOISE_BEFORE and NOISE_AFTER
...
930 Crank noise before radio
931 Beep noise of radio
932 Crank radio short
934...
так что почти все совпадает...
и вообще, у них там есть SDK, в котором все эти исходники пишутся и компилируются...
может его просто выкупить ?
_________________ THX2U |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Zman : |
что я уже сделал - везде по ходу процедуры Speak...noise я добавил дебаговый вывод в файл MOV_* функций, то есть с какими параметрами они вызываются, теперь можно следить что именно запрашивается у х2.ехе
|
Проверь, вот такую вещь.
1. Увеличь размер массива TX_AUDIO.voicestreams до 3 элементов (адрес 00010h)
2. В TX_AUDIO.SetVoicestream1 добавь инициализацию 2-го элемента массива TX_AUDIO.voicestreams[2] = 244;
3. В файле 00044.xml все stream="1" поменяй на stream = "2"
4. Переименуй файл 00144.dat в 00244.dat
5. Посмотри с какими параметрами вызывается MOV_PlayMovieVoice()
Т.е. идея в чем. Нужно проверить считывается ли параметр stream из xml-файла процедурой MOV_GetVoiceStream. Если читается, то на каком месте происходит сброс значения current_voicestream в 144. По идее индекс stream-а должен быть всегда 2 и соответственно выбираться должен 244.dat. Возможно, что этого мало и нужна предварительная подгрузка звукового файла. Т.е. процедуре MOV_LoadMovie нужно давать правильное значение, а не 100+Language. Тогда все заработает.
Код: |
.title audio
.ident X2
.radix 16d
.loadobj "x2story.obj"
.section code, abs
;00000010: 000B | 0001 push 2
;00000012: 000A | 0002 push 1
;00000014: 005A 00000001 | 0003 callasm SE_ArrayAlloc ; 00000001
;0000001A: 002B 0007 | 0002 write TX_AUDIO.voicestreams ; [7]
;0000001E: 002C | 0002 pop
$ = 00000010h
push 3h
; | TX_AUDIO.SetVoicestream1:
;00000E36: 0055 0003 | 0000 setmem 3
;00000E3A: 0009 | 0000 push 0
;00000E3C: 005A 0000001F | 0001 callasm SFX_GetLanguage ; 0000001F
;00000E42: 0001 0064 | 0001 push 64h ; 100d
;00000E46: 003E | 0002 add SP[0],SP[1]
;00000E48: 000A | 0001 push 1
;00000E4A: 0006 0007 | 0002 read TX_AUDIO.voicestreams ; [7]
;00000E4E: 002D | 0003 put_to_array
;00000E50: 002C | 0001 pop
;00000E52: 0009 | 0000 push 0
;00000E54: 0035 | 0001 ret
$ = 00000E52h
L100:
push 0
callasm SFX_GetLanguage ; 0000001F
push 200d
add SP[0],SP[1]
push 2
read [7] ; TX_AUDIO.voicestreams
put_to_array
pop
push 0
ret
.end
|
Если удастся разобраться, то можно будет увеличить TX_AUDIO.voicestreams до 10 элементов. А моддерам останется только править единственный xml-файл и добавлять звуковые файлы. Причем перекрытие звуковых треков будет выполняться автоматом, чего и хотел AlexYar. Это наиболее простой способ, мне кажется.
Zman : |
и вообще, у них там есть SDK, в котором все эти исходники пишутся и компилируются...
может его просто выкупить ?
|
Ага, есть. Когда Х2 только вышел, народ умолял их выложить для ХТ этот компилятор. Они там привели какие-то отмазки, мол работает только на сервере, это не для понимания простых смертных и вообще исходников не сохранилось.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo : |
Проверь, вот такую вещь....
|
ты будешь смеяться, но я именно так уже и пытался сделать
скорее всего у меня ошибка в инициализации этого массива, потому что нифига не заработало (поэтому и не стал пока писать сюда).
У меня грузится 00244.xml ! но потом не грузится 00244.dat
вот два лога:
Код: |
TX_AUDIO.SpeakWithPriorityAndNoise.0000194E: MOV_GetVoiceStream( 44, 108 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001972: MOV_GetVoiceStart( 44, 108, 220120 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001990: MOV_GetVoiceLength( 44, 108, 220120 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001C4E: MOV_PlayMovieVoice( 144, 44, 108, 220120 );
TX_AUDIO.SpeakWithPriorityAndNoise.0000194E: MOV_GetVoiceStream( 44, 2222 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001972: MOV_GetVoiceStart( 44, 2222, 220120 );
TX_AUDIO.SpeakWithPriorityAndNoise.00001990: MOV_GetVoiceLength( 44, 2222, 220120 );
|
первый кусок - это с нормальными файлами, все работает
второй кусок - я везде поменял стрим на 2 и страницу 2222 добавил, как видно она пытается запросить voiceStart, voiceLength и потом вылетает из процедуры, то есть таблица из 000244.xml не подгружена...
вообщем пока еще рано что либо говорить, буду дальше смотреть...
и поясни вот этот кусок плиз:
Код: |
push 2
push 1
callasm SE_ArrayAlloc ; 00000001
write TX_AUDIO.voicestreams ; [7]
|
в переводе на человеческий язык это означает
Код: |
TX_AUDIO.voicestreams := SE_ArrayAlloc( 2 ); |
то есть присваивается указатель на выделенную память
2 - размер массива, как я понимаю
а вот с 0 или с 1 начинаются индексы ? далее по тексту идут самые разные виды обращений, в том числе и в цикле проверяются все ли элементы этого массива = 0. Так вот похоже, что индексы идут с 0, то есть [0..1] в этом случае.
Глупые вопросы:
- зачем они выделяют два элемента, если используется один ?
- каждый элемент по умолчанию - dword / long ?
- если я выделяю больше 2 (изменяю), надо ли корректировать setmem(x)
- если setmem(x) в начале, то в конце стек всегда должен быть = 0 ? (компилятор ругается, что у меня несовпадение стека, но потом все работает
CheckerTwo : |
народ умолял их выложить для ХТ этот компилятор. Они там привели какие-то отмазки, мол работает только на сервере, это не для понимания простых смертных и вообще исходников не сохранилось.
|
я все больше убеждаюсь, что у них часто логика хромает, это и по коду видно ... зачем спрашивается вешать на страничку полную доку по сдк, если он никому не доступен ?
_________________ THX2U |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Zman : |
У меня грузится 00244.xml ! но потом не грузится 00244.dat
|
Непонятно, почему грузится 244.xml. Функции MOV_GetVoiceStream и пр. вроде должны 00044xml грузить.
Zman : |
процедуры, то есть таблица из 000244.xml не подгружена...
|
Имхо, конечно, но оставь xml на закуску Попробуй сначала с dat разобраться...
Zman : |
и поясни вот этот кусок плиз:
в переводе на человеческий язык это означает
Код: |
TX_AUDIO.voicestreams := SE_ArrayAlloc( 2 ); |
то есть присваивается указатель на выделенную память
|
Все так. Переменной TX_AUDIO.voicestreams присваивается указатель на массив размером 2 элемента. Индексы в массивах идут с 0
Zman : |
- зачем они выделяют два элемента, если используется один ?
|
Куски кода могли остаться еще с xbtf, так что сильно не удивляйся.
Zman : |
- каждый элемент по умолчанию - dword / long ?
|
Скорее всего да.
Zman : |
- если я выделяю больше 2 (изменяю), надо ли корректировать setmem(x)
|
Нет, на стек не влияет.
Zman : |
- если setmem(x) в начале, то в конце стек всегда должен быть = 0 ? (компилятор ругается, что у меня несовпадение стека, но потом все работает
|
Все функции в КС возвращают в стеке число. Значит стек на команде RET должен быть равен 1.
Zman : |
... зачем спрашивается вешать на страничку полную доку по сдк, если он никому не доступен ?
|
Почему недоступен. Для разработчиков, кажись, пятого уровня - доступен.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo : |
Непонятно, почему грузится 244.xml. Функции MOV_GetVoiceStream и пр. вроде должны 00044xml грузить.
|
я для проверки принудительно прописывал там вместо
MOV_GetVoiceStream( SE_GetLanguage(), PageID );
MOV_GetVoiceStream( SE_GetLanguage()+200, PageID );
CheckerTwo : |
Куски кода могли остаться еще с xbtf, так что сильно не удивляйся.
|
а что, там все работало с двумя стримами и разными файлами как нужно ?
тогда давай тот исходник
_________________ THX2U |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Zman : |
CheckerTwo : |
Куски кода могли остаться еще с xbtf, так что сильно не удивляйся.
|
а что, там все работало с двумя стримами и разными файлами как нужно ?
тогда давай тот исходник
|
Там не было xml-файлов (и соответственно параметра "stream"). Они появились только в Х2. Но некоторые места остались старыми. Например current_voicestream. Ему задавали конкретное число и читали откуда хотели.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
ну что, народ! спешу поделиться радостными известиями...
ОНО ЗАРАБОТАЛО !!!
вообщем мы шли по верному пути, но кроме инициализации массива потоков (которая у меня позавчера тоже кстати была неверной ), надо было исправить еще несколько мест. Фактически там используется нечто вроде константы MaxStream = X, на которую идут проверки по ходу выполнения.
Я сегодня перелопатил весь исходник, нашел и исправил ВСЕ эти места и получил первый работающий патч
значит что мы имеем на данный момент:
- все старые звуки и субтитры работают без изменений, ничего не виснет (это тоже достижение, так как я переписал заново половину кода в TX_AUDIO.SetLanguage() )
- мои добавочные звуки нормально играются из дополнительных файлов mov\00NLL.dat, где N=[2..8], это номер стрима, LL = LanguageID !
(то есть файлы от mov\00244.dat до mov\00844.dat)
- дополнительный бонус: к этим новым звукам можно добавлять субтитры, для этого добавляется файл t\44000N.xml, с соответствующим pageID...
но это уже было в самой х2, я ничего не исправлял , просто убедился что оно все вместе работает...
- для новых звуков пока что надо дописать в файл mov\000LL.xml
их параметры. Новую страницу и новый номер стрима, и потом список: начало/длина, то есть точно так же как в существующем файле.
следующий этап - заставить эту шарманку читать отдельные mov\00NLL.XML
полной ясности у меня еще нет, но картина уже более четкая.
недостатки: похоже что таблица расположения сообщений читается один раз и потом держится в памяти и она скорее всего может быть только одна. То есть если читать из двух разных файлов - она будет перегружаться во время перехода на другой файл (в этот момент могут быть тормоза)
_________________ THX2U |
|
|
DragonP 281 EGP
Рейтинг канала: 3(27) Репутация: 108 Сообщения: 527 Откуда: Новосибирск Зарегистрирован: 18.12.2004 |
|
2 Zman
Уважаемые ASMщики огромная просьба позаботиться о совместимости намечаемых патчей. А идеально это совмещение их в одном (новые команыд+новый звуки и еще еще .... ) - общее ж дело делаем.
ps Читаю ваши посты, ничего не понимаю, а сердце радуется в предвещении новых возможностей.
_________________ Звезды зовут... |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Zman : |
В моем синтаксе я предлагаю объединить эти два смысла вместе, то есть сначала делается рор, а потом сравнение и переход. Общий смысл всех моих предложений - приблизить как можно больше к стандартным ассемблерам
|
В таком случае нужно будет команду add переименовать как pop_pop_add. Команду сравнения 2 чисел if sp[1] <> sp[0] как pop_pop_cmp_jne ну и тд.. Не, все-таки, если уж мы работаем в стековой машине, нужно принять как должное, что команда берет аргумент из стека (бритва Оккама).
Zman : |
ОНО ЗАРАБОТАЛО !!!
|
Бывает.
Zman : |
следующий этап - заставить эту шарманку читать отдельные mov\00NLL.XML
|
2AlexYar
Еще раз, так ли необходимо, чтобы было несколько xml-файлов? Вопрос не праздный, ибо тесты подтверждают вывод Zman - игруха кеширует файл разметки.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
DragonP : |
2 Zman
Уважаемые ASMщики огромная просьба позаботиться о совместимости намечаемых патчей.
|
совместимости кого с кем ? попобробнее плиз...
так как "официальный" патч у нас всего один, от Shaddie, надо будет все вместе туда собрать, ИМХО... (после доведения до конца ессесно)
народ, а распакованные сейвы кто-нибудь смотрел ?
что именно там хранится ? судя по всему - очень много всего
или дайте gzip этот самый...
_________________ THX2U |
|
|
AlexYar 1869 EGP
Рейтинг канала: 6(445) Репутация: 324 Сообщения: 31947
Зарегистрирован: 26.10.2003 |
|
CheckerTwo : |
так ли необходимо, чтобы было несколько xml-файлов? Вопрос не праздный, ибо тесты подтверждают вывод Zman - игруха кеширует файл разметки.
|
Файл разметки для каждой версии игры разный. Если не будет отдельного файла-разметки, то придется игроков заставлять собственноручно объединять свой файл разметки с модовым. Это неизбежно приведет к куче глюков и багов. К примеру, в инкоминге я вкладывал специально две версии файлов разметки для НД-шной и английской (пиратской) озвучки. А сколько их этих файлов в природе существует - хз. При таком раскладе свой файл разметки (отдельный) - это выход из ситуации.
К тому же нет ответа на главный вопрос - стрим прописывается для каждого ИД или для всей страницы в целом?
И еще вопрос. Если в одном файле разметки ДВАЖДЫ упоминается один и тот же ИД с одной страницы, то какой из них будет главнее, тот который ниже(последний) ?
Zman : |
так как "официальный"патч у нас всего один, от Shaddie
|
Как минимум два "официальных" - один от Чекера (увеличение кол-ва кораблей), второй от Шадди (увеличение команд скриптердактора). Ессно патч с озвучкой не должен с ними конфликтовать ни коим образом
|
|
|
DragonP 281 EGP
Рейтинг канала: 3(27) Репутация: 108 Сообщения: 527 Откуда: Новосибирск Зарегистрирован: 18.12.2004 |
|
AlexYar : |
Как минимум два "официальных" - один от Чекера (увеличение кол-ва кораблей), второй от Шадди (увеличение команд скриптердактора). Ессно патч с озвучкой не должен с ними конфликтовать ни коим образом
|
Во во Об этом я и говорил. Новые команды + Новые корабли + своя озвучка = никаких конфликтов + новая Х2
_________________ Звезды зовут... |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
AlexYar : |
К тому же нет ответа на главный вопрос - стрим прописывается для каждого ИД или для всей страницы в целом?
|
Стрим прописывается для page.
|
|
|
Shaddie 556 EGP
Рейтинг канала: 4(60) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004 |
|
Zman : |
...следующий этап - заставить эту шарманку читать отдельные mov\00NLL.XML
|
Файл mov\00NLL.XML читается асм. процедурой MOV_LoadVoiceInfo.
AlexYar : |
К тому же нет ответа на главный вопрос - стрим прописывается для каждого ИД или для всей страницы в целом?
|
CheckerTwo правильно говорит. У одной страницы может быть только один стрим.
AlexYar : |
Если в одном файле разметки ДВАЖДЫ упоминается один и тот же ИД с одной страницы, то какой из них будет главнее, тот который ниже(последний)?
|
Главнее будет первый в файле.
streams.rar |
Описание: |
Мой пример по расширению streams |
|
Имя файла: |
streams.rar |
Размер файла: |
1.36 KB |
Скачано: |
652 раз(а) |
_________________ Быстро едешь, тихо понесут... |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
Shaddie : |
Файл mov\00NLL.XML читается асм. процедурой MOV_LoadVoiceInfo.
|
это-то уже давно было понятно, вопрос как правильно все вместе увязать, чтобы и волки сыты и овцы того... сейчас я хочу попробовать сделать так:
если стрим=1, то читать из старого 000LL.xml, а если стрим=2..8 то читать из 00NLL.xml, тогда сохранится совместимость со всем старым...
обрати внимание, что в поставке есть файл mov/00907.dat
то есть стрим > 8 делать нельзя!
9-ый стрим на русском языке будет совпадать с этим файлом
Shaddie : |
У одной страницы может быть только один стрим.
|
подтверждаю
Shaddie, твой патч на мой почти полностью похож, но я еще выбросил все лишнее из SetLanguage, теперь он у меня стал в три раза короче , там освободилось место, куда и помещается дополнительно инициализация до 8-го стрима, то же самое касается SetVoiceStream1. Вообщем у меня размер самого x2story.obj не меняется, все внутри помещается.
CheckerTwo, Shaddie - предлагаю объединить все имеющиеся патчи в один и релизить всё вместе, а то действительно разброд получится в будущем...
дополнительные сведения:
1) плохая новость: после патча игра определяет, что в ней ковырялись , то есть сразу же при запуске уже пишет в углу MODIFIED, сигнатуры или CRC прописаны в файле x2files.xml
2) хорошая новость: я кажется знаю место, где это можно подправить , только вот не знаю - нужно ли это ?
3) там же я нашел исходный код для той самой лотереи, народ тут все спрашивал "можно ли выиграть?", по идее можно оттуда восстановить формулу, чтобы точно знать какова вероятность выигрыша и какой там алгоритм, если кому интересно...
и теперь вопрос, в основом скриптологам
достаточно ли наличия новых команд и возможностей по добавлению ракет/кораблей/3д-моделей, а также (я надеюсь) своего звука для того, чтобы создавать полноценные новые миссии ? то есть с кат-сценами, конкретными заданиями, проверкой на выполнение, бонусами итд... ну чтобы лучше EGS
вопрос возникает потому, что отдельные миссии в оригинальной игре лежат отдельными .obj файлами, то есть наличия скриптов недостаточно - есть еще и икакой-то дополнительный код в x2??mission.obj
я за последнюю неделю пересмотрел все известные сайты по х2, народ что-то там ковыряется, но я думаю Е-Г на данном этапе круче всех , так что будет логичным воплотить имеющиеся нароботки в виде большого серьезного адд-она, при этом объединить все местные силы с Е-Г
у меня даже есть идея для принципиально нового корабля
_________________ THX2U |
|
|
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Слышал, что в Москву-реку активно запускают осетров. Если они там не растворятся, это будет хорошая традиция.(Ocean) - С тем раствором, что вместо воды в Москве-реке, как бы через пару лет они не вылезли на берег и не начали жрать прохожих (Tantis)
|
» X2-ASM - это проcто! | страница 3 |
|