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

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

   Страница 5 из 7
На страницу: Пред.  1, 2, 3, 4, 5, 6, 7  След. | Все страницы
Поиск в этой теме:
Канал X3: Reunion » Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы»
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
AlexYar :
затем сделать саму команду в интерфейсе редактора.
Вот с этого места можно поподробней? Как эту функцию добавить в команды скриптредактора?
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 17:25 06-10-2011   
AlexYar
 1616 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25247

Зарегистрирован: 26.10.2003
Xenon J :
Как эту функцию добавить в команды скриптредактора?


Заказать её в теме Ext-патча и надеяться, что новая версия выйдет в обозримом будущем Улыбка

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

Последний раз редактировалось: AlexYar (01:18 09-10-2011), всего редактировалось 1 раз
    Добавлено: 01:18 09-10-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
AlexYar :
Заказать её в теме Ext-патча и надеяться, что новая версия выйдет в обозримом будущем
Я уже заказал и надеюсь. Уже полгода как. Гы-гы (Многие её годами ждут. Я вот даже жениться успел, а она так и не вышла. (Цитата не в тему)).

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

Вот, например, команда Set name to:


Код:
   case 930:
     {
     var loc20=loc16[1];
     var loc21=loc16[2];
     if(loc20&131072)
      {
      if(loc20==131074)
       {
       loc20=loc7[loc21];
       loc21=loc6[loc21];
       }
      else
       {
       if(loc21==1)
        {
        loc20=loc1;
        loc21=loc2;
        }
       else
        {
        loc21=TSCRIPT.ScriptGetConst(loc1,loc2,loc21);
        loc20=global.ga_ScriptTmpRetType;
        }
       }
      }
     var loc22=loc16[3];
     var loc23=loc16[4];
     if(loc22&131072)
      {
      if(loc22==131074)
       {
       loc22=loc7[loc23];
       loc23=loc6[loc23];
       }
      else
       {
       if(loc23==1)
        {
        loc22=loc1;
        loc23=loc2;
        }
       else
        {
        loc23=TSCRIPT.ScriptGetConst(loc1,loc2,loc23);
        loc22=global.ga_ScriptTmpRetType;
        }
       }
      }
     if(0)
      {
      (loc20==65542||loc20==65543)&&(loc21==this||SE_ObjectExists(
         loc21));
      TSCRIPT_EDITOR.ScriptInvalidArgs(arg2,loc15,loc10);
      }
     if(loc22==5)
      {
      loc21->SetYourName(loc23);
      }
     else
      {
      loc21->SetYourName(0);
      }
     break;
     }

Требуется на её основе создать команду Set sector ID to, вызывающую самодельную функцию с одним аргументом.
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 10:22 09-10-2011   
AlexYar
 1616 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25247

Зарегистрирован: 26.10.2003
Xenon J :
на её основе создать команду Set sector ID to


На основе можно, но не нужно.
Основная сложность не в том, чтобы вызов команды в __runscript() прописать, а в том, чтобы прописать новую команду в интерфейс редактора, плюс научить скриптовой движок видеть и понимать эту команду в теле скриптов.

Когда есть шаблоны нужных функций, с отформатированным текстом определённым образом - добавить новые команды занимает примерно пол часа - час (с проверкой, компиляцией обжа и тестами).
А когда их нет - там чёрт ногу сломает в дебрях цифирек, запятых и скобок Улыбка Главное там не запутаться и ошибок не наделать, иначе таких багов оберёшься, что век не разберёшься.
Объяснять, что и где какая скобка с запятой где что определеяет, и как и почему задаются типы аргументов - очень долго и муторно Совсем запутался...

Xenon J :
Многие её годами ждут


Как-то невнятно ждут Хы... Мне в личку всего двое отписались по поводу патча, а так у меня сложилось впечатление, что он уже никому не нужен, поэтому последняя версия была заморожена почти готовой (процентов на 90) Улыбка
    Добавлено: 20:04 09-10-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
AlexYar :
На основе можно, но не нужно.
Основная сложность не в том, чтобы вызов команды в __runscript() прописать, а в том, чтобы прописать новую команду в интерфейс редактора, плюс научить скриптовой движок видеть и понимать эту команду в теле скриптов.
Так расскажи хоть, какие функции за это отвечают.
AlexYar :
Как-то невнятно ждут Мне в личку всего двое отписались по поводу патча,
И я был одним из них. Улыбка
AlexYar :
а так у меня сложилось впечатление, что он уже никому не нужен, поэтому последняя версия была заморожена почти готовой (процентов на 90)
Поэтому мне хотелось бы сделать всё самому, а не ждать, пока кто-то решит, что его патч всем нужен. Улыбка
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 10:23 10-10-2011   
Dimmell
 88 EGP

Рейтинг канала: 4(77)
Репутация: 10
Сообщения: 772
Откуда: Минск
Зарегистрирован: 31.01.2010
AlexYar :
Как-то невнятно ждут Мне в личку всего двое отписались по поводу патча, а так у меня сложилось впечатление, что он уже никому не нужен, поэтому последняя версия была заморожена почти готовой (процентов на 90)

Размораживать пора - не все любят беспокоить уважаемого и занятого человека в личку. Улыбка
    Добавлено: 13:03 10-10-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
Как сделать так, чтобы функция запускалась только один раз при старте новой игры?
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 18:25 28-10-2011   
AlexYar
 1616 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25247

Зарегистрирован: 26.10.2003
Xenon J :
Как сделать так, чтобы функция запускалась только один раз при старте новой игры?


1. Заменить блок памяти на последнюю ксенонскую модель.
2. Посмотреть на предыдущую страницу этой темы.
    Добавлено: 18:08 31-10-2011   
AlexYar
 1616 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25247

Зарегистрирован: 26.10.2003
Xenon J :
Так расскажи хоть, какие функции за это отвечают.


TSCRIPT.__runScript()
TSCRIPT_EDITOR.InitDatabase()
Новые t-ID в файле *0001 (именно в основном описателе, в других работать не будет).

Вроде всё.
    Добавлено: 14:09 01-11-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
Вот ещё, проблемка. Имеется корабль под названием Пиратский корабль. В Х3, как известно, названия кораблей на карте состоят из расы и названия, поэтому в данном случае получается Пиратский Пиратский корабль в случае с пиратами, что не есть гут. Как это исправить и конкретно для этого корабля расу не указывать? Чтобы был просто - Пиратский корабль вне зависимости от владельца? Там с полдесятка функций для имени корабля. Совсем запутался...
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 13:14 07-11-2011   
Ander_Donetsk
 92 EGP

Рейтинг канала: 5(122)
Репутация: 25
Сообщения: 242
Откуда: Украина, г. Донецк
Зарегистрирован: 14.10.2007
"под названием Пиратский корабль" переименовать в текстовике этот шип в Корсар, к примеру - и весь сказ..
_________________
http://devmods.ru/
    Добавлено: 16:36 07-11-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
Ander_Donetsk :
"под названием Пиратский корабль" переименовать в текстовике этот шип в Корсар, к примеру - и весь сказ..
Ага, только голосовое описание всё равно останется и будет говориться каждый раз при захвате цели.
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 17:32 07-11-2011   
AlexYar
 1616 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25247

Зарегистрирован: 26.10.2003
Xenon J :
только голосовое описание всё равно останется и будет говориться каждый раз при захвате цели.


Ни разу не слышал в игре "пиратский пиратский корабль", вроде игра сама отрезает для пиратшипа название расы.
    Добавлено: 18:52 07-11-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
AlexYar :
Ни разу не слышал в игре "пиратский пиратский корабль", вроде игра сама отрезает для пиратшипа название расы.
Увы, не отрезает:

 Cкрытый текст   (кликните здесь для просмотра)


Как сам понимаешь, произносится всё точно так же, как и написано. Улыбка
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 12:36 08-11-2011   
AlexYar
 1616 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25247

Зарегистрирован: 26.10.2003
Xenon J :
Увы, не отрезает:


Для всех пир.кораблей или только для жопсовых?
Проверь на обычных и жопсовых.

Затем копни:

TSHIP.GetNameArray()
и
TSHIP.GetFormattedName()
    Добавлено: 15:19 08-11-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
AlexYar :
Для всех пир.кораблей или только для жопсовых?
Проверь на обычных и жопсовых.
На скрине обычные корабли, у меня нет жопсовых (НЛО разве что Хы... ).
AlexYar :
Затем копни:

TSHIP.GetNameArray()
Это пробовал. Добавлял доп. фильтр по типу корабля вроде такого:

Код:
 var loc4=this->GetOwner()->GetID(); //оригинальная строка

 if(TSHIP.sh_SubType==51)
 {
  loc4=0;
 }


