|
|
|
Канал 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
|
|
|
|
Lord of Silence
|
|
Добрый день уважаемые пилоты. Я здесь новичок но читаю форумы со времен X-Tension. Прежде всего хочу выразить огромный респект Shaddie, CheckerTwo, DF и Blueboar за то, что благодаря их усилиям появились такие чудесные программы, как: асм и дизасм obj. (Сбылась мечта идиота: увеличил силу мин, изменил SubType стартового корабля с открывахи на ХР, и еще кое-что по- мелочи). Но вот вопрос асмщикам: Никак не могу найти где задается лимит скорости для корабля игрока внутри станций - хочется убрать тупое ограничение на 40м/с. Сначала думал, что задается в TSTATION.ActivateInnerShip но менял там все, что связанныо со коростью - результат 0). Или может я не туда смотрю, а лимит задается где-нибудь в функциях класса TSHIP?
Ткните пожалуйста хотя-бы в каком направлении копать?
С уважениеем Lord Of Silence.
|
|
|
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
|
Ссылки на ассемблер и дизассемблер - в первом посте.
И здесь, на всякий случай:
Ассемблер
Дизассемблер
|
|
|
Doc77
40 EGP
 Репутация: 0 Сообщения: 73 Заблокирован
Зарегистрирован: 13.11.2006
 |
|
Не подскажите почему когда происходит установка ну например: Установил новую карту, при загрузке издаются страные звуки как описать,непомню где то слышал а где???
Что типа игра под себя настраивает тот или иной сюжет
|
|
|
Darth Revan
345 EGP
    Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006
 |
|
Похоже, скорость в ангаре задаётся не в STATION.ActivateInnerShip, а в TSHIP.__StartInHangar. И не в обже, а внутри функции SA_StartInHangar. И несколько другую физику в ангаре тоже контролирует движок. Можно попробовать там вставить новый лимит, может поможет. Или убрать SA_StartInHangar. Или что-то ещё
|
|
|
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 байт?
|
|
|
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:
|
|
|
|
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
|
Вроде исправил. Ссылка на подправленную версию:
Дизассемблер
|
|
|
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 (в нее передаются координаты точки назначения, скорость и еще чего то). Следовательно, если предел скорости движения корабля в станции и задается в обже, то в тех процедурах где происходит вызов этой процедуры.
_________________ Быстро едешь, тихо понесут... |
|
|
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 переписал.
|
|
|
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
На днях покопаю отпишусь.
|
|
|
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 обязателен. А вылеты в винду обычно из-за стека и происходят.
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
Shaddie опять нашел косяк
При полной перекомпиляции файлов XT и XBTF, obj-файл не собирался. Поправил это дело.
Ассемблер
|
|
|
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
|
все, теперь можно пробовать ассемблировать и доводить его до ума.
|
|
|
Black_Jak
65 EGP
 Репутация: 5 Сообщения: 73
Зарегистрирован: 22.10.2006
 |
|
CheckerTwo : |
все, теперь можно пробовать ассемблировать и доводить его до ума.
|
Вопрос простого читателя, мало-что понимающего в изложенном, но увлеченного игрой Х3!
Смотрю ты уже почти полностью расковырял игрушку, так почему не исправишь все глюкобаги?
ДА! И почему тогда не делаешь на основе игры какого-то интересного и глобального мода?
|
|
|
Darth Revan
345 EGP
    Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006
 |
|
CheckerTwo : |
Не очень понятно, почему их КС не делает проверок при окончательной линковке модулей.
|
Потому что он прожил точно такую же долгую жизнь. И не очень праведную.
Black_Jak : |
ДА! И почему тогда не делаешь на основе игры какого-то интересного и глобального мода?
|
Будет мод. Не всё сразу.
|
|
|
CheckerTwo
550 EGP
     Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004
 |
|
Black_Jak : |
Смотрю ты уже почти полностью расковырял игрушку
|
Не, только один маленький кусочек ковыряем. Всю игруху не осилить. Я подозреваю, что даже в ES нет человека, который разбирается во всех деталях игрушки.
Black_Jak : |
так почему не исправишь все глюкобаги?
|
Все глюки. Хм. Их найти еще нужно, понять, потом уж исправлять.
Если все будет хорошо, а есть серьезные основания надеятся что будет именно хорошо, то существует ненулевая вероятность того, что Obj-скрипты будут полностью переписаны.
Black_Jak : |
ДА! И почему тогда не делаешь на основе игры какого-то интересного и глобального мода?
|
Я ж не моддер, я - механик.
|
|
|
Black_Jak
65 EGP
 Репутация: 5 Сообщения: 73
Зарегистрирован: 22.10.2006
 |
|
Darth Revan : |
Будет мод. Не всё сразу.
|
Это радует! Потому что например как для меня, то игра Х2-Х3 имеет очень хорошую базу и достаточно слабую реализацию своих же возможностей!
CheckerTwo : |
Я ж не моддер, я - механик.
|
В любой идее есть две составляющие! Идея мысли и идея факта! То есть не вопрос что можно что-то придумать, вопрос - можно ли это что-то реализовать! Я так понимаю, что как-раз тебе и отвечать на данные вопросы, как "механику"! Так что удачи Вам ребята! Надеюсь! И свистите, если нужна тупо-раб сила! Помогу - чем смогу!
|
|
|
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. Если интересно - пиши в личку, поговорим.
|
|
|
SD
270 EGP
  Рейтинг канала: 2(21) Репутация: 30 Сообщения: 2544
Зарегистрирован: 05.03.2006
 |
|
Lord of Silence : |
инфа по другим битам переменной sh_Flags
|
Из моего опыта:
80h - вызывалось прерывание(?) При обнаружении этого флага AttackRunOnTarget сразу возвращает FLRET_INTERRUPTED.
8000h - Неуничтожимость.
80000000h - Корабль уничтожен.
|
|
|
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|