|
|
|
Канал X3: Reunion »
Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы» |
|
|
Chem 780 EGP
Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007 |
|
Фактически таблица - это аналог хэша получается.
_________________ Умножим энтропию на 0 :-) |
|
|
Dark_ 64 EGP
Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008 |
|
Дабы разъяснить конкретную ситуацию, листинг добавления элемента в эту таблицу:
Код: |
function TSECTOR.AddSun(arg1)
{
TSECTOR.sec_Suns[arg1]=arg1;
arg1->SetEnvironment(this);
return(0);
}
|
Один обьект одновременно пихает и в ключ и в значение таблицы по этому ключу, что и делает возможным приведенный выше код.
добавлено спустя 43 секунды:
Chem : |
Фактически таблица - это аналог хэша получается.
|
Даже не аналог, vtable и есть самая настоящяя хеш-таблица.
Последний раз редактировалось: Dark_ (18:12 07-04-2008), всего редактировалось 1 раз |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(99) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Пока Дарт Ревана нет предлагаю для временного решения проблемы:
Dark_ : |
Вполне логичный код в котором делается примерно следующей
Код: |
if(<некое логическое выражение которое нам не итерсно>) {
{
(loc3[2]=loc3[2]+1)-1; // результат от -1 выкидывается, строчки asm
// 001B629A - 001B629E
// идёт if который выглядит примерно так:
if (SE_ArraySize(loc3[1]) > loc3[2]) { // впрочем if не важен. |
Теперь посмотрим на то что сгенерировал XA2C:
Код: |
if(<некое логическое выражение которое нам не итерсно>)
{
loc3[2]=loc3[2]+1-1; // вот здесь наступает пипец логике кода...
if(loc3[2]>=SE_ArraySize(loc3[1]))
{ |
|
в дизассемблере сделать анализ на конструкции вида:
Код: |
push 1 ; или const
<ariphmetic_command>
pop
|
и либо выводить ошибку, либо комментарить.
Как оказалось в x3story таких мест - больше 750, и каждое из них может приводить к ошибкам...
Что скажите?
Последний раз редактировалось: CheckerTwo (21:09 08-04-2008), всего редактировалось 3 раз(а) |
|
|
Dark_ 64 EGP
Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008 |
|
CheckerTwo : |
либо комментарить.
|
Коментарить, ошибкой как таковой не является, но логического смысла конструкция не несёт.
|
|
|
AlexYar 1848 EGP
Рейтинг канала: 13(2096) Репутация: 328 Сообщения: 31531
Зарегистрирован: 26.10.2003 |
|
CheckerTwo : |
в x3story таких мест - больше 750
|
Странно, я насчитал всего 11+1
Искал поиском по хс-тексту конструкции "+1-1;" и "-1+1;". Первых 11, вторая всего одна.
И все они в сюжетке (тобж3003 и тквест299).
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(99) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
AlexYar : |
Странно, я насчитал всего 11+1 Подозрение.
|
Ну я считал немного по-другому - количество последовательностей команд push/cmd/pop. Где cmd - это одна из следующих команд add, sub, mul, div, mod, or and, xor. Возможно, что декомпилятор Дарта не везде глючит, только изредка...
Самая первая такая последовательность - в функции TX_AUDIO.FadeSFXOut
Последний раз редактировалось: CheckerTwo (21:43 08-04-2008), всего редактировалось 1 раз |
|
|
Dark_ 64 EGP
Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008 |
|
AlexYar : |
Странно, я насчитал всего 11+1
|
Просто большая часть обрабатывается "правильно", и генерятся строчки вида:
(loc7=loc7-1)+1;
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(99) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Текущая поправленная версия 3.28b доступна на http://checkertwo.narod .ru/do3_28.zip
Проверяйте...
- добавлена опция UnsafeCmd, включение которой позволяет комментировать
код в конструкции вида "push / cmd / pop". Здесь cmd - это одна из
следующих команд add, sub, mul, div, mod, or, and, xor. Такая
последовательность команд может приводить к нерабочему С коду после XA2C.
do3_28.zip |
Описание: |
|
Имя файла: |
do3_28.zip |
Размер файла: |
98.58 KB |
Скачано: |
667 раз(а) |
Последний раз редактировалось: Finist (07:35 09-04-2008), всего редактировалось 1 раз |
|
|
AlexYar 1848 EGP
Рейтинг канала: 13(2096) Репутация: 328 Сообщения: 31531
Зарегистрирован: 26.10.2003 |
|
Dark_ : |
Просто большая часть обрабатывается "правильно", и генерятся строчки вида:
(loc7=loc7-1)+1;
|
А эта "единица" точно не баг егософтовского компилятора?
В первом случае единица явно лишняя (и её можно грохнуть), во втором и третьем случае уже поменяется логика:
Код: |
Вариант 1:
(loc1=loc1-1)+1;
Вариант 2:
while((loc3=loc3-1)+1)
Вариант 3:
while((loc10=loc10-1)+1>0)
|
добавлено спустя 25 минут:
Интересный пример оптимизации кода навешивания 20-ти щитов на врата при активации сектора
Код: |
for(loc1=20;(loc1=loc1-1)+1;1) // абра-кадабра
{
var loc2=SA_AllocObject(9,3);
SA_MoveObjectIntoContainer(loc2,TGATE.ga_ObjectID);
}
|
По-идее должно было выглядеть так:
Код: |
loc1=0;
while(loc1<20)
{
var loc2=SA_AllocObject(9,3);
SA_MoveObjectIntoContainer(loc2,TGATE.ga_ObjectID);
loc1=loc1+1;
}
|
Строчек больше, но смысл более понятен
Последний раз редактировалось: AlexYar (12:39 09-04-2008), всего редактировалось 1 раз |
|
|
Dark_ 64 EGP
Рейтинг канала: 5(201) Репутация: 7 Сообщения: 58 Откуда: за вторым поворотом Зарегистрирован: 18.03.2008 |
|
AlexYar : |
А эта "единица" точно не баг егософтовского компилятора?
|
Чего не знаю того не знаю.
В эгосовтовском коде чёрт ногу сломит на различных if(0){} и прочем мусоре не несущем никакого смысла... мусор этот возможно остался от их собственных патчей или от компилятора у которого весьма специфический стиль генерации asm кода...
AlexYar : |
Вариант 2:
while((loc3=loc3-1)+1)
Вариант 3:
while((loc10=loc10-1)+1>0)
|
Дык тут pop нету сразу после операции...т.е. выражение реально используется а не выкидывается в void.
В этих вариант ничего не изменится.
добавлено спустя 9 минут:
AlexYar : |
for(loc1=20;(loc1=loc1-1)+1;1) // абра-кадабра
|
Видал индуский код и похуже
Последний раз редактировалось: Dark_ (12:53 09-04-2008), всего редактировалось 1 раз |
|
|
бухой джедай 182 EGP
Рейтинг канала: 5(141) Репутация: 70 Сообщения: 7906 Предупреждений: 1 Откуда: Одесса:) Зарегистрирован: 08.09.2007 |
|
люди примерно колво всякого мусора в эгософтовском коду сказать можете ????7(будем немношка посчитать время процесорное которое на этот мусор тратится )
_________________ Так Добрый вечер...Превед с большого Бодуна...
Магистр Непросыхаемость...
Злобный Рецедивист... |
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(99) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Finist : |
здесь будет надёжней
|
Спасибо!
Dark_ : |
В эгосовтовском коде чёрт ногу сломит на различных if(0){} и прочем мусоре не несущем никакого смысла... мусор этот возможно остался от их собственных патчей или от компилятора у которого весьма специфический стиль генерации asm кода...
|
if(0){...} - это они так закоментарили старый плохоотлаженный код. Он нигде не вызывается и не выполняется. Частично можно удалить из дизассемблерного файла, если включить опции RemarkNoUse = On и RemarkIfConst = On
|
|
|
TechCat 100 EGP
Репутация: 25 Сообщения: 328
Зарегистрирован: 20.02.2006 |
|
А это нормально, если в function TORBITALLASER.___startDefendThread() используется 222, а не 500 ед/м?
|
|
|
Chem 780 EGP
Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007 |
|
Трудно сказать
_________________ Умножим энтропию на 0 :-) |
|
|
AlexYar 1848 EGP
Рейтинг канала: 13(2096) Репутация: 328 Сообщения: 31531
Зарегистрирован: 26.10.2003 |
|
WD : |
используется 222, а не 500 ед/м?
|
Таких недочётов в коде очень много, но на фоне общего кол-ва ошибок их просто не заметно в игре
|
|
|
Rdf 60 EGP
Рейтинг канала: 3(46) Репутация: 2 Сообщения: 57
Зарегистрирован: 22.09.2007 |
|
Чего я хочу добиться:
Так как npc в бою не используют боковые двигатели, то игрок имеет перед ними большое преимущество. Хотелось бы уровнять шансы. Этого можно добиться несколькими способами, но почти все они затронут баланс сил игры в целом (например, усиление пиратских патрулей сильно подорвет здоровье торговцев). И тут мне в голову пришла идея уменьшить повреждения, получаемые npc от корабля игрока в 2 раза (ну или увеличить повреждения получаемые игроком в 2 раза). Таким образом, изменения коснутся только боев с участием игрока и все останутся довольными.
Как я себе представляю решение:
Очевидно, что подобные вещи осуществляются на уровне движка. Сначала я сунулся в функции TSHIP.Hit и TSHIP.HitDamage, но, пораскинув мозгами, я пришел к выводу, что они работают, скорее всего, на объектах не активного сектора. И тут мне на глаза попалась функция TSHIP.FireLasersOnTarget. Все бы хорошо, но она ссылается на функцию SA_FireOnObject где и происходит самое интересное.
Что я хочу от уважаемых иеромантов:
Функции SA_, SE_ находятся в x3.exe? С помощью какого софта можно поковырять x3.exe? (утомительную процедуру регистрации на сайте egosoft в рядах девелоперов, которая не известно чем закончится, хотелось бы оставить на крайний случай). А может, я чего не досмотрел и есть более простое решение?
|
|
|
Chem 780 EGP
Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007 |
|
Rdf : |
(утомительную процедуру регистрации на сайте egosoft в рядах девелоперов, которая не известно чем закончится, хотелось бы оставить на крайний случай)
|
При наличии лицензии - ничего в этой процедуре утомительного нет.
Зато получишь частичное описание таких функций. Хотя в данном случае - практически не поможет.
Описание - куцее. Но явно нарушать часть правил Эгософта не буду . Т.е. цитату оттуда не приведу. Скажу только стреляет при наличии энергии.
И таки да - живут они в x3.exe
_________________ Умножим энтропию на 0 :-) |
|
|
AlexYar 1848 EGP
Рейтинг канала: 13(2096) Репутация: 328 Сообщения: 31531
Зарегистрирован: 26.10.2003 |
|
Chem : |
И таки да - живут они в x3.exe
|
И простым смертным его изменение недоступно. Не поможет даже лицензия егософта, которая по сути ничего не даёт такого, что было бы неизвестно сейчас без неё.
зыж Гораздо проще научить неписей использовать стрейф, что экспериментально уже было сделано давно и работало. Правда сейчас в этом направлении никто не работает, многое затерялось и забылось (чтобы потом придумать еще раз ).
Последний раз редактировалось: AlexYar (21:09 06-06-2008), всего редактировалось 1 раз |
|
|
klop711 80 EGP
Репутация: 24 Сообщения: 41 Откуда: Minsk Зарегистрирован: 19.08.2007 |
|
Rdf : |
С помощью какого софта можно поковырять x3.exe?
|
"ковырять" лучше всего этим: Hex-Rays.Decompiler for DataRescue.IDA.Pro.Advanced
Для "ковыряния" - штука бесподобная , но если захочешь собрать обратно (из C-исходников) то получишь большое количество ранее не существовавших багов, на исправление которых уйдет колоссальное кол-во человеко-часов.
IMHO реинжинеринг X3.EXE интересен с точки зрения:
- перевода на OpenGL (все-таки CVA либо FBO существенно быстрее своих аналогов в DX9);
- избавления от внутреннего жава-подобного интерпретатора псевдокода, и возможно от скриптов (компиляция всего в EXE).
P.S. впрочем есть и косяки (в имеющейся сейчас, в интернете, warez-версии Hex-Ray'я):
- нет де-компиляции кода сопроцессора (плавающая точка будет в виде ассемблерных вставок);
- на выходе - чистый C (без ++), а ~15% кода X3.EXE - операции с классами (реальными!, FIXED я не имею ввиду);
- иногда не разбирает сложные кейзы (но это в принципе решаемо).
|
|
|
RD180
|
|
А как бороться с ошибками, возникающими при работе xa_asm.exe вида (из x3story.err файла):
pass2:(x3story.inc:245791) Err: Undefined identifier 'GetStandardTurretLaserMask'. и т.д? Таких ошибок полчилось 8, причем только для GetStandardTurretLaserMask, GetSpecialTurretLaserMask, GetStandardMissileMask, GetSpecialMissileMask, SetCurrentMissileType, GetNumMissiles, SetPilotTradeSkill и GetPilotTradeSkill.
xa2c.exe и xc.exe сработали без ошибок, обж был стандартный от весиии 2.5, использовались конфигурации для дизассемблера и ассемблера выложенные в первом посте этой темы.
|
|
|
|
|
|
Канал X3: Reunion ->
Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы» |
|