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

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

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

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


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
На всякий случай, может вдруг пригодится...
Где-то с 3.20 версии введена константа .VERSION, возвращающая текущую версию ассемблера.
Код:

           .title     test settime
           .ident     X3
           .radix     16d

           .section   code, con

.if .version < 325d
  .error "Требуется xa_asm версии 3.25"
.else
  .settime   "6-10-2006 14:56:30"
.endif

           ret

           .section   strg, con

           .end

    Добавлено: 10:58 08-10-2006   
Lord of Silence
 





Добрый день уважаемые пилоты. Я здесь новичок но читаю форумы со времен X-Tension. Прежде всего хочу выразить огромный респект Shaddie, CheckerTwo, DF и Blueboar за то, что благодаря их усилиям появились такие чудесные программы, как: асм и дизасм obj. (Сбылась мечта идиота: увеличил силу мин, изменил SubType стартового корабля с открывахи на ХР, и еще кое-что по- мелочи). Но вот вопрос асмщикам: Никак не могу найти где задается лимит скорости для корабля игрока внутри станций - хочется убрать тупое ограничение на 40м/с. Сначала думал, что задается в TSTATION.ActivateInnerShip но менял там все, что связанныо со коростью - результат 0). Или может я не туда смотрю, а лимит задается где-нибудь в функциях класса TSHIP?
Ткните пожалуйста хотя-бы в каком направлении копать?
С уважениеем Lord Of Silence.
    Добавлено: 10:48 14-11-2006   
CheckerTwo
 550 EGP


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

Ежели вдруг откопаешь - напиши. Тоже интересно... Улыбка

Так-с.
Вот вышла новая версия Х3 2.0. Exe - не упакован, obj-файлы не криптованы. В срочном порядке выпускается новая версия асма и дизасма. Поддерживают некриптованные строковые секции. Кроме того, в дизассемблер добавлена небольшая фича - "определение условно закоментаренного кода" и вырезание такового.
Работает примерно так: если перед условным переходом стоит константное выражение, удовлетворяющее условию перехода, то следующий за этой конструкцией код - считается недоступным и дизассемблер его закоментарит. Сие включается/выключается в ini-файле строчкой RemarkIfConst = On/Off. Сама команда IF при этом не комментарится, потому как в некоторых случаях при таких преобразованиях потребуется генерация нового кода, что для дизассемблера как бы неправильно...
Пример:
Код:

L000019D6: push       0
           if SP[0]=0 then jump L000019F4
;           read       TX_AUDIO.au_IdleFaceState ; [1]
;           push       1
;           if SP[0]<SP[1] then push 0 else push 1
;           if SP[0]=0 then jump L000019F4
;           push       1
;           jump       L000019F6

L000019F4: push       0


Ссылки на ассемблер и дизассемблер - в первом посте.
И здесь, на всякий случай:
Ассемблер
Дизассемблер
    Добавлено: 19:32 14-11-2006   
Doc77
 40 EGP


Репутация: 0
Сообщения: 73 Заблокирован

Зарегистрирован: 13.11.2006
Не подскажите почему когда происходит установка ну например: Установил новую карту, при загрузке издаются страные звуки как описать,непомню где то слышал а где???
Что типа игра под себя настраивает тот или иной сюжет
    Добавлено: 11:43 16-11-2006   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
Похоже, скорость в ангаре задаётся не в STATION.ActivateInnerShip, а в TSHIP.__StartInHangar. И не в обже, а внутри функции SA_StartInHangar. И несколько другую физику в ангаре тоже контролирует движок. Можно попробовать там вставить новый лимит, может поможет. Или убрать SA_StartInHangar. Или что-то ещё Улыбка
    Добавлено: 03:51 22-11-2006   
Lord of Silence
 





Я так и думал, что ограничение на скорость задаётся в TSHIP.__StartInHangar. Но меня привлёк внутри неё следующий код:


pushw 0FFFFh ; -1d
write TSHIP.sh_SpeedLimit ; [46h ; 70d]

