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

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

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

   Page 3 of 4
Go to page: Previous  1, 2, 3, 4  Next | All pages
Поиск в этой теме:
Канал X2: The Threat: «Трансляторы XC->XASM и XASM->XC»
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
: 103
Posts: 412
Location: Tomsk
Joined: 18 Aug 2004
Darth Revan wrote:
выражение if(A?(B?1:0):0) может быть восстановлено в виде if(A&&B), в то время как выражение var C=A?(B?1:0):0 можно упростить лишь до вида var C=A&&B?1:0


Мда, вжисть бы не найти...
Но пока по заданию AlexYar ковырялся в генерируемом коде нашел еще несколько, на мой взгляд неочевидных, особенностей. Для примера возьмем тестовую функцию вида:
Code:

.func      Test ;
function Test(arg1)
{
  var loc1 = 0;

  for(loc1 = 0; loc1 < 24; loc1 = loc1 + 1) {
    start {
      if (loc1 == arg1) { return (1); }
    }
  }
  return (0);
}


В генерируемом коде выполняется принудительный выход из функции из блока begin_critical/end_critical без выполнения завершающего end_critical:
Code:

Test_for_1_1:
           push       SP[0]     ; <-- loc1
           push       24
           if SP[0]<=SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endfor_1_1
; Test_start_2_1:
           begin_critical
           if SP[0]<>0 then jump Test_endstart_2_1
; Test_if_3_1:
           push       SP[0]     ; <-- loc1
           push       SP[5]     ; <-- arg1
           if SP[0]<>SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endif_3_1
           push       1
           mov        SP[1],SP[0]
           pop       
           ret       
Test_endif_3_1:
           end_critical
Test_endstart_2_1:
           push       SP[0]     ; <-- loc1
           push       1
           add        SP[0],SP[1]
           mov        SP[1],SP[0]     ; --> loc1
           pop       
           jump       Test_for_1_1
Test_endfor_1_1:

Так, далее, если вместо return(1) внутри цикла поставить просто break - выход из цикла, то генерится код примерно такого содержания:
Code:

Test_for_1_1:
           push       SP[0]     ; <-- loc1
           push       24
           if SP[0]<=SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endfor_1_1
; Test_start_2_1:
           begin_critical
           if SP[0]<>0 then jump Test_endstart_2_1
; Test_if_3_1:
           push       SP[0]     ; <-- loc1
           push       SP[5]     ; <-- arg1
           if SP[0]<>SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endif_3_1
           jump       Test_endfor_1_1
Test_endif_3_1:
           end_critical
Test_endstart_2_1:
           push       SP[0]     ; <-- loc1
           push       1
           add        SP[0],SP[1]
           mov        SP[1],SP[0]     ; --> loc1
           pop       
           jump       Test_for_1_1
Test_endfor_1_1:

При этом блок опять остается незакрытый командой end_critical. Такой код довольно часто может использоваться, а вот локализовать ошибку будет непросто... С continue - примерно тоже самое получится. С этими зависаниями я почему-то грешил именно на это, а оказалось...

Кстати, надо будет проверить, что происходит, если команда end_critical пропускается/отсутствует.

- Дополнено -
Когда тест писал, попался еще один глючек:
Code:

function Test(arg1)
{
  var loc1 = 0;

  for(loc1 = 0; loc1 < 24; loc1 = loc1 + 1)
    start {
      if (loc1 == arg1) { continue; }
    }
 
  return (0);
}

Долго соображал - куда у меня critical секция делась.
Code:

Test_for_1_1:
           push       SP[0]     ; <-- loc1
           push       24
           if SP[0]<=SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endfor_1_1
; Test_if_2_1:
           push       SP[0]     ; <-- loc1
           push       SP[5]     ; <-- arg1
           if SP[0]<>SP[1] then push 0 else push 1
           if SP[0]=0 then jump Test_endif_2_1
           jump       Test_continuefor_1_1
Test_endif_2_1:
Test_continuefor_1_1:
           push       SP[0]     ; <-- loc1
           push       1
           add        SP[0],SP[1]
           mov        SP[1],SP[0]     ; --> loc1
           pop       
           jump       Test_for_1_1
Test_endfor_1_1:

Пока фигурные скобки для цикла не поставил - ничего не получалось...

Last edited by CheckerTwo on 16:58 05-12-2007; edited 1 time in total
    Posted: 15:16 05-12-2007   
Darth Revan
 345 EGP


Рейтинг канала: 5(153)
: 42
Posts: 349
Location: Belarus Prime
Joined: 01 Feb 2006
На самом деле, это проблема не транслятора, а программиста - как придумать ещё один способ сделать ошибку в коде Улыбка Хотя любой из вариантов функуции Test будет транслироваться, ни один не будет нормально работать. Выход из блока start любым способом запрещён - блок start может быть только завершён естественным путём инструкцией end_critical. С точки зрения кода вне блока start этого блока и не существует. Улыбка Т.е. по инструкции begin_critical создаётся новый поток (task), причём содержимое стека копируется. Причём, если поток создан без ошибок, то в стек этого нового потока проталкивается 0. Далее исполнение основного кода продолжается полсде команды end_critical. Новый же поток начнёт выполняться только когда ему придёт очередь при переключении активного потока. Соответственно, первой испольняемой инструкцией для него будет инструкуия
Code:
if SP[0]<>0 then jump Test_endstart_2_1

