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

Search | Conference rules | Album | Register | Pilots list | Profile | Log in to check your private messages | Log in

   Page 4 of 5
Go to page: Previous  1, 2, 3, 4, 5  Next | All pages
Поиск в этой теме:
Канал X-Tension/X-BTF: «Раскопки обжа на предмет юзабельных вещей»
KWON
 328 EGP


Рейтинг канала: 7(586)
: -12
Posts: 136
Location: Україна. Чигирин.
Joined: 24 Nov 2014
yakim81 wrote:
Где то во внутренностях игры видел заготовки принадлежности сектора игроку. Если можно будет сделать и сектор, принадлежащий Игроку так, что бы эта информация отображалась на галактической карте.


С разрешения Shaddie поделюсь Редактором где можно ставить станции игрока и сделать сектор принадлежащий плаеру.
Также можете взять строку любой станции в "Stations.dat" и поставить после раздела [Player],
добавив её на карту уберите личные корабли класов М5, М4 и ТS иначе это тоже будут Эксперименталы только не М3.

XT Map Editor.7z
 Description:
Редактор карт со станциями игрока
 Filename:  XT Map Editor.7z
 Filesize:  1.9 MB
 Downloaded:  135 Time(s)

_________________
Постраждати за Україну, все одно, що постраждати за Христа!
https://www.youtube.com/watch?v=8ki69Vcb_-E

Last edited by KWON on 13:59 03-05-2017; edited 11 times in total
    Posted: 05:53 23-07-2016   
yakim81
 305 EGP


Рейтинг канала: 6(373)
: 16
Posts: 217

Joined: 07 Feb 2015
Улыбка У меня как обычно две новости.
1. Научил obj залетать на 11 горизонталь без проблем
2. Галактическая карта не видит 11 горизонталь, т.е. вообще не видно где летишь, но корабль Гонеров появился в новом секторе, а это значит, что, при создании кораблей Гонеров, учитываются сектора за матрицей 20х10, В меню чит при добавлении спутников во все системы - спутники добавляются в новые сектора за пределами матрицы 20х10, на карте не видно, но они присутствуют в меню личного имущества.


В прикрепленном файле измененный obj + файл патча с вносимыми изменениями.
Внесены изменения во всех циклах в связке 20+10, в некоторых местах значения передаются в качестве параметров для процедур и функций. заменено все подозрительное.

Запускной файл вылетает с ошибкой при выходе из игры (даже без разницы, открывалась карта или нет)

Редактор карт неверно читает значения из 44001.txt

Если после компиляции ваших obj игра вылетает - виноват компилятор, он переписывает секцию STRG на STRU. После компиляции необходимо в новом obj заменить последнюю секцию на исходную.

001_obj_30x30.ZIP
 Description:
001.obj 30x30
 Filename:  001_obj_30x30.ZIP
 Filesize:  574.27 KB
 Downloaded:  117 Time(s)
    Posted: 16:34 24-07-2016   
yakim81
 305 EGP


Рейтинг канала: 6(373)
: 16
Posts: 217

Joined: 07 Feb 2015
для отображения карты выше 11 горизонтали и шире 20 вертикали необходимо видимо отредактировать еще 00335.bod и 00365.bod. Пока, к сожалению, нет возможности это провести
Это оказалось не то. У меня закончились мысли...

Last edited by yakim81 on 22:39 29-07-2016; edited 1 time in total
    Posted: 16:44 28-07-2016   
KWON
 328 EGP


Рейтинг канала: 7(586)
: -12
Posts: 136
Location: Україна. Чигирин.
Joined: 24 Nov 2014
Благодаря пилоту Non разобрался как можно русифицировать обж, подобно программистам "НовогоДиска"!

Пошаговое описание:

- берем файл 001.obj ;
- создаем папку "UnpackSTR";
- розмещаем в ней XA_ASM.EXE и XA_ASM.INI пилота CheckerTwo;
брать здесь:
ссылка
http://www.elite-games.ru/conference/viewtopic.php?p=3552417#3552417
- cоздаем файл UnpackSTR.asm
с таким содержимым:
Code:
 .title obj_patch
 .ident XT
 .radix 16d
 .loadobj "001.obj"
 .section code, abs
 .end

т.е. с нулевым действием;
- в файле XA_ASM.INI выставляем:
StrCrypt = false
- берем мышкой файл "UnpackSTR.asm" и перетаскиваем на XA_ASM.EXE;
- получаем файл UnpackSTR.cod;
- скачиваем хороший гекс редактор (я пользуюсь BreakPoint Software Hex Workshop v6.7);
- открываем им UnpackSTR.cod;
- задаем в поиск гекс-код нахождения текстовой секции STR: 535452 (не адрес-смещение);
эта секция это всегда завершение файла 001.obj
и если вы редактором карт Shaddie добавляли сектора и объекты,
то этот участок смещается в конец файла.
- и о чудо! мы видим знакомые английские и немецкие буквы в место непонятных гекс-кодов которые были раньше в этом месте обжа!
- теперь главная и продолжительная работа:
с помощью гекс-редактора переводим все необходимые нам букафки
секция STR занимает в конце файла 001.obj 44090 байт
так что розбираться придется долго.

- завершив гекс-перевод создадим папку "РackSTR"
- розместим в ней XA_ASM.EXE и XA_ASM.INI пилота CheckerTwo;
- но, теперь в файле XA_ASM.INI выставляем:
StrCrypt = true
- помещаем сюда переведенный файл UnpackSTR.cod;
- переименовываем его в 001.obj;
- берем наш текстовый файл UnpackSTR.asm
и не меняя внутренностей переименуем его теперь в РackSTR.asm;
- берем мышкой файл "РackSTR.asm" и перетаскиваем на XA_ASM.EXE;
- получаем файл РackSTR.cod;
- теперь розмещаем в этой папке GPTH.EXE и GPTH.INI от пилота CheckerTwo;
- дапее берем мышкой файл РackSTR.cod и перетаскиваем на GPTH.EXE;
- получаем РackSTRfix.obj и РackSTRfix.pch;
- переименовываем их в 001.obj и 001.pch;
- потом копируем их в папку "L" игры и проверяем результат. Всё.

Правда теперь грузится игра чего то медленние но зато все переводы работают.

Тут обж моей работы.
посмотрите меню взлома, оно почти на русише.
Восстанов. - это значит презагрузка всей Икс-галактики с возвратом всех станций и кораблей (станции игрока не пострадают),
но потребует несколько минут ожидания (10-15) в зависимости от силы Вашего компа,
не додумайтесь нажать это два раза, замучитесь потом ждать презагрузки карты несколько раз.

Вложение удалено, смотреть обновленную русификацию ниже:
http://www.elite-games.ru/conference/viewtopic.php?p=3553065#3553065
_________________
Постраждати за Україну, все одно, що постраждати за Христа!
https://www.youtube.com/watch?v=8ki69Vcb_-E

Last edited by KWON on 06:26 03-01-2018; edited 1 time in total
    Posted: 20:44 27-12-2017   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Лучшей альтернативой будет strg abs патчинг с помощью xa_asm.
Доп. информация в посте CheckerTwo

Это удобнее, т.к. результат работы в маленьком текстовом файле.

Ограничения:
- кодировка файла патча CP1251
- длина строки не больше исходной

Важно: в xa_asm.ini выставить опцию StrCrypt = true
Code:
; Принудительное указание на криптовку секции строк.
; Если ключ не указан - выбор режима "криптовать/не криптовать" остается
; за компилятором. Если ключ указан - то будет выполнятся то, что установлено:
; TRUE - криптовать, FALSE - не криптовать
StrCrypt = true

Иначе игра после патча обжа будет вылетать.


Как сделать свой перевод этим способом?

1. Добжим оригинальный обж XT
Code:
dobj 001.obj



2. Открываем 001.str
В этом файле все строки обжа


3. Находим интересующую строку, к примеру:
Code:
00002355 : Dear tester.\nYou are able to test Race Campaigning. The notoriety towards the player of the race of this sector is now -300. If you fire one shot at a factory, a campaign is started. Hitting something after a campaign or after a truce starts next campaign. Have fun\n\nOnno Paap

Номер строки 00002355
Длина исходной строки 279 символов. Учитываем, чтобы наш перевод был не длиннее.


4. Патчим строки по этому шаблону:

Установка указателя на номер строки
Code:
$ = <Номер строки>h

суффикс h нужен, чтобы шестнадцатеричный адрес был правильно найден

Замена строки
Code:
S0002355: .ascii     "Строка"

Номер строки тот же, но первый нуль меняется на S и суффикс h отсутствует
Сама строка в кавычках, строки поддерживаются только в кодировке ASCII

Конечный пример:
Code:
           .title     rus_patch
           .ident     XT
           .radix     10d
           .loadobj   "001.obj"
 
           .section   strg, abs