pop
read TSHIP.sh_Flags ; [4]
push 1
and SP[0],SP[1]
if SP[0]=0 then push 1 else push 0
if SP[0]=0 then jump L00088DE2
push 0
push SP[6] ; arg1
call GetObjectID ; 000007CF
mov SP[2],SP[0] ; loc1
pop

read TSHIP.sh_ObjectID ; [0Ah ; 10d]
if SP[0]=0 then jump L00088DE2
read TSHIP.sh_SpeedLimit ; [46h ; 70d]
read TSHIP.sh_ObjectID ; [0Ah ; 10d]
push 2
callasm SA_SetSpeedLimit ; 00004805



Явно видно, что в переменную sh_SpeedLimit записывается -1. А далее перед вызовом функции SA_SetSpeedLimit эта переменная считывается в стек. Сначала я думал что -1 и отвечает за лимит скорости(40м/с) и попробовал записать в sh_SpeedLimit вместо -1 положительное число, но результат себя не оправдал - в игре лимит остался таким же, каким и был.
Ясно одно, что функция SA_SetSpeedLimit также, как и SA_StartInHangar, является внутренней функций exe-шника, потому что в описании КС её нет, и неизвестно, как она ведёт себя при значении переменной sh_SpeedLimit равной -1 (впрочем как и с переменной sh_ObjectID равной PLAYERSHIP тоже неизвестно – кстати видно, что после того, как в стек считывается sh_ObjectID, происходит его проверка на 0 и если равно то прыжок – то есть лимит скорости в инструкции callasm SA_SetSpeedLimit задается только для класса (или подтипа) объекта не равного 0 ?) . Так что изменить лимит просто так не прокатит (нужно реверснуть exe-шник чтобы понять суть работы SA_SetSpeedLimit, но для этого у меня опыта маловато).

To Darth Revan:
убрать SA_StartInHangar ты имеешь ввиду заменить внутри функции TSHIP.__StartInHangar
следующий вызов:
callasm SA_StartInHangar
на конструкцию типа:
push 0
pop
push 0
pop
push 0
pop
Т.к. длина инструкции callasm вместе с операндом занимает 6 байт?
    Добавлено: 11:14 23-11-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Lord of Silence :
убрать SA_StartInHangar ты имеешь ввиду заменить внутри функции TSHIP.__StartInHangar следующий вызов: callasm SA_StartInHangar на конструкцию типа:
push 0
pop
push 0
pop
push 0
pop
Т.к. длина инструкции callasm вместе с операндом занимает 6 байт?

Ну, тогда уж не 6 байт.
Функция SA_SetSpeedLimit(arg1, arg2), плюс надо еще после нее pop убрать, всего 9 слов получается:
Код:

;00088C66: 0006 000A      | read       TSHIP.sh_ObjectID ; [0Ah ; 10d]
;00088C6A: 0033 000446ED  | if SP[0]=0 then jump L00088DE2
; от сих
;00088C70: 0006 0046      | read       TSHIP.sh_SpeedLimit ; [46h ; 70d]
;00088C74: 0006 000A      | read       TSHIP.sh_ObjectID ; [0Ah ; 10d]
;00088C78: 000B           | push       2
;00088C7A: 005A 00004805  | callasm    SA_SetSpeedLimit ; 00004805
;00088C80: 002C           | pop
; вот до сих
;00088C82: 0001 07F1      | push       07F1h ; 2033d
$ = 00088C70h
      jump  $1
$ = 00088C82h
$1:
    Добавлено: 21:14 23-11-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Обнаружил неприятный косяк в дизассемблере версии 3.25. Расстроен
Не всегда правильно определялся "недоступный код" в сложных конструкциях. Например:
Код:

           push       0
           jump       L00051BF2

L00051BF0: push       1
L00051BF2: if SP[0]=0 then push 1 else push 0
           if SP[0]=0 then jump L00051C08
;           push       SP[0] ;
;           push       2
;           or         SP[0],SP[1]
;           mov        SP[1],SP[0] ;
;           pop
L00051C08: push       SP[2] ; loc26


