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

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

   Страница 3 из 12
На страницу: Пред.  1, 2, 3, 4 ... 10, 11, 12  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал 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
    Добавлено: 15:08 28-01-2006   
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

писать
Код:
pop_jnz 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
    Добавлено: 15:38 28-01-2006   
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
    Добавлено: 15:49 28-01-2006   
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:

Ладно, подумаем... Улыбка
    Добавлено: 18:14 28-01-2006   
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
    Добавлено: 18:56 28-01-2006   
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
    Добавлено: 20:18 28-01-2006   
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 только вышел, народ умолял их выложить для ХТ этот компилятор. Они там привели какие-то отмазки, мол работает только на сервере, это не для понимания простых смертных и вообще исходников не сохранилось.
    Добавлено: 08:48 29-01-2006   
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
    Добавлено: 16:08 29-01-2006   
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 :

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

Почему недоступен. Для разработчиков, кажись, пятого уровня - доступен.
    Добавлено: 16:52 29-01-2006   
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
    Добавлено: 17:37 29-01-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Zman :
CheckerTwo :

Куски кода могли остаться еще с xbtf, так что сильно не удивляйся.

а что, там все работало с двумя стримами и разными файлами как нужно ?
тогда давай тот исходник Улыбка

Там не было xml-файлов (и соответственно параметра "stream"). Они появились только в Х2. Но некоторые места остались старыми. Например current_voicestream. Ему задавали конкретное число и читали откуда хотели. Улыбка
    Добавлено: 18:21 29-01-2006   
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
    Добавлено: 15:52 30-01-2006   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
2 Zman
Уважаемые ASMщики огромная просьба позаботиться о совместимости намечаемых патчей. А идеально это совмещение их в одном (новые команыд+новый звуки и еще еще .... Хы... ) - общее ж дело делаем.

ps Читаю ваши посты, ничего не понимаю, а сердце радуется в предвещении новых возможностей. Улыбка
_________________
Звезды зовут...
    Добавлено: 16:50 30-01-2006   
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 - игруха кеширует файл разметки.
    Добавлено: 17:52 30-01-2006   
Zman
 65 EGP

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


совместимости кого с кем ? Улыбка попобробнее плиз...

так как "официальный" Улыбка патч у нас всего один, от Shaddie, надо будет все вместе туда собрать, ИМХО... (после доведения до конца ессесно)

народ, а распакованные сейвы кто-нибудь смотрел ?
что именно там хранится ? судя по всему - очень много всего Улыбка
или дайте gzip этот самый...
_________________
THX2U
    Добавлено: 19:59 30-01-2006   
AlexYar
 1655 EGP


Рейтинг канала: 6(409)
Репутация: 344
Сообщения: 25968

Зарегистрирован: 26.10.2003
CheckerTwo :
так ли необходимо, чтобы было несколько xml-файлов? Вопрос не праздный, ибо тесты подтверждают вывод Zman - игруха кеширует файл разметки.


Файл разметки для каждой версии игры разный. Если не будет отдельного файла-разметки, то придется игроков заставлять собственноручно объединять свой файл разметки с модовым. Это неизбежно приведет к куче глюков и багов. К примеру, в инкоминге я вкладывал специально две версии файлов разметки для НД-шной и английской (пиратской) озвучки. А сколько их этих файлов в природе существует - хз. При таком раскладе свой файл разметки (отдельный) - это выход из ситуации.

К тому же нет ответа на главный вопрос - стрим прописывается для каждого ИД или для всей страницы в целом?

И еще вопрос. Если в одном файле разметки ДВАЖДЫ упоминается один и тот же ИД с одной страницы, то какой из них будет главнее, тот который ниже(последний) ?

Zman :
так как "официальный"патч у нас всего один, от Shaddie


Как минимум два "официальных" - один от Чекера (увеличение кол-ва кораблей), второй от Шадди (увеличение команд скриптердактора). Ессно патч с озвучкой не должен с ними конфликтовать ни коим образом Улыбка
    Добавлено: 03:33 31-01-2006   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
AlexYar :
Как минимум два "официальных" - один от Чекера (увеличение кол-ва кораблей), второй от Шадди (увеличение команд скриптердактора). Ессно патч с озвучкой не должен с ними конфликтовать ни коим образом

Во во Улыбка Об этом я и говорил. Новые команды + Новые корабли + своя озвучка = никаких конфликтов + новая Х2 Подмигиваю
_________________
Звезды зовут...
    Добавлено: 06:56 31-01-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
К тому же нет ответа на главный вопрос - стрим прописывается для каждого ИД или для всей страницы в целом?

Стрим прописывается для page.
    Добавлено: 08:54 31-01-2006   
Shaddie
 555 EGP


Рейтинг канала: 4(60)
Репутация: 118
Сообщения: 259
Откуда: Томск
Зарегистрирован: 09.09.2004
Zman :
...следующий этап - заставить эту шарманку читать отдельные mov\00NLL.XML
Файл mov\00NLL.XML читается асм. процедурой MOV_LoadVoiceInfo.

AlexYar :
К тому же нет ответа на главный вопрос - стрим прописывается для каждого ИД или для всей страницы в целом?
CheckerTwo правильно говорит. У одной страницы может быть только один стрим.

AlexYar :
Если в одном файле разметки ДВАЖДЫ упоминается один и тот же ИД с одной страницы, то какой из них будет главнее, тот который ниже(последний)?
Главнее будет первый в файле.

streams.rar
 Описание:
Мой пример по расширению streams
 Имя файла:  streams.rar
 Размер файла:  1.36 KB
 Скачано:  308 раз(а)

_________________
Быстро едешь, тихо понесут...
    Добавлено: 09:32 31-01-2006   
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
    Добавлено: 16:10 31-01-2006   
Канал X2: The Threat: «X2-ASM - это проcто!»
На страницу: Пред.  1, 2, 3, 4 ... 10, 11, 12  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Пытался Викинга перефлудить - кнопки на клаве вспотели - не получилось.... (посетовал Harley)

  » X2-ASM - это проcто! | страница 3
Каналы: Новости | 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