$ = 00002355h
S0002355:  .ascii      "Уважаемые тестеры.\nВы можете проверить Гонки. Награда победителю этого сектора теперь - 300. Кампания начнется, когда вы выстрелите по фабрике. При выстреле по чему-либо после начала кампании или перемирия перезапустит кампанию. Веселитесь\n\nОнно Паап"

           .end



Как сделать перевод, когда нужно вместить больше символов?

1. Находим команду, вызывающую интересующую нас строку в файле 001.out по номеру строки как в файле 001.str, только первый нуль заменён на S: 00003963 -> S0003963
Code:
000D579C: 0056 00002355          |    0            get_strg   S0002355 ;  ; "Dear tester.\nYou are able to test Race Campaigning. The notoriety towards the player of the race of this sector is now -300. If you fire one shot at a factory, a campaign is started. Hitting something after a campaign or after a truce starts next campaign. Have fun\n\nOnno Paap"

2. Устанавливаем указатель на адрес с вызовом строки и подменяем на вызов своей строки
Code:
           .section   code, abs

$ = 000D579Ch
           get_strg   S000AD6F

3. Дописываем свою строку неограниченной длины в конец строковой секции.
Code:
           .section   strg, con

S000AD6F:  .ascii     "Dear tester.\nYou are able to test Race Campaigning. The notoriety towards the player of the race of this sector is now -300. If you fire one shot at a factory, a campaign is started. Hitting something after a campaign or after a truce starts next campaign. Have fun\n\nOnno Paap\nHAHAHAHAHA HAH AHH HA AHHA HAHH"


Ассемблер xa_asm решает, какой будет адрес у строки при дозаписи в конец, основываясь на длине предидущих.

Новая строка в строковой секции патченного обжа:
Code:
0000AC3B : Dear tester.\nYou are able to test Race Campaigning. The notoriety towards the player of the race of this sector is now -300. If you fire one shot at a factory, a campaign is started. Hitting something after a campaign or after a truce starts next campaign. Have fun\n\nOnno Paap\nHAHAHAHAHA HAH AHH HA AHHA HAHH



В приложении перевод от KWON в виде asm патча и пример добавления строк неограниченной длины.

xt_obj_l10n_example.7z
 Description:
 Filename:  xt_obj_l10n_example.7z
 Filesize:  3.02 KB
 Downloaded:  43 Time(s)
    Posted: 20:37 28-12-2017   
KWON
 328 EGP


Рейтинг канала: 7(586)
: -12
Posts: 136
Location: Україна. Чигирин.
Joined: 24 Nov 2014
Спасибо пилоту Non, получилось сделать удлинение записей русификации:

1. Слово "Armageddon" заменено на "Bосстановление всей карты".
 Cкрытый текст   (кликните здесь для просмотра)

2. Слово "Variables" заменено на "Проверить рейтинг (клав. [+])".
 Cкрытый текст   (кликните здесь для просмотра)

3. Также переведено меню очков расовых рейтингов:
 Cкрытый текст   (кликните здесь для просмотра)

4. Ещё скриншот Секретной миссии:
 Cкрытый текст   (кликните здесь для просмотра)

5. Информация о данных на станции игрока:
 Cкрытый текст   (кликните здесь для просмотра)


Весь список русифицированных слов в 001.obj:
 Cкрытый текст   (кликните здесь для просмотра)

Перевод секции STRG:
00001621 : Неизв. команда!
00002355 : Уважаемые тестеры.\nВы можете проверить Гонки. Награда победителю этого сектора теперь - 300. Кампания начнется, когда вы выстрелите по фабрике. При выстреле по чему-либо после начала кампании или перемирия перезапустит кампанию. Веселитесь\n\nОнно Паап
0000246A : Да
000025D8 : Игрок
0000281A : Бренaн
00002E50 : Ускор. производ
00002E60 : Норм. производ.
00002E71 : Взлом Банка Икс-Галактики на %d%02d
00002E9B : Взлом оборудования!
000030D0 : Цель
0000312A : Камера
000034EC : Нет доступной информационной помощи на эту тему сейчас
000035EC : Нет объектов!
00003704 : %d.%d м/с
00003725 : %d м/с%c
00003770 : %d МВ
00003820 : %d неопределен
0000394B : Показать все сектора
00003963 : Дать заводы игроку
00003978 : Дать спутники
00003987 : Проверить задачи
0000399B : Не нажимать - затрясет!
000039B6 : Взлом галактического банка на %d
00003BC4 : [Л]
00003C23 : %d км
00003CBA : Перемен.
00003D07 : Диалог
00003E26 : Статус: %s
00003E47 : Текущий Приоритет:%d
00003E6B : Мин. Приоритет: %d
00003E8F : Макс. Приоритет: %d
00003EAD : Есть
00003EB2 : Нет
00003EB8 : Вероятность: %s
00003F72 : Квест
0000405A : Настройка
00004081 : Земля - колыбель ума, но мы не можем жить всегда в колыбели.
000040CB : \nЗемля - колыбель ума, но мы не можем жить всегда в колыбели.
00004125 : \n-Koнстантин E. Циолковский\n\nВы поставили бы корабельные паруса против ветров и водотоков, освещая костер под его палубой... Я не имею времени для бессмыслицы.\nВы поставили бы корабельные паруса против ветров и водотоков, освещая костер под его палубой... Я неимею никакого времени для такой бессмыслицы.
00004269 : \n-Наполеон\n\nГлавное - не переставать задавать вопросы.
000042A4 : \nГлавное - не переставать задавать вопросы.
000042DB : \n-Альберт Ейштейн\n\nУм и дух человека растут с Космосом, в котором он позволяет действовать.
0000433D : \nУм и дух человека рустут с космосом, в котором он действует.
0000437F : \n-Крафт А. Ерике \n
00004446 : %s %s Л:%d Щ:%d
00004604 : Усоверш
00004824 : Меню
0000482C : Переменные Квеста %s
00004843 : Знач.
0000485A : Нет перем-х
00004945 : Пилот:***?????
00004954 : ...
00004958 : ..Неизвестный объект**????
00004973 : ..
00004976 : ..*Неизвестно что????
0000498C : Жрец Гонеров...
0000499C : . ? Н-Л-О.................
00005186 : Ты трус! Почему ты улетаешь? Мы думали, что можем доверять тебе!
000051F2 : Отношение Аргона
0000520C : Отношение Сплита
00005226 : Отношение Паранида
00005240 : Отношение Борона
0000525A : Отношение Телади
00005274 : Отношение Пиратов
0000528E : Отношение Гонеров
000052A6 : Количество ведомых:
0000537A : Нападение
00005384 : Нападающих
000093D0 : Восстанов.
000093EC : Запись в журнал
00009419 : Продажа
00009424 : Продать корабль
00009494 : Запись
000094A0 : Запись
000094AA : Введите запись:
000094C0 : Введите запись:
000094D5 : Улучш. судов
000094E3 : Усоверш. судов
00009505 : Имя
0000950A : Нажмите любую клавишу
0000952D : Нажмите любую клавишу
00009565 : Отлично! Хорошие фотографии. Вот деньги - %s Кредитов.
000095AA : Превосходно! Мы удовлетворены твоей работой. Вот деньги - %s кр.
000096B4 : Ручная запись журнала
000099E9 : Ваш
000099ED : Ваш
00009AA6 : Данные производ.цикла
00009ABC : Данные производ.цикла
00009ADA : Врем.цикла
00009AE5 : Врем.цикла
00009AF0 : Сколько производит
00009B03 : Сколько производ
00009B14 : Производство завер.
00009B29 : Производство завершено
00009B5B : Доступно нужных ресурсов
00009B76 : Доступно нужных ресурсов
00009C4A : Зв-д
00009C4F : Солнц
00009C68 : Система удаленной торговли отсутствует
00009C8F : Система удаленной торговли не установлена
00009CF8 : Груз
00009CFE : Груз
00009D17 : %s%s%d%s Кр
00009E33 : Нет доступа
00009E45 : Нет доступа
00009E56 : Да
0000A146 : %scr получите если доставите меня к %s %s в %s секторе %s для работы. %scr оплата за миссию.
0000A1BD : Найдите формулу лекарства от Аргонского Гриппа(сектор Президентский Рубеж) и вернитесь к %s в секторе '%s'. Время-%s час.
0000A239 : Мое имя-доктор %s, и мне нужна Ваша помощь! У нас на станции вспыхнул 'Аргонский Грипп'. Мы слышали, что существует лекарство, и мы должны узнать его формулу. Пожалуйста, летите к торговой станции в секторе 'Президентский Рубеж', где должна быть эта формула. Я даю вам %s час(а,ов). Пожалуйста, быстрее!
0000A44A : Транспорт
0000A456 : Транспортник
0000A46F : Отключить сканер
0000A483 : Закрыть
0000A48E : Oтключить Скан.
0000A49E : Закр.
0000A4A4 : Привет, моё имя %, я коммерционный представитель этой %s станции. Перевезитe меня на станцию %s в Системе %s. Я заплачу Вам %scr за Вашу службу.
0000A545 : Говорит тайная служба Борона. Мы к сожалению сообщаем, что смог убежать пират Мале Ги. Мы попробуем узнать о его новом местопребывании. Мы изведали, что он пошлет Транспортник с Космотабаком через сектор %s. За уничтожение этого транспорта мы платим 20000кр. Поспешите, однако.
0000A6F6 : Говорит тайная служба Борона. Мы получили анонимное указание, что Мале Ги нападет на боронскую коммерционную станцию в секторе %s. Мы платим Вам 50000кр. если Вы успешно обороните станцию. Спасите невиновных боронцев!
0000A824 : Гром
0000A82C : Maлe Ги
0000A843 : Ocминожек II
0000A850 : Бала Ги
0000A868 : Гонер Ван
0000A872 : Кларис
0000A879 : Cтрела
0000A884 : Meлиса Бенкс
0000A951 : Да, Да
0000A995 : Икс-Прото
0000A9A1 : Паранид Персей
0000AC3B : Bосстановление всей карты
0000AC55 : Проверить рейтинг (клав. [+])