Вроде исправил. Ссылка на подправленную версию:
Дизассемблер
    Добавлено: 22:28 23-11-2006   
Shaddie
 556 EGP


Рейтинг канала: 4(60)
Репутация: 118
Сообщения: 261
Откуда: Томск
Зарегистрирован: 09.09.2004
Lord of Silence :
Явно видно, что в переменную sh_SpeedLimit записывается -1. А далее перед вызовом функции SA_SetSpeedLimit эта переменная считывается в стек. Сначала я думал что -1 и отвечает за лимит скорости(40м/с) и попробовал записать в sh_SpeedLimit вместо -1 положительное число, но результат себя не оправдал - в игре лимит остался таким же, каким и был.
Переменная sh_SpeedLimit равная -1 - это нет ограничения скорости, вернее скорость ограничена макс. скоростью корабля. В других случаях она чаще всего задает ограничение скорости при движении корабля в звене.

Lord of Silence :
...впрочем как и с переменной sh_ObjectID равной PLAYERSHIP тоже неизвестно – кстати видно, что после того, как в стек считывается sh_ObjectID, происходит его проверка на 0 и если равно то прыжок – то есть лимит скорости в инструкции callasm SA_SetSpeedLimit задается только для класса (или подтипа) объекта не равного 0 ?).
Переменная sh_ObjectID - идентификатор объекта, для объекта в секторе с игроком она больше 0, для объектов в других секторах она равна 0.
Для корабля в котором находится игрок 1 бит переменной sh_Flags равен 1.
Вот в этом коде для корабля с игроком выполнится переход на метку L00088DE2:
read TSHIP.sh_Flags ; [4]
push 1
and SP[0],SP[1]
if SP[0]=0 then push 1 else push 0
if SP[0]=0 then jump L00088DE2

Перемещения корабля, скорее всего, выполняется процедурой TSHIP.__galaxyFlightStep (в нее передаются координаты точки назначения, скорость и еще чего то). Следовательно, если предел скорости движения корабля в станции и задается в обже, то в тех процедурах где происходит вызов этой процедуры.
_________________
Быстро едешь, тихо понесут...
    Добавлено: 23:23 23-11-2006   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
2 Lord of Silence

-1 лимита скорости - это его отсутствие.

sh_ObjectID - это SectorObject объекта. Фишка в том, что реально физика работает только в секторе игрока, а в остальных только просчитываются координаты объектов в TSHIP__galaxyFlightStep. А вот в секторе игрока объектами управляет движок используя идентификаторы SectorObject. Эти идентификаторы связываются с объектами классов обжей при помощи SA_SetEventObject и поэтому объекты классов могут получать сообщения от движка - CollisionWarn, Hit.

Кроме того, обж-код в иксах написан очень грязно. Отчасти, по вине их кодогенератора, отчасти по вине собственно по вине обжписателей.

Кстати, в доке по КС далеко не все функции. Все exe-функции можно посмотрете в самом exe в X2 и X3 патчей 2.0.x (защиту сняли).

Lord of Silence :
убрать SA_StartInHangar ты имеешь ввиду заменить внутри функции TSHIP.__StartInHangar

Можно прямо в коде большого файла. Если интересно, я могу выложить файлики для X2 на основе полностью перекомпилиного обжа. Там не все возможности, что были, зато ряд новых. И пару функций на XC переписал. Увеличил число доступных рас и секторов. Пару багов поправил, пару добавил Улыбка

P.S. Для X2 я TSHIP.__galaxyFlightStep на XC переписал.
    Добавлено: 00:12 24-11-2006   
Lord of Silence
 





To CheckerTwo:
Всё понял чуть не затупил - а стек то неучёл!)
Цитата:

Darth Revan:
Или убрать SA_StartInHangar. Или что-то ещё

Уже пробовал - убираем и вылетаем (в Винду с ошибкой!)
(Видимо эта процедура довольно важная - и без неё никак.)
Убирал вот так:
push SP[8] ; arg1
call TSTATION.PrepareStartShip ; 000047D5
pop
L000889E4:
;Начиная с этого момента

