Здравствуйте, уважаемые завсегдатаи форума! Большинство из вас, конечно же, встречало в игре ситуации, вызывающие недоумение и раздражение. Вот два примера, связанные со взятыми на абордаж кораблями:
- Если захватить TL, который перевозит станцию (см., например, тут.), то он продолжает следовать заложенной в него программе "лететь в такой-то сектор и построить там станцию". Им очень трудно управлять, потому что прежняя программа постоянно берет на себя контроль.
- В миссии на убийство можно захватить корабль, пилотируемый указанной жертвой, и миссия будет засчитана. Однако этот корабль через небольшое время будет уничтожен игрой, так что приходится его быстренько продавать.
Обе эти ситуации я считаю недоработкой: захваченный корабль должен принадлежать игроку, как любой другой, и не должен выполнять никаких прежних скриптовых команд, не должен и удаляться. Возникает вопрос: можно ли "исправить" игру самостоятельно? Покопался немного - вот что получается.
1. Захваченный TL, перевозящий станцию. Управление производится стандартным скриптом !god.tl.deliver.factory После того, как скрипт сымитировал полет к верфи и покупку станции, она появляется в грузовом отсеке, и вызывается скрипт !move.movetosector для полета к тому сектору, где должна быть построена станция. По прибытии в сектор главный скрипт снова получает управление и вызывает скрипт !move.movetoposition, чтобы подлететь к будущему месту расположения станции. Станция удаляется из трюма, скрипт дает TL команду "нет команд", ну а строится станция уже вне скрипта.
Игроки идут на большие ухищрения: либо прыгнуть на TL со станцией в свой сектор и быстренько построить ее, а потом пускай корабль летит, куда ему надо, либо пристыковать TL к своему доку оборудования, выгрузить станцию на него, а позже перегрузить ее в другой TL. Первый способ не всегда удобен, поскольку станцию лучше строить, когда удобно тебе, а не когда вынуждают. Второй способ труден в исполнении из-за "сумасшествия" автопилота TL, да и док оборудования требуется. К тому же игра может и зависнуть, как сообщали игроки.
У меня
версия игры 2.7.1. Я для себя реализовал третий способ - путем редактирования стандартного скрипта
!god.tl.deliver.factory В двух местах, а именно после вызова !move.movetosector
| Код:- 0045
skip if [SECTOR] == $target.sector - 0046
= [THIS]->call script '!move.movetosector' : targetsector=$target.sector
|
| |
и после вызова !move.movetoposition (в районе строки 0083 исходного скрипта) я вставил одинаковые блоки команд:
| Код:- $TL.race = [THIS]->get owner race
- if $TL.race == {Player}
- [THIS]->set command: {COMMAND_NONE 0}
- $TL.name = [THIS]->get name
- $TL.sector = [THIS]->get sector
- $TL.msg = sprintf: fmt='%s докладывает: прибыл в сектор %s, готов к службе.', $TL.name, $TL.sector, null, null, null
- = wait 200 ms
- send incoming message $TL.msg to player: display it=[FALSE]
- return [FALSE]
- end
|
| |
Работает это так. Игрок, как обычно, берет на абордаж TL, после чего оставляет его в покое и отправляется по своим делам. Ну, можно выделить TL сопровождение. TL летит по заданной программе в нужный сектор (поскольку !move.movetosector продолжает выполняться), а вот там останавливается и рапортует игроку "готов!". По сектору он уже не летит, станцию не "строит", она остается в трюме. Если же игрок захватил TL в секторе назначения, тот продолжает лететь к месту установки станции (под управлением скрипта !move.movetoposition), а вот там уже рапортует. Корабль со станцией в трюме теперь полностью ваш, и больше никаких глюков.
Можно еще после абордажа перебросить на TL прыжковый двигатель, навигационный программный модуль и батареи и выставить в командной консоли Автопрыжок. Лучше пусть сам по скрипту прыгнет, команду на прыжок отдавать не стоит (насчет последнего еще потестировать бы, но вот если не вмешиваться, все будет в ажуре).
Я считаю, что такой способ гораздо удобнее тех, которые вынужденно применяют игроки сейчас, чертыхаясь налево и направо. Разумеется, замена стандартного скрипта
вызывает надпись "modified" в игре.Наверняка существуют более элегантные способы, прошу опытных людей высказаться.
Могу предположить, попробовать вешать на TL при абордаже какую-то локальную переменную, которая затем бы проверялась в !move.movetosector и вызывала его останов. Хотя, конечно, "портить" такой ходовой скрипт не хотелось бы. Или вообще можно при успешном абордаже остановить все скрипты, под которыми находится корабль? Если можно, то почему разработчики так не сделали?
В общем, мой способ работает, и этим он хорош. Но можно ведь сделать лучше?
2. Миссия на убийство. Предполагаю, что проблема в 11.cat\director\0.1 Assassinate 1.pck Там есть проверки перед удалением кораблей сопровождения главной цели, не были ли они захвачены игроком. Почему-то главная цель, в отличие от сопровождения, все равно удаляется. Я пока не очень разобрался, в чем там дело. Может быть, кто-то подскажет и, таким образом, можно будет избавиться от этой досадной проблемы?
Спасибо за внимание всем, кто дочитал.