причём условный переход никогда не происходит, поскольку в стеке всегда находится 0. Я могу в данном случае ошибаться в том, что команда
Code:
if SP[0]<>0 then jump Test_endstart_2_1

выполняется в этом созданном потоке. Т.е. возможно, что при успешном создании потока 0 проталкивается в стек основной потока и там же происходит указанная проверка, хотя она тоже будет бессмысленна. Так что в каком потоке выполняется эта проверка не играет никакой роли. Главное, что код внутри блока start выполняется в отдельном потоке уже после переключения потоков и, следовательно, после возврата в основном потоке из функции Test и разрушения его стека. Иными словами, выходить из блока start попросту некуда. Код внутри блока start по существу не находится внутри функции Test, хотя благодаря тому, что стек копируется при создании нового потока из этого потока моожно обращаться к аргументам функции Test. Иными словами, не return, не выход по break и continue из блока start невозможен. Возможно лишь естественное достижение конца блока и уничтожение потока по команде end_critical.

Кстати, поскольку в примере start в находится цикла, то будет создано аж 24 новых потока. И если arg1 находится в диапазоне от 0 до 23, то мы можем получить или вылет, или подвисание. Т.е. return(1) - один возврат в окна с потерей несохранённых данных, break - вылет, continue - зависание Улыбка

Соответственно, такой код на XC писать просто нельзя. Более того, такой код может появиться в выходном файле транслятора xa2c только если точно такой же выход типа return, break, continue из участка кода, соответствующего блоку start, происходит и в asm-коде оригинального обжа, т.е. это проблема написания кода, а не его трансляции. Я на всякий случай просмотрел x3story.xc - ни одного такого некорректного выхода из блока start я там не обнаружил.

Можно придумать и другой пример из разряда "а что будет если":

Code:
begin_critical
      код1
      if SP[0]=0 then jump label
      код2
      end_critical
label:код3
      end_critical


Сам не знаю, будет ли это работать Улыбка
    Posted: 23:37 05-12-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
: 103
Posts: 412
Location: Tomsk
Joined: 18 Aug 2004
Darth Revan wrote:
На самом деле, это проблема не транслятора, а программиста - как придумать ещё один способ сделать ошибку в коде Улыбка

Ну это-то понятно Улыбка На то он и программист, чтобы придумывать ошибки - профессия такая. Идея функции Test() навеяна идеями программистов Egosoft:
Code:

function TX_AUDIO.SFX_Stress()
{
 var loc1=0;
 for(loc1=0;loc1<1000;(loc1=loc1+1)-1) {
   start {
     while(1) {
       SFX_PlaySound(900+SE_Random(84),SE_Random(200));
     }
   }
 }
 return(0);
}

А всевозможные варианты выхода из блока start - это уже предположения - почему перекомпиляция всего обжа приводила к зависанию игрухи, при условии, что xa2c где-то недопонял асм-код.. Надо же было хоть какую-то рабочую гипотезу для анализа, тем более, что пвсе предыдущие варианьы уже проверены.. Улыбка Неявный выход из цикла по break, внутри которого start-секция - вполне возможная ошибка. По свертыванию кода в тернары - это сложно, тут думать надо было. Я наверное никогда бы не дошел до их анализа..
Darth Revan wrote:
Выход из блока start любым способом запрещён - блок start может быть только завершён естественным путём инструкцией end_critical. С точки зрения кода вне блока start этого блока и не существует. Улыбка

Ага, на 100% согласен. Я к тому, что хорошо бы сообщение выдавать - про некорректный выход из start{} блока...

Darth Revan wrote:
Я на всякий случай просмотрел x3story.xc - ни одного такого некорректного выхода из блока start я там не обнаружил.
    Posted: 09:10 06-12-2007   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
Сравнивал хс-файл старого образца и нового, сгенеренный новой версией xa2c. В некоторых местах в новой версии отсутствуют некоторые скобки. Например:

Старый вариант:

Code:
  if((TX_AUDIO.current_speak_page==1271&&arg4&1)&&TX_AUDIO.au_IdleFaceState<=1)


Новый вариант:

Code:
  if(TX_AUDIO.current_speak_page==1271&&arg4&1&&TX_AUDIO.au_IdleFaceState<=1)



Это идентичный код, или нужно лишние скобки удалять вручную?


А еще есть такие случаи. Старый код:

TMONITORCONTROL.ShowSubTitleText(loc2,loc3,arg3&1|arg3&16384,arg2);

Новый:

TMONITORCONTROL.ShowSubTitleText(loc2,loc3,(arg3&1)|(arg3&16384),arg2);

Тоже по новому образцу исправлять?
    Posted: 16:38 06-12-2007   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
Darth Revan wrote:
Самый яркий пример - TQUEST194.__GetParseTemplates


Еще один яркий пример - ф-ия TUPGRADE2.GetBestSellPrices()