000889E4: 0005 0001 | 0003 L000889E4: push SP[0] ; loc3
000889E8: 0005 0004 | 0004 push SP[3] ; loc1
000889EC: 0006 000A | 0005 read TSHIP.sh_ObjectID ;
000889F0: 000C | 0006 push 3
000889F2: 005A 000047E6 | 0007 callasm SA_StartInHangar ;


;И вот до сих пор


000047E6: push 0
pop



То есть эти 10 (зеленых) слов заменял на push 0
pop
Но вот непонятно только одно - после этого вызова
callasm SA_StartInHangar
идет: push 0
pop
-но эти инструкции ведь по сути ничего не выполняют (Я бы даже описал их как nop) - Но CheckerTwo в начальных постах писал, что эсли функция ничего не возвращает то всё-равно резултат должен быть "выпихнут" из стека - т.е. после инструкции вызова должен быть pop. Правильно ли я понимаю, что SA_StartInHangar - все таки возвращает какой-то результат
- и если я прав, то вылет в Винду становится очевиден.
Цитата:

Shaddie:
Переменная sh_ObjectID - идентификатор объекта, для объекта в секторе с игроком она больше 0, для объектов в других секторах она равна 0.
Для корабля в котором находится игрок 1 бит переменной sh_Flags равен 1.

Еще раз огромнейший респект вам уважаемые пилоты - теперь многие моменты проясняются - но интересно есть ли инфа по другим битам переменной sh_Flags? (В описалове по КС её не нашел).
Цитата:

Darth Revan:
Если интересно, я могу выложить файлики для X2 на основе полностью перекомпилиного обжа. Там не все возможности, что были, зато ряд новых. И пару функций на XC переписал. Увеличил число доступных рас и секторов. Пару багов поправил, пару добавил

Если не секрет - то что ещё добвил, и какие баги? (огласите весь список пожалуйста).
Твой патч пока не смотрел - но обязательно его поставлю! Чего только стоит оптимизация торговых скриптов и изменение рассового отношения! Просто я юзал disasm + hexeditor(hiew)(использовать asm было страшновато - что я не делал полную перекомпиляцию он не проводил! - может не так настроил .ini?. Хотя неболшие патчи компилит на ура.)

Но чем дальше копаю - тем более убеждаюсь, что лимит скорее всего задаётся действительно не в obj-файлах,а в движке.
Но пока я не отчаиваюсь - на днях покопаю тоже довольно интересную процедуру: TSHIP.__LandInHangar(arg1);
В ней тоже есть и задание лимита SA_SetSpeedLimit, и перемещение объекта по координатам: TSHIP.__galaxyFlightStep
На днях покопаю отпишусь.
    Добавлено: 14:29 27-11-2006   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
Lord Of Silence :
Твой патч пока не смотрел - но обязательно его поставлю! Чего только стоит оптимизация торговых скриптов и изменение рассового отношения!

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

Lord Of Silence :
что я не делал полную перекомпиляцию он не проводил!

И не надо. Хотя 2.0, кажется, можно. Просто я спрашиваю, надо ли выкладывать, потому что в новом патче не всё от 2.0. Конкретно сейчас не помню, давно писалось. Посмотрю, а потом выложу. Просто патч я делаю для себя с нужными именно мне возможностями и с оглядкой на то, что скрипты в игре будут использоваться минимально (т.е. код в обжах будет писан, но не на асме, естественно) - а значит не увлекаюсь новыми ScE командами.

Lord Of Silence :
Но чем дальше копаю - тем более убеждаюсь, что лимит скорее всего задаётся действительно не в obj-файлах,а в движке.

Вся физика в движке. Попробуй довести то, что я сказал. Возьми оригинальный обж, и его модифицируй прямо в тексте. Кстати, действительно, любая функция возвращает значение. Так что pop обязателен. А вылеты в винду обычно из-за стека и происходят.
    Добавлено: 20:57 27-11-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Shaddie опять нашел косяк Улыбка
