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

Поиск | Снег | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 12 из 12
На страницу: Пред.  1, 2, 3 ... 10, 11, 12    Перейти:   Все страницы
Поиск в этой теме:
Канал X2: The Threat: «X2-ASM - это проcто!»
Darth Revan
 345 EGP


Рейтинг канала: 5(150)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
Вот, кажется ещё толком не упоминалось. В обжах есть возможность работать с восьмибайтовыми числами с плавающей точкой. Правда, поддерживаются только арифметические операции.

Константа с плавающей точкой (fp8) задаётся командой unknown a,b, где а и b - два dwordа, т.е. те самые 8 байт, расположенные в обратном порядке, т.е. внутреннее представление числа с плавающей точкой. Получить такое представление можно, например, написав маленькую програмку на каком-нибудь ящыке программирования. Может и тулсы каьке есть. На XC запись очень похожа: __unknown(a,b).

Теперь о преобразовании типов. Как и положено, результат арифметической операции целого и fp8 есть fp8. Таким образом, чтобы преобразовать целое в fp8, достаточно сложить наше целое с [color="blue"]0.0[/color]. Т.е. если есть некторая целая переменная value_int, то value_int+__unknown(0,0) будет fp8.

Для осуществления обратной операции, т.е. приведения fp8 к целому служит exe-функция
Код:
int SE_ToInt(fp8).


Т.е. SE_ToInt(value_fp8) вернёт приведённою к целому величину value_fp8.

Как я уже отмечал, для fp8 доступны лишь базовые арифметические операции. Передача в функции, принимающие целые параметры, например, SE_Sqrt, SE_Distance3 и вообще все exe-функции, значений типа fp8 приводит к неправильным результатам - они воспринимаются какцелые, и результат возвращается целый.

Рассмотрим пример на XC использования fp8. Ниже приведена функция
Код:
fp8 DSqrt(fp8)

вычисляющая fp8 квадратный корень от fp8 аргумента.