Можно посмотреть сам пример русифицированного обжа.
Бросил в архив ещё и текстовые файлы заодно.

Rus_001.obj.7z
 Description:
Пример русификации 001.obj
 Filename:  Rus_001.obj.7z
 Filesize:  545.66 KB
 Downloaded:  41 Time(s)

_________________
Постраждати за Україну, все одно, що постраждати за Христа!
https://www.youtube.com/watch?v=8ki69Vcb_-E

Last edited by KWON on 15:01 27-01-2018; edited 4 times in total
    Posted: 03:47 03-01-2018   
KWON
 328 EGP


Рейтинг канала: 7(586)
: -12
Posts: 136
Location: Україна. Чигирин.
Joined: 24 Nov 2014
Для желающих использовать и русифицировать свой обж а не выложенный пример
предлагается уже переведенный участок обжа - секции STR.

Порядок работы:
1. Скачать файл "Rus OBJ".
2. Открыть гекс-редактором Ваш 001.obj.
3. Задать в поиск гекс-код 535452.
4. Поставить курсор перед буквой S и выделить всё до конца файла (44095 байт).
5. Открыть гекс-редактором файл "Rus OBJ" и просто выделить всё содержимое.
6. Скопировать выделенную область и перенести на выделение Вашего 001.obj.
7. Всё. Сохраните и тестируйте.

Rus OBJ.rar
 Description:
Закриптованный участок секции STRG
 Filename:  Rus OBJ.rar
 Filesize:  38.97 KB
 Downloaded:  41 Time(s)

_________________
Постраждати за Україну, все одно, що постраждати за Христа!
https://www.youtube.com/watch?v=8ki69Vcb_-E
    Posted: 13:51 05-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Расковырял отключение захвата и отключение бесячего (меня) рандомного повреждения оборудования. Совместимость с сейвами до/после присутствует. Можно поиграть с отключенными, потом вернуть оригинальный обж и продолжить играть.

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

Частично разобрался как подменять стандартные функции кнопок на свои. К примеру заставил F2 запускать добавляемую в конец обжа функцию, чтобы тестировать пошустрее чего делает различный код в XT. Подозрение.

Много чего из обжа X2 очень похоже на XT, я таким образом и понял, какой именно код пропускать в процедуре TSHIP.AttackedBy, чтобы отключить захват. Да.

Подробнее в readme.html внутри архива.
    Posted: 23:21 12-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Мда блин, это жестко. Улыбка

С чего собственно началась эта тема, и на что мозгов хватило только сейчас.

Анимация меню + блокировка управления побеждена. Улыбка

Помимо уничтожения бодов с анимацией по раскопкам CheckerTwo (Open/Close), есть ещё подляна в обже.

Code:
000F1136: 0031 00078825          |    1 L000F1136: jump       L000F1052
000F113C: 0006 000A              |    1 L000F113C: read       TMENU.me_Mask ; [10d ; 0Ah]
000F1140: 0033 000788A9          |    2            if SP[0]=0 then jump L000F115A
000F1146: 0001 03E8              |    1            push       1000d ; 03E8h
000F114A: 000A                   |    2            push       1
000F114C: 005A 000000C5          |    3            callasm    P_Delay ; 000000C5


000F1146 - вот она наша подляна, задержка в 1000 мс.

Простенький патчик для обжа через xa_asm:
Code:
           .title     001.obj
           .ident     XT
           .radix     10d
           .loadobj   "001.obj"

           .section   code, abs

$ = 000F1146h
           push       50d

           .end

Значение ниже 50 не рекомендую, я тестил.

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

...

Дошёл до Ксенонского безумия.
В процедуре TRACE.Logic можно снизить таймауты. Ксенонские карательные отряды будут создаваться не раз в 40-55 секунд, а раз в 2-3 секунды. Верфь больше не закроет свой шлюз Хаос

Code:
; 000D49C2: 0001 2710              |    2 L000D49C2: push       10000d ; 2710h
; 000D49C6: 0001 61A8              |    3            push       25000d ; 61A8h
$ = 000D49C2h
           push       1000d
           push       1500d

; 000D49EC: 0001 7530              |    2            push       30000d ; 7530h
$ = 000D49ECh
           push       1000d


Last edited by Non on 02:19 13-01-2018; edited 1 time in total
    Posted: 00:27 13-01-2018   
KWON
 328 EGP


Рейтинг канала: 7(586)
: -12
Posts: 136
Location: Україна. Чигирин.
Joined: 24 Nov 2014
Класс!
Будем разбираться.

Значит, теперь Вам возможно расширение процедур и даже добавлять недоступные объекты на карту?
Тогда посмотрите это сообщение:
http://www.elite-games.ru/conference/viewtopic.php?p=3299124#3299124
Там речь о увеличении количества НЛО и размещение на карту мин и лазерных башен для врага (Пиратам, Ксенонам).
Non wrote:
Частично разобрался как подменять стандартные функции кнопок на свои. К примеру заставил F2 запускать добавляемую в конец обжа функцию, чтобы тестировать пошустрее чего делает различный код в XT.

Т.е. теперь реально запустить насильно любую миссию, да?
_________________
Постраждати за Україну, все одно, що постраждати за Христа!
https://www.youtube.com/watch?v=8ki69Vcb_-E
    Posted: 15:27 13-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
KWON wrote:
Значит, теперь Вам возможно расширение процедур и даже добавлять недоступные объекты на карту?

Расширение процедур тема непростая. При добавлении своего кода через jump в конец и jump обратно нужно правильно поработать со стеком (иногда ещё и правильно увеличить размер стека - setmem). В этом сильно помогает транслятор XC->XASM, который в целом генерирует корректный для XT код, за исключением нескольких отличий в именах встроенных функций и т.д.

Самое оптимальное для abs патчинга оригинального обжа, чего мне удавалось получить в X2 это:
1. Взять оригинальную процедуру.
2. Собрать с ней обж и задобжить его.
3. Изменить процедуру, собрать с ней обж и задобжить его.
4. diff'ом сравнить изменения в XASM коде, куда надо вставлять jump'ы, как изменился setmem и т.д.

Такой подход не прокатил с функцией _Init в X2 например. Всё вроде бы корректно, но _Init перестаёт работать.

Я думаю что в своей левой процедуре, генерируемой транслятором XC->XASM, возможно потом немного подправленной под XT, можно вольно воротить чего угодно.

Один минус - не понятно как запустить её только один раз при старте игры / загрузке сохранёнки.

Глобальные переменные .vint роняют игру при загрузке с сохранёнки. А они нужны, допустим, чтобы установить флаг, запускалась ли твоя процедура, или нет. Но можно придумать и другой флаг, может даже созданный астероид по особым координатам Улыбка, надо только немного подумать. Подозрение.

KWON wrote:
Т.е. теперь реально запустить насильно любую миссию, да?

Думаю вполне. Нужно найти место где она запускается и с какими аргументами (если такие есть) и запустить её по образу и подобию в своей процедуре.



Расскажу немного, как транслятор XC->XASM сильно может упростить понимание происходящего в XASM коде обжа. Также рекомендую почитать транслированный в XC обж X2, почти все функции 1 в 1.

Разберу до безобразия примитивную тестовую функцию, написанную на XC.

Code:
#include "inc/xt.h";

.func Testing

function Testing()
{
  var PlShip=TCLIENT.GetPlayerShip()->GetObjectID();
  SA_MoveObjectIntoContainer(SA_AllocObject(9,3), PlShip);
}


Она добавляет на корабль игрока щит на 125МВт на низком уровне, игнорируя добавление товара в трюм и т.д.

Code:
Testing:

setmem     5                           ; Размер стека
push       0                           ;1 Нули толкаются в стек, когда функция запускается без параметров
push       0                           ;2 Т.к. после запуска функция уничтожает верхнюю ячейку стека
push       2100d                       ;3 Это номер класса TClient
call59     TCLIENT.GetPlayerShip       ;2 Здесь вызов функции съел 2100d и 0, вернул PlayerShip и остался первый 0
call       GetObjectID                 ;1 Здесь вызов функции съел 0 и Playership, вернул PlayershipObjectID
push       SP[0]                       ;2 В стек запихивается копия PlayershipObjectID, их теперь там две
push       3                           ;3 В стек толкается 3 из SA_AllocObject(9,3)
push       9                           ;4 В стек толкается 9 из SA_AllocObject(9,3), читать проще задом наперёд
push       2                           ;5 Теперь в стек толкается 2, означает что параметров для SA_AllocObject 2
callasm    SA_AllocObject              ;3 Съедает 3 последние значения из стека (3, 9, 2) и возвращает в стек объект
push       2                           ;4 Теперь в стеке две копии PlayershipObjectID, объект из SA_AllocObject и 2
callasm    SA_MoveObjectIntoContainer  ;2 Эта функция съедает 2 (кол-во параметров), PlayershipObjectID и объект(щит)
pop                                    ;1 Уничтожается возвращённое SA_MoveObjectIntoContainer значение (наверное 0)
pop                                    ;0 Уничтожается исходный PlayershipObjectID
push       0                           ;1 Толкается 0
ret                                    ;0 Возвращается этот 0, т.к. функция всегда что-то возвращает


Кстати, если транслировать код без определения переменной через var или var:=, то он получается короче и копия Playership уже не толкается в стек, используется исходная:

Code:
SA_MoveObjectIntoContainer(SA_AllocObject(9,3), TCLIENT.GetPlayerShip()->GetObjectID());


Code:
Testing:
           setmem     4
           push       0
           push       0
           push       2100d
           call59     TCLIENT.GetPlayerShip
           call       GetObjectID
           push       3
           push       9
           push       2
           callasm    SA_AllocObject
           push       2
           callasm    SA_MoveObjectIntoContainer
           pop
           push       0
           ret


Last edited by Non on 18:47 13-01-2018; edited 8 times in total
    Posted: 17:43 13-01-2018   
KWON
 328 EGP


Рейтинг канала: 7(586)
: -12
Posts: 136
Location: Україна. Чигирин.
Joined: 24 Nov 2014
Non wrote:
В процедуре TRACE.Logic можно снизить таймауты.
Ксенонские карательные отряды будут создаваться не раз в 40-55 секунд, а раз в 2-3 секунды.
Верфь больше не закроет свой шлюз


Да, крутая вещь - бесконечность Караванов Ксенонов.
Наверно теперь можно поправить плач всех экстэнщиков о вопиющей "активности" пиратов?

Вот, попробовал в 6-ти местах поменять 15000 на 1000.
И что вы думаете...
заворушились пиратики:
Code:
000D89D6: 0001 3A98              |    5            pushw      15000d ; 3A98h
000D89DA: 0001 3A98              |    6            pushw      15000d ; 3A98h

000D9EC6: 0001 3A98              |                 pushw      15000d ; 3A98h
000D9ECA: 0001 3A98              |                 pushw      15000d ; 3A98h

000DA4F8: 0001 3A98              |                 pushw      15000d ; 3A98h
000DA4FC: 0001 3A98              |                 pushw      15000d ; 3A98h

_________________
Постраждати за Україну, все одно, що постраждати за Христа!
https://www.youtube.com/watch?v=8ki69Vcb_-E

Last edited by KWON on 21:43 13-01-2018; edited 1 time in total
    Posted: 21:26 13-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Осилил старт в случайном секторе. Улыбка

Запуск кода на XC в папке inc происходит вместо вот этого в процедуре TClient.Run
Code:
000DE1D4: 0006 0005              |   11            read       TCLIENT.cl_StartsectorY ; [5]
000DE1D8: 0006 0004              |   12            read       TCLIENT.cl_StartsectorX ; [4]
000DE1DC: 0004 0011              |   13            readvar    global.ga_Sectors ; [17d ; 11h]
000DE1E0: 0008                   |   14            get_from_array
000DE1E2: 0008                   |   13            get_from_array
000DE1E4: 000A                   |   12            push       1
000DE1E6: 0001 0834              |   13            push       2100d ; 0834h
000DE1EA: 0059 0006EE82 0000290D |   14            call59     TCLIENT.EnterSector ;
000DE1F4: 002C                   |   12            pop
000DE1F6: 0009                   |   11            push       0
000DE1F8: 002C                   |   12            pop
000DE1FA: 0006 0005              |   11            read       TCLIENT.cl_StartsectorY ; [5]
000DE1FE: 0006 0004              |   12            read       TCLIENT.cl_StartsectorX ; [4]
000DE202: 0004 0011              |   13            readvar    global.ga_Sectors ; [17d ; 11h]
000DE206: 0008                   |   14            get_from_array
000DE208: 0008                   |   13            get_from_array
000DE20A: 000A                   |   12            push       1
000DE20C: 0006 0001              |   13            read       TCLIENT.cl_Player ; [1]
000DE210: 0057 0000290D          |   14            call       EnterSector ; 0000290D
000DE216: 002C                   |   12            pop
000DE218: 0009                   |   11            push       0
000DE21A: 002C                   |   12            pop


А вот собственно сам код:
Code:
GetRandomSector:
{
  var x, y;
  P_Delay(1000);
  while
  {
    x=P_Random(20);
    y=P_Random(10);
    if(global.ga_Sectors[x][y]->GetOwner())
    {
      break;
    }
  }
  TCLIENT.EnterSector(global.ga_Sectors[x][y]);
  TCLIENT.GetPlayer()->EnterSector(global.ga_Sectors[x][y]);
}
jump ContinueTClientRun;


Брать тут
    Posted: 01:37 14-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Решил покодить на асме. Улыбка

Сделал старт со случайным кораблём М4-М5, запуск глобальной функции Testing из patch.xc при старте игры / загрузке сохранения, иными словами любого произвольного кода, который там будет написан. Улыбка
И максимальные апгрейды скорости / поворота для NPC.
Ксенонские К теперь пипецки опасны. Улыбка
А как весело они таранят пирбазу, если случайно стартовал в Ксенонском секторе. Хы...

Все обновления по-прежнему доступны во вложении в первом посте. Улыбка


Старт со случайным кораблём
Code:
           .section   code, abs

; 000DE038: 0009                   |   11 L000DE038: push       0
; 000DE03A: 000A                   |   12            push       1
; 000DE03C: 000F                   |   13            push       6
; 000DE03E: 0009                   |   14            push       0
; 000DE040: 0009                   |   15            push       0
; 000DE042: 0009                   |   16            push       0
; 000DE044: 000F                   |   17            push       6
; 000DE046: 0001 07E8              |   18            push       2024d ; 07E8h
; 000DE04A: 003A                   |   19            create_object
; 000DE04C: 0057 000009BB          |   19            call       TSHIP_M4.Create ; 000009BB
; 000DE052: 002B 0002              |   12            write      TCLIENT.cl_Ship ; [2]
; 000DE056: 002C                   |   12            pop
$ = 000DE038h
           jump       GetRandomShip

$ = 000DE056h
GetRandomShipRet:

           .section   code, con

GetRandomShip:
           push       2
           push       1
           callasm    P_Random
           push       6
           add        SP[0], SP[1] ; 0 class (var)

           push       0 ; 1 regular / TL

           push       4
           push       1
           callasm    P_Random
           push       1
           add        SP[0], SP[1] ; 2 race

           push       SP[2] ; 3 class (var)

           push       0 ; 4
           push       0 ; 5
           push       0 ; 6
           push       6 ; 7
           push       2018 ; 8

           push       SP[8] ; 9 class (var)
           add        SP[0],SP[1]
           create_object
           call       TSHIP_M3.Create
           .word      2Bh, 2 ; write TClient.cl_Ship
           pop
           jump       GetRandomShipRet


Автозапуск глобальной функции Testing из patch.xc
Code:
           .section   code, abs
; 000DE244: 002E 0007              |   11            popx       7
; 000DE248: 0054                   |    4            end_critical
$ = 000DE244h
           jump       NewGame
NewGameRet:

; 0002BC4A: 002C                   |    1            pop
; 0002BC4C: 0009                   |    0            push       0
; 0002BC4E: 0035                   |    1            ret
$ = 0002BC4Ah
           jump       LoadSave


           .section   code, con
NewGame:
           popx       7
           push       0
           call58     global.Testing
           pop
           end_critical
           jump       NewGameRet

LoadSave:
           pop
           push       0
           call58     global.Testing
           pop
           push       0
           ret


Максимальные апгрейды NPC
Code:
           .section   code, abs

; 000ABF04: 0011                   |    1            push       8
; 000ABF06: 0005 0002              |    2            push       SP[1] ; loc1
; 000ABF0A: 000B                   |    3            push       2
; 000ABF0C: 005A 0000175E          |    4            callasm    P_RandomLowNorm ; 0000175E
$ = 000ABF04h
           push       0
           pop
           push       0
           pop
           push       0
           pop
           push       SP[0]