При полной перекомпиляции файлов XT и XBTF, obj-файл не собирался. Поправил это дело.
Ассемблер
    Добавлено: 19:24 28-11-2006   
CheckerTwo
 550 EGP


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

Вот присылают письма, пишут - как перекомпилировать obj Х3. Улыбка
Предлагаю упрощенный вариант. Улыбка

1. В отдельную папочку складываем ассемблер вместе с его ini-файлом, x3story.obj, дизассемблер, с его ini и вот этот патчик.
Код:

           .title     x3crit
           .ident     X3
           .radix     16d
           .loadobj   "x3story.obj"

           .section   code, con
;
; исключительно для Х3 версии 2.0.2!
;
; procedure TCAMERA.CopyObjects(arg1);
;0001BC96: 0009                   push       0
;0001BC98: 0005 0006              push       SP[5] ; loc1
;0001BC9C: 0057 000022D5          call       GetNumDustInsts ; 000022D5
; правим на  call GetNumDustInstances
$ = 0001BC9Ch+2
           .long      000154A7h

; procedure TSCRIPT.__runScript(arg1, arg2, arg3, arg4, arg5, arg6);
;0005FEBA: 0009                   push       0
;0005FEBC: 0005 0003              push       SP[2] ; loc21
;0005FEC0: 0057 00004349          call       GetMaxDamageMissile ; 00004349
; правим на   call GetMaxDamageMissileType
$ = 0005FEC0h+2
           .long      00006282h

; procedure TFLYING_WARE.Activate();
;00092A78: 0009                   push       0
;00092A7A: 0006 0002              read       TFLYING_WARE.wr_Environment ; [2]
;00092A7E: 0057 000051CC          call       GetSectorObjectID ; 000051CC
; правим на   call GetObjectID
$ = 00092A7Eh+2
           .long      00000B79h

; procedure TObj1F91.Activate();
;001A59BE: 0009                   push       0
;001A59C0: 0006 0002              read       TFLYING_WARE.wr_Environment ; [2]
;001A59C4: 0057 000051CC          call       GetSectorObjectID ; 000051CC
; правим на   call GetObjectID
$ = 001A59C4h+2
           .long      00000B79h

; procedure TSHIP.Cmd_EscortObject(arg1);
;000C08D4: 000B                   push       2
;000C08D6: 003C                   get_object
;000C08D8: 0057 00006A37          call       Cmd_EscortObject_T ; 00006A37
; ошибка тащится с Х2, что на самом деле подразумевали - не очень понятно
; правим на   call Cmd_EscortObjectWithTimeout
$ =  000C08D8h+2
           .long      00003C72h

; procedure TMENU_COMMAND.MenuAction();
;00165016: 0006 0053              read       TMENU_COMMAND.mecc_NewVal ; [53h ; 83d]
;0016501A: 000A                   push       1
;0016501C: 0006 0024              read       TMENU.me_Object ; [24h ; 36d]
;00165020: 0057 0000C81B          call       SetTactical ; 0000C81B
;00165026: 002C                   pop
;00165028: 0009        L00165028: push       0
; код SetTactical в Х2 так и не довели до ума.
; в Х3 исключили из кода, так что глюки остались только
; в меню, при установке параметров корабликов
$ = 00165016h
           jump      L00165028

$ = 00165028h
L00165028:

; TSHIP_FIGHTER.GetQuestion
;000D9BDA: 000B                   push       2
;000D9BDC: 003C                   get_object
;000D9BDE: 0057 000073F0          call       SignalAttack ; 000073F0
; эта серьезный косяк. если в ES его попытались обойти через скрипты,
; то не известно еще чем обернется исправление ошибки.
; правим на call Signal_Attacked
$ = 000D9BDEh+2
           .long      0000566Ah

; TSHIP_TS.GetQuestion
;000DAEE6: 000B                   push       2
;000DAEE8: 003C                   get_object
;000DAEEA: 0057 000073F0          call       SignalAttack ; 000073F0
; таже фигня - critical!
; правим на call Signal_Attacked
$ = 000DAEEAh+2
           .long      0000566Ah