Значение переменной TUPGRADE2.NumHeaders может выйти за разумные рамки на порядки Улыбка Вместо 1 или 0 там складываются размеры таблиц товаров. А вместе с этой переменной так же уходит и значение переменной TUPGRADE2.up_aStrings - это возвращаемое значение ф-ии TUPGRADE2.GetBestSellPrices().

И в перспективе, через работу меню - это тоже может стать еще одной причиной виса Улыбка
    Posted: 22:04 06-12-2007   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
Darth Revan wrote:
Рассмотрим пример. Применим транслятор xa2c к файлам x3story.asm и x3story.out при включенной и выключенной опциях -skipbc. Соответственно, первое встречающееся различие в файлах x3story.xc находится в функции function TSECTOR.FindStation.


Может я чего не так делаю, но у меня различие в файлах только одно:

С опцией -skipbc в начале файла есть пустая секция:

Code:

           .title     x3story.obj
           .ident     X3
           .radix     10d
asm
 {

 }


Без опции -skipbc такой asm-секции нет.

Больше никаких различий между хс-файлами нет, они совершенно одинаковы. Даже строка:

#pragma {SafeLogicalOps=0;}

у обоих одинаковая.

Это только у меня так, или у всех?


зыж: Запускаю так:

xa2c x3story -skipbc

и просто -

xa2c x3story

зыж2: Или заглушку теперь добавлять нужно обязательно вторым параметром?
    Posted: 22:08 07-12-2007   
ULiX
 320 EGP


: 146
Posts: 573
Location: Комсомольск на-Амуре
Joined: 12 Jul 2005
Code:

           read       TMENU_SHIP.mes_iChangedValue ; [87d ; 57h]
           push       1
           add        SP[0],SP[1]
           write      TMENU_SHIP.mes_iChangedValue ; [87d ; 57h]
           push       1
           sub        SP[0],SP[1]
           pop

Транслируется как:
(TMENU_SHIP.mes_iChangedValue=TMENU_SHIP.mes_iChangedValue+1)-1;

Вопрос реальности отображения в сях:

TMENU_SHIP.mes_iChangedValue++;
или
++TMENU_SHIP.mes_iChangedValue;

Сей под руками нет чтоб проверить.
Например:

i=0;
Ai=A[i++];

i=0;
Ai=A[++i];

После выполнени как первых двух строк так и вторых значение i Изменится c 0 на 1.
Но в каком то случае Ai будет равна A[0], а в другом случае A[1]. Это у меня пробел в образовании Улыбка

Пример блока команд:

Code:

    if(TObj2601.IsOpen())
     {
     TObj2601.Close();
     }
    TObj2601.Open(TMENU.me_Object->GetName());
    TObj2601.SetTextCentered(SE_ReadText(1904,loc3?80001:80002));
    TObj2410.ShowScanPopup(TMENU.me_Object);

В этом примере методы объекта вызываются через "." хатя общепринято через точку обращаться к свойствам, а к методам обращаться через "->".
В чем вообще принципиальная разница точки и стрелочки?
Помнится, когда я пересаживался с борландского Си на микрософтский у меня этот вопрос вызвал затруднение, так как в одном языке вызывать методы можно было только через стрелочку, а в другом дозволено было пользоваться как точкой так и стрелочкой.

Я просто задался вопросом, могу ли я получить локальную переменную объекта переданного как аргумент функции другого класса не используя методы?
По тексту программы я не разу не встречал такого варианта.
К примеру, структуры типо: "arg1->GetObjext()" существуют, а вот что то вроде: "arg1.me_Obj" или "loc1.me_Obj" я ни разу не встречал.
Но собственно и асм-команды для чтения локальной переменной указанного объекта тоже не имеется. Но не факт, что команды не существует, просто она ни разу не появилась, так как разработчики ни разу не использовали такого обращения к внешним локальным переменным. Ведь в стандартных сях такое обращение допустимо.

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

Предположим есть родительский и дочерний классы со своими функциями:

.class OBJMather
.func MyFunc
.endclass

.class OBJDaughter(OBJMather)
.func Function1
.endclass


Из функции OBJDaughter.Function1() происходит вызов функции MyFunc которая описана в родительском классе.
Если я в дочерний класс добавлю одноименную функцию MyFunc, будет ли происходить вызов из функции Function1 вновь описанной функции вместо прежней родительской?

========
При задании текущего счетчика команд можно ли использовать в качестве значений метки определенные в коде. Например:
$ = TSHIP.AttackedBy
$ = $ + 100
Ну, конечно при условии, что адреса погрузились директивой .LOADOBJ

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

=========
Где-то заходил разговор об оптимизации кода.
Внесу своё предложение.
Просматривая код я часто сталкивался со следующим вариантом организации цикла:

for(i=0;i<SE_ArraySize(myArray);i++){}

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

var SmyArray=SE_ArraySize(myArray);
for(i=0;i<SmyArray);i++){}

Однако увы на автомате такую оптимизацию делать не стоит.
Я также встречал варианты, где подобная структура цикла почти оправдана:

