|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
так как народу прибавляется, раньше или позже будут возникать проблемы с совместимостью исходников. Предлагаю обще-употребляемые вещи заносить в .inc файлы и тут выкладывать - будет проще для всех.
Вот файл-хидер для задания типов у параметров функций, используется при добавлении новых команд в скрипт-редактор
пример задания параметров функции:
Код: |
push 0FFFFh ; -1d
push 2
push 0412h ; 1042d ; command ID
push 4 ; always=4
create_array
push 4
push 0Fh ; 15d ; %1 parameter definition
push 14h ; 20d ; %0 parameter definition
push 2 ; number of parameters
create_array
push 2 ; always=2
create_array
|
parameter definition - как раз и есть коды, обозначающие типы параметров. Все внутри файла на странице
_________________ THX2U |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
2 ZMan. По-моему, 25d и 26d - разные вещи. 25d позволяет опустить в редакторе приём возвращаемого значения, а 26d нет.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
Darth Revan
26d, как я понял, может быть NULL при возврате из функции
а 25d всегда со значением
народ, никто не разбирался как новые команды добвляются штатным способом через AddNewCmd ? вроде бы все нашел... Таблицы команд с параметрами как задаются - видно, а ссылок на обработчики нету
_________________ THX2U |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Zman : |
26d, как я понял, может быть NULL при возврате из функции а 25d всегда со значением.
|
25d можно не принимать, а 26d - нельзя. По-моему, так.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
сделал тут попутно отключалку сюжета насовсем
то есть при рестарте игры сразу вылетаешь на диско в космос
если вдруг кому-то надо:
Код: |
DisablePlot = TRUE
.section code, abs
.if DisablePlot
$ = 0015F34Ch
ret
.endif
.end
|
можно накладывать поверх любого патча (компилить отдельным файлом), либо просто добавить в текст патча Shaddie перед строкой ".section code, con" только вот это:
_________________ THX2U |
|
|
AlexYar 1846 EGP
Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31404
Зарегистрирован: 26.10.2003 |
|
Zman : |
то есть при рестарте игры сразу вылетаешь на диско в космос
|
А можно сделать выбор стартового корабля как-нибудь? Я имею в виду - прямо в асм-файле. Ну типа субтип корабля как-нить прописывать там.
И самое главное - нафиг отключить появление хааков в Президентском Рубеже и вообще в игре (khaak aggression всегда 0)? А то игра через какое-то время все равно агрессию выставляет в 15, и хааки появляются.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
а разве первый корбаль не в setup скриптах прописан ?
_________________ THX2U |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
сделать хааков всегда дружелюбными (не тестировал!):
Код: |
$ = 000AC908h
push 0
|
правда это может на сюжет как-то влиять кажется
после этого патча команда <set khaak agression level to %1> тоже работать перестанет!
_________________ THX2U |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Изначально корабль прописан в коде. Но можно скрипт добавить, который возвращает корабль, и старт будет с этого корабля в том месте, где он находится.
|
|
|
AlexYar 1846 EGP
Рейтинг канала: 6(434) Репутация: 328 Сообщения: 31404
Зарегистрирован: 26.10.2003 |
|
Zman : |
а разве первый корбаль не в setup скриптах прописан ?
|
Только для "custom game".
Zman : |
правда это может на сюжет как-то влиять кажется
|
Дык и сюжет отключить нафиг Главное - сделать возможным определить в скрипте при старте игры с каким уровнем сложности начал игрок. Т.е. чтобы при старте игры запускался скрипт, а в него аргументом передавалось значение сложности игры (1-3).
Darth Revan : |
Но можно скрипт добавить, который возвращает корабль, и старт будет с этого корабля в том месте, где он находится.
|
Именно это и нужно, но еще и в аргумент передавать уровень сложности.
Сейчас при старте на открывахе определить уровень сложности скриптом легко - по оборудованию на корабле и деньгам. А вот если начать в скафандре, то тут фокус с оборудованием не прокатывает.
Вопрос у асм-умельцам. Пожалуйста, поработайте над дополнительными расами, ну очень надо
10 дополнительных очень мало (надо 50 и более). А так же нужно иметь возможность как-то менять отношения между расами (хотя бы прямо в асм-файле). Просто менять отношение к игроку в игре можно, а вот между самими расами никак нельзя
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
О команде switch..endswitch
Сначала небольшое вступление...
Команда 005E представляет собой косвенный переход по таблице адресов. Очень даже может быть, что КС язык от эгософта имеет С-образную конструкцию switch {...}. Для такой конструкции компилятор ES генерит 2 варианта кода.
Первый вариант: перед командой 005E вставляется стандартный проверочный код, проверяющий верхний предел индекса. Если входное значение превышает этот предел, принудительно будет выполнен переход с индексом 0. При дизассемблировании такого варианта кода дизассемблер проверяет несколько предыдущих команд, находит константу верхнего предела и вычисляет размер таблицы переходов. В компиляторе для Х2 в кодогенераторе КС для этого варианта была ошибка, в результате чего размер таблицы переходов был в 2 раза больше необходимого. Для Х3 эту ошибку пофиксили.
Код: |
push SP[0]
push SP[0]
push 3 ; <- верхний предел
if SP[0]<SP[1] then push 0 else push 1
if SP[0]<>0 then jump $1
pop
push 0 ; idx <- default переход
$1: switch
case jump L00000980 ; 0 - default переход
case jump L000008E2 ; 1
case jump L00000904 ; 2
case jump L00000926 ; 3
case jump 0h ; 4
case jump 0h ; 5
case jump 0h ; 6
endswitch
|
Второй вариант трансляции switch {} использует команду locate (005F), выполняющую поиск значения в таблице. При дизассемблировании такого варианта кода дизассемблер смотрит на команду, стоящую перед командой locate, определяя размер таблицы. В этом варианте таблица имеет верный размер.
Код: |
$1: push 0111h ; 273d
push 01B1h ; 433d
push 1Bh ; 27d
push 3
locate
switch
case jump L000100E8 ; 0 - default переход
case jump L00010076 ; 1
case jump L00010076 ; 2
case jump L0001009C ; 3
endswitch
|
Это было вступление, так на всякий случай для новичков.
Теперь первое предложение.
На текущий момент дизассемблер правильно разбирает только стандартно-сгенерированную последовательность команд, относящихся к конструкции switch...endswitch. Если при написании патча моддер вставит другую последовательность команд, дизассемблер не сможет корректно восстановить код switch-конструкции. Это не означает, что данная программа однозначно не будет работать. Это означает, что я не знаю как написать ИИ для дизассемблера, определяющего размер таблицы переходов.
Поэтому первое предложение для асм-щиков - пишите код, аналогичный стандартному от ES. Это относится только к команде switch, точнее к тем командам, которые предшествуют switch.
Тогда если вдруг решите проверить корректность написания программы, при дизассемблировании вашего obj не будет ОЧЕНЬ страшных ругательств. Дизассемблировав убедитесь, что в листинге отсутствуют ошибки работы со стеком типа "function at addr = ХХХ has corrupted phase stack (NNN <> MMM)". Ну или чего-то в том духе.
Теперь второе предложение : Изменение синтаксиса switch.
Задумка использовать в ассемблере конструкцию языка высокого уровня вида switch - case jump - endswitch, оказалась мягко говоря неудачной. Во-первых из-за того, что данная конструкция считается ассемблером единой неделимой командой. И правка такой конструкции в общем случае затруднительна. Во-вторых, из-за того, что такая конструкция при парсинге длинных таблиц требует офигенный стек ассемблера. Посему предлагаю считать синтаксис switch..endswitch - устаревшим и заменить его командой XJUMP @SP, символизирующей косвенный переход по таблице, расположенной следом за этой командой. Таблица будет представлять собой просто последовательность директив .long, содержащими адрес метки перехода.
Выглядеть будет примерно вот так:
Код: |
$1: push 0111h ; 273d
push 01B1h ; 433d
push 1Bh ; 27d
push 3
locate
$1: xjump @SP
.long ($2 - 8) / 2 ; 0 - default переход
.long ($3 - 8) / 2 ; 1
.long ($4 - 8) / 2 ; 2
.long ($5 - 8) / 2 ; 3
|
Что скажите?
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Я согласен.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo : |
Что скажите?
|
через Е ! "скажете" - (сорри, привычка такая...)
два вопроса:
1) генерить в своем коде лишнюю вторую половину неправильного свича - не надо ?
2) ты хочешь синтакс сделать вместо или оба вместе ?
в принципе как сделаешь, так и будем юзать, не вижу тут больших проблем.
хочу вернуться в вопросу о патчах!
насколько я понимаю, таблица патчей нужна только для того, чтобы можно было загрузить старый сейв и сконвертировать его в соответствии с измененным .обж
В основном движке оно по моему не используется. Если мы откажемся от совместимости со старыми сейвами, я думаю весь сегмент PTCH можно похерить . В конце концов новые моды предполагают рестарт игры по умолчанию.
Зачем это нужно ? тогда мы сможем полностью компилить x2story.asm из исходника и переносимость/совместимость будет лучше. Если сейчас ягасофт выпустит новый патч 1.5, все наши исходники поползут по абсолютным адресам, придется перелопачивать сначала... А так в исходник добавили свои патчи, перекомпилили и все... К тому же в старом файле сейчас очень много дырок (мертвый код плюс те самые хвосты от switch). Если пересобрать все заново, может где-то производительность поднимется (?).
Я тут по ходу дела попытался отключить заставку в скрипт эдиторе...
ну когда первый раз его запускаешь он там мееееедленно пишет:
"welcome to M.S.C.I interface...." etc etc
думал из-за звука (на каждую букву пиликает)... звук отрезал, так оно печатает с такой же скоростью! искусственных задержек там нету, просто в цикле выполняется вырезание каждой буквы из строки и вывод по одной на экран. Так оно само по себе так медленно выводит блин! вот вам и скорость работы скриптов... а у меня их крутится 4500 штук за раз в обычной игре...
( то, что можно порезать эту строку в .xml - я знаю )
_________________ THX2U |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Zman : |
ну когда первый раз его запускаешь он там мееееедленно пишет:
|
А если на ввод или пробел нажать?
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Zman : |
1) генерить в своем коде лишнюю вторую половину неправильного свича - не надо ?
|
Что б работала игра - не обязательно, а чтобы проверить себя в дизассемблере - надо, пока я не придумаю как вычислять размер таблиц.
Zman : |
2) ты хочешь синтакс сделать вместо или оба вместе ?
|
Ну пока будут жить вместе. Генерацию в dobj сделал по ключу в ini.
Zman : |
хочу вернуться в вопросу о патчах!
...
Зачем это нужно ? тогда мы сможем полностью компилить x2story.asm из исходника и переносимость/совместимость будет лучше.
|
Все к этому и идет. Вот сделал в дизассемблере, чтоб он закомментаривал неиспользуемый код. Попытался восстановить более подробное описание о функциях.
Zman : |
Если сейчас ягасофт выпустит новый патч 1.5, все наши исходники поползут по абсолютным адресам, придется перелопачивать сначала... А так в исходник добавили свои патчи, перекомпилили и все... К тому же в старом файле сейчас очень много дырок (мертвый код плюс те самые хвосты от switch). Если пересобрать все заново, может где-то производительность поднимется (?).
|
Ну патча 1.5 точно не будет никогда. Они Х3-то доделать не могут.
Производительность конечно поднимется, но несущественно. Нужно переделывать отдельные куски. Для этого нужно примерно определить, какие из процедур-функций выполняются наиболее часто. Собрав статистику можно пытаться оптимизировать. К сожалению неизвестно сколько времени выполняется каждая команда.
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Выложил апдейты дизассемблера и ассемблера. Ссылки на первой странице.
Трассировщик дизассемблера пытается вытащить дополнительную инфу о функция и переменных. Кроме того, в asm-файле закомментаривает текст, который недоступен по его мнению.
Ассемблеру добавил команды pushw (0001) и pushd (0002). Кроме того понимает xjump @sp.
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
CheckerTwo, респектище за трассировщик. Так стало гораздо лучше.
|
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo -
_________________ THX2U |
|
|
Zman 65 EGP
Репутация: 12 Сообщения: 54 Откуда: Galaxy far, far away... Зарегистрирован: 17.01.2006 |
|
CheckerTwo
слушай, что-то я там не пойму логику генерации комментариев...
заголовки функций у тебя местами function, местами procedure
а закономерность я так и не нашел
_________________ THX2U |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Zman : |
заголовки функций у тебя местами function, местами procedure
|
Идея была такой. Если функция вызывается где-то в коде и ее результат используется, т.е. после call стоит не pop, то это "функция", иначе - процедура.
|
|
|
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|