; procedure TObj0BBB.CheckTurretActionMissionStatus();
;001ADB38: 0009                   push       0
;001ADB3A: 003C                   get_object
;001ADB3C: 0057 0000F562          call       CheckEnvAnimation ; 0000F562
; меняем на  call  CheckAnimation
$ = 001ADB3Ch+2
           .long      0000F553h

; procedure TQUEST299.UpdateRacer(arg1);
;001E15E2: 0006 0028              read       TQUEST299.qq_RacerData ; [28h ; 40d]
;001E15E6: 0008                   get_from_array
;001E15E8: 0008                   get_from_array
;001E15EA: 0057 00011357          call       SetBoostActive ; 00011357
; меняем на call  SetBoostActiv
$ = 001E15EAh+2
           .long      0001BC18h

; TQUEST224.ActivateMission
;0021F2B8: 0009                   push       0
;0021F2BA: 003C                   get_object
;0021F2BC: 0057 000127D9          call       ActivateMines ; 000127D9
; меняем на call  ActivateMineField
$ = 0021F2BCh+2
           .long      0001C2D6h

; procedure TQUEST225.ActivateMission(arg1, arg2);
;0022B7C2: 000C                   push       3
;0022B7C4: 003C                   get_object
;0022B7C6: 0057 00012A6C          call       SpeakMessageWithPriority ; 00012A6C
; меняем на call  PlayMessageWithPriority
$ = 0022B7C6h+2
           .long      0000F002h

; TQUEST228.SpawnShipM0Picker
;0024154A: 000B                   push       2
;0024154C: 0005 0004              push       SP[3] ; loc1
;00241550: 0057 00012F29          call       AddLasers ; 00012F29
; меняем на call AddLaser
$ = 00241550h+2
           .long      00001B0Ch

; procedure TMENU_COMMAND.SpecialUpdate();
;001639C8: 0009        L001639C8: push       0
;001639CA: 0006 0024              read       TMENU.me_Object ; [24h ; 36d]
;001639CE: 0057 0000C7CD          call       GetFightSkill ; 0000C7CD
; меняем на call  GetPilotFightSkill
$ = 001639CEh+2
           .long      00003E32h

; procedure TMENU_COMMAND.SpecialUpdate();
;001639F2: 0009                   push       0
;001639F4: 0006 0024              read       TMENU.me_Object ; [24h ; 36d]
;001639F8: 0057 0000C7CD          call       GetFightSkill ; 0000C7CD
; меняем на call  GetPilotFightSkill
$ = 001639F8h+2
           .long      00003E32h

; procedure TMENU_COMMAND.ChangeValue(arg1);
;00165E62: 0009                   push       0
;00165E64: 0006 0024              read       TMENU.me_Object ; [24h ; 36d]
;00165E68: 0057 0000C7CD          call       GetFightSkill ; 0000C7CD
; меняем на call  GetPilotFightSkill
$ = 00165E68h+2
           .long      00003E32h

; procedure TObj097F.OnButtonSelect(arg1);
;0017EECC: 000A                   push       1
;0017EECE: 0009                   push       0
;0017EED0: 0001 0834              push       0834h ; 2100d
;0017EED4: 0059 00075538 000004F6 call59     TCLIENT.GetPlayer ;
;0017EEDE: 0057 0000D45F          call       IsFormationenLeader ; 0000D45F
; :) прикольно, может у них переводчик глюканул и с немецкого на англ.
; не перевел...
; меняем на call  IsFormationLeader
$ = 0017EEDEh+2
           .long      00006072h

; procedure TObj097F.OnUpdate();
;0017F08E: 000A                   push       1
;0017F090: 0009                   push       0
;0017F092: 0001 0834              push       0834h ; 2100d
;0017F096: 0059 00075538 000004F6 call59     TCLIENT.GetPlayer ;
;0017F0A0: 0057 0000D45F          call       IsFormationenLeader ; 0000D45F
; меняем на call  IsFormationLeader
$ = 0017F0A0h+2
           .long      00006072h