Или такого (TSHIP.GetFormattedName()):

Код:
 var loc8=this->GetOwner()!=0?this->GetOwner()->GetID():0; //оригинальная строка

 if(TSHIP.sh_SubType==51)
 {
  loc8=0;
 }


Чую, что пропустил какую-то элементарщину типа запятой, но сообразить не могу. Ой, не могу!..
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 16:44 08-11-2011   
Dimmell
 88 EGP

Рейтинг канала: 4(77)
Репутация: 10
Сообщения: 772
Откуда: Минск
Зарегистрирован: 31.01.2010
Xenon J :
Имеется корабль под названием Пиратский корабль. В Х3, как известно, названия кораблей на карте состоят из расы и названия, поэтому в данном случае получается Пиратский Пиратский корабль в случае с пиратами, что не есть гут.

А "Пиратский корабль" в просто "корабль" переименовать нельзя?
На карте будет Пир.корабль Улыбка
    Добавлено: 21:24 08-11-2011   
Xenon J
 814 EGP


Модератор
Рейтинг канала: 11(1671)
Репутация: 192
Сообщения: 3031
Откуда: Ксенонский сектор 472
Зарегистрирован: 30.03.2007
Dimmell :
А "Пиратский корабль" в просто "корабль" переименовать нельзя?
Я же говорил, голосовое сопровождение останется прежним.
_________________
Последний раз редактировалось: Xenon J (21:12 20-12-2017), всего редактировалось 16 раз
    Добавлено: 12:21 09-11-2011   
AlexYar
 1616 EGP


Рейтинг канала: 13(2093)
Репутация: 346
Сообщения: 25247

Зарегистрирован: 26.10.2003
Xenon J :
голосовое сопровождение останется прежним.


Его тоже можно изменить в файле разметки озвучки. Просто старт фразы сдвинь на попозже (и длину на столько же укороти).

Последний раз редактировалось: AlexYar (15:15 09-11-2011), всего редактировалось 1 раз
    Добавлено: 15:14 09-11-2011   
мимолётчик
 50 EGP

Рейтинг канала: 1(3)
Репутация: 2
Сообщения: 4

Зарегистрирован: 27.06.2014
Моё исследование xstory.obj:

 Катапультирование NPC из повреждённого корабля   (кликните здесь для просмотра)

 Вычисление вероятности захвата   (кликните здесь для просмотра)
Как только игрок делает хоть одно попадание по вражескому кораблю - сам или турелью корабля, просили её это делать или нет - расчитывается шанс захватить корабль, который затем меняется только по истечении интервала времени (интервалы расписаны в гайде ULiX). Манера стрельбы, скорость снятия щита, непрерывность или отрывистость роли не играют, судя по коду, что подтверждается практикой: если выставить сильно отрицательную мораль или отключить рандом, то каким образом ни стреляй, сдача гарантирована. Хотя по игровому опыту кажется, что эффективнее быстро снять щит одной очередью, что никак не отражено в коде (скорее всего, это чудеса разброса рандома, который тут дважды решает исход дела). Кроме поправки для ID (обрабатывается в 4% случаев), логика выглядит так:
Код:
макс_щит = макс_щит / 100; // 1% от полных щитов

if (макс_щит > 1000)
    макс_щит = 1000;  // 1%, но не более 1000 единиц

if (щит <= макс_щит && корпус > 0
   && корпус <= (макс_корпус * random(8)) / 8)  // корпус <= 0/8..7/8 (87.5% максимум)
{
    if (игровое_время > начало_следующего_периода_захвата_этого_корабля)
    {
        шанс_захвата = 30 - мораль_пилота;  // мораль 1..29

        if (сила_атакующего < сила_этого_корабля)
            шанс_захвата -= 5;
    }
   
    if (корпус != 0)  // нелепая "защита" от деления на нуль, см. выше + мозг
    {
        бонус_корпуса = макс_корпус / (корпус * 4); // 1..(макс_корпус / 4)
   
        if (бонус_корпуса > 10)
            бонус_корпуса = 10; // +10% шанса захвата при 2% корпуса - хлам

        шанс_захвата += бонус_корпуса;
    }
   
    if (владелец == хааки)
    {
        шанс_захвата = (шанс_захвата * (боевой_рейтинг_числом - 5)) / 25;
       
        if (шанс_захвата < 0)
            шанс_захвата = 0; // мизерный шанс появляется с 6 рейтинга, и равен обычному на 30м
    }

    if (random(100) < шанс_захвата)
        // выпрыгивать
}

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

 Выпрыгивание молча и немедленно + сброс цели   (кликните здесь для просмотра)
Код:
                                 |      TSHIP.AttackedBy:
000CA6BC: 0006 0023              |    7            read       TSHIP.sh_Owner ; [35d ; 23h]
000CA6C0: 0010                   |    8            push       7
000CA6C2: 0004 0019              |    9            readvar    global.ga_Races ; [25d ; 19h]
000CA6C6: 0008                   |   10            get_from_array
000CA6C8: 004E                   |    9            if SP[0]=SP[1] then push 0 else push 1
000CA6CA: 0033 00065372          |    8            if SP[0]=0 then jump L000CA6EC
000CA6D0: 0006 0023              |    7            read       TSHIP.sh_Owner ; [35d ; 23h]
000CA6D4: 000F                   |    8            push       6
000CA6D6: 0004 0019              |    9            readvar    global.ga_Races ; [25d ; 19h]
000CA6DA: 0008                   |   10            get_from_array
000CA6DC: 004E                   |    9            if SP[0]=SP[1] then push 0 else push 1
000CA6DE: 0033 00065372          |    8            if SP[0]=0 then jump L000CA6EC

--> 000CA6BC: 0009 0033 0006 53A4       push 0, if SP[0]=0 then jump L000CA750

Обычно если непись - не ксенон или хаак, запускается телеобращение за номером 28. Можно вместо первых же инструкций проверки просто прыгнуть дальше, как в вышеописанном фиксе, а можно сделать что-нибудь полезное - далее остаётся немало теперь уже неиспользуемых инструкций. Как лучше дать игроку понять, что корабль сдался? В пылу боя, когда снаряды повсюду, активное маневрирование и стрельба, множество звуков, мало что привлечёт внимание. Звуки утонут или собьют с толку, журнал некогда читать. Есть вариант перестать целиться в сдавшийся корабль: игрок может не заметить посинения рамки, но её полного исчезновения вместе с прицелом (и корректировкой огня) он ни за что не пропустит!
Код:
000CA6BC: 0009                   |    7            push       0
          000A                   |    8            push       1
          0001 084E              |    9            push       2126d ; 084Eh
          0059 00084CE4 00006DD4 |    10           call59     TMONITORCONTROL.SetActiveMonitorTracking ;
          002C                   |    8            pop
          0009                   |    7            push       0
          0033 000653A4          |    8            if SP[0]=0 then jump L000CA750

Можно изменить общий шанс катапультирования, и/или сделать возможной 100% сдачу определённого корабля.
Повышение общей вероятности может быстро надоесть - пираты и ксены и так нередко сдаются, а посинение каждого второго даст уйму ненужных кораблей, которые хаак поначалу не может продать. Кроме того, за уничтожение брошенного корабля не повышается расовый рейтинг, даже если миллисекунду назад корабль пилотировался ксеноном. На пиратах и ксенонских М6-звеньях, залетающих в расовые секторы, вполне можно повысить рейтинг с -5 до нулевого за несколько вечеров.
Гарантированная сдача (с нулевой вероятностью случайной сдачи) лично мне удобнее. Корабль сканируется, и если очень хочется то, что он везёт, ну и его самого в придачу, запускаю самописный скрипт (кнопкой), меняющий мораль пилота в корабле-цели на -200, сбиваю щит и он сразу и всегда выпрыгивает. То же, что может произойти без шаманства, только без миллиона перезагрузок и одинаковых попыток победить рандом.

 Повышение общей вероятноcти   (кликните здесь для просмотра)
Код:
                                 |      TSHIP.AttackedBy:
000CA69C: 0001 0064              |    7 L000CA69C: push       100d ; 64h
000CA6A0: 000A                   |    8            push       1
000CA6A2: 005A 00000158          |    9            callasm    SE_Random ; 00000158

--> 000CA69C: 0001 0032      push 50

