Оглавление | Сообщение об ошибках | Ваше мнение о проекте | E-Mail автору |
ПРАКТИКУМ
v Добавление новой команды в консоль.
Как вы уже поняли ScE Х2 позволяет пользователю добавлять новые команды в командное меню объектов. Также, существует некоторый алгоритм позволяющий сделать команду доступной лишь для определенного типа объектов и при возникновении определенных условий. Принцип добавления новой команды был рассмотрен в разделе «Языковые файлы», далее в этой главе мы детально рассмотрим весь процесс добавления команды и установке ее связи с назначенным скриптом. Всю последовательность действий можно разделить на несколько шагов:
Шаг 1. Определение пункта меню для новой команды.
Прежде всего следует определить в какой слот командного меню вы хотите добавить новую команду. ScE позволяет добавить команду в один из 10 стандартных пунктов командного меню.
Далее, в таблице будут приведены пункты командного меню и мнемонические имена команд находящихся в этих пунктах, а также соответствующие им ID на страницах основного языкового файла. Как все это использовать в ваших скриптах, мы рассмотрим далее.
Тип |
ID |
Меню |
Мнемоническое имя |
Navigation |
200-231 |
Командное меню, Навигация |
COMMAND_TYPE_NAV_00 to 31 |
Combat |
300-331 |
Командное меню, Боевые |
COMMAND_TYPE_FIGHT_00 to 31 |
Trade |
400-431 |
Командное меню, Торговые |
COMMAND_TYPE_TRADE_00 to 31 |
Special |
500-531 |
Командное меню, Специальные |
COMMAND_TYPE_SPECIAL_00 to 31 |
Piracy |
600-631 |
Командное меню, Пиратские |
COMMAND_TYPE_PIRACY_00 to 31 |
Custom |
700-731 |
Командное меню, Выборочные |
COMMAND_TYPE_CUSTOM_00 to 31 |
General |
800-831 |
Командное меню, Общие |
COMMAND_TYPE_GENERAL_00 to 31 |
Turret |
900-931 |
Меню турелей (из основного меню) |
COMMAND_TYPE_TURRET_00 to 31 |
Station |
1100-1131 |
Командная консоль станций |
COMMAND_TYPE_STATION_00 to 31 |
Ship |
1200-1231 |
Дополнительные корабельные команды |
COMMAND_TYPE_SHIP_00 to 31 |
Для того, чтобы продолжить изучение, давайте установим задачу и на ее примере рассмотрим все действия. Задача: Добавить в командное меню команду запускающую некий патрульный скрипт patrol.script.xml, на кораблях класса М6, М2 исключая запуск на кораблях других классов. Данная команда должна быть доступна только кораблям имеющим Боевой софт МК1.
Теперь приступим к определению пункта командного меню в котором следует расположить создаваемую нами команду. Так как, наш скрипт управляет боевым кораблем и выполняет военные действия, т.е. «патрулирование», то логично было бы расположить новую команду в пункте «Боевые». Определившись с тем, в какой пункт мы будем размещать новую команду, переходим к выбору самой команды.
Для каждого слота в ScE предусмотрено 32 команды. Обратите внимание на то что некоторые из них могут быть уже использованы самим Егософтом или другими скриптами. Мы остановимся на команде COMMAND_TYPE_FIGHT_15. То есть, выбор слота в командном меню мы осуществляем из принципа логичности, а команду выбираем из тех, что не заняты.
Шаг 2. Определение имени команды.
Следующим шагом является определение имени команды, т.е. загрузка текста который будет отражаться в строке меню данной команды. Если этот шаг будет пропущен, то новая команда в меню, отразится как ReadText2010-315 и ReadText2011-315, выглядеть наглядно это будет приблизительно так:
Для того чтобы отразить имя команды в том виде, что нам нужно: мы должны создать языковой файл и ввести соответствующие значения на страницы и в идентификаторы соответствующие новой команде. В нашем случае это страницы 2010 и 2011, а идентификатор ID 315 соответствующий команде COMMAND_TYPE_FIGHT_15 . И не забывайте про краткое описание вашей команды вызываемое клавишей «i». Как произвести эти операции подробно описано в разделе «Языковые файлы XML в Х2» глава «Использование пользовательских языковых файлов при работе с командным меню».
Вот необходимый нам языковой файл назовем его 70005.XML для русскоязычной версии, и 440005.XML для англоязычной версии:
<?xml version="1.0" encoding="UTF-8" ?>
- <language id="7">
- <page id="2010" title="Script Cmd Names" descr=" ">
<t id="315">Мой патрульный скрипт</t>
</page>
- <page id="2011" title="Script Cmd Shorts" descr=" ">
<t id="315">МойПатруль</t>
</page>
- <page id="2022" title="Command Info" descr=" ">
<t id="315">Эта команда запускает патрульный скрипт</t>
</page>
</language>
Создав этот файл, нам необходимо обеспечить его загрузку при инициализации игры. Для этого мы должны написать инициализирующий скрипт, который выполнит все необходимые подготовительные действия и добавит новую команду в меню. Назовем этот скрипт init.NewCommand. Теперь нам необходимо обеспечить загрузку созданного нами языкового файла. Соответственно первой строчкой в этом скрипте мы должны поставить команду load text: id=5
001 load text: id=5
Эта команда подгрузит созданный нами языковой файл 70005.XML и добавит изменения в основной языковой файл.
Шаг 3. Добавление в меню новой команды и установка связи со скриптом.
Этим шагом мы добавим в выбранное нами меню новую строку и установим ее связь со скриптом patrol.script.xml.
Первое, что нам нужно сделать, это установить связь между выбранной нами командой и нашим скриптом, делается это при помощи команды global script map: set. Далее, произвести установку класса объектов для которых эта команда будет доступна.
002 $command = COMMAND_TYPE_FIGHT_15
003 global script map: set: key=$command, class=Большой корабль, race=Player, script='patrol.script', prio=0
Команда в строке 003 установила связь между командой COMMAND_TYPE_FIGHT_15 и скриптом patrol.script и установила доступ к новой команде для кораблей класса большой корабль, но новая строка в командном меню еще не создана.
Теперь, следуя условиям задачи нам нужно настроить фильтр на некоторые типы классов кораблей. Точнее, т.к. мы установили доступ к команде COMMAND_TYPE_FIGHT_15 для кораблей класса «Большой корабль», то в него попали все большие корабли классов М6, М2, М1, TL, а по условиям нашей задачи создаваемая нами команда должна быть доступна только кораблям класса М6 и М2. Соответственно нам следует установить фильтр на корабли класса М1, TL. Сделать это можно при помощи команды global script map: ignore, добавив в инициализирующий скрипт следующие строки:
004 global script map: ignore: key=$command, class=Носитель M1, race=Player
005 global script map: ignore: key=$command, class=Тяжёлый транспорт TL, race=Player
Теперь, закрыв доступ к нашей команде кораблям класса М1, TL, нам остается выполнить последнее условие: обеспечить доступ к команде только для кораблей на которых установлен «Боевой программный модуль МК1». В этом нам поможет команда set script command upgrade: command=<arg> upgrade=<arg> , именно после обработки этой команды ScE добавит новую командную строку в слот команд «Боевые». В нашем случае добавляем строку следующего содержания в инициализирующий скрипт:
006 set script command upgrade: command=$command upgrade=Боевой программный модуль Мк.1
007 return null
Вот, собственно мы и выполнили поставленную перед нами задачу. Теперь в слоте командного меню «Боевые» добавлена новая команда «Мой патрульный скрипт».
Следует сказать, еще об одной команде подобной команде set script command upgrade: command=<arg> upgrade=<arg> имеющей гораздо более гибкие возможности и предоставляющей возможность установить более сложный фильтр или произвести еще какие либо проверки прежде чем активировать командную строку. Это команда set script command upgrade: command=<Object Command/Signal> upgrade <Var/Ware> script=<script name> , данная команда позволяет в момент открытия меню запустить проверочный скрипт и в зависимости от возвращаемого им флага разрешить или запретить доступ к новой командной строке. Подробное описание команды и возвращаемых флагов в разделе «Команды ScE» глава «Общие команды». Пример ее использования привожу из своего скрипта «Огненный заслон». Данный проверочный скрипт обеспечивает активацию команды в слоте станции в случае, если к данной станции пристыкован корабль на борту которого находиться «Заказ на установку комплекса «Огненный Заслон» или к станции пристыкован корабль с определенным именем. У данного скрипта обязательно должно быть заготовлено место под один аргумент, данный аргумент будет указывать на объект на котором запускается скрипт и будет передан ScE автоматически, т.ч. если ваш скрипт будет запускаться на станции то вы указываете Перем/Станция, как в примере. И соответственно Перем/Корабль если скрипт рассчитан для корабля и т.д. Автоаргументы мы обсуждали в разделе «ScE» глава «Сигналы».
001
002 $name1 = read text: page=1 id=1231
003 $ship.ar = $station -> get ship array from sector/ship/station
004 $count = size of array $ship.ar
005 while $count
006 dec $count =
007 $cur.ship = $ship.ar[$count]
008 $name = $cur.ship -> get name
009 $ware = $cur.ship -> get amount of ware Заказ на установку комплекса "ОГНЕННЫЙ ЗАСЛОН" in cargo bay
010 skip if $name == $name1 OR $ware > 0
011 continue
012 $flag = [CmdConCheck.Available]
013 return $flag
014 end
015
016 $flag = [CmdConCheck.Disabled]
017 return $flag
Далее в строке 002 из языкового файла получается имя объекта для сравнения (естественно оно должно быть предварительно внесено в этот файл), в строке 003 мы получаем массив пристыкованных к нашей станции кораблей. А далее идут проверки пристыкован ли станции корабль имеющий на борту определенный товар (заказ на установку комплекса «ОГНЕННЫЙ ЗАСЛОН») или корабль имя которого соответствует тексту взятому со страницы 1 ID 1231. И возвращается соответствующий флаг, в соответствии с которым, пункт меню будет активирован или останется недоступным.
Последнее, что хотелось бы добавить к выше сказанному, это то, что количество команд в Х2 ограниченно и прежде чем вешать свой скрипт более чем одну команду хорошо продумайте, нет ли возможности реализовать его возможности использую одну командную строку (например использование разных аргументов при запуске.). А так же, не забывайте проверить какие команды используют скрипты уже запущенные в вашей игре, дабы избежать конфликтов скриптов.
Оглавление | Сообщение об ошибках | Ваше мнение о проекте | E-Mail автору |