for(i=0;i<SE_ArraySize(myArray);i++)
{
if(expression)
{
SE_ArrayRemove(myArray,i);
i--;
}
}


Такую структуру лучше всего преобразовать к виду:

var SmyArray=SE_ArraySize(myArray);
for(i=0;i<SmyArray);i++)
{
if(expression)
{
SE_ArrayRemove(myArray,i);
i--;
SmyArray--;
}
}

Ну и ещё на счет этих "++".
Вроде бы запись удобная, но код получается не оптимальный.
Если скажем использовать что-то вроде

MyVar=i++;

то использование "++" оправдано, но в случае, если отсутсвует переменная, которая примет результат вычислений, то код дополнится процедурой извлечения ненужного значения из стека (pop).
Записи типо i+=1; или классическое i=i+1; лишены таких недостатков.
Это же касается и стандартных языков C, а не только XC. Кроме того операторы "+=" и "-=" вроде как не поддерживаются транслятором XC_to_XAsm.

Еще, если можно, взгляните на пост и дайте хоть какой-то ответ, но желательно в этой теме а не в той:

http://www.elite-games.ru/conference/viewtopic.php?p=1963172#1963172

Нужно дать ответ относительно задания текстовых констант.
Проблемы у меня с этим возникли.

Эммм... время поджимает...

Горячие классы: 5002-5102... из них свободные 5044-5102!

Сейчас нет времени пояснять просто глянте короткий код фукции:

function TUPGRADEMASTER.UpdateUpgrades()
А строчки (5002+loc1)->Init();
(5002+loc1)->Set();
Открывают новые возможности Улыбка
Можно добавлять новые подпункты в существующие меню и реализовывать новые способности не правя сами меню а просто добавляя слассы 5044-5102 по образцу класса TUPGRADE.

Таким образом я добавил новый пукт меню в меню инфы корабля просто добавлением своего класса не правя абсолютных адресов.
Осталось только отрехтовать код... как раз проблема с отображением из-за глюков со строковыми константами.

В общем здесь люди умные, возможно я даже ничего нового и не сообщил, а если сообщил, то заинтересовавшиеся уже знают как воспользоваться этой информацией.
_________________
Новое ещё не значит лучшее
    Posted: 10:29 17-07-2008   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
ULiX wrote:
К примеру, структуры типо: "arg1->GetObjext()" существуют, а вот что то вроде: "arg1.me_Obj" или "loc1.me_Obj" я ни разу не встречал.


Потому что в хс перед точкой стоит имя класса, а в твоем примере - имя переменной Подмигиваю

ULiX wrote:
Если я в дочерний класс добавлю одноименную функцию MyFunc, будет ли происходить вызов из функции Function1 вновь описанной функции вместо прежней родительской?


Да.


На остальное позже отвечу, надо отвлечься на поесть Хы...
    Posted: 18:11 18-07-2008   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
ULiX wrote:
Я просто задался вопросом, могу ли я получить локальную переменную объекта переданного как аргумент функции другого класса не используя методы?


У тебя терминология сильно иная, и затрудняет понимание языка хс (по крайней мере моё понимание).
Есть классы, есть функции. Всё. Никаких методов, никаких свойств нет. Процедур тоже нет Гы-гы

Через точку, точнее перед ней, пишется имя класса, которому принадлежит функция или переменная. Через стрелочку вызывается функция того-же класса, что и переменная слева от стрелочки.

T.e. к примеру.

var ship=global.ga_PlayerShip.

Тут ясно, что присваивается значение глобальной переменной ga_PlayerShip

var type=ship->GetType();

Тут происходит вызов ф-ии класса TSHIP (TSHIP.GetType()), потому что корабль собственно и есть класса TSHIP.

По поводу дочерних классов - если корабль был создан из дочернего класса, то ф-ия GetType будет вызвана из того класса, если таковая там есть. Если её там нет, то из родительского класса TSHIP. Если её удалить из класса TSHIP, то она будет вызвана из класса TSCRIPT, а если и оттуда, то из класса TGBODY, т.е. по иерархии классов. Ну тут всё понятно надеюсь.


ULiX wrote:
Кроме того операторы "+=" и "-=" вроде как не поддерживаются транслятором XC_to_XAsm.


И ++ и -- вроде тоже не поддерживаются.

ULiX wrote:
function TUPGRADEMASTER.UpdateUpgrades()
А строчки (5002+loc1)->Init();
(5002+loc1)->Set();
Открывают новые возможности
Можно добавлять новые подпункты в существующие меню и реализовывать новые способности не правя сами меню а просто добавляя слассы 5044-5102 по образцу класса TUPGRADE.


Честно говоря не понял, о каких меню идёт речь.

Классы 5000* это классы апгрейдов, и помимо обжа они обрабатываются и напрямую в ехе. К меню они совершенно не относятся никак, кроме как косвенно. Кроме того, некоторые классы этого диапазона отсутсвуют в обже, но присутствуют в ехе.
По крайней мере я добавив новый апгрейд добавлением нового класса нарвался на очень неприятный баг, приведший игру в нерабочее состояние после суточного прогона игры (видимо попал на старый кусок кода в ехе, который остался со времен х2/ХТ/ХБТФ).