В коде выше 100 меняется на 50, повышая вероятность в несколько раз (разы отличаются в зависимости от морали, но, короче, во много - у ULiX'a в доке неверная оценка). Может быть любым положительным числом, наверное. Если изменить на 1, все будут сдаваться (кто может сдаться), хотя поправка 5 при более слабом корабле у игрока может изредка помешать захватить особо вредных индивидуумов.

 100% вероятность для определённого корабля   (кликните здесь для просмотра)

Функция изменения морали (доступная из скриптов) проверяет диапазон 1..30. Для выставления отрицательной морали можно положить на стек не аргумент нового значения, а 1, и установка нижнего порогового значения никогда не будет выполняться:
Код:
                                 |      TSHIP.SetPilotMorale
000B6792: 0005 0004              |    0 L000B6792: push       SP[3] ; arg1
000B6796: 0009                   |    1            push       0
000B6798: 004A                   |    2            if SP[0]<=SP[1] then push 0 else push 1
000B679A: 0033 0005B3D0          |    1            if SP[0]=0 then jump L000B67A8
000B67A0: 000A                   |    0            push       1
000B67A2: 002A 0005              |    1            mov        SP[4],SP[0] ; arg1
000B67A6: 002C                   |    1            pop

--> 000B6792: 0001 0001      push 1

Отключение случайной сдачи:
Код:
                                 |      TSHIP.AttackedBy:
000CA5AA: 0027                   |    6            push       30d ; 1Eh
000CA5AC: 0009                   |    7            push       0
000CA5AE: 003C                   |    8            get_object
000CA5B0: 0057 00006209          |    9            call       GetPilotMorale ; 00006209
000CA5B6: 003F                   |    8            sub        SP[0],SP[1]

--> 000CA5AA: 0009        push 0

Вычитание морали пилота из нуля будет всегда отрицательным (если мораль не изменена игроком на отрицательную), а random(100) выдаёт 0..99 включительно, поэтому ни один пилот больше не сдастся случайно.

 Катапультирование при целом корпусе   (кликните здесь для просмотра)
Для отключения проверки на произвольный процент корпуса ULiX в своём патче предлагает в "корпус <= (макс_корпус * random(8)) / 8" поменять вторую 8 на 1, тогда в 7 из 8 случаев проверка будет проходить, а в восьмом - нет. Надёжднее поступить более радикальным образом и вообще не выполнять этот код с рандомом, сразу прыгнув туда, куда перейдёт управление, если условие в итоге выполнится.
Код:
                                 |      TSHIP.AttackedBy:
000CA4DE: 0005 0002              |    6            push       SP[1] ; loc5
000CA4E2: 0005 0002              |    7            push       SP[1] ; loc6
000CA4E6: 0011                   |    8            push       8
000CA4E8: 000A                   |    9            push       1
000CA4EA: 005A 00000158          |   10            callasm    SE_Random ; 00000158
000CA4F0: 0040                   |    9            mul        SP[0],SP[1]
000CA4F2: 0011                   |    8            push       8
000CA4F4: 0041                   |    9            div        SP[0],SP[1]
000CA4F6: 004C                   |    8            if SP[0]<SP[1] then push 0 else push 1
000CA4F8: 0033 0006527F          |    7            if SP[0]=0 then jump L000CA506
000CA4FE: 000A                   |    6            push       1
000CA500: 0031 00065280          |    7            jump       L000CA508

--> 000CA4DE: 000A 0031 0006 5280        push 1, jump to L000CA508

 Сохранение всего оснащения   (кликните здесь для просмотра)
Код:
                                 |      TSHIP.DowngradeTakeOver:
000D4122: 0055 0009              |    0            setmem     9
000D4126: 0001 03E8              |    0            push       1000d ; 03E8h
000D412A: 000A                   |    1            push       1
000D412C: 005A 000000EB          |    2            callasm    TI_Delay ; 000000EB

--> 000D4122: 0055 0001 0009 0035      setmem 1, push 0, ret

Представьте себе: всё то время, пока NPC вам объясняет, почему решил покинуть корабль, он уничтожает оружие, щиты и оборудование, чтобы не досталось врагу (вам). Отучить его от этого поможет немедленный возврат нуля из функции "даунгрейда", и корабли будут оставаться для вас со всей начинкой. А, например, у пиратов чего только ни бывает: стыковочный компьютер (очень часто), сканер груза и сканер астероидов, транспортёр, прыжковый двигатель, триплексный сканер, расширенная торговая система, жизнеобеспечение трюма... - это не говоря об оружии (BPSG, CIG), щитах, ракетах и контрабанде. Всё это почти всегда и полностью уничтожается в данной функции (90% для каждого предмета). Фикс полезен всем и незаменим для хаака.

 Захват больших кораблей   (кликните здесь для просмотра)
Код:
                                 |      TSHIP_BIG.Create:
000D7376: 000A                   |    0            push       1
000D7378: 000A                   |    1            push       1
000D737A: 003C                   |    2            get_object
000D737C: 0057 000072B4          |    3            call       TSHIP.DisableCapture ; 000072B4

--> 000D7376: 0009

Там до этого проверка, что биг шип не принадлежит расе игрока. Интересно, непонятно.
Также см. "Посадка/взлёт для Xenon J" ниже.

 Сдача хааков без зависимости от боевого рейтинга   (кликните здесь для просмотра)
Код:
                                 |      TSHIP.AttackedBy:
000CA63E: 0006 0023              |    7            read       TSHIP.sh_Owner ; [35d ; 23h]
000CA642: 0010                   |    8            push       7
000CA644: 0004 0019              |    9            readvar    global.ga_Races ; [25d ; 19h]
000CA648: 0008                   |   10            get_from_array
000CA64A: 004F                   |    9            if SP[0]<>SP[1] then push 0 else push 1
000CA64C: 0033 0006534A          |    8            if SP[0]=0 then jump L000CA69C

--> 000CA642: 0028      push 31

Чтобы хааки катапультировались с тем же шансом, как и все остальные, а не с уменьшенным по разнице боевого рейтинга с максимальным, достаточно сменить код расы в проверке с хаакского (7) на любой неиспользуемый, например 31.


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

Для начала стоит открыть последний языковой файл описания, первый. Для английской версии это 440001.xml. Там - рейтинги и описания квестов. Я скопировал игровые рейтинги (военные, торговые и расовые) в 440003.xml (пользовательский, всегда подгружаемый с сейвом) и дописал ко всем рейтингам числовые значения, -5 там или +24.

В телах квестов есть $ПЕРЕМЕННЫЕ$ и их не только можно (как кое-где сделано), но и нужно раскрасить, чтобы с одного взгляда вычитывать из текста новости главное - что, куда, на чём, почём и для кого. Покрасил их все так:
Код:
[red]красный[/red] [b]жёлтый[/b] [green]зелёный[/green] [blue]синий[/blue] \033Cсине-зелёный\033X \033Mпурпурный\033X

Деньги - зелёным, время - синим, требуемые рейтинги и количество товара - красным, станцию и сектор назначения - сине-зелёным (циан), расы заказчика и цели - пурпурным, остальное важное - жёлтым. Стало возможно читать быстро и без боли в глазах.

В описании квестов содержатся не все переменные, которые подаются в обработчик текста. TradeRank и FightRank есть везде, кое-где они "скрыты" типа описаний перевозки прячущегося от ксенонов пассажира, заказных убийств, такси или тура всей жизни. Их стоит добавить в начало текста и покрасить, будут в числовом виде (что не напрягает, если к рейтингам дописать числовые значения и помнить, +сколько ваши боевое и торговое звания).

Далее - шаманство в обже и что там можно сделать, чтобы игрок меньше страдал:

 Ускорение появления новых сообщений   (кликните здесь для просмотра)
Код:
                                 |      TQUESTMASTER.GetStationBBSOffers:
001A9626: 0009                   |    8            push       0
001A9628: 0004 001A              |    9            readvar    global.ga_Player ; [26d ; 1Ah]
001A962C: 0057 0000067F          |   10            call       TPLAYER.GetAge ; 0000067F
001A9632: 0027                   |    9            push       30d ; 1Eh
001A9634: 000A                   |   10            push       1
001A9636: 005A 00000158          |   11            callasm    SE_Random ; 00000158
001A963C: 003E                   |   10            add        SP[0],SP[1]
001A963E: 0018                   |    9            push       15d ; 0Fh
001A9640: 003E                   |   10            add        SP[0],SP[1]
001A9642: 002B 000B              |    9            write      TQUESTMASTER.qm_NextBBSUpdate ; [11d ; 0Bh]

--> 001A9632: 0013      push 10
--> 001A963E: 000E      push 5

Первое - рандом(макс_секунд), второе - что к нему добавляется. Изначально новые BBS появляются через (0..29 + 15) секунд, в предложенном варианте - (0..9 + 5).

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

 Заказные убийства   (кликните здесь для просмотра)
Эта миссия отправляет в текстовый парсер переменную FightRank, которой нет в телах сообщений, и игроку остаётся гадать по вознаграждению и/или проверять методом тыка, достаточный ли у него боевой ранг. Можно добавить и покрасить эту переменную (в языковом xml-файле), и вы будете видеть числовое значение требуемого боевого ранга.
Миссия имеет малый шанс появиться (35%) и только в единственном экземпляре. Также, кроме произвольных рас, требуемый ранг выбирается в широчайшем диапазоне: 2/3 что ранг от нулевого до вашего, и по оставшейся трети неравномерно размазана произвольная поправка -2..+7 к вашему рангу. Вознаграждение нелинейно увеличивается, начинаясь с 17К, 370К на 18 ранге, 900К на 20, 1.3М на 21 и далее по гиперболе. Бонус расового рейтинга (начисляемый одинаково и расе заказчика, и цели) прямо зависит от вознаграждения, и смысла брать дешёвые варианты (менее ста тысяч cr) вообще нет.
Итого, шанс появиться миссии с нужным заказчиком против нужной расы с требуемым рангом, равным вашему или чуть меньше, просто ничтожен, а значит, многие десятки перезагрузок автосейва. Но это исправимо.
Код:
                                 |      TQUEST216_BBS_ASSASINATION_P1316.EvaluatePriority:
001D0D04: 000A                   |    0            push       1
001D0D06: 0005 0006              |    1            push       SP[5] ; arg2
001D0D0A: 003F                   |    2            sub        SP[0],SP[1]
001D0D0C: 002B 000B              |    1            write      TQUESTMASTER_QUESTS_BASIC.qu_MaxOffers ; [11d ; 0Bh]

001D0D4C: 0006 0015              |    0 L001D0D4C: read       TQUEST216_BBS_ASSASINATION_P1316.QS_PRIORITY ; [21d ; 15h]
001D0D50: 0035                   |    1            ret

--> 001D0D04: 0013             push 10
--> 001D0D4C: 0001 0064        push 100

Максимум предложений меняется с 1 на 10, а шанс - вместо чтения переменной на 100.

Миссия при обработке вероятности появления, предложения и хода выполнения использует счётчик внутреннего состояния, и работает с ним с прицелом на уникальность миссии, поэтому для множественного появления в объявлениях и корректного запуска (и последующей работы) нужно поменять логику работы с состоянием в нескольких местах. 0 - не обработана, 1 - добавлена, 2 и 3 - варианты отказа, 4 - запущена и далее ход выполнения. Суть изменений - нулевой шанс появления или обработки после запуска одного из предложений (состояние 4 и выше).

 Обработка состояния для множественных предложений   (кликните здесь для просмотра)
Код:
                                 |      TQUEST216_BBS_ASSASINATION_P1316.EvaluatePriority:
001D0D12: 0009                   |    0            push       0
001D0D14: 0001 1078              |    1            push       4216d ; 1078h
001D0D18: 0059 000E8600 000101F4 |    2            call59     TQUEST216_BBS_ASSASINATION_P1316.GetInternalQuestState ;
001D0D22: 0009                   |    1            push       0
001D0D24: 004E                   |    2            if SP[0]=SP[1] then push 0 else push 1
001D0D26: 0033 000E8694          |    1            if SP[0]=0 then jump L001D0D30
001D0D2C: 0009                   |    0            push       0
001D0D2E: 0035                   |    1            ret

--> 001D0D22: 000D 004D        push 4, if SP[0] >  SP[1] then push 0 else push 1

Код:
                                 |      TQUEST216_BBS_ASSASINATION_P1316.Evaluate:
001D4F3C: 0009                   |    2            push       0
001D4F3E: 0001 1078              |    3            push       4216d ; 1078h
001D4F42: 0059 000E8600 000101F4 |    4            call59     TQUEST216_BBS_ASSASINATION_P1316.GetInternalQuestState ;
001D4F4C: 0009                   |    3            push       0
001D4F4E: 004E                   |    4            if SP[0]=SP[1] then push 0 else push 1
001D4F50: 0033 000EA7AD          |    3            if SP[0]=0 then jump L001D4F62

001D5546: 0009                   |    5            push       0
001D5548: 0001 1078              |    6            push       4216d ; 1078h
001D554C: 0059 000E8600 000101F4 |    7            call59     TQUEST216_BBS_ASSASINATION_P1316.GetInternalQuestState ;
001D5556: 0009                   |    6            push       0
001D5558: 004F                   |    7            if SP[0]<>SP[1] then push 0 else push 1
001D555A: 0033 000EAAC7          |    6            if SP[0]=0 then jump L001D5596

--> 001D4F4C: 000D 004D         push 4,  if SP[0]>SP[1] then push 0 else push 1
--> 001D5556: 0028 004E         push 31, if SP[0]=SP[1] then push 0 else push 1

Последний фикс - отключение в общем-то ненужной проверки состояния (31 не может быть, поэтому Evaluate корректно завершится и вернёт 1 - успешная инициализация).

По вкусу можно отключить проверку минимального расового рейтинга - если вам тоже кажется, что раз объявление на заказное убийство можно встретить на пиратских базах, то вряд ли оно расчитано исключительно на законопослушных граждан. Впрочем, это заметно упростит игру, тк рейтинга 19 достичь можно быстро, а всего две миссии с вознаграждением 500-700К (или одна за 900К) моментально реанимируют расовый рейтинг с -5 до нулевого. По-моему, интереснее искать и ждать ксенонское вторжение, но вот вариант фикса, если что:

 Отключение проверки минимального расового рейтинга   (кликните здесь для просмотра)
Код:
                                 |      TQUEST216_BBS_ASSASINATION_P1316.Select:
001D5766: 0009                   |    3            push       0
001D5768: 0001 0834              |    4            push       2100d ; 0834h
001D576C: 0059 00077C1E 000004F6 |    5            call59     TCLIENT.GetPlayer ;
001D5776: 000A                   |    4            push       1
001D5778: 0006 0024              |    5            read       TQUEST216_BBS_ASSASINATION_P1316.qu_VictimRaceID ; [36d ; 24h]
001D577C: 0004 0019              |    6            readvar    global.ga_Races ; [25d ; 19h]
001D5780: 0008                   |    7            get_from_array
001D5782: 0057 0000084C          |    6            call       GetNotoriety ; 0000084C
001D5788: 002B 002D              |    4            write      TQUEST216_BBS_ASSASINATION_P1316.qu_StartNoto ; [45d ; 2Dh]
001D578C: 002C                   |    4            pop
001D578E: 0009                   |    3            push       0
001D5790: 0001 0834              |    4            push       2100d ; 0834h
001D5794: 0059 00077C1E 000004F6 |    5            call59     TCLIENT.GetPlayer ;
001D579E: 000A                   |    4            push       1
001D57A0: 0006 0025              |    5            read       TQUEST216_BBS_ASSASINATION_P1316.qu_AuthorRaceID ; [37d ; 25h]
001D57A4: 0004 0019              |    6            readvar    global.ga_Races ; [25d ; 19h]
001D57A8: 0008                   |    7            get_from_array
001D57AA: 0057 0000084C          |    6            call       GetNotoriety ; 0000084C
001D57B0: 0013                   |    4            push       10d ; 0Ah
001D57B2: 004A                   |    5            if SP[0]<=SP[1] then push 0 else push 1
001D57B4: 0033 000EABED          |    4            if SP[0]=0 then jump L001D57E2

--> 001D5768: 0033 000E ABED        if SP[0]=0 then jump L001D57E2

Сразу делается переход за обработку недостаточного рейтинга, как в случае успешной проверки.

 Изменение разброса требуемого боевого ранга   (кликните здесь для просмотра)
Требуемый ранг вычисляется так:
Если рандом(1000) меньше 676, то берётся произвольный ранг от нуля до ранга пилота. Далее берётся рандом(93):
0..29 текущий ранг пилота без изменений
30..49 -1
50..54 рандом(2) +2 или +3
55..79 +1
80..89 +4
90..93 рандом(3) +5, +6 или аж +7.

Разброс, как из старого дедушкиного ружья, при том, что большинство получаемых вариантов игрок или не может использовать, или они ему не нужны ввиду бессмысленной дешевизны. Это при том, что миссия редкая и расы произвольные.
Первый рандом (произвольного ранга) отключается перепрыгиванием сразу за проверку сравнения его результата с 676. Второй можно тоже выключить, всегда получая задания для нынешнего боевого рейтинга пилота, но получится однообразно. Предлагаемый вариант использует первые три прыжка в свиче: рандом(55), 0..29 +0, 30..49 -1, 50..54 -2 или +1, чтобы изредка можно было посмотреть, сколько денег отсыпят на следующем боевом рейтинге, и замотивироваться повысить его.
Код:
                                 |      TQUEST216_BBS_ASSASINATION_P1316.GetNeededRank:
001D49BC: 0055 0006              |    0            setmem     6
001D49C0: 0001 005D              |    0            push       93d ; 5Dh
001D49C4: 000A                   |    1            push       1
001D49C6: 005A 00000158          |    2            callasm    SE_Random ; 00000158
001D49CC: 0009                   |    1            push       0
001D49CE: 0009                   |    2            push       0
001D49D0: 0001 03E8              |    3            push       1000d ; 03E8h
001D49D4: 000A                   |    4            push       1
001D49D6: 005A 00000158          |    5            callasm    SE_Random ; 00000158
001D49DC: 0001 02A4              |    4            push       676d ; 02A4h
001D49E0: 004A                   |    5            if SP[0]<=SP[1] then push 0 else push 1
001D49E2: 0033 000EA4FC          |    4            if SP[0]=0 then jump L001D4A00

001D4A04: 0026                   |    4            push       29d ; 1Dh
001D4A1C: 0026                   |    4            push       29d ; 1Dh
001D4A2A: 0001 0032              |    4            push       50d ; 32h
001D4A58: 0001 0031              |    4            push       49d ; 31h
001D4A68: 0001 0037              |    4            push       55d ; 37h

001D4A98: 000C                   |    4            push       3
001D4A9A: 003E                   |    5            add        SP[0],SP[1]

001D4AAC: 000B                   |    4            push       2
001D4AAE: 003E                   |    5            add        SP[0],SP[1]

--> 001D49D0: 0009 0033 000E A4FC    push 0, if SP[0]=0 then jump L001D4A00
--> 001D49C0: 0001 0037              push 55
--> 001D4A98: 000A                   push 1
--> 001D4AAC: 000A 003F              push 1, sub


 Попутчик   (кликните здесь для просмотра)
Тот самый квест подбросить пассажира за 1000..5000 Cr по 500Cr за каждый следующий сектор. Едва ли полезен, разве что в самом начале на XTreme, хотя и там проще продать щит и пушки и получить начальный капитал для перевозки спиртного, после чего игнорировать этот квест (через 10 минут от начала игры). Можно брать несколько раз, может появляться многократно везде, кроме ксенонских и хаакских станций (расы 6 и 7). Менять стоит разве что вероятность появления на доске:
Код:
                                 |      TQUEST190_HITCHHIKER_P1290.EvaluatePriority:
001C2296: 001D                   |    1            push       20d ; 14h
001C2298: 002A 0002              |    2            mov        SP[1],SP[0] ; loc1
001C229C: 002E 0001              |    2            popx       1
001C22A0: 0035                   |    1            ret

--> 001C2296: 0001 0064 002A 0002 002C      push 100, mov SP[1]<-SP[0], pop

Ещё можно сделать его повеселее, увеличив максимальную дистанцию с 8 до, например, 18 секторов (награда 1К..10К):
Код:
                                 |      TQUEST190_HITCHHIKER_P1290.Evaluate:
001C2302: 000E                   |    8            push       5
001C2304: 000A                   |    9            push       1
001C2306: 005A 00000158          |   10            callasm    SE_Random ; 00000158

001C231C: 000E                   |    8            push       5
001C231E: 000A                   |    9            push       1
001C2320: 005A 00000158          |   10            callasm    SE_Random ; 00000158

001C2492: 0005 0002              |    7            push       SP[1] ; loc6
001C2496: 0011                   |    8            push       8
001C2498: 004B                   |    9            if SP[0]>=SP[1] then push 0 else push 1

--> 001C2302: 0018      push 15
--> 001C231C: 0018      push 15
--> 001C2496: 001B      push 18

 Основной торговый квест (generic trading 1)   (кликните здесь для просмотра)
Хорошо написанный квест, генерирующий разнообразные задания отвезти некий товар куда-нибудь на каком-либо типе корабля. Или этот квест писал не тот же индус, чьего пера весь остальной код обжа, или у этого индуса на этом квесте наступило кратковременное озарение (в результате получения давно напрашивающегося подзатыльника от лида).
Квест может появляться неоднократно и быть многократно взят. Подкрутить стоит разве что частоту появления, потому что он достоин появляться почаще, ну и по вкусу - немного доработать напильником разброс требуемого торгового рейтинга.

 100% вероятность везде   (кликните здесь для просмотра)
EvaluatePriority делает разнообразные проверки, не нужные, если хочется видеть эту миссию везде (а она этого достойна, поскольку весьма разнообразна), поэтому проще переписать её с самого начала.
Код:
                                 |      TQUEST193_GENERIC_TRADING_1_P1293.EvaluatePriority:
001C5D02: 0055 0002              |    0            setmem     2
001C5D06: 0009                   |    0            push       0

--> 001C5D06: 000E 002B 000B 002C 0001 0064 0035
push 5, write TQUESTMASTER_QUESTS_BASIC.qu_MaxOffers (11d ; 0Bh), pop, push 100, ret

 Меньший разброс требуемого торгового рейтинга   (кликните здесь для просмотра)
Требуемый рейтинг считается с помощью рандом(100) и массива 5,25,55,80,90,95,97,98,99,100 так: от числового значения торгового рейтинга пилота отнимается 2, а дальше прибавляется по 1 за каждый элемент массива, больше которого произвольное число.
0..4 -2
5..24 -1
25..54 +0
55..79 +1 и т.д.
Легко подкрутить расчёт под вариант, близкий к уменьшенному разбросу в миссии на убийство - сменой рандома со 100 на 60: небольшие равные шансы на -2 и +1, основной +0 и чуть меньший -1.
Код:
                                 |      TQUEST193_GENERIC_TRADING_1_P1293.RankRequirement:
001C5B0E: 0001 0064              |    3            push       100d ; 64h
001C5B12: 000A                   |    4            push       1
001C5B14: 005A 00000158          |    5            callasm    SE_Random ; 00000158

--> 001C5B0E: 0001 003C         push 60

 Локальный торговый квест (generic trading b)   (кликните здесь для просмотра)
Если на станции осталось меньше четверти запаса одного из основных ресурсов, может появиться этот квест (37%). А может и не появиться. Что означает перезагрузки автосейва, а потом ещё и ещё, ибо сгенерированное предложение не подошло по рейтингу или содержало мизерное количество товара, делая её бессмысленной вплане денег, рейтинга и продажи остатка из трюма (цена сбита). Эти недоразумения исправимы:

 100% шанс появления   (кликните здесь для просмотра)
Код:
                                 |      TQUEST263_GENERIC_TRADING_B_P1363.EvaluatePriority:
001C9D2A: 0001 0025              |    0 L001C9D2A: push       37d ; 25h
001C9D2E: 0035                   |    1            ret

--> 001C9D2A: 0001 0064     push 100

Квест может появиться на станции в единственном экземпляре, но больше-то и не надо.

 Изменение разброса требуемого торгового рейтинга   (кликните здесь для просмотра)
Код:
                                 |      TQUEST263_GENERIC_TRADING_B_P1363.RankRequirement:
001C9A34: 0001 0064              |    3            push       100d ; 64h
001C9A38: 000A                   |    4            push       1
001C9A3A: 005A 00000158          |    5            callasm    SE_Random ; 00000158

--> 001C9A34: 0001 003C         push 60

Код копипасталогичен оному из основного торгового квеста, таблетка та же, результат тот же: наибольший шанс +0 к торговому рангу пилота, чуть меньший шанс -1 и небольшие шансы -2 и +1.

 Всегда максимальное требуемое количество товара   (кликните здесь для просмотра)
Код:
                                 |      TQUEST263_GENERIC_TRADING_B_P1363.GetAmountOfWares:
001C83B4: 0005 0006              |   12 L001C83B4: push       SP[5] ; loc7
001C83B8: 0005 0008              |   13            push       SP[7] ; loc6
001C83BC: 004B                   |   14            if SP[0]>=SP[1] then push 0 else push 1
001C83BE: 0033 000E41E3          |   13            if SP[0]=0 then jump L001C83CE
001C83C4: 0005 0007              |   12            push       SP[6] ; loc6
001C83C8: 002A 0007              |   13            mov        SP[6],SP[0] ; loc7

--> 001C83B8: 0001 0000         push 0

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

Стоит добавить, что взятая миссия проверяется при стыковке, позволяя сперва продать станции требуемого ресурса до предела, отстыковаться (раздобыть ещё, если не хватит для миссии), пристыковаться и выполнить миссию на всю стоимость + бонус. Лучше всего работает со здоровенным боронским TS и TL неподалёку, набитым товарами (а если разрешена посадка TS - ещё и полным ангаром таких же здоровенных TS, набитых товарами).

 Тур (tourbus)   (кликните здесь для просмотра)
Миссия для TS - покатать туристов по галактике с фиксированной оплатой за каждый посещённый впервые за этот тур сектор. Может появиться на торговых станциях (33%). Для зачёта сектора достаточно просто появиться в нём (и сразу можно прыгнуть обратно). Ограничение по времени произвольно 20..40 минут. При использовании джампдрайва хоть раз за весь тур (даже после истечения времени) от оплаты остаётся 10%. Завалить миссию можно, покинув корабль или продав пассажиров в рабство на пиратской базе.

Бонусы начисляются за пиратский сектор (+50%), космомух (+70% раз за сектор), ксенонский сектор (+150%) и хаакский сектор (+200%). Насчёт последнего непонятно, в чём смысл бонуса, если посещение в оригинальной игре требует использования джампдрайва, что оставляет десятую часть награды и делает бессмысленным не только посещение хааков, но и весь тур.

Бонусы НЕ даются за: посещение неизвестных секторов, пролёт рядом с разрушенными вратами, обломками Xenon M0, НЛО или ксенскими/хакскими станциями - что, по-моему, явная недоработка, ибо в описании сказано, что будут бонусы за всё необычное. Стоило бы дописать (аналогично реализации бонуса за космомух), но это добавит переменные классу этого квеста, увеличит тела функций GetValueForRank, Vbi и Check и в итоге обяжет сдвинуть адреса всех указателей далее по коду, увеличив размер обжа (для игрока всё это, видимо, означает несовместимость сохранений и других модов, что-либо дописывающих в обж). Пока непонятно, стоит ли оно того.

Эта миссия передаёт в обработчик текста переменную TradeRank, которой нет в текстовом описании - её можно добавить и покрасить, чтобы видеть номер требуемого торгового ранга.

 100% вероятность появления   (кликните здесь для просмотра)
Код:
                                 |      TQUEST214_BBS_TOURBUS_P1314.EvaluatePriority:
001CE868: 0006 0017              |    1            read       TQUEST214_BBS_TOURBUS_P1314.iMaxQuests ; [23d ; 17h]
001CE86C: 0005 0007              |    2            push       SP[6] ; arg2
001CE870: 003F                   |    3            sub        SP[0],SP[1]
001CE872: 002B 000B              |    2            write      TQUESTMASTER_QUESTS_BASIC.qu_MaxOffers ; [11d ; 0Bh]
001CE876: 002C                   |    2            pop
001CE878: 0006 0018              |    1            read       TQUEST214_BBS_TOURBUS_P1314.iQuestPriority ; [24d ; 18h]
001CE87C: 002A 0002              |    2            mov        SP[1],SP[0] ; loc1
001CE880: 002E 0001              |    2            popx       1
001CE884: 0035                   |    1            ret

--> 001CE868: 0001 0005         push 5
--> 001CE878: 0001 0064         push 100

 Меньший разброс требуемого торгового рейтинга   (кликните здесь для просмотра)
[code | TQUEST214_BBS_TOURBUS_P1314.Evaluate:
001CE8B6: 0001 0064 | 1 push 100d ; 64h
001CE8BA: 000A | 2 push 1
001CE8BC: 005A 00000158 | 3 callasm SE_Random ; 00000158

--> 001CE8B6: 0001 003C push 60[/code]
Аналогично торговым квестам, требуемый торговый ранг может иметь произвольную поправку -2..+7 к рангу пилота. Предлагаемый фикс аналогичен.

 Отключение штрафа за использование прыжкового двигателя   (кликните здесь для просмотра)
Код:
                                 |      TQUEST214_BBS_TOURBUS_P1314.Check:
001CFE18: 0001 13B0              |    2            push       5040d ; 13B0h
001CFE1C: 000A                   |    3            push       1
001CFE1E: 0009                   |    4            push       0
001CFE20: 0001 0834              |    5            push       2100d ; 0834h
001CFE24: 0059 00077C1E 000004F6 |    6            call59     TCLIENT.GetPlayer ;
001CFE2E: 0057 000100EB          |    5            call       TPLAYER.GetStatCounter ; 000100EB
001CFE34: 0006 0033              |    3            read       TQUEST214_BBS_TOURBUS_P1314.iTmpInt ; [51d ; 33h]
001CFE38: 004B                   |    4            if SP[0]>=SP[1] then push 0 else push 1
001CFE3A: 0033 000E7F26          |    3            if SP[0]=0 then jump L001CFE54

--> 001CFE18: 0009 0033 000E 7F26       push 0, if SP[0]=0 then jump L001CFE54

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

 Перевозка пассажира, преследуемого ксенонами (Pirate transport)   (кликните здесь для просмотра)
Почему "пиратский" и "транспорт" - непонятно, тк миссия требует боевого рейтинга и зубастого корабля, а к какой-либо пиратской деятельности не обязывает. Изредка появляется почти везде (10%), если в данном секторе есть другая станция, у расы-владельца которой игрок имеет неотрицательный рейтинг. Туда и просят довезти некое тело в сохранности и секретности (см. p.s.). Все генерируемые ксеноны могут сдаться, включая Xenon K, и решительно настроены напасть именно на игрока. За эпичную PvE баталию в стиле "завали толпу", размах которой может превышать большинство вариантов ксенонского вторжения, игрок вознаграждается нулевым (0.000) расовым рейтингом, мизерной оплатой 400..13К и краткой смс-кой в холодных тонах. Всё это делает созданных ксенонов гораздо более ценными во всех отношениях, чем перевозимый сноб-нищеброд, которого сразу после взлёта можно просто выбросить за борт без сожалений и последствий.
Ещё одна миссия со скрытой переменной FightRank в предложениях. Вы знаете, что делать.

 100% вероятность появления   (кликните здесь для просмотра)
Код:
                                 |      TQUEST172_PIRATE_TRANSPORT_P1235.EvaluatePriority:
001D7794: 0055 0004              |    0            setmem     4
001D7798: 0005 0004              |    0            push       SP[3] ; arg1
001D779C: 000A                   |    1            push       1
001D779E: 0058 0000648F 00002B87 |    2            call58     global.GetObjectSector ; 0000648F, 00002B87

--> 001D7798: 0013 002B 000B 002C 0001 0064 0035        push 10, write TQUESTMASTER_QUESTS_BASIC.qu_MaxOffers, pop, push 100, ret

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

 Меньший разброс требуемого боевого рейтинга   (кликните здесь для просмотра)
Код:
                                 |      TQUEST172_PIRATE_TRANSPORT_P1235.GetNeededRank:
001D6FEC: 0001 0064              |    3            push       100d ; 64h
001D6FF0: 000A                   |    4            push       1
001D6FF2: 005A 00000158          |    5            callasm    SE_Random ; 00000158

--> 001D6FEC: 0001 003C         push 60

Аналогично торговым квестам.

p.s. хотя по логике, мало кто пропустит внезапное побоище целой флотилии непонятно как тут оказавшихся ксенов против одинокого спешащего корабля, от местных правоохранительных органов (помогающих по мере возможностей) до пиратов, сложивших 2 и 2 и решивших просканировать ваш трюм. Если бы что-то из этого было, с последствиями, действительно можно было бы назвать миссию "пиратской". Минимальным вариантом было бы сделать добавляемого пассажира нелегальным товаром, как в основной торговой миссии с наркотой, pirate sidearms и прочим не совсем легальным добром.

Захватываемый (как все мелкие не-хааки) Ксенон К генерируется на рейтингах 28..30 включительно в 8% случаев. М5-М3+ (М6 не бывает) создаётся от одного до полсотни, в зависимости от боевого ранга. 8% для К считается при создании каждого корабля, то есть на XTreme (8% * 50) вас может поджидать дюжина эсминцев. Эксперимента ради можно принудительно генерировать максимально возможную бригаду:

 Всегда максимум ксенонов   (кликните здесь для просмотра)
Код:
                                 |      TQUEST172_PIRATE_TRANSPORT_P1235.CreateEnemyShip:
001D70EE: 0001 0064              |    2            push       100d ; 64h
001D70F2: 000A                   |    3            push       1
001D70F4: 005A 00000158          |    4            callasm    SE_Random ; 00000158

001D70FA: 0005 0007              |    3            push       SP[6] ; arg1
001D70FE: 0025                   |    4            push       28d ; 1Ch
001D7100: 004D                   |    5            if SP[0]>SP[1] then push 0 else push 1

--> 001D70FA: 0001 001E         push 30
--> 001D70EE: 0001 00??

Первая правка симулирует максимальный боевой рейтинг (30), ниже 28 секция с генерацией К работать не будет.
Вторая - предел рандома, с результатом которого сравнивается 8 для К. При 50 шанс удвоится (push 50 - 0001 0032), а при 8 (0001 0008) вас встретят одни только К. Удачи.

 Такси М5   (кликните здесь для просмотра)
Убойная миссия по сверхскоростной, иногда требующей превысить все игровые возможности, доставке пассажира от станции к станции с возвращением в итоге туда, где брался квест. Учитывая быстрое повышение "сложности" квеста и соответствено уменьшающегося времени доставки, мало кому удастся добраться обратно, на определённом этапе получив скромную просьбу клиента доставить его через несколько секторов за одну минуту, при том, что часть этой минуты будет потрачена на открытие сообщения, чтение данной просьбы и выход из шокового состояния с попыткой отстыковаться и начать куда-то лететь. Спасти может или джампдрайв (на аргонском Discoverer Raider), или припаркованная рядом TL с ним же, или перезагрузка автосейва, после которой следующее место назначения и предельное время сгенерируются заново.

Но вообще, миссия так и задумана, смысла что-либо менять в логике особо и нет.

Оплата за каждую доставку = базовая оплата + бонус * процент затраченного времени (от максимального для этой доставки). Чем быстрее довезёте, тем выше оплата.
При определении каждого следующего пункта назначения проверятся "шанс отправиться домой" (5%), если он выпал, клиент просит довезти обратно, где брался квест, и на этом квест завершится. Когда клиент попросится обратно и случится ли это вообще - одному рандому известно.

 100% вероятность появления   (кликните здесь для просмотра)
Код:
                                 |      TQUEST217_BBS_TAXI_P1317.EvaluatePriority:
001D901C: 0006 0016              |    0            read       TQUEST217_BBS_TAXI_P1317.iMissionPriority ; [22d ; 16h]
001D9020: 0035                   |    1            ret

--> 001D901C: 0001 0064         push 100

 Меньший разброс требуемого торгового ранга   (кликните здесь для просмотра)
Код:
                                 |      TQUEST217_BBS_TAXI_P1317.Evaluate:
001D9062: 0001 0064              |    1            push       100d ; 64h
001D9066: 000A                   |    2            push       1
001D9068: 005A 00000158          |    3            callasm    SE_Random ; 00000158

--> 001D9062: 0001 0046     push 70

 Старый картограф (Treasure Hunt)   (кликните здесь для просмотра)
Если игроку повезёт (8%) или он компенсирует везение парой-тройкой десятков перезагрузок, то обнаружит на торговой станции объявление от старого картографа о сокровище в глубинах космоса. Если вы видите это объявление, значит, координаты сокровища уже расчитаны, сохраните игру.

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

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

Миссия очень, очень рандомная. Примерная стоимость того, что вы найдёте, расчитывается (когда просите "рассказать ещё") так:
3..19: ранг * 5500 + (рандом(ранг) + 3) * 35000
20+: 850000 + торговый_рейтинг / 2 * (рандом(ранг - 18) + 5)
торговый_рейтинг - точное значение (50К при ранге +20 0%, 500К при +25 0%, 10М при +30 0%).

Сгенерированная ценность важна до 19 ранга, если нужны деньги, а после принципиально определяет, что ещё сможете найти, поэтому и ремендуется в любом случае сделать два сохранения, если собираетесь пободаться с рандомом. Чаще всего находятся ящики с деньгами: по максимальному количеству денег за несколько попыток можно понять, какую ценность сгенерировал квест, и если маловато, загрузить первый сейв и сделать второй заново.

Самое ценное в этом квесте - не деньги, а редкие корабли (15%). До 24 торгового ранга, вне зависимости от ценности, вы можете найти произвольно от М5 до М3. А вот начиная с Capitalist +24 стоимость сильно влияет на класс находимого корабля.

 Информация о кораблях, ценности находки и торговом рейтинге   (кликните здесь для просмотра)
<2М: M5-M3
2M+: M3, TS или TP (максимум для Capitalist +24 0%)
5М+: M6 (максимум для Magnate +26 8%)
14М: TL (максимум для Tycoon +28 43%)
15M: шанс найти корабль увеличивается с 15% до 23,5% (максимум для Tycoon +28 52%)
65M: М2 - 16.037.500 очков торговли, сильно выше XTreme (10M). На таком рейтинге любые М2 уже покупаются по несколько штук на сдачу от очередного мега-комплекса, погруженного в дюжину собственных TL.

Максимум - это если рандом в расчёте ценности вернёт максимальное значение, для увеличения шанса нужен ранг выше. Иметь процент до следующего ранга выше указанного смысла не имеет, тк рандом(ранг-18) фактически всё решает.

Поотключать рандомы (сохранив ценность находки в зависимости от торгового рейтинга) можно следующими фиксами:

 100% шанс появления   (кликните здесь для просмотра)
Код:
                                 |      TQUEST316_BBS_QUEST_TREASURE_HUNT_P304316.EvaluatePriority:
001FF262: 0006 0023              |    0 L001FF262: read       TQUEST316_BBS_QUEST_TREASURE_HUNT_P304316.qq_Priority ; [35d ; 23h]
001FF266: 0035                   |    1            ret

--> 001FF262: 0001 0064         push 100

 Всегда максимальная стоимость находки   (кликните здесь для просмотра)
Код:
                                |      TQUEST316_BBS_QUEST_TREASURE_HUNT_P304316.GetChestWorth:
001FF9AA: 0005 0006              |    2            push       SP[5] ; arg1
001FF9AE: 000A                   |    3            push       1
001FF9B0: 005A 00000158          |    4            callasm    SE_Random ; 00000158

001FF9E0: 0005 0006              |    2            push       SP[5] ; arg1
001FF9E4: 001B                   |    3            push       18d ; 12h
001FF9E6: 003F                   |    4            sub        SP[0],SP[1]
001FF9E8: 000A                   |    3            push       1
001FF9EA: 005A 00000158          |    4            callasm    SE_Random ; 00000158

--> 001FF9AE: 000A 003F 0009 002C       push 1, sub, push 0, pop
--> 001FF9E8: 000A 003F 0009 002C       push 1, sub, push 0, pop

При замещении рандома предельным для него значением из него надо вычесть единицу, тк (насколько я понял) рандом возвращает значение от нуля до переданного предельного значения, включая ноль но не включая предельное, то есть рандом(100) -> 0..99 <- сто штук.

 Находить только корабли   (кликните здесь для просмотра)
Код:
                                 |      TQUEST316_BBS_QUEST_TREASURE_HUNT_P304316.Accept:
001FF7F2: 0001 0064              |    0            push       100d ; 64h
001FF7F6: 000A                   |    1            push       1
001FF7F8: 005A 00000158          |    2            callasm    SE_Random ; 00000158
001FF7FE: 0005 0001              |    1            push       SP[0] ; loc1
001FF802: 0001 0055              |    2            push       85d ; 55h
001FF806: 004D                   |    3            if SP[0]>SP[1] then push 0 else push 1

--> 001FF802: 0001 0000        push 0

 Пожертвование (Donation)   (кликните здесь для просмотра)
Даёте денег, получаете расовую репутацию:
10.000 - 2
50.000 - 12..15
500.000 - 150..190
5.000.000 - 1800..2100
Заказчик всегда той же расы, которой принадлежит сектор. Давать денег бесполезно, если у данной расы рейтинг ниже 0. Кроме этого, видимо, рейтинг начисляется по-разному в зависимости от рейтинга перед начислением, но как именно, пока не нашёл.

Есть вариант изменить эту миссию, сделав расу заказчика произвольной (из тех же) и отключив проверку неотрицательного рейтинга. Это позволит поднять репутацию у гонеров из глубоких минусов, тк каких-либо игровых средств это сделать в оригинальной X3R я не нашёл. Ксены или хаки Элизиумом Света не интересуются, сколько я играл. Появляющиеся там иногда пиратские М5 недостаточны. Если спасти гонерского рейнджера от пиратского звена, ксенонского патруля и хаакского кластера одновременно, тот не скажет даже "спасибы". Может, и есть какой-нибудь приемлемый способ наладить с ними отношения, но и допиливание пожертвований - тоже уместный вариант, по-моему. Чтобы религиозным фанатикам не были нужны деньги - не слышал о таком. Да и всем остальным. Proffittsss.
Для успокоения совести можно уменьшать бонус при негативном рейтинге.

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

 Доработка напильником   (кликните здесь для просмотра)
Код:
                                 |      TQUEST317_BBS_QUEST_DONATION_P3043317.EvaluatePriority:
00201338: 0055 0005              |    0            setmem     5
0020133C: 000F                   |    0            push       6
0020133E: 000A                   |    1            push       1
00201340: 005A 00000158          |    2            callasm    SE_Random
00201346: 0007                   |    1            push       SP[0]
00201348: 0033 001009A7          |    2            if SP[0]=0 then jump L00201356
0020134E: 0012                   |    1            push       9
00201350: 002A 0002              |    2            mov        SP[1],SP[0]                           
00201354: 002С                   |    2            pop

00201356: 002B 0018              |    1 L00201356: write      TQUEST317_BBS_QUEST_DONATION_P3043317.qq_OfferRaceID
0020135A: 0007                   |    1            push       SP[0]
0020135C: 0004 0019              |    2            readvar    global.ga_Races
00201360: 0008                   |    3            get_from_array
00201362: 002B 0017              |    2            write      TQUEST317_BBS_QUEST_DONATION_P3043317.qq_OfferRace
00201366: 002E 0002              |    2            popx       2
0020136A: 000E                   |    0            push       5
0020136C: 002B 000B              |    1            write      TQUESTMASTER_QUESTS_BASIC.qu_MaxOffers
00201370: 002C                   |    1            pop
00201372: 0001 0020              |    0            push       32
00201376: 0035                   |    1            ret

Эта функция переписана, вероятность добавления в объявления выставлена 32% (в предпоследней строке), ибо везде и при каждом обновлении она вряд ли нужна (можно указать любую вероятность по вкусу).

Код:
                                 |      TQUEST317_BBS_QUEST_DONATION_P3043317.Evaluate:
00201470: 0055 0003              |    0            setmem     3
00201474: 000A                   |    0            push       1

--> 00201474: 000A 0035       push 1, ret

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

Код:
                                 |      TQUEST317_BBS_QUEST_DONATION_P3043317.Donate:
0020168E: 0004 001A              |    1 L0020168E: readvar    global.ga_Player ; [26d ; 1Ah]
00201692: 000A                   |    2            push       1
00201694: 0006 0017              |    3            read       TQUEST317_BBS_QUEST_DONATION_P3043317.qq_OfferRace ; [23d ; 17h]
00201698: 0057 0000084C          |    4            call       GetNotoriety ; 0000084C
0020169E: 0009                   |    2            push       0
002016A0: 004A                   |    3            if SP[0]<=SP[1] then push 0 else push 1
002016A2: 0033 00100B58          |    2            if SP[0]=0 then jump L002016B8
002016A8: 0009                   |    1            push       0
002016AA: 002B 0016              |    2            write      TQUEST317_BBS_QUEST_DONATION_P3043317.qq_NotorietyInc ; [22d ; 16h]
002016AE: 002C                   |    2            pop
002016B0: 000E                   |    1            push       5
002016B2: 002A 0002              |    2            mov        SP[1],SP[0] ; loc1
002016B6: 002C                   |    2            pop
002016B8: 0005 0005              |    1 L002016B8: push       SP[4] ; arg1

--> 0020168E: 0009 0033 0010 0B58       push 0, if SP[0]=0 then jump L002016B8   // skip check ака забить

--> 002016A8: 0006 0016 000B 0041 002B 0016 002E 0001
read qq_NotorietyInc, push 2, div, write qq_NotorietyInc, popx 1

 Минирование на пиратских базах (Quest158, Blackmail)   (кликните здесь для просмотра)
Посещение пиратских баз изредка (3%) приводит к закладыванию часовой бомбы в трюм вашего корабля, и загрузка автосейва минирования не отменит, зато вы заметите, что в объявлениях 100% будет предложение по "охране", в котором некий мутный тип прозрачно намекает, что или вы платите за крышу, или никаких гарантий. Плата ерундовая, и точно разминирует корабль. Но если всё это дело совсем не по нраву, то вот рецепт:
Код:
                                 |      TQUEST158.EvaluatePriority:
002019BC: 0055 0002              |    0            setmem     2
002019C0: 0005 0005              |    0            push       SP[4] ; arg2
002019C4: 0009                   |    1            push       0
002019C6: 004E                   |    2            if SP[0]=SP[1] then push 0 else push 1
002019C8: 0033 00100CE5          |    1            if SP[0]=0 then jump L002019D2

--> 002019C0: 0009 0035         push 0, ret

Если отключаете минирование, есть смысл отключить и "охрану":
Код:
                                 |      TQUEST323_BBS_QUEST_BLACKMAIL_P301422.EvaluatePriority:
002053E6: 0055 0003              |    0            setmem     3
002053EA: 0001 081C              |    0            push       2076d ; 081Ch

--> 002053EA: 0009 0035         push 0, ret

 Пиратский сундук (pirate crate)   (кликните здесь для просмотра)
Не очень легальный квест, иногда появляющийся на пиратских базах (25%), взять который удастся только обстрелянному пилоту (Competent +6 и выше), не имеющему ни одной полицейской лицензии. Смысл заключается в полёте в некий сектор и подборе там контейнера по неким координатам. Западло - в толпе злодеев около контейнера, бросающихся на игрока как только увидят, точнее - в том, что среди них обязательно есть Yaki Raijin M4 с Mass Driver'ами, точно стреляющий сразу по корпусу. Этим гадством могут быть вооружены и другие корабли, что заставляет растягивать толпу в линию и прятаться за астероидами от Raijin M4 и Susanowa, если нужно беречь корпус, как хааку поначалу.

 100% шанс добавления   (кликните здесь для просмотра)
Код:
                                 |      TQUEST322_BBS_PIRATES_CRATE_P301422.EvaluatePriority:
0020246A: 000A                   |    0 L0020246A: push       1
0020246C: 0005 0006              |    1            push       SP[5] ; arg2
00202470: 003F                   |    2            sub        SP[0],SP[1]
00202472: 002B 000B              |    1            write      TQUESTMASTER_QUESTS_BASIC.qu_MaxOffers ; [11d ; 0Bh]
00202476: 002C                   |    1            pop
00202478: 0006 003F              |    0            read       TQUEST322_BBS_PIRATES_CRATE_P301422.qq_Priority ; [63d ; 3Fh]
0020247C: 0035                   |    1            ret

--> 0020246A: 0013 002B 000B 002C 0001 0064 0035
push 10, write TQUESTMASTER_QUESTS_BASIC.qu_MaxOffers, pop, push 100, ret

 Перестать везде хвастаться своими 5 полицейскими лицензиями   (кликните здесь для просмотра)
Код:
                            |      TQUEST322_BBS_PIRATES_CRATE_P301422.CheckPoliceLicense:
00202FE8: 0055 0005              |    0            setmem     5

--> 00202FE8: 0055 0001 0009 0035       setmem 1, push 0, ret

Если в секторе с контейнером есть хоть одна NPC-станция, у расы-владельца которой игрок имеет неотрицательную репутацию, и все негодяи перестреляны, в 25% случаев игрок получает встречное предложение от конкурента доставить груз ему за двойную плату. Если вознаграждение - 700-800К, то это отличный вариант. Если 300-400К, можно вернуться и в качестве награды получить вместо денег Software Signature Scrambler, иначе редко предлагаемый по цене около миллиона кредитов и весьма нужный всю игру.
Шанс встречного предложения расчитывается на месте, когда добит последний созданный миссией враг, поэтому можно оставить какой-нибудь М5, сохраниться где-нибудь и мучать его, пока не получите сообщение. Но можно и без мучений:

 Всегда получать встречное предложение   (кликните здесь для просмотра)
Код:
                                 |      TQUEST322_BBS_PIRATES_CRATE_P301422.MakeAlternativeOffer:
0020504A: 0001 0064              |    0            push       100d ; 64h
0020504E: 000A                   |    1            push       1
00205050: 005A 00000158          |    2            callasm    SE_Random ; 00000158

--> 0020504A: 0001 0001         push 1

Прочее перенесено в следующий пост, этот стал обрезаться при отправке.

Последний раз редактировалось: мимолётчик (17:10 01-07-2014), всего редактировалось 13 раз(а)
    Добавлено: 00:44 28-06-2014   
Канал X3: Reunion -> Модовый и скриптовый отсек X3: Reunion: «Кодинг в обже, вопросы и ответы»
На страницу: Пред.  1, 2, 3, 4, 5, 6, 7  След. | Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: И проблемы у меня решаются сами собой уже давно. Потому что если их не решать, они, видимо, обижаются и решаются сами. (Fry)

  » Кодинг в обже, вопросы и ответы | страница 5
Каналы: Новости | 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