; 000ABF3C: 0011                   |    1            push       8
; 000ABF3E: 0005 0002              |    2            push       SP[1] ; loc1
; 000ABF42: 000B                   |    3            push       2
; 000ABF44: 005A 0000175E          |    4            callasm    P_RandomLowNorm ; 0000175E
$ = 000ABF3Ch
           push       0
           pop
           push       0
           pop
           push       0
           pop
           push       SP[0]


Last edited by Non on 23:52 17-01-2018; edited 1 time in total
    Posted: 22:35 17-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Согласен. Нифига не понятно - автоматически запускается произвольный код, и че? Подозрение.

Тогда пример. Улыбка

Функция Testing, она же произвольный код.

Разместит игрока поближе к южным воротам. Создаст нам новый сектор под Danna's Chance (пиратский). Подсоединит воротами новый сектор. Создаст в нём солнце, планету и 200 астероидов со случайными координатами, моделькой и ресурсом.

И всё это на любой сохранёнке. Подмигиваю
Привет интерактивность.
Добавлено: Или не совсем на любой. Всё оно конечно создаёт, только со звуком в новом секторе происходит какая-то фигня. А в новой игре норм..
Добавлено ещё: Похоже всё дело было в том, что сектору обязательно нужно установить владельца. На сохранёнке сделанной в оригинальной игре теперь со звуком всё нормально.

Так можно и случайную карту сделать, на самом деле. Может и сделаю, когда-нибудь. Улыбка

Вся эта ерунда сейчас подключена во вложении в первом посте.
Начало новой игры разместит игрока в секторе, в котором происходит добавление ворот и создаст собсна новый сектор.

Code:
function Testing()
{
  // Задержка 5 секунд
  P_Delay(5000);

  // Чтобы наш код не запускался более одного раза в сохранёнке
  // Используем неиспользуемую существующую глобальную переменную
  if(global.ga_ClientID==339)
  {return(0);}
  global.ga_ClientID=339;

  // Поставим корабль игрока поближе к воротам
  SA_SetPos(TCLIENT.GetPlayerShip()->GetObjectID(), 0, 0, -6800000);

  // Создадим новый сектор
  var x = 4;
  var y = 7;
  var sector = global.ga_Sectors[x][y] = new(TSECTOR)->Create(x, y);
  // Установим владельца сектора (необходимо для его нормальной работы)
  sector->SetOwner(global.ga_Races[7]);

  // Создадим солнце
  var sun = new(TSUN)->Create(
    14400000*2, // x
    360000*2, // y
    28800000*2, // z
    255,        // r
    255,        // g
    255         // b
  );
  // Добавим его в сектор
  sun->AddTo(sector);

  // Создадим планету
  var planet = new(TPLANET)->Create(
    28800000*30, // x
    360000*2,   // y
    12000000*2, // z
    3           // подтип планеты, текстура
  );
  planet->AddTo(sector);

  // Создадим ворота
  var gate = new(TGATE)->Create(
    0,       // x
    0,       // y
    7200000, // z
    0        // тип ворот: С/N 0; Ю/S 1; З/W 2; В/E 3
  );
  // Добавим их в сектор
  gate->AddTo(sector);

  // Создадим ворота в существующем секторе, чтобы соединить его с новым
  // Ворота южные
  gate=new(TGATE)->Create(0, 0, -7200000, 1);
  gate->AddTo(global.ga_Sectors[4][6]);

  // Создадим 200 астероидов по случайным координатам в новом секторе
  var asteroid, ast;
  for(ast=0; ast<200; ast=ast+1)
  {
    asteroid = new(TASTEROID)->Create(
      P_Random(14400000) - 7200000, // x
      P_Random(14400000) - 7200000, // y
      P_Random(14400000) - 7200000, // z
      P_Random(3),                  // подтип астероида (модель)
      P_Random(2),                  // ресурс астероида (руда, кремний)
      P_Random(50)                  // количество минерала
    );
    asteroid->AddTo(sector);
  }
}


Last edited by Non on 17:25 18-01-2018; edited 8 times in total
    Posted: 02:14 18-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Запись в файл в папке с игрой прямо из кода обжа. Улыбка

Code:
var file = SE_FOpen("test.txt", "w");
SE_FPrintf(file, "test test");
SE_FClose(file);


После исполнения игрой этого кода в папке с игрой создастся файл test.txt с содержанием "test test".

SE_FPrintf поддерживает форматирование:
Code:
SE_FPrintf(file, "number: %d", variable);

Если переменная variable содержала 5, то в файле будет
Code:
number: 5


SE_FPrintf и SE_SPrintf разные функции. Первая для записи форматированного текста сразу в файл. Вторая для записи форматированного текста в строку.

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

Code:
var string = "";
string = string + SE_SPrintf("variable1: %d\n", variable1);
...
string = string + SE_SPrintf("variable2: %d\n", variable2);


И получим в файле что-то вроде:
Code:
variable1: 5
variable2: -199659


Для чего это может быть полезно, спросите вы?

Отлаживать свой код, записывать в файл содержимое переменных.

Динамически записывать имена секторов при генерации случайной карты сразу в языковой файл. Улыбка

Last edited by Non on 18:23 18-01-2018; edited 3 times in total
    Posted: 18:12 18-01-2018   
Shepard
 434 EGP


Модератор
Рейтинг канала: 3(34)
: 89
Posts: 3250
Location: из безумного и бесконечного
Joined: 02 Feb 2010
Вот бы путь до земли раскопать...или сектор земной выдернуть из XBTF
_________________
and Nothing Else Matters...
    Posted: 15:33 19-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Shepard wrote:
Вот бы путь до земли раскопать...или сектор земной выдернуть из XBTF

Это не сложно. Можно создать аналогичный по образу и подобию и воткнуть туда земной авианосец. Тока чё дальше? Хы...

Можно даже симулировать XBTF-шный прыжок в X-вселенную со случайно генерированной картой, в теории. Улыбка
Не знаю как с озвучкой, но cut-сцена прыжка со злыми молниями есть. Я её даже в X2 прикручивал на обже.

Last edited by Non on 16:09 19-01-2018; edited 1 time in total
    Posted: 16:09 19-01-2018   
Shepard
 434 EGP


Модератор
Рейтинг канала: 3(34)
: 89
Posts: 3250
Location: из безумного и бесконечного
Joined: 02 Feb 2010
Пофиксить врата в Триумфе, запилить путь к земле, а там
Non wrote:
симулировать XBTF-шный прыжок в X-вселенную со случайно генерированной картой, в теории. Улыбка
Не знаю как с озвучкой, но cut-сцена прыжка со злыми молниями есть
Хы...
_________________
and Nothing Else Matters...
    Posted: 16:55 19-01-2018   
Non
 790 EGP


Модератор
Рейтинг канала: 6(332)
: 237
Posts: 793

Joined: 27 Jun 2006
Пытаюсь пересобрать обж XT полностью, чтобы можно было пожоще откорректировать через XC.

Поправил из 38 ошибок 34. Осталось 4 вызова локальных процедур/функций, альтернативы которым не понимаю где искать:
Code:
 pass2:(001_fixed.asm:302745) Err: Undefined identifier 'SetLatency'.

 pass2:(001_fixed.asm:313080) Err: Undefined identifier 'Debug'.

 pass2:(001_fixed.asm:383527) Err: Undefined identifier 'IsDisabled'.

 pass2:(001_fixed.asm:384059) Err: Undefined identifier 'IsDisabled'.


 Контекст SetLatency (TClient.Init)   (кликните здесь для просмотра)