Т.е. теоретически, добавлять апгреды для кораблей таким способом можно, но очень осторожно. Неизвестно каких мин оставил за собой егософт, когда удалял старые апгрейды и плодя дупы, такие как стрейфдрайв Улыбка


зыж По поводу твоих ошибок со строками я ответил в той теме, где ты спрашивал.
    Posted: 02:42 19-07-2008   
ULiX
 320 EGP


: 146
Posts: 573
Location: Комсомольск на-Амуре
Joined: 12 Jul 2005
AlexYar wrote:
И ++ и -- вроде тоже не поддерживаются.

Да вроде как поддерживаются, но только в одну сторону из XC в XASM а вот из асма в си прописывает все операции: (i=i+1)-1

На счет локальных переменных. Я вижу мы друг друга не допоняли.
Пример:

Меню SHIPINFO имеет ссылку на объек-корабль, которая сохранена в локальной переменной me_Object, об этом позаботилась процедура создания меню. Таким образом программа меню знает свойсва какого объекта она должна использовать.

Для получения каких либо свойств (локальных переменных сласса) из процедур класса меню, используются методы (функции) скласса корабля. Например для получения состояния корпуса:
TMENU.me_Object->GetHull();

Но никак не:

TMENU.me_Object.sh_Hull;

Вот я и задался вопросом, как получить локальное свойство класса из другого класса не используя методы?

Получается так, что локальными переменными могут пользоваться только локальные функции класса в котором эти переменные определены.

Вывод. Если я дополняю класс TSHIP своей переменной (свойством) и собираюсь менять это свойство и читать его из процедур других классов, то необходимо также добавить в класс два метода (функции) для установки и чтения этой переменной.

Вопос у меня возник в связи с отсутствием функций для чтения и изменения переменной im_AllowedContexts класса 2400.
Эта переменная хранит таблицу контекстов обработки горячих клавиш. Эта переменная заполняется из файла contexts.dat и не правится больше, кроме как дополнением скриптовых обработок клавишь. Очень хотелось изменить контекст так, чтоб некоторые клавиши передавались обработчику своего меню. И вообще создать свой набор горячих клавиш для своего контекста меню.

AlexYar wrote:
Честно говоря не понял, о каких меню идёт речь.


Я говорю о всех меню, где вызывается функция:

TUPGRADEMASTER.ContextMenuBuild(ClassObject,Object)
где
ClassObject - класс объекта меню
Object - ссылка на сам объект меню

Эта функции для каждого апгрейда вызовет фукцию:
ContextMenuBuild(ArrayConxMenu,ClassObject,Object)

Каждый апгрейд самостоятельно решает проверяя класс объекта ClassObject добавлять контекстное меню в вызывающее или нет, путём добавления в массив ArrayConxMenu свой подмассив из трех элементов. Первый элемент текст контекстного меню, третий ссылка на объект для которого определена функция ContextMenuAction, обычно апгрейды добаляют только один пункт мею и ссылаются самми на себя, хотя теоретически один апгред может создать несколько контекстных меню, каждое из которых будет просто ссылаться на функцию ContextMenuAction любого другого объект. Таким образом можно создать один апгрейд дающий дополнительные пункцты меню, а сами функции оформалять в других классах.

Млин... это так легко не объяснить, это нужно вжиться... Если очень интересно, то могу помочь это всё понять...

Выложил своё творение в готовом виде, без исходников:

Расширенные торговые утилиты

Как раз демонстрация добавления нового устройства и пункта меню в меню корабля, там же где анализаторы цен высвечиваются.
Для появления этого пункта необходимо установить Торговый модуль МК-3, а для работы ещё и Расширенную торговую систему. Может быть и дорого зато функции не слабые. А то было не понятно почему галоторговцы так обожают этот Мк-3, если для игрока оно бесполезно.

Если кого заинтересует, как всё это реализовано, могу подклиться исходниками. Гы-гы
_________________
Новое ещё не значит лучшее
    Posted: 09:57 23-07-2008   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
ULiX wrote:
Да вроде как поддерживаются


Неа. Не поддерживаются. В документации по синтаксису хс о них нет ни слова.

ULiX wrote:
Получается так, что локальными переменными могут пользоваться только локальные функции класса в котором эти переменные определены.

Вывод. Если я дополняю класс TSHIP своей переменной (свойством) и собираюсь менять это свойство и читать его из процедур других классов, то необходимо также добавить в класс два метода (функции) для установки и чтения этой переменной.


Совершенно верно. Иным способом получить значение лок.переменной класса из ф-ии другого класса нельзя.

ULiX wrote:
Очень хотелось изменить контекст так, чтоб некоторые клавиши передавались обработчику своего меню. И вообще создать свой набор горячих клавиш для своего контекста меню.


А изменения context.dat недостаточно?

ULiX wrote:
Таким образом можно создать один апгрейд дающий дополнительные пункцты меню, а сами функции оформалять в других классах.


Для примера выложил бы маленький скрин с новым пунктом меню, это гораздо быстрее привело бы к пониманию вопроса, чем все объяснения Улыбка