; TCLIENT.CatchWareObject
;000F7A96: 0005 0008              push       SP[7] ; arg1
;000F7A9A: 000A                   push       1
;000F7A9C: 0009                   push       0
;000F7A9E: 0005 000B              push       SP[10d] ; arg1
;000F7AA2: 0057 000004AA          call       GetEnvironment ; 000004AA
;000F7AA8: 0057 0000864F          call       RemoveRandomContainer ; 0000864F
;000F7AAE: 0033 0007BD60          if SP[0]=0 then jump L000F7AC8
;000F7AB4: 000A                   push       1
;000F7AB6: 0001 1464              push       1464h ; 5220d
;000F7ABA: 000B                   push       2
;000F7ABC: 0006 0000              read       TCLIENT.cl_Player ; [0]
;000F7AC0: 0057 00002CAB          call       TPLAYER.IncStatCounter ; 00002CAB
;000F7AC6: 002C                   pop
;000F7AC8: 0001 0824   L000F7AC8: push       0824h ; 2084d
; В Х2 RemoveRandomContainer была функция в классе TSTATION.
; Сейчас ее нет - этот кусок просто исключаем.
$ = 000F7A96h
           jump       L000F7AC8
$ = 000F7AC8h
L000F7AC8:

; TCLIENT.InitClient
;000EA96E: 0009                   push       0
;000EA970: 000A                   push       1
;000EA972: 0004 001A              readvar    global.ga_Player ; [1Ah ; 26d]
;000EA976: 0057 00007B97          call       SetLatency ; 00007B97
;000EA97C: 002C                   pop
;000EA97E: 0031 000754DC L000EA97E: jump       L000EA9C0
; причем тащится еще с XBTF
; этот кусок кода из инициализации сетевой версии - в игре не используется
$ = 000EA96Eh
           jump       L000EA97E
$ = 000EA97Eh
L000EA97E:

; TCLIENT.MakeXenonShips
; Тоже из XBTF! И, вроде как, даже
; там не использовалась. Естественно, что вызывает функции, которых уже нет в живых
; в новых классах TSHIP
;000F0D26: 0057 0000805B          call       SetLeader ; 0000805B
;000F0D4E: 0057 00008065          call       SetRelativePos ; 00008065
;000F0D7C: 0057 00008065          call       SetRelativePos ; 00008065

;000F0C1C: 0055 000A              setmem     0Ah ; 10d
;000F0C20: 0009                   push       0
;000F0C22: 0006 0000              read       TCLIENT.cl_Player ; [0]
$ = 000F0C22h
           ret
           .end

За многие годы жизни игрухи от XBTF до X3 obj-скрипты игрухи накопили приличное кол-во косяков. Этот патчик исправляет только опечатки в именах процедур и те куски, которые давно уже не используются игрой. Не очень понятно, почему их КС не делает проверок при окончательной линковке модулей.

Короче запускаем ассемблер:
>xa_asm.exe x3_crit.asm

2. В ini-файле дизассемблера включаем опцию
RemarkIfConst = On и дизассемблируем cod-файл, полученный после ассемблера:
>dobj.exe x3_crit.cod

3. В полученном asm-файле делаем 2 исправления:
- комментарим строчку .loadobj "x3story.obj"
- вставляем следующий макрос:
Код:

.macro unknown a1, a2
  .word 005Ch
  .long a1, a2
.endm


все, теперь можно пробовать ассемблировать и доводить его до ума.
    Добавлено: 20:05 28-11-2006   
Black_Jak
 65 EGP


Репутация: 5
Сообщения: 73

Зарегистрирован: 22.10.2006
CheckerTwo :
все, теперь можно пробовать ассемблировать и доводить его до ума.