Код:
.func DSqrt
function DSqrt(a)
 {
 var d0=__unknown(0,0); //0.0
 if(a<=d0){return(0);}
 var eps=__unknown(3e45798eh,0e2308c3ah); //точность (относительная)
 var x=a;
 var d1=__unknown(3ff00000h,0); //1.0
 if(a>=d1)
  {
  var a1=a;
  var d15=__unknown(40e00000h,0); //2^15
  var d30=__unknown(41d00000h,0); //2^30
  var y=d1;
  while(a1>d30)
   {
   a1=a1/d30;
   y=y*d15;
   }
  x=y*SE_Sqrt(SE_ToInt(a1)); //начальное приближение, если a>=1. Здесь два преобразования типов.  }
 else
  {
  x=(1+a)/2;                 //начальное приближение, если a<1
  }
 x=(x+a/x)/2;               
 x=(x+a/x)/2;                //сразу сделаем две итерации
 var x1=0;
 while
  {
  x1=(x+a/x)/2;           //итерационыый алгоритм, сходится очень быстро, и крайне быстро
  if(x-x1<eps*x1){break;} // вблизи корня, так что достаточно одной-двух итераций
  x=x1;
  }
 return(x1);
 }
    Добавлено: 15:09 06-08-2007   
Darth Revan
 345 EGP


Рейтинг канала: 5(150)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
Вот ещё одно возможное применение чисел с плавающей точкой. Предположим, что нам необходимо вычислить значение некоторой сложной математической функции f(x), где x из некоторого промежутка, причём так, чтобы код работал достаточно быстро. Для примера рассмотрим функцию sin(x). В X3, конечно, её можно вычислить, используя exe-функцию SE_Sin. В X2 вычислить эту функцию тоже можно, но окольным путём через функцию SE_GetRotMatrixFromAngles, что менее эффективно.

Вспомним разложение Тейлора для функции f(x).
f(x+h)=f(x)+f'(x)h/1!+f''(x)h2/2!+f'''(x)h3/3!+...
и так далее до любой степени h (при условии достаточной гладкости функции f(x)).

Возвращаясь к нашему примеру, имеем
sin(x+h)=sin(x)+h-h3/6+O(x,h5),
где остаток
O(x,h5)<=h5/120.

А дальше воспользуемся этой формулой. Внешним от иксов способом вычисляем значение функции f(x) с некоторым шагом d и сохраняем результат в некотором файле. После чего, скажем, при начале игры читаем в обжах эти значения из файла в некоторый массив. В самой функции вычисления значения f(y) по y находим ближайшее значение x из таблицы (например, если наша равномерная сетка значений в таблице содержит 0, то можно брать x=y%d). После чего используем формулу для вычисления f(y)=f(x+h). В нашем случае для вычисления синуса достаточно вычислить
sin(x)+h-h3/6,
где значение sin(x) берётся из массива, причём погрешность вычисления, связанная с использованием приближения синуса, не превосходит величины
O(x,d5)<=d5/120.
    Добавлено: 20:08 09-08-2007   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Для временного решение проблемы с декомпиляцией XA2C конструкций вида push / cmd / pop, где cmd - одна из следующих команд add, sub, mul, div, mod, or, and, xor, в дизассемблер введена опция:
UnsafeCmd. Включение опции позволяет комментировать код.
Текущая версия 3.28b доступна на http://checkertwo.narod .ru/do3_28.zip

do3_28.zip
 Описание:
Зеокало
 Имя файла:  do3_28.zip
 Размер файла:  98.58 KB
 Скачано:  541 раз(а)


Последний раз редактировалось: Finist (07:17 09-04-2008), всего редактировалось 1 раз
Последний раз редактировалось: CheckerTwo (22:15 08-04-2008), всего редактировалось 1 раз
    Добавлено: 22:15 08-04-2008   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Маленькие хитрости и трюки...

Как-то по весне обсуждали с AlexYar-ом возможность модернизации Х3. Ни к чему толковому не пришли, но поселилась в душе какая-то неудовлетворенность, что ли. И решил я немного поэкспериментировать. Прошло уж пол-года, все недосуг было, сейчас выкладываю. Возможно, что это пригодится кому-нибудь.

Идея передачи информации из Х3 в другую программу может быть решена просто и красиво. Как оказалось, стандартные exe-функции движка Х3 частично поддерживают работу с pipe-каналами.

Что для этого нужно.

1. Небольшую внешнюю программку - сервер pipe-канала.
2. Маленькие вставки в obj-файл.
3. Собственно все.

1. Громкое слово "pipe-сервер" не должно пугать. На самом деле это очень простая консольная программа. Пример реализации такого сервера можно глянуть в архиве. Написан на Delphi, а потому может быть легко переведен на любой язык, которым владеете. Программа создает именованный канал "\\.\PIPE\X3" и "зависает", в ожидании подключения к нему клиента - в нашем случае Х3.

2. В obj-файле нужно создать три функции для работы с каналом:

Код:

  .var fPipe;   // переменная, хранящая хендл pipe-канала

  // Эта функция открывает именованный канал
  // должна вызываться только один раз при запуске игры
  function _create_pipe()
  {
    global.fPipe = SE_FOpen("\\\\.\\PIPE\\X3", "r+");
    return (0);
  }

  // Эта функция закрывает именованный канал
  // должна вызываться только один раз - при завершении игры
  function _close_pipe()
  {
    if (global.fPipe) {
      SE_FClose(global.fPipe);
      global.fPipe = 0;
    };

    return (0);
  }

  // тестовая функция передачи данных из Х3 во внешнюю программу
  // может вызываться где попало и столько раз, сколько нужно
  // это всего лишь пример, в реальной жизни передавать строчку
  // "test test" смысла не имеет.
  function _send_pipe()
  {
    if (global.fPipe) {
      SE_FPrintf(global.fPipe, "test test");
    };
   
    return (0);
  }


Именованный канал, однажды созданный будет жить до тех пор, пока либо клиент, либо сервер не прекратят существование. Запускать нужно сначала серверную часть, а уж потом пропатченную игру. Если во время работы игры сервер вдруг упадет, (а такое возможно при посылке очень длинного сообщения, > 4К), то скорее всего, игрушка тоже вылетит в винду.

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

Ограничения.
Увы! К сожалению, выше приведенный код может только передавать данные из Х3. Получить данные из внешней проги таким способом не получится. Это связано с тем, что среди exe-функций отсутствует функция, способная из открытого по SE_FOpen файла что-либо прочитать. Ну или я не нашел... Прикрутить SE_ReadFile тоже не удастся. Причина проста - эта функция внутри себя содержит код определения размера файла. А для pipe-каналов размер файла не существует как таковой. В результате функция вываливается не прочитав ничего.

Замечания.
Функцию SE_WriteFile тоже можно приспособить к работе с pipe-каналами. Но это не очень удобно. Точнее, совсем не удобно. Эта функция сама открывает файл, записывает данные и закрывает файл (ну или канал). Всё, после этого придется снова создавать новый pipe-канал, к старому уже никак не подцепиться. При этом возможны очень неприятные моменты, когда канал еще не создан, а следующая функция уже пытается что-либо передать. Потери инфы или вылеты неизбежны.

pipe.rar
 Описание:
Пример pipe-сервера
 Имя файла:  pipe.rar
 Размер файла:  13.71 KB
 Скачано:  578 раз(а)


Последний раз редактировалось: CheckerTwo (15:32 07-08-2008), всего редактировалось 1 раз
    Добавлено: 15:10 07-08-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
Checker!!! Он вкернулся!!! Он снова с нами!!!
Выкладываю свои мемуары сделаные за выходные.

*** Версия XA_ASM 3_28 ***

Работа над модом дроида резко затормозилась... Расстроен
Причина в невозможности откомпилировать код.
Код:

           .radix     10d
           .section   code, con
           

.classdef  TSHIP
  .vint      sh_Droid
  .varray    sh_DroidPrototypes
; procedures
  .func      GetDroid
  .func      SetDroid
  .func      AddDroidPrototyp
  .func      GetDroidPrototypes
.endclass  TSHIP

; function TSHIP.AddDroidPrototyp(aProt)
TSHIP.AddDroidPrototyp:
           setmem     3
; TSHIP_AddDroidPrototyp_if_1_1:
           read       TSHIP.sh_DroidPrototypes
           if SP[0]<>0 then jump TSHIP_AddDroidPrototyp_endif_1_1
           push       0
           push       1
           callasm    SE_ArrayAlloc
           write      TSHIP.sh_DroidPrototypes
           pop       
TSHIP_AddDroidPrototyp_endif_1_1:
           push       SP[3]     ; <-- aProt
           read       TSHIP.sh_DroidPrototypes
           push       2
           callasm    SE_ArrayAppend
           pop       
           push       0
           ret       
; function TSHIP.GetDroidPrototypes()
TSHIP.GetDroidPrototypes:
           setmem     1
           read       TSHIP.sh_DroidPrototypes
           ret       
; function TSHIP.GetDroid()
TSHIP.GetDroid:
           setmem     1
           read       TSHIP.sh_Droid
           ret       
; function TSHIP.SetDroid(oDroid)
TSHIP.SetDroid:
           setmem     1
           push       SP[3]     ; <-- oDroid
           write      TSHIP.sh_Droid
           pop       
           push       0
           ret       


Выдаёт ошибки:
Цитата:

pass2:(_DroidShipClassAdd.inc:7) Err: Error of definition of variable 'sh_Droid'.

pass2:(_DroidShipClassAdd.inc:8) Err: Error of definition of variable 'sh_DroidPrototypes'.

pass2:(_DroidShipClassAdd.inc:19) Err: Error of definition of variable 'sh_DroidPrototypes'.
pass2:(_DroidShipClassAdd.inc:19) Err: Local variable 'TSHIP.sh_DroidPrototypes' not defined.

pass2:(_DroidShipClassAdd.inc:24) Err: Error of definition of variable 'sh_DroidPrototypes'.
pass2:(_DroidShipClassAdd.inc:24) Err: Local variable 'TSHIP.sh_DroidPrototypes' not defined.

pass2:(_DroidShipClassAdd.inc:28) Err: Error of definition of variable 'sh_DroidPrototypes'.
pass2:(_DroidShipClassAdd.inc:28) Err: Local variable 'TSHIP.sh_DroidPrototypes' not defined.

pass2:(_DroidShipClassAdd.inc:37) Err: Error of definition of variable 'sh_DroidPrototypes'.
pass2:(_DroidShipClassAdd.inc:37) Err: Local variable 'TSHIP.sh_DroidPrototypes' not defined.

pass2:(_DroidShipClassAdd.inc:42) Err: Error of definition of variable 'sh_Droid'.
pass2:(_DroidShipClassAdd.inc:42) Err: Local variable 'TSHIP.sh_Droid' not defined.

pass2:(_DroidShipClassAdd.inc:48) Err: Error of definition of variable 'sh_Droid'.
pass2:(_DroidShipClassAdd.inc:48) Err: Local variable 'TSHIP.sh_Droid' not defined.


Код вполне рабочий, а природа ошибок абсолютно непонятна.

Поэксперементировав с разными классами я пришёл к выводу, что объявить новую локальную переменную можно исключительно для "одиноких бездетных" классов, например: TX_AUDIO, TINIT, TGALAXY, TSECTOR, TPLANET. Замените все TSHIP на TSECTOR и код прекрасно откомпилируется.

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

Есть конечно вариант перекомпилировать весь x3story.obj из исходников как это делает AlexYar... Мысль меня не прельщает, тестирование исключительно через начало новой игры и не совместимость со старыми сохранками, а я задумывал автоматический перевод скриптовых дроидов в обж, у тех пилотов, у которых они были. Да даже если и кто-то захочет пройти сюжет дроида заного, вряд ли прям сразу захочет бросить все свои достижения и начать новую игру... Предпочитаю сделать мод таким образом, чтоб можно было установить и загрузиться со старой сохранки и продолжить играть, но уже с добавочным сюжетом и функциями дроидов.

Что-то намудрил Чекер... Млин паскалист-дельфинист, теперь понятно откуда такая тяга к приставке "T" у классов Хы.... Без исходников там черт ногу сломит. У него и в программе все классы начинаются c "T". Пытаюсь найти момент, когда же локальная переменная добавляется в список...

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

void sub_00422C84( MyCompiler AS TCompiler, locVar AS STRING, arg3 AS BYTE, arg4 AS BYTE)

На первых порах замечаем, что существует глобальный флаг символизирующий номер прохода. Флаг является свойством объекта TCompiler.
Замечаем, что на втором проходе функция, которая должна возвращать ссылку на запись TRecVars выбранного класса возвращвет ноль в случае если используется класс "без родствеников".

TRecVars sub_0041A4D0( Symbols AS TStorySymbols, Class AS INTEGER, locVar AS STRING, fMathCaseCompare AS BYTE)

Эта функция похоже проверяет наличие определения локальной переменной не только в текущем классе, но и во всех старших родствениках.

На функцию определения наличия записи в списке грешить не приходится:

TRecVars sub_0041986С( ObjVars AS TVarsList, locVar AS STRING, fMathCaseCompare AS BYTE)

Проверил, на втором проходе список переменных для TSHIP не изменил своего размера, пошаговая трасировка показала, что новая локальная переменная после первого прохода так и не оказалась в списке переменных... Странно, ведь если переменная не может добавиться на первом проходе, то мы должны были получить генерацию ошибки 39h:

$1039 = E, "Нельзя добавить переменную '%s' в указанный класс."

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

boolean sub_41A5E0(Symbols AS TStorySymbols, Class AS INTEGER),

которая занимается проверкой запрета на добавление новой переменной к классу Class, в случае с классом TSHIP возвращает TRUE, что запрещает добавление переменной к классу и генерируется ошибка 39 на первом проходе... Разбираться, почему сообщение об ошибке не попадает в список ошибок я не стал, мне куда интересней, почему же для класса TSHIP и для всех классов, имеющих родственников нельзя добавить локальную переменную? Что же такое проверяет эта функция?

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


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


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

Хм... может всё таки причина не в родителях а именно в детях?
Так точно дети всему виной!!! Супер! Для класса TSHIP_M1, не имеющего дочерних классов определить новые локальные переменные можно! Только мне это мало поможет.

После досканальной пошаговой проверки делаю выводы:
Функция запрещает определение новой локальной переменной для класса имеющего хотя бы одного "ребёнка", у которого имеется хотя бы одна собствненная локальная переменная.

Эхххх... Может это всё таки ошибка а? Я предполагаю, что нельзя определять в родительском классе переменную с таким же именем, что в дочернем, но чтоб настолько категорично...

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

Цитата из редми к компилятору:
Цитата:
Для модификации (дополнения) существующих классов новыми переменными и/или
функциями нужно использовать директиву .CLASSDEF без параметров. Например:

.classdef TASTEROID
.vint NewVariable
.func NewFuction
.endclass TASTEROID


Нигде не говорится об ограничениях!!!

Неужели придётся, как Эгософтовцы, извращаться через псевдолокальные переменные оформленные в массиве сохраненном в глобальной переменной? ЖУТЬ!!!

Срочно нужен Чекер!!!!
Так или иначе, ему придется хотя бы разобраться, почему сообщение об ошибке 39 на первом проходе не попало в файл отчета.

Что-то мне это всё напоминает... Как только ULiX начинает вплотную использовать какой-либо инструмент, он как магнит притягивает и выявляет ошибки. Надеюсь это поможет, как отчасти это помогло в эвалюции exScE.

Хм... А вот сейчас поэксперементирую. Уберу к чертям собачьим эту проверку и разрешу добавить переменную назло Чекеру, посмотрим, что из этого выйдет.



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

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

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

Возвращаемся к нашим "баранам"...
Эксперемент удался... Новые локальные переменные для "семейных" и "многодетных" классов вполне определяются. Видимо Чекер недоделал алгоритм проверки запрета добавления локальной переменной, а тот алгоритм, что имеется сейчас себя не оправдывает. Я конечно убрал "заглушку" запрещающую определить локальную переменную в классе к примеру TSHIP, но всё же думаю не стоит эксперементировать и добавить, скажем, к классу TSHIP переменную "sh_LaunchTime" которая уже определена в дочернем классе TSHIP_MOVEABLE. Сейчас мне не до экспериментов, но думаю ни к чему хорошему они и не приведут. Без заглушки главное подходить к определению новых переменных с особой осторожностью.

А знаете ли вы что...
Класс "TObj0" внегласно существует, но мы его привыкли называть "global".

Выкладываю исправленный xa_asm.exe позволяющий добавлять локальные переменные для всех классов.
Да простит меня Чекер, но я исходников не имею, поэтому правлю, как могу, по нашему, по х......и.

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

Заодно выяснил почему я не смог использовать TObj2246 как родительский класс, его внутренее имя было создано согласно установке в xa_asm.ini "TypeName = HEX" в TObj8C6. Логично, что объекты разные Хы....
Иправлеям на TypeName = DEC и всё нормально компилируется.

Атач удален, т.к. размещен без разрешения владельца ПО
_________________
Новое ещё не значит лучшее

Последний раз редактировалось: Tension MAN (14:18 12-08-2008), всего редактировалось 2 раз(а)
    Добавлено: 05:28 11-08-2008   
AlexYar
 1615 EGP


Рейтинг канала: 6(409)
Репутация: 346
Сообщения: 25234

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


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

Если прочесть внимательно все темы по компиляции - можно сделать вывод, что несовместимость с сохранениями будет в любом случае! Хоть компилируй целиком, хоть накатывай патч. Ну если конечно ты не 1 байт правишь в обже Улыбка

Так что полная компиляция - единственный 100% рабочий метод. К тому же он гораздо удобнее патчинга (если временно отбросить обновление версий), так как позволяет сразу задать нужные стартовые условия и данные для тестирования, компиляция кода занимает 1 секунду, старт игры значительно сокращается, если поотключать на старте всю лабуду стандартной игры, оставив только рабочую часть тестируемого кода.


ULiX :
Заодно выяснил почему я не смог использовать TObj2246 как родительский класс, его внутренее имя было создано согласно установке в xa_asm.ini "TypeName = HEX" в TObj8C6. Логично, что объекты разные .
Иправлеям на TypeName = DEC и всё нормально компилируется.


И рекомендую не изобретать уже 5 раз изобретенный велосипед, а внимательно усвоить все материалы по ХС и xa_asm-у. Ты повторяешь все ошибки ,которые по сто раз уже разобраны в этих темах, и о которых всем давно известно Подмигиваю


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

Последний раз редактировалось: AlexYar (12:01 11-08-2008), всего редактировалось 2 раз(а)
    Добавлено: 11:27 11-08-2008   
Shaddie
 550 EGP


Рейтинг канала: 4(60)
Репутация: 118
Сообщения: 259
Откуда: Томск
Зарегистрирован: 09.09.2004
ULiX :
Может поэтому вообще решено заблокировать добавление новых локальных переменных в классы с родствениками?

Обращение к локальным переменным в обже происходит по порядковому номеру этой переменной с учетом всех переменных классов-владельцев. То есть если в классе-владельце 10 переменных, то обращение к первой переменной объявленной в нижестоящем по иерархии классе будет происходить по номеру 11. Теперь если добавить в первый класс переменную (к ней теперь нужно будет обращаться по номеру 11) и не изменить по всему коду обращение к переменной с номера 11 на 12 (а если этих переменных в подчиненных классах больше то и для них) можем получить кучу багов.
Поэтому при неполной компиляции обжа CheckerTwo и сделал соответствующую проверку:
ULiX :
Функция запрещает определение новой локальной переменной для класса имеющего хотя бы одного "ребёнка", у которого имеется хотя бы одна собствненная локальная переменная.

_________________
Быстро едешь, тихо понесут...
    Добавлено: 00:00 12-08-2008   
ULiX
 320 EGP


Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
ULiX :
Атач удален, т.к. размещен без разрешения владельца ПО

Началось... Ой, не могу!..
Tension MAN, Это с каких пор ты стал защитником авторских прав? И это на ЕГ!!! На сайте который изначально поддерживает тех, кто ломает и "ковыряет" все игры официальных представителей, которые стремятся защитить свои права на продукты...

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

AlexYar :
Прежде чем выкладывать на сайте хакнутые версии трудов других авторов - перед этим обязательно нужно получить их разрешение.

Не "хакнутая", а поправленая. Тоже мне защитник авторских прав... уж кто-то, но не ты... Ой, не могу!..

to Shaddie
Спасибо за разъяснение... Хотя меня это больше огорчает, чем радует. Я добавить то добавил переменные, но получается так что дочерние объекты обращаясь к конкретным своим локальным переменным будут обращаться к переменным из parent класса. Хм...
---- Найти среди существующих лок переменных ненужную/неважную и присвоить ей массив своих переменных Улыбка ----

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

AlexYar :
И рекомендую не изобретать уже 5 раз изобретенный велосипед, а внимательно усвоить все материалы по ХС и xa_asm-у. Ты повторяешь все ошибки ,которые по сто раз уже разобраны в этих темах, и о которых всем давно известно

Не еродствуй. Судя по числу закачек инстументов программирования на XC и XAsm таких програмеров единицы. Если ещё учесть, что некоторые закачали эти проги так для посмтореть, то в итоге реально использующих эти инструменты меньше десятка. Тут нужно всячески поддерживать новичков, а не пинать их по каждому поводу... Хотя... это у тебя в крови и не исправимо. Что в скриптописании, что теперь в обжах... Лучше раскритикую, чтоб отбить желание на всю отставшуюся жизнь... Не педогогично это... Учитель должен привлекать ученика к предмету обучения, а не отталкивать, дескать, хреного ты всё делаешь и ничего у тебя не получится, и отвали, иди книжки читать.

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

Ну... если не использовать ожидания, то не в любом. Вот к примеру добавление нового девайса, как я это сделал при добавлении Расширенных Торговых Утилит. Обращение к новому коду происходит только при открытии меню, всё остальное время код не активен, и если весь остальной код не сместился, а это именно так и есть, если я патчу, а не перекомпилирую заново, то можно в любое время отключать и подключать этот мод без вызова проблем. Проблему совместимости мода с оригиналом можно решить если в момент сохранения не будет в активном состоянии (отрабатываться какой либо код программы) ни одна из функций добавленных патчем. И конечно же не будет существовать неразрушенных объектов созданных дерективой new.

Второй вариант выпросить Shaddie разобраться, как же именно добавляются патчи Эгософтом.
Для чего используется в KC метакоманда
#pragma path NNN

Млин. Только я решил почитать об этом и не могу попасть на страницы DEVNET вообще. РРРРРР... Разозлен
_________________
Новое ещё не значит лучшее
    Добавлено: 10:32 14-08-2008   
Tension MAN
 1220 EGP


Рейтинг канала: 4(54)
Репутация: 383
Сообщения: 8350
Откуда: Москва, корпус Д&Ф
Зарегистрирован: 30.11.2002
ULiX :
Tension MAN, Это с каких пор ты стал защитником авторских прав? И это на ЕГ!!! На сайте который изначально поддерживает тех, кто ломает и "ковыряет" все игры официальных представителей, которые стремятся защитить свои права на продукты...

меня попросили присечь сие действо и я присек, в будущем при использовании чужого контента оставляйте ссылку на копирайт владельца, без обид это всего лишь формальность Улыбка
Личные разборки в приват...
_________________
EVE-online - TensionMAN in game.

Последний раз редактировалось: Tension MAN (19:27 14-08-2008), всего редактировалось 2 раз(а)
    Добавлено: 12:34 14-08-2008   
AlexYar
 1615 EGP


Рейтинг канала: 6(409)
Репутация: 346
Сообщения: 25234

Зарегистрирован: 26.10.2003
ULiX :
И это на ЕГ!!! На сайте который изначально поддерживает тех, кто ломает и "ковыряет" все игры официальных представителей


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

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

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

ULiX :
Судя по числу закачек инстументов программирования на XC и XAsm таких програмеров единицы


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

ULiX :
Не "хакнутая", а поправленая


Напиши свой компилятор и правь сколько угодно.

ULiX :
Тоже мне защитник авторских прав... уж кто-то, но не ты...


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


Tension MAN :
Личные разборки в приват


Разборок не будет Улыбка Просто разъяснил человеку элементарные понятия, которые он не смог усвоить сам.
    Добавлено: 13:00 14-08-2008   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
ULiX :
Checker!!! Он вкернулся!!! Он снова с нами!!!

ну да, здесь я. Иногда пропадаю - коммандировки и загруз на работе...

ULiX :
Выкладываю свои мемуары сделаные за выходные.
*** Версия XA_ASM 3_28 ***
Работа над модом дроида резко затормозилась... Расстроен
Причина в невозможности откомпилировать код.


Жесть Улыбка

Ну это дело уже обсуждали. Проблема в том, что ES для классовых переменных использует недоделанную, недоведенную до ума идею.Несмотря на то, что переменные класса компилятся в отдельные таблицы для каждого класса (например, смотреть файл x3story.var - нумерация в классе идет с 0 индекса), доступ к ним (команда read <class_var> и write <class_var>) выполняется по плоской таблице. Т.е. индекс переменной вычисляется для всего дерева наследования. Т.е. иерархии переменных нет. С одной стороны это и неплохо - генерация и исполнение кода реализуется достаточно просто, с другой - мы имеем массу проблем при модификации obj-ей. Точнее сказать, основную массу проблем имеет ES, когда выпускает патчи к игре.

Цитата:
Что-то намудрил Чекер... Млин паскалист-дельфинист, теперь понятно откуда такая тяга к приставке "T" у классов Хы....

Улыбка А что, паскаль - хороший язык. Вообще, все что придумал Вирт - вполне приличные вещи. Я помню случай у нас на работе. Команда из трех программистов писала на С достаточно большой проект. Месяц парились в отладчиках сидели, ночи не спали.. а ошибки лезли и лезли. Хотя концепция была продумана и спецификации все были. В общем дело к сдаче, шеф трясет, нервотрепка. Ну я плюнул, за 4 дня переписал этот код на модулу, исправил синтаксические ошибки, в которые компилятор пальцем показал, и все. Все! Т.е. и отлаживать не пришлось. Поганяли по тестам и через неделю сдали. Все были просто счастливы Улыбка После этого я как-то к С охладел, хотя писать приходится и много - для встроенных контроллеров. Улыбка

Цитата:
$1039 = E, "Нельзя добавить переменную '%s' в указанный класс."

К стати, все что ты делал, можно было не делать, потому что в этом топике, я писал, как можно отрубить вопли ассемблера. Так чтобы он вообще игнорировал ошибку.
Код:
$1039 = I, "Нельзя добавить переменную '%s' в указанный класс."

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

добавлено спустя 30 минут:
А теперь немного о X3TC.

Игра пока еще не вышла, смотреть особо нечего. Но кое что уже можно и поковырять. Улыбка

Итак, ES переписала свой КC. Изменился ли сам язык и его синтаксис - это мы вряд ли когда узнаем. А вот результат работы компилятора можно поизучать. Собственно основные алгоритмы кодогенерации похоже не изменились. Код какой был неоптимальный, такой и остался. Далее, новый КС генерирует байтовые команды. Коды всех команд были заменены. Так что о совместимости вообще никакой речи быть не может. Что дает такое изменение? В первую очередь - уменьшение размера obj-файла. А так как размер практически не изменился - значит добавили функциональности в игру.

Внутренний формат obj-файлов изменился. Выбросили секцию CTIM. В секции SYMB и VARS остались описания только глобальных процедур и переменных. Все методы и классовые переменные теперь описываются в секции CLAS.

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

Новый код после дизассемблера будет выглядет примерно так:
Код:
00084BF3:  05 09       pushb    09
00084BF6:  16 00 22    write    class.[0022]
00084BF7:  24          pop
00084BF8:  01          push     0
00084BFB:  16 00 25    write    class.[0025]
00084BFC:  24          pop
00084BFD:  01          push     0
00084C00:  16 00 0D    write    class.[000D]
00084C01:  24          pop
00084C04:  0D 00 09    push     sp[0008]
00084C07:  0E 00 07    read     global.[0007]
00084C08:  10          get_from_array


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

Всеж непонятно, для чего все это делалось?

Hvala Mne :
Показал сегодня тему Бернду Лехану, директору ES.
Он сказал, что моддинг дело хорошее, и что если народ добьется каких-то положительных результатов, их можно будет даже опубликовать на сайте ES.
Также если найдутся какие-то еще косяки в компиляторе KC, было бы неплохо об этом информировать ES.


Возможно, что Бернд Лехан оценил большой вклад российских моддеров в дело поисков косяков в компиляторе? Хы...

Идея для ES: Подмигиваю
Мне почему-то думалось, что ES попытается реализовать упрощенный байт-код, который можно было бы транслировать в исполняемый код машины при загрузке (JIT-технологии). Причем эти самые технологии были придуманы 15 лет назад, обкатаны и уже повсеместно используются. Не обязательно использовать dotNet. Можно и свою реализацию. Для такой тормозной игры как Х, это было бы просто замечательным решением - именно для таких задачь, как игрушка, когда единожды загруженная программа крутится очень долго, эта технология была очень даже к месту.

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

PS: Получается, что тот задел, который был у моддеров перечеркнули... Расстроен
Если Darth Revan не появится, то ХС для Х3ТС не будет.

Последний раз редактировалось: CheckerTwo (20:03 19-10-2008), всего редактировалось 3 раз(а)
    Добавлено: 19:09 19-10-2008   
AlexYar
 1615 EGP


Рейтинг канала: 6(409)
Репутация: 346
Сообщения: 25234

Зарегистрирован: 26.10.2003
CheckerTwo :
PS: Получается, что тот задел, который был у моддеров перечеркнули...


Слишком поздно они это сделали Улыбка В х3тс ничего особоважного нет, а тех наработок, что есть для х3тт моддерам хватит ещё на довольно долгое время. Просто егософт делает всё возможное для уменьшения продаж своего продукта и убивания серии, так как подрезать возможности моддерам и кодерам = убивать собственную игру же, которая этим модам обязана свему существованию на компах юзверей Улыбка
    Добавлено: 22:43 19-10-2008   
Darth Revan
 345 EGP


Рейтинг канала: 5(150)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
CheckerTwo :
Самое печальное - уничтожены все имена переменных и классов. В таблицах переменных поля-ссылки на имены остались, но забиты какой-то фигней. Это означает, что разбираться и модифицировать будет крайне сложно.


Угу, всё равно что экзэшник дизассемблить Гы-гы Игры у меня ещё нет, обж бы посмотреть... Но с xc транслятором врядли следует ожидать проблем. xa2c - смотреть надо. Если оптизатора в KC всё ещё нет, то всё может получиться. Вопрос то ведь не в этом. Толку от трансляторов почти ноль: нет имён переменных - сложно будет даже в скрипт-редактор команды добавить. Можно конечно сравнивать с X3R обжем и пытаться идентифицировать имена, но если честно, надежды что-то маловато. По крайней мере я с этим не справлюсь. Да и в любом случае, удастся лишь в частных случаях, а для серьёзной работы нужно видеть всю картину.

Да, я как понял, и имена exe-функций не остались (которые callasm)? Если так, то это вообще уже всё Задница

Кстати, а возможность вызова функции по ссылке не появилась? Т.е. чтобы адрес можно было сделать переменной, а не константой. Очень полезная вещь, с её помощью вроде можно совместимость с сейвами сделать.

Add: вроде всё не так плохо, как я боялся.

Последний раз редактировалось: Darth Revan (15:58 09-01-2009), всего редактировалось 1 раз
    Добавлено: 18:24 07-01-2009   
AlexYar
 1615 EGP


Рейтинг канала: 6(409)
Репутация: 346
Сообщения: 25234

Зарегистрирован: 26.10.2003
Darth Revan :
Если так, то это вообще уже всё


А если прочесть тему багов в х3тс - создаётся впечатление, что в новом КС косяков на порядок больше, чем в старом...

2Darth Revan: Ты в каких дальних странах-то обитал всё это время? Хы...
    Добавлено: 13:25 08-01-2009   
Darth Revan
 345 EGP


Рейтинг канала: 5(150)
Репутация: 42
Сообщения: 349
Откуда: Belarus Prime
Зарегистрирован: 01.02.2006
В Неизведанных Регионах Совсем запутался... Вот вроде вернулся, а то меня последние два года постоянно чёго-то выбрасывало в окна Улыбка постоянно куда-то пропадал. Решил завязать с этим безобразием.

Транслятор выправил, ошибка оказалась в неправильно выставленном приоритете команды put_to_array и отсутствию проверки на установку скобок для неё же (в смысле именно тех внешних, охватывающих весь оператор). Т.е. ошибка была при выводе результата, где я проверял приоритеты операторов чтобы скобок лишних не ставить. Для остальных вариантов присваивания всё было OK, а здесь чего-то пропустил Расстроен И будь я нормальным, я бы давно увидел баг-репорт и исправил. Рыдания. Потестирую малёк и выложу.
    Добавлено: 18:17 08-01-2009   
AlexYar
 1615 EGP


Рейтинг канала: 6(409)
Репутация: 346
Сообщения: 25234

Зарегистрирован: 26.10.2003
Ошибка в файле xa_asm.ini в секции [Class_X2]

2201 = "MENU_BACKGRAUND"

2CheckerTwo: поправь у себя в следующих версиях, ок? Улыбка

Последний раз редактировалось: AlexYar (11:36 09-02-2009), всего редактировалось 3 раз(а)
    Добавлено: 11:35 09-02-2009   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
AlexYar :
Ошибка в файле xa_asm.ini в секции [Class_X2]

Спасибо. Щас поправлю.
    Добавлено: 23:00 09-02-2009   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
По настоятельной просьбе djkram добавил в ассемблер возможность патча секции STRG. Улыбка

Ассемблер искать в первом посте.

Сразу обращаю внимание, что эта возможность ассемблера - палка о 2х концах. С одной стороны - удобно поправить строку маленьким патчем без перекомпиляции всего obj-а. Например нужно, чтобы при выводе какой-либо строки вместо маленьких букв выводились заглавные.
Для примера:
Код:

           .title     test
           .ident     X3
           .radix     16d
           .loadobj   "x3story.obj"
           .section   strg, abs

; была такая строка
; [right][select value = 'Station%d']$PICK$[/select][/right]\n
; слово Station заменим

$ = 0000B0DBh
S0000B0DB: .ascii "[right][select value = 'STATION%d']$PICK$[/select][/right]\n"
           .end


С другой стороны, можно налететь на трудноуловимые ошибки.
Поэтому, добавлены следующие ограничения:
1. адрес начала строки, задаваемый в примере командой $=0000B0DBh, должен точно соответствовать началу строки в obj-файле. Адреса всех строк можно посмотреть в файлике с расширением .str
2. длина строки в патче должна быть не больше, чем в obj-файле. Если строка короче - дополняется нулевыми байтами.

-- добавлено --

Чуть не забыл. Добавлен ключ StrCrypt в INI файле.
Позволяет принудительное установить режим криптовки секции строк.
Если StrCrypt = true, то ассемблер криптует секцию строк. Если false - то не криптует. Если что-то другое, кроме true/false, или вообще отсутствует в INI файле - то криптовка секции будет выполнятся в большинстве случаев, кроме режима ПАТЧА обжа с секцией STRU вместо STRG.
В одной из версий Х3 ES раздала obj с расшифрованной секцией строк (STRU), так что это нормально.

Последний раз редактировалось: CheckerTwo (01:08 16-01-2011), всего редактировалось 2 раз(а)
    Добавлено: 23:01 15-01-2011   
CheckerTwo
 550 EGP


Рейтинг канала: 4(96)
Репутация: 103
Сообщения: 412
Откуда: Tomsk
Зарегистрирован: 18.08.2004
Исправления, небольшая оптимизация и доработка.

По просьбе djkram сделал возможным инициализацию глобальных и классовых переменных.
Код:
Код:

   .title tst_var
   .ident X3
   .radix 10d
   .loadobj "tst_var1.cod"
   
   .section code, abs
   
.vint   TGlobal_3 = 101d

.classdef X_AUDIO
.vint   au_ErrorCount = 103d
.vint   au_IdleFaceState = 203d
.endclass X_AUDIO

   .end


Секция CODE должна быть с атрибутом ABS. Числовой идентификатор класса задавать не нужно. Он сам вытаскивается из обжа. Имена класса и переменной должны строго соответствовать тем, что нашел дизассемблер. Важно также, что бы у дизассемблера и ассемблера были одинаковые форматы вывода, например DEC - десятичный.

Ассемблер, дизассемблер в первом посте.
    Добавлено: 16:41 12-03-2011   
KWON
 331 EGP


Рейтинг канала: 4(73)
Репутация: -10
Сообщения: 142
Откуда: Україна. Чигирин.
Зарегистрирован: 24.11.2014
Подниму достаточно важную тему и заодно выложу
ини-файлы для "DOBJ" и "XA_ASM"
с заполненными пустыми строками классов ХТ, Х2, Х3.
Сделано благодаря изыскам пилота Chem:
http://www.elite-games.ru/conference/viewtopic.php?p=1830876#1830876

ini.rar
 Описание:
Полностью заполнены все классы
 Имя файла:  ini.rar
 Размер файла:  13.44 KB
 Скачано:  62 раз(а)

_________________
Следи за собой, будь осторожен.
В. Цой.
    Добавлено: 14:00 27-12-2017   
Канал X2: The Threat: «X2-ASM - это проcто!»
На страницу: Пред.  1, 2, 3 ... 10, 11, 12    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Ты попробуй покомандовать людьми. Либо получится, либо они тебя сами вылечат. (Химик о мании величия)

  » X2-ASM - это проcто! | страница 12
Каналы: Новости | 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