ULiX wrote:
Млин... это так легко не объяснить, это нужно вжиться... Если очень интересно, то могу помочь это всё понять...


Пока не совсем получается понять тебя Гы-гы , сделай скрин.

Я легко делаю новые меню целиком, но пока не понял, что именно делаешь ты. Имхо это как-то... слишком усложнённо и крайне ненадёжно. Проще сделать новое меню, какое надо, и не ломать уже существующие меню в "надежде" привести игру в неработоспособность Улыбка
    Posted: 12:06 23-07-2008   
ULiX
 320 EGP


: 146
Posts: 573
Location: Комсомольск на-Амуре
Joined: 12 Jul 2005
AlexYar wrote:
А изменения context.dat недостаточно?

Для изменения этого файла нужно конкретно очень строго прошить код своей клавиши, тогда клавиша уже не будет Custom и естесно не будет отображаться в опциях как возможную для перезадания, если только не править код меню опций, я же регистрирую клавишу как пользовательскую. Как ни странно создатели сделали вариант внутренней регистрации дополнительных клавиш с запуском не скриптов а со сылкой на объект. То есть дополнительные классы могут зарегестрировать свои горячие клавиши так, чтобы у игроков имелась возможность перезадать их. По умолчанию контекст для таких кустом клавиш задаётся равным 2, что соответствует "В полёте"... Не совсем удобно, так как в меню эти клавиши работать не будут, что мы и наблюдаем с Анализаторами цен. Но я тут заметил, что Эгософт всё же услышал мои молитвы. По крайней мере в версии 2.5 сделано исправление... Теперь все кустом клавиши исправляют контекст на 1 (Всегда)...

Оригинальный ход и вроде и так сойдёт. Собственно мне это наруку, так как все мои новые зарегестрированные пользовательские клавиши смогут обрабатываться во всех меню созданных мной и всех других меню в которые я внедрил своё дополнительный пункт. Вопрос тут только в конфликтности... К примеру клавиша "s" используется как стрейф вниз в полете, но как старт скрипт редактора в консоле... т.е. разделенные функции по разным контекстам. К примеру клавиша "е" используется как для поворота оси корбля так и для вызова консоли в главном меню. Но в качестве контекста для функции поворота осей задано Всегда, поэтому при нажатии "е" в главном меню происходит изменение крена корабля и одновременное открытие консоли, т.е. две функции по одной клавише...
Тогда стоит задача, как для кустом клавиши (с контектом Всегда) не допустить срабатывания двух разных функций при условии что в качестве горячки задана одна кнопка на клавиатуре? Нужно изменить context.dat но до регистрации кустом клавиши не известен её код, который выделяется динамически от 1536 и в порядке возрастания. Но context.dat читается только при старте новой игры и остаётся в памяти в массивах, если исправить их, то можно добиться нужного результата.

А что разве нет какой-нибудь SE функции для получения доступа к локальной переменной другого класса?

Исправление контекста дополнительныъ клавишь с 2 на 1 не исправило глюков с анализаторами, так как в X3 в отличии от Х2 анализаторы больше не кустом девайсы и их коды горячих функций прошиты не массиве дополнительных клавиш. Хотя действительно если изменить контекст с 2 на 1 для Анализаторов, то будет сработка клавиш во всех меню разом... Даже когда корабль пристыкован Улыбка... НО исправление файла context.dat не даст результатов пока не начнешь новую игру. Поэтому и была предпринята попытка сменить контекст с 2 на 1 для кустом.

Предлагаю провести эксперимент, чтоб понять о каких исправлениях идёт речь.

1. Поставте бонус пак, или какой-нить скрипт который регистрирует горячие клавишу.
2. Начните новую игру.
3. Зайдите в настройки клавиш и задайте горячую кнопку для какой либо дополнительной скриптовой функции. Например оборона маскитами.

При задании клавиши вы увидете строчку что-то вроде "Сработка: В полёте"

4. Сохранитесь.
5. Загрузитесь.
6. Снова зайдите в настройку клавишь. И попытайтесь перезадать кнопку для скрипт функций.
Но теперь вы будете видеть "Сработка: Всегда".

Вот так Эгософт решили исправить проблему с несработкой горячих клавишь для анализаторов, но исправили совсем другое. Жаль, что в другом месте делается невозможность запуска скриптов по горячим клавишам в пристыкованном положении, хотя я лично против такого ограничения, пусть скрипты сами решаю работать им или нет, если корабль не в полёте.

Я всё это веду к тому, что исправить контекст очень бы хотелось, в частности, чтобы исправить неработающие клавиши анализаторов без старта новой игры.

Из обжа это делается:
TObj2400.im_AllowedContexts[673]="1;"
TObj2400.im_AllowedContexts[674]="1;"

Или по более избирательному:

TObj2400.im_AllowedContexts[673]="2;1004;1025;"
TObj2400.im_AllowedContexts[674]="2;1004;1025;"

Нужно лишь получить доступ к этой локальной переменной Подмигиваю
_________________
Новое ещё не значит лучшее
    Posted: 06:50 24-07-2008   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
ULiX wrote:
А что разве нет какой-нибудь SE функции для получения доступа к локальной переменной другого класса?