Code:
;
; === Init ======================================================
; procedure TCLIENT.Init(arg1);
;
TCLIENT.Init:
           setmem     4
           get_strg   S000281A ;  ; "BRENNAN"
           get_strg   S000086E ;  ; "%s"
           push       2
           callasm    SE_SPrintf ; 000003C2
           write      TCLIENT.cl_UserName ; [41d ; 29h]
           pop
           push       1
           write      TCLIENT.cl_UID ; [42d ; 2Ah]
           pop
           push       0
           write      TCLIENT.cl_CutScene ; [0]
           pop
           push       0
           write      TCLIENT.cl_Player ; [1]
           pop
           push       0
           write      TCLIENT.cl_Ship ; [2]
           pop
           push       0
           write      TCLIENT.cl_New ; [3]
           pop
           push       1
           write      TCLIENT.cl_StartsectorX ; [4]
           pop
           push       3
           write      TCLIENT.cl_StartsectorY ; [5]
           pop
           push       0
           write      TCLIENT.cl_SunInst ; [6]
           pop
           push       0
           write      TCLIENT.cl_WarpRequest ; [7]
           pop
           push       0
           write      TCLIENT.cl_WarpPID ; [8]
           pop
           push       0
           write      TCLIENT.cl_AutoPilotMode ; [9]
           pop
           read       TCLIENT.cl_WarpSectorX ; [10d ; 0Ah]
           pop
           read       TCLIENT.cl_WarpSectorY ; [11d ; 0Bh]
           pop
           push       0
           write      TCLIENT.cl_DateString ; [12d ; 0Ch]
           pop
           push       0
           write      TCLIENT.cl_LastKey ; [13d ; 0Dh]
           pop
           push       0
           write      TCLIENT.cl_Killed ; [14d ; 0Eh]
           pop
           push       0
           write      TCLIENT.cl_Leave ; [15d ; 0Fh]
           pop
           push       0
           write      TCLIENT.cl_NextCheatLaser ; [17d ; 11h]
           pop
           push       0
           write      TCLIENT.cl_NextCheatShield ; [18d ; 12h]
           pop
           push       0
           write      TCLIENT.cl_ScreenGrabbing ; [19d ; 13h]
           pop
           push       0
           write      TCLIENT.cl_CutTake ; [16d ; 10h]
           pop
           push       0
           write      TCLIENT.cl_ActiveMenu ; [24d ; 18h]
           pop
           push       0
           write      TCLIENT.cl_Mask ; [34d ; 22h]
           pop
           push       0
           write      TCLIENT.cl_LoadGame ; [35d ; 23h]
           pop
           push       0
           write      TCLIENT.cl_InputLocked ; [36d ; 24h]
           pop
           push       0
           write      TCLIENT.cl_cheatactive ; [44d ; 2Ch]
           pop
           push       0
           write      TCLIENT.cl_cheatactivatestate ; [45d ; 2Dh]
           pop
           push       0
           write      TCLIENT.cl_FastForward ; [39d ; 27h]
           pop
           push       0
           write      TCLIENT.cl_Autopilot ; [51d ; 33h]
           pop
           push       0
           write      TCLIENT.cl_DockingHangar ; [52d ; 34h]
           pop
           readvar    global.ga_IsNetworkActive ; [23d ; 17h]
           if SP[0]=0 then jump L000DDBC4
           readvar    global.ga_IsServer ; [19d ; 13h]
           if SP[0]=0 then push 1 else push 0
           if SP[0]=0 then jump L000DDB6E
           push       0
           pop
L000DDB6E: push       SP[3] ; arg1
           push       1
           callasm    Net_CreatePlayer ; 00002822
           writevar   global.ga_ClientID ; [22d ; 16h]
           pop
           readvar    global.ga_ClientID ; [22d ; 16h]
           if SP[0]=0 then jump L000DDBBE
           readvar    global.ga_ClientID ; [22d ; 16h]
           push       1
           callasm    Net_GetPlayerName ; 00002833
           readvar    global.ga_ClientID ; [22d ; 16h]
           push       2
           push       2009d ; 07D9h
           create_object
           call       TPLAYER.Create ; 000009BB
           write      TCLIENT.cl_Player ; [1]
           pop
           push       0
           push       1
           read       TCLIENT.cl_Player ; [1]
           call       SetLatency ; 00002845
           pop
L000DDBBE: jump       L000DDBFA

L000DDBC4: push       1
           writevar   global.ga_ClientID ; [22d ; 16h]
           pop
           push       SP[3] ; arg1
           readvar    global.ga_ClientID ; [22d ; 16h]
           push       2
           push       2009d ; 07D9h
           create_object
           call       TPLAYER.Create ; 000009BB
           write      TCLIENT.cl_Player ; [1]
           pop
           read       TCLIENT.cl_Player ; [1]
           push       9
           readvar    global.ga_Races ; [18d ; 12h]
           put_to_array
           pop
           push       0
           pop
L000DDBFA: push       1
           write      TCLIENT.cl_New ; [3]
           pop
           push       0
           write      TCLIENT.cl_Alert ; [23d ; 17h]
           pop
           push       0
           push       5000d ; 1388h
           call59     TUPGRADEMASTER.Set ;
           pop
           push       0
           push       3001d ; 0BB9h
           call59     TQUESTMASTER.Set ;
           pop
           push       0
           ret


 Контекст Debug (TClient.Input)   (кликните здесь для просмотра)
Code:
;
; === Input =====================================================
; function  TCLIENT.Input(arg1);
;
...
000E5E9C: 0031 00072F55          |                 jump       L000E5EB2
000E5EA2: 0007                   |    6 L000E5EA2: push       SP[0] ; loc6
000E5EA4: 0001 01A5              |    7            push       421d ; 01A5h
000E5EA8: 004F                   |    8            if SP[0]<>SP[1] then push 0 else push 1
000E5EAA: 0033 00072F75          |    7            if SP[0]=0 then jump L000E5EF2
000E5EB0: 002C                   |    6            pop
000E5EB2: 0009                   |    5 L000E5EB2: push       0
000E5EB4: 005A 00002E0C          |    6            callasm    P_GetTimeWarpFactor ; 00002E0C
000E5EBA: 0001 FF9C              |    6            push       -100d ; 0FF9Ch
000E5EBE: 004B                   |    7            if SP[0]>=SP[1] then push 0 else push 1
000E5EC0: 0033 00072F6C          |    6            if SP[0]=0 then jump L000E5EE0
000E5EC6: 0009                   |    5            push       0
000E5EC8: 002C                   |    6            pop
000E5ECA: 0009                   |    5            push       0
000E5ECC: 005A 00002E0C          |    6            callasm    P_GetTimeWarpFactor ; 00002E0C
000E5ED2: 000A                   |    6            push       1
000E5ED4: 003F                   |    7            sub        SP[0],SP[1]
000E5ED6: 000A                   |    6            push       1
000E5ED8: 005A 00002CC0          |    7            callasm    P_SetTimeWarpFactor ; 00002CC0
000E5EDE: 002C                   |    6            pop
000E5EE0: 000A                   |    5 L000E5EE0: push       1
000E5EE2: 002A 0006              |    6            mov        SP[5],SP[0] ; loc1
000E5EE6: 002E 0005              |    6            popx       5
000E5EEA: 0035                   |    1            ret

000E5EEC: 0031 00072F7D          |                 jump       L000E5F02
000E5EF2: 0007                   |    6 L000E5EF2: push       SP[0] ; loc6
000E5EF4: 0001 0044              |    7            push       68d ; 44h
000E5EF8: 004F                   |    8            if SP[0]<>SP[1] then push 0 else push 1
000E5EFA: 0033 00073063          |    7            if SP[0]=0 then jump L000E60CE
000E5F00: 002C                   |    6            pop
000E5F02: 0053                   |    5 L000E5F02: begin_critical
000E5F04: 0032 0007305A          |    6            if SP[0]<>0 then jump L000E60BC
000E5F0A: 0009                   |    5            push       0
000E5F0C: 005A 00001F8B          |    6            callasm    SA_GetTrackingAim ; 00001F8B
000E5F12: 0005 0001              |    6            push       SP[0] ; loc6
000E5F16: 0033 00072FA1          |    7            if SP[0]=0 then jump L000E5F4A
000E5F1C: 0005 0001              |    6            push       SP[0] ; loc6
000E5F20: 000A                   |    7            push       1
000E5F22: 005A 00000F28          |    8            callasm    SA_GetEventObject ; 00000F28
000E5F28: 0005 0001              |    7            push       SP[0] ; loc7
000E5F2C: 0033 00072F9C          |    8            if SP[0]=0 then jump L000E5F40
000E5F32: 0009                   |    7            push       0
000E5F34: 0005 0002              |    8            push       SP[1] ; loc7
000E5F38: 0057 00002E20          |    9            call       Debug ; 00002E20
000E5F3E: 002C                   |    8            pop
000E5F40: 002E 0001              |    7 L000E5F40: popx       1
000E5F44: 0031 00073057          |    6            jump       L000E60B6
...


 Контекст IsDisabled (TMENU_QUESTS.SpecialUpdate)   (кликните здесь для просмотра)