Вопрос простого читателя, мало-что понимающего в изложенном, но увлеченного игрой Х3!
Смотрю ты уже почти полностью расковырял игрушку, так почему не исправишь все глюкобаги?
ДА! И почему тогда не делаешь на основе игры какого-то интересного и глобального мода?
    Добавлено: 20:43 28-11-2006   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
CheckerTwo :
Не очень понятно, почему их КС не делает проверок при окончательной линковке модулей.


Потому что он прожил точно такую же долгую жизнь. Улыбка И не очень праведную. Гы-гы

Black_Jak :
ДА! И почему тогда не делаешь на основе игры какого-то интересного и глобального мода?

Будет мод. Не всё сразу.
    Добавлено: 03:00 30-11-2006   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Black_Jak :
Смотрю ты уже почти полностью расковырял игрушку

Не, только один маленький кусочек ковыряем. Всю игруху не осилить. Улыбка Я подозреваю, что даже в ES нет человека, который разбирается во всех деталях игрушки.
Black_Jak :
так почему не исправишь все глюкобаги?

Все глюки. Хм. Их найти еще нужно, понять, потом уж исправлять.
Если все будет хорошо, а есть серьезные основания надеятся что будет именно хорошо, то существует ненулевая вероятность того, что Obj-скрипты будут полностью переписаны. Гы-гы

Black_Jak :

ДА! И почему тогда не делаешь на основе игры какого-то интересного и глобального мода?

Я ж не моддер, я - механик. Улыбка
    Добавлено: 08:15 30-11-2006   
Black_Jak
 65 EGP


Репутация: 5
Сообщения: 73

Зарегистрирован: 22.10.2006
Darth Revan :
Будет мод. Не всё сразу.

Это радует! Потому что например как для меня, то игра Х2-Х3 имеет очень хорошую базу и достаточно слабую реализацию своих же возможностей!
CheckerTwo :
Я ж не моддер, я - механик.

В любой идее есть две составляющие! Идея мысли и идея факта! То есть не вопрос что можно что-то придумать, вопрос - можно ли это что-то реализовать! Я так понимаю, что как-раз тебе и отвечать на данные вопросы, как "механику"! Так что удачи Вам ребята! Надеюсь! И свистите, если нужна тупо-раб сила! Помогу - чем смогу!
    Добавлено: 10:48 30-11-2006   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
CheckerTwo :
то существует ненулевая вероятность того, что Obj-скрипты будут полностью переписаны.

Ну, насчёт обжей не знаю. А вот скрипты на обжи - будут.
Black_Jak :
Это радует! Потому что например как для меня, то игра Х2-Х3 имеет очень хорошую базу и достаточно слабую реализацию своих же возможностей!

Возможностей, конечно, не ахти. Но реализовано действительно мало. И на том, что даёт движок, можно реализовать немало. И, мне кажется, Egosoft в тупик зашла.
Black_Jak :
Идея мысли и идея факта! То есть не вопрос что можно что-то придумать, вопрос - можно ли это что-то реализовать!

Я более полугода думал, как привести в согласие то, что я хочу реализовать, с реалиями движка. В общем, придумал.
Black_Jak :
Надеюсь! И свистите, если нужна тупо-раб сила! Помогу - чем смогу!

Ловлю на слове. Мод будет для X2. Если интересно - пиши в личку, поговорим.
    Добавлено: 02:46 05-12-2006   
SD
 251 EGP


Рейтинг канала: 2(21)
Репутация: 30
Сообщения: 2405

Зарегистрирован: 05.03.2006
Lord of Silence :
инфа по другим битам переменной sh_Flags

Из моего опыта:
80h - вызывалось прерывание(?) При обнаружении этого флага AttackRunOnTarget сразу возвращает FLRET_INTERRUPTED.
8000h - Неуничтожимость.
80000000h - Корабль уничтожен.
    Добавлено: 09:30 05-12-2006   
Канал X2: The Threat: «X2-ASM - это проcто!»
На страницу: Пред.  1, 2, 3 ... 8, 9, 10, 11, 12  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Погон повесил. Эпитафию ему в профиль кто-нибудь отпишите. (Harley)

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