Нет.

ULiX wrote:
Нужно лишь получить доступ к этой локальной переменной


Выход, который использую я (да и егософт тоже, судя по изменениям в 2.5 насчёт наконец-то добавленной команды GetSector всем объектам, кроме TCLIENT) - добавление ф-ий в класс этой переменной для её считывания и записи. Других способов скорее всего нет.
    Posted: 12:04 24-07-2008   
ULiX
 320 EGP


: 146
Posts: 573
Location: Комсомольск на-Амуре
Joined: 12 Jul 2005
У меня глобальная просьба для Darth Revan

Можно ли сделать альтернативный синтакси для команд, таким образом, чтобы приблизить язык XC к языку KC, который и используется для создания обжей X?

Думаю, следовало бы сразу пойти этим курсом. Это позволит писать проекты на языке, который может быть принят компанией Эгософт для внедрения в новую версию игры. Многие проекты вполне приличные и могли бы быть приняты официально, но честно говоря будет очень много мороки переделать исходник из XC для трансляции в KC. Я уже это проделал со своими Расширенными торговыми утилитами, и поверте, мне это не доставило удовольствие. Построчно проверять код на несколько тысяч строк на предмет правильности синтаксиса для KC это ужас!!! Рыдания.

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

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

Если нет времени или желания, то я бы с удовольствием глянул бы на исходники для XC и попробывал бы добавить самостоятельно поддержку альтернативного синтаксиса.

Вообще странно, зачем было выдумывать свой синтаксис для команд, которые уже имеют свой синтаксис в стандартном си.

Вот только незадача... в KC вместо "->" используется точка "."
Нужно научить транслятор распозновать имена классов и переменные указывающие на объект. Нужно проверить определен ли псевдоним как класс.

return(retc);

В KC нет скобок для команды return
return retc;

В KC cтрока
return;
Без параметров эквивалентна:
return(0);

Массивы преопределяются как:
array MyAr={a1,a2,a3};

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

Но это дело поправимо, если за такую задачу возьмутся, то я согласен предоставить инфу по синтаксису.
_________________
Новое ещё не значит лучшее
    Posted: 09:01 28-07-2008   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
ULiX wrote:
но честно говоря будет очень много мороки переделать исходник из XC для трансляции в KC


А но кой хрен нужно переделывать исходники из ХС на КС? Хочешь работать на Егософт - пиши сразу на КС. А если хочешь воровать чужие работы - будешь получать по балде со всеми вытекающими Хы...

зыж На дату его последнего посещения ЕГи посмотреть не забыл?

зыыж Переделка ХС под КС - полный абсурд по той еще причине, что уже на ХС написано множество исходников, и никто их переписывать не будет, как никто не будет переучиваться на КС без острой на то необходимости.

Last edited by AlexYar on 11:52 28-07-2008; edited 2 times in total
    Posted: 11:03 28-07-2008   
ULiX
 320 EGP


: 146
Posts: 573
Location: Комсомольск на-Амуре
Joined: 12 Jul 2005
AlexYar wrote:
зыыж Переделка ХС под КС - полный абсурд по той еще причине, что уже на ХС написано множество исходников, и никто их переписывать не будет, как никто не будет переучиваться на КС без острой на то необходимости.

Я не прошу переделку. Я хочу чтоб добавился альтернативный синтаксис. Т.е. один и тот же код можно написать разными способами.

К приемеру XC не делает отличий по типам переменных, как следствие определение переменных в КС:

int MyInt;
bool MyBool;
array MyArray;
table MyTable;
vartype MyVar;
GALOBJ MyObj;
SECOBJ MySecOBJ;

Абсолютно аналогично с определениями
var MyVariable;

И имеют идентичный код на асме.

Таким образом, нужно ввести лишь синонимы слову var при определении переменной. А также синонимы слову function при определении функций. Если уже существует база замен текстового кода на Xасм код, то нужно просто дополнить её ещё несколькими синонимами и доп структурами. Это не заставит привыкших к старому XC пилотов перестраиваться, но доставит удобство тем, кто привык программить на традиционном языке Си.

А наши иероманты скоро соберут всю базу объектов со всеми функциями и описанием к ним, так что дайте стандартный Си и люди потянутся что-то делать более энергично. На ЕС много желающих предложить свои задумки, но они склонны к традиционному синтаксису.
_________________
Новое ещё не значит лучшее
    Posted: 09:12 29-07-2008   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
ULiX wrote:
тем, кто привык программить на традиционном языке Си.


А что сложного привикнуть к "традиционному" ХС ? Хы...
Я "привык" за неделю. Не вижу никакой проблемы в этом.

ULiX wrote:
А наши иероманты скоро соберут всю базу объектов со всеми функциями и описанием к ним,


Мечтать не вредно, вредно не мечтать Улыбка Если Егософт сам эту информацию не предоставит - иероманты по всем ф-иям инфу соберут только лет через 5-7, не раньше, а то и больше.
Пока собрана информация примерно только о 50% ехе-ф-ий и их параметров. Если ты о ф-иях в обже - то они уже давно разобраны все. Но сами по себе они ничто, нужна инфомация по ехе-функциям.