Code:
0011D226: 0009                   |   11 L0011D226: push       0
0011D228: 0033 0008EA19          |   12 L0011D228: if SP[0]=0 then jump L0011D43A
0011D22E: 0005 000B              |   11            push       SP[10d] ; loc1
0011D232: 0006 0015              |   12            read       TMENU.me_SelectedLine ; [21d ; 15h]
0011D236: 004F                   |   13            if SP[0]<>SP[1] then push 0 else push 1
0011D238: 0033 0008E949          |   12            if SP[0]=0 then jump L0011D29A
0011D23E: 000A                   |   11            push       1
0011D240: 0006 0040              |   12            read       TMENU.me_YSpacing ; [64d ; 40h]
0011D244: 0001 0100              |   13            push       256d ; 0100h
0011D248: 0005 0008              |   14            push       SP[7] ; loc7
0011D24C: 0006 0040              |   15            read       TMENU.me_YSpacing ; [64d ; 40h]
0011D250: 0040                   |   16            mul        SP[0],SP[1]
0011D252: 0006 003F              |   15            read       TMENU.me_YOff ; [63d ; 3Fh]
0011D256: 003E                   |   16            add        SP[0],SP[1]
0011D258: 0009                   |   15            push       0
0011D25A: 000E                   |   16            push       5
0011D25C: 003C                   |   17            get_object
0011D25E: 0057 00003419          |   18            call       ShowRect ; 00003419
0011D264: 002C                   |   12            pop
0011D266: 000A                   |   11            push       1
0011D268: 0006 0040              |   12            read       TMENU.me_YSpacing ; [64d ; 40h]
0011D26C: 0001 0080              |   13            push       128d ; 80h
0011D270: 0005 0008              |   14            push       SP[7] ; loc7
0011D274: 0006 0040              |   15            read       TMENU.me_YSpacing ; [64d ; 40h]
0011D278: 0040                   |   16            mul        SP[0],SP[1]
0011D27A: 0006 003F              |   15            read       TMENU.me_YOff ; [63d ; 3Fh]
0011D27E: 003E                   |   16            add        SP[0],SP[1]
0011D280: 0001 0100              |   15            push       256d ; 0100h
0011D284: 000E                   |   16            push       5
0011D286: 003C                   |   17            get_object
0011D288: 0057 00003419          |   18            call       ShowRect ; 00003419
0011D28E: 002C                   |   12            pop
0011D290: 0005 0001              |   11            push       SP[0] ; loc11
0011D294: 002B 0044              |   12            write      TMENU_QUESTS.meq_SelectedQuestID ; [68d ; 44h]
0011D298: 002C                   |   12            pop
0011D29A: 0009                   |   11 L0011D29A: push       0
0011D29C: 000A                   |   12            push       1
0011D29E: 0001 0FA0              |   13            push       4000d ; 0FA0h
0011D2A2: 0005 0004              |   14            push       SP[3] ; loc11
0011D2A6: 003E                   |   15            add        SP[0],SP[1]
0011D2A8: 0057 00003D9A          |   14            call       TQUEST.GetTextID ; 00003D9A
0011D2AE: 000A                   |   12            push       1
0011D2B0: 005A 000002FD          |   13            callasm    SE_ReadText ; 000002FD
0011D2B6: 0056 000043A1          |   12            get_strg   S00043A1 ;  ; "%-35s"
0011D2BC: 000B                   |   13            push       2
0011D2BE: 005A 000003C2          |   14            callasm    SE_SPrintf ; 000003C2
0011D2C4: 002A 000B              |   12            mov        SP[10d],SP[0] ; loc2
0011D2C8: 002C                   |   12            pop
0011D2CA: 0006 0015              |   11            read       TMENU.me_SelectedLine ; [21d ; 15h]
0011D2CE: 0005 000C              |   12            push       SP[11d] ; loc1
0011D2D2: 004F                   |   13            if SP[0]<>SP[1] then push 0 else push 1
0011D2D4: 0005 0006              |   12            push       SP[5] ; loc7
0011D2D8: 0006 0040              |   13            read       TMENU.me_YSpacing ; [64d ; 40h]
0011D2DC: 0040                   |   14            mul        SP[0],SP[1]
0011D2DE: 0006 003F              |   13            read       TMENU.me_YOff ; [63d ; 3Fh]
0011D2E2: 003E                   |   14            add        SP[0],SP[1]
0011D2E4: 0006 0041              |   13            read       TMENU.me_XOff ; [65d ; 41h]
0011D2E8: 0005 000D              |   14            push       SP[12d] ; loc2
0011D2EC: 000D                   |   15            push       4
0011D2EE: 003C                   |   16            get_object
0011D2F0: 0057 00003008          |   17            call       ShowText ; 00003008
0011D2F6: 002C                   |   12            pop
0011D2F8: 0009                   |   11            push       0
0011D2FA: 0001 0FA0              |   12            push       4000d ; 0FA0h
0011D2FE: 0005 0003              |   13            push       SP[2] ; loc11
0011D302: 003E                   |   14            add        SP[0],SP[1]
0011D304: 0057 00003E3B          |   13            call       TQUEST.GetPriority ; 00003E3B
0011D30A: 0005 0002              |   12            push       SP[1] ; loc11
0011D30E: 0056 000043A7          |   13            get_strg   S00043A7 ;  ; "%3d %3d"
0011D314: 000C                   |   14            push       3
0011D316: 005A 000003C2          |   15            callasm    SE_SPrintf ; 000003C2
0011D31C: 002A 000B              |   12            mov        SP[10d],SP[0] ; loc2
0011D320: 002C                   |   12            pop
0011D322: 0006 0015              |   11            read       TMENU.me_SelectedLine ; [21d ; 15h]
0011D326: 0005 000C              |   12            push       SP[11d] ; loc1
0011D32A: 004F                   |   13            if SP[0]<>SP[1] then push 0 else push 1
0011D32C: 0005 0006              |   12            push       SP[5] ; loc7
0011D330: 0006 0040              |   13            read       TMENU.me_YSpacing ; [64d ; 40h]
0011D334: 0040                   |   14            mul        SP[0],SP[1]
0011D336: 0006 003F              |   13            read       TMENU.me_YOff ; [63d ; 3Fh]
0011D33A: 003E                   |   14            add        SP[0],SP[1]
0011D33C: 0001 0100              |   13            push       256d ; 0100h
0011D340: 0006 0041              |   14            read       TMENU.me_XOff ; [65d ; 41h]
0011D344: 003E                   |   15            add        SP[0],SP[1]
0011D346: 0005 000D              |   14            push       SP[12d] ; loc2
0011D34A: 000D                   |   15            push       4
0011D34C: 003C                   |   16            get_object
0011D34E: 0057 00003008          |   17            call       ShowText ; 00003008
0011D354: 002C                   |   12            pop
0011D356: 0005 000A              |   11            push       SP[9] ; loc2
0011D35A: 000A                   |   12            push       1
0011D35C: 005A 00000DD2          |   13            callasm    SE_FreeString ; 00000DD2
0011D362: 002C                   |   12            pop
0011D364: 0009                   |   11            push       0
0011D366: 0001 0FA0              |   12            push       4000d ; 0FA0h
0011D36A: 0005 0003              |   13            push       SP[2] ; loc11
0011D36E: 003E                   |   14            add        SP[0],SP[1]
0011D370: 0057 000043AF          |   13            call       IsDisabled ; 000043AF
0011D376: 0033 0008E9BF          |   12            if SP[0]=0 then jump L0011D386
0011D37C: 0001 0044              |   11            push       68d ; 44h
0011D380: 0031 0008E9C1          |   12            jump       L0011D38A

0011D386: 0001 0045              |   11 L0011D386: push       69d ; 45h
0011D38A: 0005 0002              |   12 L0011D38A: push       SP[1] ; loc11
0011D38E: 0009                   |   13            push       0
0011D390: 0001 0BB9              |   14            push       3001d ; 0BB9h
0011D394: 0059 000B266C 00002CD4 |   15            call59     TQUESTMASTER.GetCurrentQuest ;
0011D39E: 004F                   |   14            if SP[0]<>SP[1] then push 0 else push 1
0011D3A0: 0033 0008E9D4          |   13            if SP[0]=0 then jump L0011D3B0
0011D3A6: 0001 002A              |   12            push       42d ; 2Ah
0011D3AA: 0031 0008E9E7          |   13            jump       L0011D3D6


 Мои изменения   (кликните здесь для просмотра)
Code:
diff --git a/001.asm b/001_fixed.asm
index 03c07c5..49b45a9 100644
--- a/001.asm
+++ b/001_fixed.asm
@@ -45260,7 +45260,7 @@ TX_AUDIO.LoopMusic:
            push       0
            push       0
            get_object
-           call       GetModVolume ; 00009F0C
+           call       GetMODVolume ; 00009F0C
            push       5
            if SP[0]<SP[1] then push 0 else push 1
            if SP[0]=0 then jump L0002B3E2
@@ -45842,7 +45842,7 @@ L0002BA30: push       0
            call       GetEnvironment ; 00001192
            push       0
            get_object
-           call       GetModVolume ; 00009F0C
+           call       GetMODVolume ; 00009F0C
            push       5
            if SP[0]<SP[1] then push 0 else push 1
            if SP[0]=0 then jump L0002BA64
@@ -53026,7 +53026,7 @@ L00031318: push       SP[0] ; loc2
            get_from_array
            push       0
            push       SP[1] ; loc3
-           call       GetWarpGates ; 000099F2
+           call       GetWarpgates ; 000099F2
            if SP[0]=0 then jump L000314F0
            push       0
            push       SP[1] ; loc3
@@ -53310,7 +53310,7 @@ L00031664: push       SP[0] ; loc2
            get_from_array
            push       0
            push       SP[1] ; loc3
-           call       GetWarpGates ; 000099F2
+           call       GetWarpgates ; 000099F2
            push       0
            if SP[0]<>SP[1] then push 0 else push 1
            if SP[0]<>0 then jump L000316AA
@@ -271814,7 +271814,7 @@ TSHIP_M0.SetDisowned:
            if SP[0]=0 then jump L000C6AB2
            push       0
            push       SP[4] ; arg1
-           call       GetSerial ; 0000207D
+           call       GetID ; 0000207D
            push       0
            push       SP[1] ; loc1
            read       TSHIP_M0.shm0_Guns ; [60d ; 3Ch]