ULiX wrote:
На ЕС много желающих предложить свои задумки, но они склонны к традиционному синтаксису.


Какое отношение ЕС имеет к ЕГ ? С какого бодуна ты стал представлять интересы ЕС? Подозрение. Засланный казачок что-ли? Гы-гы

К тому же на повестке дня стоят более важные проблемы с ХС, чем подстройка под чьи-то удобства Улыбка Сперва нужно сделать возможность детрансляции обжа ХТ хотя бы, и сделать возможность его полной перекомпиляции.
Далее на повестке стоит модернизация xa_asm и xc для полной невозможности разборки перекомпилированных обжей.


Ну и конечно же ничто не сдвинется с мёртвой точки, если Darth Revan не захочет опять заняться иксами, так как сейчас у него такого желания/возможностей нет. CheckerTwo тоже взял долгосрочный таймаут.
    Posted: 12:37 29-07-2008   
ULiX
 320 EGP


: 146
Posts: 573
Location: Комсомольск на-Амуре
Joined: 12 Jul 2005
В этих вопросах нужно искать желающих перенять эстафету, как это например делается с ExScE. Всё, что для этого нужно, чтоб чекер и дарт выложили исходники, не сомневаюсь, что тогда найдутся и желающие покопаться в коде и модернизировать и даже сделают интерфейс Улыбка. Без исходников никто за это не возьмется, так как истоки о структуре obj уходят далеко в прошлое, и уже никто не задумывается об этой самой структуре... Как собственно любой программист на ООП языках забывает об ассемблере, как о страшном сне.
Эхх старые добрые времена, когда установленный SoftIce было нормой и проги не ругались, что у тебя дебагер в памяти и они отказываются дальше устанавливаться. Кто интересно сейчас ещё помнит как это было, собирать по крупицам структуру обж, да и вообще всего. Разборки c pck, cat, смех над XOR кодированием, на котором Эгософт видимо помешалось... Настальгия...
_________________
Новое ещё не значит лучшее
    Posted: 10:23 06-08-2008   
AlexYar
 1945 EGP


Рейтинг канала: 6(462)
: 325
Posts: 33144

Joined: 26 Oct 2003
ULiX wrote:
Всё, что для этого нужно, чтоб чекер и дарт выложили исходники, не сомневаюсь, что тогда найдутся и желающие покопаться в коде


Ха-ха-ха Ой, не могу!.. Желающие покопаться в коде... Ой, не могу!..
Я даже знаю, кто эти желающие, и как их фирма называется Гы-гы


2DarthRevan и CheckerTwo: Не дай бог, даже не думайте Гы-гы
    Posted: 20:58 07-08-2008   
ULiX
 320 EGP


: 146
Posts: 573
Location: Комсомольск на-Амуре
Joined: 12 Jul 2005
Quote:

Рыыыыыыыыыыы....
У XC тоже свои причуды... Он же каждый раз когда новый файл компилирует автоматом создаёт строки с именами:
S_XC_B_1
S_XC_B_2
S_XC_B_3
и т.д.

И получается, что в нескольких inc файлах имеются разные строки с одними и теми же именами-ссылками... Повеситься можно. Приходится, либо ручками исправлять имена строк в кадом файле отдельно, либо объединять все свои cpp файлы в один и генерировать один inc файл. Не удобно ни то ни другое... ПОсле каждой компиляции XC-XASM исправлять имена строк обломно, а общий файл слишком геморно, когда нужно иметь под глазами сразу несколько классов, чтоб помнить имена переменных и функций, да и вообще НУЖНО!

Явно в XC необходимо ввести метакоманду задающую базовое имя строковой переменной, чтоб можно было избежать повторений в разных модулях.
Как, скажите мне, могут два разных человека написать совместимые сpp файлы, используя в своём коде строки, если в результате inc файлы будут иметь повторения определения строк?


AlexYar wrote:
2DarthRevan и CheckerTwo: Не дай бог, даже не думайте

Какой ты всё таки... Вот имел бы я исходники с проблемой, которую я изложил в тут:

http://www.elite-games.ru/conference/viewtopic.php?p=1986002#1986002

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

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

Представте, что можно сделать с человеком, изменив правильно в нужной позиции цепочки ДНК один атом???

Блин, хоть раз бы увидеть ДНК и её структуру живъём. Я вообще считаю, поручите вы раскадирование кода ДНК не биологам а заядлым программерам-х.....м и проект Геном Человека завершится в ближайшие месяцы. Уж кто лучше разбирается в шифровке и кодировании? Подумаешь несколько миллионов атомов... Что мы не сможем расшифровать несколько мегабайт информации?
_________________
Новое ещё не значит лучшее
    Posted: 05:49 11-08-2008   
Канал X2: The Threat: «Трансляторы XC->XASM и XASM->XC»
Go to page: Previous  1, 2, 3, 4  Next | All pages
  
Display posts from previous: 
View previous topic | View next topic |
К списку каналов | Наверх страницы
Цитата не в тему: Подходи тихо, стреляй точно, улетай быстро.

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