@@ -292383,7 +292383,7 @@ L000D6182: push       SP[24d] ; arg1
 
 L000D619E: push       0
            read       TRACE.ra_CampaignAmbassador ; [15d ; 0Fh]
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            mov        SP[2],SP[0] ; loc20
            pop
            push       SP[1] ; loc20
@@ -292777,7 +292777,7 @@ TRACE.CampaignCheck:
            push       0
            push       SP[2] ; loc1
            call       GetOwner ; 0000035D
-           call       getID ; 00002506
+           call       GetID ; 00002506
            read       TRACE.ra_ID ; [1]
            if SP[0]=SP[1] then push 0 else push 1
            if SP[0]=0 then jump L000D66D0
@@ -294620,7 +294620,7 @@ L000D7E70: push       SP[0] ; loc11
            pop
            push       0
            push       SP[2] ; loc10
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            if SP[0]=0 then jump L000D7ED6
            push       0
            push       0
@@ -294642,7 +294642,7 @@ L000D7EE4: jump       L000D7E70
 L000D7EEA: push       SP[5] ; loc6
            push       0
            push       SP[3] ; loc10
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       2
            push       SP[6] ; loc8
            call       SendSquad ; 000012E5
@@ -294689,7 +294689,7 @@ L000D7F6A: push       SP[0] ; loc11
            pop
            push       0
            push       SP[2] ; loc10
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            if SP[0]=0 then jump L000D7FD0
            push       0
            push       0
@@ -294711,7 +294711,7 @@ L000D7FDE: jump       L000D7F6A
 L000D7FE4: push       SP[5] ; loc6
            push       0
            push       SP[3] ; loc10
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       2
            push       SP[6] ; loc8
            call       SendSquad ; 000012E5
@@ -295692,7 +295692,7 @@ L000D8A4A: push       1
            pop
            push       0
            push       SP[1] ; loc10
-           call       GetWarpGates ; 000099F2
+           call       GetWarpgates ; 000099F2
            if SP[0]=0 then jump L000D8AB6
            push       0
            push       SP[1] ; loc10
@@ -296163,7 +296163,7 @@ L000D9046: push       1
            pop
            push       0
            push       SP[1] ; loc10
-           call       GetWarpGates ; 000099F2
+           call       GetWarpgates ; 000099F2
            if SP[0]=0 then jump L000D90B2
            push       0
            push       SP[1] ; loc10
@@ -377471,7 +377471,7 @@ TMENU_CUSTOMINPUT.ExitMenu:
            get_object
            push       1
            read       TMENU.me_Object ; [32d ; 20h]
-           call       MenuExit ; 00003D6D
+           call       ExitMenu ; 00003D6D
            pop
            push       0
            push       2210d ; 08A2h
@@ -396149,7 +396149,7 @@ L001270AC: push       SP[4] ; loc2
            if SP[0]=0 then jump L001270EE
            push       0
            push       SP[1] ; loc6
-           call       GetWarpGates ; 000099F2
+           call       GetWarpgates ; 000099F2
            if SP[0]=0 then jump L001270EE
            push       1
            jump       L001270F0
@@ -432693,7 +432693,7 @@ L00144040: push       SP[0] ; loc2
            if SP[0]=0 then jump L0014407C
            push       0
            push       SP[1] ; loc3
-           call       GetWarpGates ; 000099F2
+           call       GetWarpgates ; 000099F2
            if SP[0]=0 then jump L0014407C
            push       1
            jump       L0014407E
@@ -495324,7 +495324,7 @@ L00173C16: push       0
            push       0
            push       0
            read       TQUEST_005.qq_gShip ; [18d ; 12h]
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            mov        SP[1],SP[0] ; loc2
            pop
            push       SP[0] ; loc2
@@ -495348,7 +495348,7 @@ L00173C16: push       0
            push       0
            push       2100d ; 0834h
            call59     TCLIENT.GetPlayerShip ;
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       1
            read       TQUEST_005.qq_gShip ; [18d ; 12h]
            call       SetSafePos ; 000025B7
@@ -500391,12 +500391,12 @@ L00177D6C: push       700d ; 02BCh
            pop
            push       0
            read       TQUEST_018.qq_gStartAtGate ; [16d ; 10h]
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       0
            push       0
            push       2100d ; 0834h
            call59     TCLIENT.GetPlayerShip ;
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       2
            callasm    SA_SetSafePos ; 000010B9
            pop
@@ -505850,7 +505850,7 @@ TQUEST_036.Force:
            push       0
            push       2100d ; 0834h
            call59     TCLIENT.GetPlayerShip ;
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       2
            callasm    SA_SetShield ; 00001068
            pop
@@ -505884,7 +505884,7 @@ TQUEST_036.Force:
            push       0
            push       2100d ; 0834h
            call59     TCLIENT.GetPlayerShip ;
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       2
            callasm    SA_SetExtraSpeed ; 000017E9
            pop
@@ -505902,7 +505902,7 @@ TQUEST_036.Force:
            push       0
            push       2100d ; 0834h
            call59     TCLIENT.GetPlayerShip ;
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       2
            callasm    SA_SetExtraRotSpeed ; 000017FA
            pop
@@ -505947,7 +505947,7 @@ TQUEST_036.Force:
            push       0
            push       2100d ; 0834h
            call59     TCLIENT.GetPlayerShip ;
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            call       Activate ; 00000E6A
            pop
            push       0
@@ -506372,7 +506372,7 @@ L0017C962: push       0
            if SP[0]=0 then jump L0017C9C2
            push       0
            read       TQUEST_036.qq_gNear_Obj_Pos ; [38d ; 26h]
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       SP[2] ; loc3
            push       2
            callasm    SA_SetSafePos ; 000010B9
@@ -517860,7 +517860,7 @@ L00185870: push       0
            callasm    SA_GetShipTypeMaxShieldType ; 0000169D
            push       2
            push       SP[4] ; loc2
-           call       addshield ; 00005436
+           call       AddShield ; 00005436
            pop
            push       7
            readvar    global.ga_Races ; [18d ; 12h]
@@ -519888,7 +519888,7 @@ L001872CA: push       0
            callasm    SA_GetShipTypeMaxShieldType ; 0000169D
            push       2
            push       SP[3] ; loc2
-           call       addshield ; 00005436
+           call       AddShield ; 00005436
            pop
            push       3
            readvar    global.ga_Races ; [18d ; 12h]
@@ -527839,7 +527839,7 @@ L0018D694: push       0
            if SP[0]=0 then jump L0018D6C2
            push       0
            push       SP[1] ; loc8
-           call       GetEnviroment ; 000055A2
+           call       GetEnvironment ; 000055A2
            mov        SP[1],SP[0] ; loc8
            pop
            jump       L0018D694
@@ -530855,7 +530855,7 @@ L0018FD18: push       0
            if SP[0]=0 then jump L0018FD40
            push       0
            get_object
-           call       OffertextParty ; 000055D8
+           call       OfferTextParty ; 000055D8
            ret
 
 L0018FD40: push       0
@@ -530879,7 +530879,7 @@ L0018FD64: push       0
            if SP[0]=0 then jump L0018FD8C
            push       0
            get_object
-           call       OffertextParty ; 000055D8
+           call       OfferTextParty ; 000055D8
            ret
 
 L0018FD8C: push       0
@@ -530980,7 +530980,7 @@ L0018FEAC: push       0
            if SP[0]=0 then jump L0018FED4
            push       0
            get_object
-           call       OffertextParty ; 000055D8
+           call       OfferTextParty ; 000055D8
            ret
 
 L0018FED4: push       0
@@ -535503,7 +535503,7 @@ L001936B2: push       0
            push       SP[2] ; loc6
            push       2
            push       SP[13d] ; arg1
-           call       AddMaxRockets ; 00005638
+           call       AddMaxRocket ; 00005638
            pop
            push       0
            pop
@@ -541697,7 +541697,7 @@ L0019822E: push       -5000d ; 0EC78h
            push       0
            push       2100d ; 0834h
            call59     TCLIENT.GetPlayerShip ;
-           call       GetObjectId ; 000024C2
+           call       GetObjectID ; 000024C2
            push       SP[3] ; loc1
            push       3
            callasm    SA_SetRelation ; 00005629
@@ -548036,7 +548036,7 @@ L0019CEEA: if SP[0]=0 then jump L0019CF6A
            pop
 L0019CF2E: push       0
            get_object
-           call       AbortMenu ; 00005661
+           call       Destruct ; 00005661
            pop
            push       0
            write      TQUEST.qu_Priority ; [1]
    Posted: 05:21 01-02-2018   
Канал X-Tension/X-BTF: «Раскопки обжа на предмет юзабельных вещей»
Go to page: Previous  1, 2, 3, 4, 5  Next | All pages
  
Display posts from previous: 
View previous topic | View next topic |
К списку каналов | Наверх страницы
Цитата не в тему: Как-то несогласованно вы друг с другом соглашаетесь. ($atana)

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