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

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

   Страница 1 из 8
На страницу: 1, 2, 3, 4, 5, 6, 7, 8  След. | Все страницы
Поиск в этой теме:
Канал X2: The Threat: «Скрипты - это легко...»
Нужен ли этот проект?
Да
96%
 96%  [ 212 ]
Нет
0%
 0%  [ 1 ]
Мне все равно
2%
 2%  [ 6 ]
Всего проголосовало : 219
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
О цели проекта:

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

Зачем это нужно?

Вся информация которую мне удалось собрать, когда я захотел научиться писать скрипты (еще не знал об ЕГ) представляла из себя разрозненные англо-язычные кусочки. От идеи уже почти отказался, когда нашел сайт ЕГ, лучшее из того что там нашел для обучения это Х2 help Dimaxx & Pegasus script MAD_Kuzia. Первое мое пособие, но к сожалению совсем устаревшее, а помимо того, если нет никакого опыта в программировании, то для большинства бесполезное. Конференция на ЕГ это собрание колоссального количества полезнейшей информации, но не в систематизированном виде. Большинство инфы из конференции не для новичков. Ведь если нет азов, зачем знать что такое "приоритет и стэк задачи". Следующая книга найденная мной была "The X2 MSCI Programmer's Handbook", если знаешь английский, лучше не надо (хотя, и в книге есть и нераскрытые вопросы). А если не знаешь? У многих руки опустились.
В конференции, например раздел "Скриптописание" вопрос №1 "А как включить редактор скриптов?", №2 "А что делает эта команда...?", а по моему разумению должно быть " Я сделал это вот так.", "А я сделал тоже самое, но скрипт в два раза меньше ... смотри." Раздел «Учебник по скриптам»  похоже всеми кто о нем знает забыт, а кто не знает может и не найти его. Найди-ка на 50 страницах тем.

Зачем это лично мне ?

Мой первый космосимулятор это спектрумовская ELITE, на глючном Спектруме 48 с десятиминутными загрузками с магнитофона, но я обожал ее. Были попытки деассемблирования, разборы кода и было это лет 15 назад. Об Х2 узнал месяца три назад. Лично для меня, это воплощение юношеской мечты, о лучшей игре.  Возможность внутреннего программирования открывает необъятные горизонты для фантазии. В общем мне это нравится, и хочется сделать свой вклад в проект Х2.
И конечно я не лишен личных амбиций, хочется чтобы уважали, но основной фактор заставивший меня взяться за эту работу - это то, что мне нужно  полное русскоязычное пособие под рукой . Вот я и решил действовать по принципу "Ели гора не идет к Магомеду, то Магомед пойдет к горе". Мне нужно пособие, и если его нет, то я сделаю его. Если не будет единомышленников буду работать над этим проектом в одиночку. Но это пособие будет создано.

Об авторских правах

Я ни в коем случае не претендую на авторство всего того, что использую в этом проекте. И более того заявляю: весь проект построен на первоисточниках таких как Х2 help Dimaxx & Pegasus script MAD_Kuzia, и переводе по мере сил "The X2 MSCI Programmer's Handbook", а также Конференция ЕГ, все разделы хоть как то связанные со скриптописанием, а также личные эксперименты, разборы скриптов написанных пилотами. В связи с этим, практически под любой статьей написанной не мной, я ставлю ссылку на первоисточник. Кроме того на этом сайте, есть страница об соавторах, то есть о тех пилотах, кто комментировал, исправлял ошибки или хоть как-то содействовал работе, а также о тех чьи статьи я взял в конференции (так сказать заочно). Не исключаю что кто то будет против  использования его материалов, если такие есть, то  сообщайте мне об этом, перепишу своими словами.

Какая нужна помощь ?

Само пособие строю по принципу учебника с азов и дальше, дальше... здесь выкладываю страницы содержащие целые разделы с черновой информацией (то есть не форматированный текст, над которым явно не работали), даже если команды с описанием, то лично я их не проверял. Разбиты разделы на главы по тематике. Текст с нормальным оформлением (то есть команды выделены, абзацы отформатированы легко читаемы, добавлены схемы, и скрины), значит тему/статью/описание считаю готовой. В оглавлении (разделы !!!) готовы ждут проверки, (***) над разделом ведется работа, (???) за них еще не брался выложен только черновик. Наличие в самом тексте статей "???" говорит о том, что о данном вопросе у меня нет вообще никакой информации, буду искать и ждать от вас.
Требуется помощь следующего характера

Проверка описаний команд (в первую очередь той что уже приведена в порядок "!!!")

Проверка правильности информации содержащейся в статьях. (в первую очередь той что уже приведена в порядок "!!!")

Дополнение и написание статей/описаний дополняющих какую либо тематику. Информация должна быть обязательно 100% проверенной (желательно в виде готовых описаний, само собой с указанием вашего aka)

Советы о порядке преподнесения информации (то есть составление оглавления)
пока все что вспомнил. Если что дополню потом.

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

О дизайне

Сразу скажу не Web дизайнер, да и чего душой кривить... вообще не дизайнер. Но буду постепенно оформлять. По мере сил. Хотя цель этого проекта не красота, а систематизация знаний. Когда проект будет завершен, место ему не на этом сайте а на ЕГ, а там профессионалы, им и оформительские карты в руки.
Да, конечный результат предполагается подверстать под распечатку, лично мне одна бумажная книга милее трех электронных. Вот такие консервативные взгляды.

О связи

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./

Обсуждаем и исправляем ошибки здесь

Прочая связь через мыло dragonp@narod.ru, или здесь в личку.

С уважением Черняков Павел aka DragonP
_________________
Звезды зовут...
    Добавлено: 17:20 25-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Вступление

Что такое – навигационный скрипт?

Вы никогда не задумывались над тем что происходит в электронном мозге корабля после того как вы отдаете ему команду «Вернуться на базу»? Нет ? Так давайте попробуем в этом разобраться.
И так предположим мы находимся в секторе «Фортуна Елены», а базой приписки нашего корабля является «Ранчо аргну» в секторе «Стена». Из консоли нашего корабля отдаем приказ «Вернуться на базу». И наблюдаем за происходящим – наш кораблик ложится на курс к западным вратам, набирает скорость и спустя несколько минут мы проходим врата и оказываемся в секторе «Президентский рубеж». Теперь наш путь лежит к северным вратам. Но вот и они позади. Мы долетели до сектора «Стена» войдя в него через южные врата. Именно в этом секторе находится наше «Ранчо аргну». Наш корабль ложится на курс сближения с базой, и движется к ней. Стыковка. Все просто. А теперь представьте, что делали бы вы, если пришлось бы вести корабль на базу в ручную.

Давайте составим последовательность наших действий:
1. Смотрим к какой базе приписан корабль.
2. Заглядываем в карту галактики и определяем где находится наш корабль. В нашем случае это сектор «Фортуна Елены»
3. Находим сектор «Стена».
4. Составляем маршрут. И так, из сектора «Фортуна Елены» через западные врата в сектор «Президентский рубеж», дальше через северные врата в сектор «Стена»
5. Отправляемся в путь.
6. Вот мы и в секторе «Стена». Открываем карту сектора находим нашу базу, выбираем ее целью и летим к ней.
7. Вот уже расстояние до станции меньше 5 км. Включаем связь и запрашиваем разрешения на посадку. Ответ утвердительный, стыкуемся.

И так, перед нами список наших действий, этакий сценарий полета к базе. Если мы сравним последовательность наших действий с действиями автопилота, то на лицо тот факт, что мы выполняли практически одинаковую последовательность действий. Получается автопилот действовал по такому же сценарию ? И это совершенно верно, ведь дословный перевод с английского слова script означает «сценарий». Так что запустив в командной консоли нашего корабля команду «Вернуться на базу», мы на самом деле запустили навигационный скрипт (далее НС) выполняющий полет на базу. А проанализировав последовательность своих действий, мы составили нечто иное как схему НС. Для того, чтобы нам полностью понять что же такое скрипт разберемся еще с несколькими понятиями:
Script engine (интерпретатор скриптовых команд), далее в тексте ScE – интерпретатор это сам центр обработки команд, производящий анализ и интерпретацию команд находящихся в теле скрипта и обеспечивающий их исполнение.
Инструкции, функции, операторы – составляющие самого языка скриптописания. Это понятные ScE наборы операторов из которых собственно и состоит скрипт. Подробное изучение нам предстоит далее.
Сегмент – какой либо определенный кусок кода НС.
Процедура – сегмент выполняющий одно какое либо действие. Например процедура проверки наличия денег на счету станции.
Аргумент - входные данные, задаваемые для НС. Именно от аргументов зависит результат выдаваемый скриптом.
Примитив – небольшой скрипт выполняющий как правило одну какую нибудь функцию и возвращающий значение в вызывающий скрипт. Это маленький кирпичик в огромном здании сложного скрипта. Цель примитивов это освобождение тела большого скрипта от часто повторяющихся кусков кода выполняющих одну и туже функцию (например, если в скрипте по мере его выполнения многократно производится сканирование галактики, то во избежание многократного переписывания процедуры сканирования, создается примитив который можно вызвать из основного скрипта и он просканировав галактику вернет основному скрипту результат поиска.

И так теперь мы имеем поверхностное представление что такое – навигационный скрипт. Давайте сформулируем понятие НС.
Навигационный скрипт – это сценарий последовательности действий и реакций объекта на внешние изменения, записанный при помощи команд и инструкций интерпретируемых и исполняемых ScE Х2.

Синтаксис команд HC.

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

<RetVar/IF> <RefObj>buy <Var/Number> units of <Var/Ware>

В данном примере <RetVar/IF> говорит о том, что возвращаемое командой значение может быть присвоено переменной <RetVar>, либо являться аргументом для таких операторов IF, IF NOT, SKIP, SKIP NOT, WIHLE, WHILE NOT. <RefObj> указывает в отношении какого объекта выполняется команда. В данном примере объектом должен быть корабль, а вообще объектом может быть станция, корабль, астероид, планета, туманность и т.п. <Var/Number> сообщает о том, что для команды необходимо указать переменную число, либо ввести число непосредственно в редакторе. <Var/Ware> является указателем на какой либо товар, а товаром в "X2 The Threat" может являться все, что можно продать или купить (так же в Х2 имеются <Var/Sector> <Var/Station> <Var/Ship> и т.п. в редакторе все возможные переменные отображаются в виде списка, в некоторых версиях они переведены на русский язык <Перем/Станция>. Например версия НД)
Пример:

022 $amount = 100
023 $ware = Батареи
024 $obj = [THIS]
025 IF NOT $obj buy $amount units of $ware


Тек же в синтаксисе команд вы можете встретить:
<Value> - значение неопределенного типа. Тут надо сотреть по смыслу, что подставлять.
<Object Command> - команда объекту. Это константа, выбирается из списка возможных.
<Object Signal> - сигнал объекту. Это тоже константа.
<Flag> - константа флаг.




В каком редакторе пишется НС, и где его взять ?

На сегодняшний день написать НС можно только во встроенном в "X2 The Threat" редакторе, это немного не удобно но пока альтернативы нет. Ввод команд в редакторе осуществляется выбором в меню нужной команды, так же вводятся переменные и другие необходимые данные. С клавиатуры вводятся только числовые текстовые значения, хотя вход в интерфейс для ввода осуществляется также через выбор соответствующего пункта в меню.
Изначально редактор находится в деактивированном состоянии и для его использования нужно провести активацию. Делается это следующим образом:
1. На корабле вылетаем в космос.
2. Набираем на клавиатуре следующее слово, важно с большой буквы без кавычек, «Thereshallbewings»
3. Раздается краткий звуковой сигнал. Редактор активирован.
После того как раздался звуковой сигнал в левом верхнем углу должена появиться полупрозрачная надпись «Modified» (это происходит не во всех версиях игры, в версии от НД этого не происходит). Значок сообщает о том что игра модифицирована. Сделано это в связи с тем, что при помощи НС можно сделать многие вещи, такие как добавить на счет игрока несколько миллионов кредитов (то есть чистое читерство), а так как значок будет сохранятся после активации редактора во всех сейвах, то это должно сообщить другим игрокам честным ли образом что либо в игре было достигнуто.
Теперь нажимаем Shift-C и оказываемся в командном меню, ищем появившуюся строчку «Редактор скриптов» или нажимаем S.

Какие бывают скрипты?

В ScE "X2 The Threat" присутствует два типа скриптов, это Глобальные скрипты и Локальные скрипты.
Глобальный скрипт – к глобальным скриптам относятся НС исполняемые без привязки к какому либо объекту.
Локальный скрипт – это скрипт запускаемый непосредственно какого либо объекта, и существующий только пока существует сам объект.
_________________
Звезды зовут...
    Добавлено: 17:41 25-01-2005   
Grey Wolf
 500 EGP


Рейтинг канала: 1(9)
Репутация: 115
Сообщения: 1677
Откуда: Ростов-на-Дону
Зарегистрирован: 31.03.2003
Дело нужное. И понятно, что нужна помощь. Тока вот как лучше эту помощь организовать?
Вот прочел я часть твоего проекта. И нашел места, где на мой взгляд, нужны комментарии и дополнения. Это те места, где стоят !!! Причем точно знаю, что в конфе это все обсуждалось и расписывалось. Ты ж вроде писал, что конфу используешь, как источник инфы, а почему тогда этого у тебя в проекте нету?
_________________
Быстро выпитая рюмка не считается налитой
    Добавлено: 17:58 25-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Описание редактора скриптов "X2 The Threat" .

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


Редактор скриптов

Выбрав этот пункт в главном меню редактора вы переходите к браузеру скриптового редактора, то есть к списку скриптов доступных для редактирования, выполнения и т.п. Самая верхняя строка строка из списка, это «новый скрипт», позволяет приступить к созданию нового НС. Если вы выберете ее, то редактор спросит у вас имя нового скрипта, и создаст пустой скрипт-файл. Браузер скритового редактора позволяет производить над скриптами определенные действия, такие как копирование, удаление, выполнение и т.д. В таблице приведены клавиши управления скриптовым редактором:

Клавиши управления редактором скриптов:

Режим браузера скриптов:
<l> загрузить скрипт из папки скриптов
<c> копировать скрипт
<r> выполнить скрипт
<Del> удалить скрипт
<Enter> редактировать скрипт

Режим редактора скриптов:
<вверх/вниз> перемещение по строкам
<влево/вправо> перемещение между выражениями
<Enter> меню функций
<Ins> вставить новую строку
<Del> удалить строку
<c> копировать стороку в буфер
<x> вырезать строку в буфер
<v> вставить строку из буфера
<.> закомментировать строку
<,> удалить символ комментария
<Home> вставить операнд выражения
<End> удалить операнд выражения
<Esc> сохранить и закрыть скрипт


Reinit Script Caches
При запуске игры все НС запускающиеся из командного меню помещаются в специальный СкриптКэш. Это делается для более быстрого выполнения команд. Но данный подход имеет и другую сторону, ScE будет использовать старую версию скрипта даже после его модификации и перезапуска команды. Пункт меню Reinit Script Caches производит перезагрузку СкриптКэша, тоесть все скрипты привязанные к пунктам меню будут перезапушены. Однако обратите внимание на то, что изменения не будут действовать для объектов уже выполняющих данную команду, а только для тех которым команда отдается после перезагрузки СкриптКэша. Для того чтобы изменения вступили для этих объектов следует остановить выполнение команды и отдать ее снова.

Script Debugging
Переключатель режимов отладки НС на объекте. Имя объекта указывается в этойже строке. Здесь возможны два варианта: вести пошаговию отладку (Trace) или производимые НС действии будут записываться в лог (Log). Выбор осуществляется нажатием “Enter”, при установке курсора на эту строку.

Clear Debug Messages
Удаляются все данные из лога объекта указанного в Script Debugging.

Script Debugger Menu
Просмотр лога отладки или пошаговое выполнения НС с показом значений переменных.

Просмотр лога (Log)– при установленном в это положение переключателя Script Debugging будет отражен лог наполнение которого происходит в реальном времени, по мере выполнения команд НС на данном объекте. Чтобы было более понятно создадим небольшой скрипт с именем a.missile.fire :

Код:
001   $ware = Ракета Москит      // раздел общиекомманды > <RetVar/IF> <Expression> Присваиваем переменной $ware значение Ракета Москит
002   $count = 20               //  Присваиваем переменной $count  = 20   Раздел общиекомманды => <RetVar/IF>                      <Expression>
003   while $count               // запускаем цикл с условием $count не 0.Раздел общиекомманды => <RetVar/IF> <Expression>
004 @  = wait 3000 ms            //Ожидаем 3 секунды (чем больше в цикле таких команд тем стабильней работает игра см.Многозадачность) .Раздел общие комманды.
005    dec $count =             // Цикл начал выполнение, уменьшаем счетчик витков на 1. Раздел общиекомманды.
006    $victium =  get player tracking aim      // получаем объект в прицеле коробля игрока в переменную $victium. Раздел «навигационные команды»
007    = [PLAYERSHIP] -> add 1 units of $ware      // добовляем одну ракету в трюм коробля игрока. Раздел    «Торговые    команды»
008    = [PLAYERSHIP] -> fire missile $ware on $victium   // выпускаем одну ракету по $victium Раздел навигационные команды
009 @  = wait 3000 ms            // ждем 3 сек.
010   end                  // начинаем новый виток цикла, тоесть передаем управление в строку 003 Раздел «Общие команды=>команды исполнения.
011   return null               //возвращаем управление                            вызывающему скрипту

* для тех кто плохо знаком с расположением команд в комментариях указаны разделы где они расположены.
Этот скрипт производит двадцать выстрелов ракетой Москит по объекту находящемуся в прицеле корабля игрока (наличие ракет в трюме не обязательно), этого времени нам хватит чтобы рассмотреть работу Script Debugger Menu. Войдите в скриптовый редактор, <ShiftC>, выбирете Редактор скриптов=> новый скрипт введите имя и повторите текст данного скрипта. Сохраните его. После, выйдите из редактора. Подлетите на своем корабле к какому нибудь астеройду и возьмите его в прицел, нажмите «Т» чтобы прицел зафиксировался на астеройде. Теперь возвращайтесь в редактор выбирайте в списке скриптов созданный a.missile.fire и жмите «r». На запрос редактора об объекте выбираем собственный корабль и жмем “Enter” Через три секунды ваш корабль сам выстрелит ракетой по астеройду. Если это произошло, снова запускаем редактор скриптов, если нет, то проверяем последовательность действий описанную выше. Наш корабль выстрелил, и мы вернулись в главное меню редактра. Очищаем буфер ScE от возможных остатков старых данных выбором команды Clear Debug Messages и устанавливаем переключатель Script Debugging в позицию “Log” и вызываем пункт Script Debugger Menu. В открывшемся окне видим длинный и все время пополняющийся табличный список:


Строки с 1 по 9 содержат в (правой части) исходный текст нашего скрипта а, после этого листинг начинает дублироваться, а если посмотреть параметр Line:, вы замерите, что цифры совпадают с номерами строк исходного текста скрипта, и до строки 9 последовательность сохранялась, а в десятой снова стал равен 3. Если посмотрим какие операторы стоят в этих строках, то становиться ясно что в строке 9 мы дошли до конца цикла и передали управление в строку 3, так как в листинге нашего скрипта в строке 10 стоит оператор end, а в данном случае он передает управление в начало цикла в строке 3. Теперь как и задумывалось данный сегмент нашего скрипта исполнится двадцать раз. Соответственно и в логе он будет последовательно отабражен двадцать раз, после чего скрипт завершится и по команде return передаст управление вызвающему скрипту, а в нашем случае т.к. мы вызывали скрипт в ручную и у нашего корабля небыло никаких других команд корабль перейдет в режим ожидания, а в лог больше ничего записываться не будет до тех пор покака корабле не будет снова запущен какой либо скрипт.
Теперь кратко опишем остальные данные выводимые в строке:
Script Name – имя скрипта, команда которого ыла выполнена в данной строке.
Line – номер строки в скрипте Script Name.
Stackdepth – глубина стек в котором выполняется задача (количество скриптов в стеке счинается с 0)
Prio – приоритет выполняемого скрипта
PID – глобальный идентификатор задачи
TaskID – Идентификатор задачи
Command – исходный текст комманды

Теперь перед нами вся последовательность команд выполненная ScE при обработке скрипта a.missile.fire.

Пошаговое выполнения (Trace) - это второй вариант отладки скрипта, пошаговое ваполнение комманд подразумевает под собой следующее, ScE выполнив одну команду ожидает разрешения от пользователя на выполнение следующей, при этом показываются значения всех переменных этого скрипта. Для подробного рассмотрения этого режима выполним такиже подготовительные действия как и при рассмотрении режима «Log», с той разницей что переключатель Script Debugging переведем в состояние «Trace» и запустим скрипт a.missile.fire. Выполняем пункт меню Script Debugger Menu. Окно для пошаговой отладки состоит из двух сегментов:


Верхний сегмент показывает листинг уже выполненных команд (отражены белым цветом), и команда ожидающая от пользователя разрешения на выполнение (отражена зеленым цветом). Информативное содержание строки такое же как и в режиме «Log» (Script Name: Line: Stackdept:…). Если вы нажмете Enter, то команда ожидающая разрешения выполнится и изменит цвет на белый, а ниже появится следующая команда скрипта и редактор будет ожидать следующего нажатия Enter. Нижний сегмент показывает список всех переменных, которые использует скрипт. Имя переменной указывается самым первым (Variable Name), далее идет тип данных (Data Type) и значение (Value). Изначально тип данных всех переменных NULL и изменяется он только после того как переменной было присвоено какоето значение. Само значение переменной отражается сразу за типом данных.
Пошаговый режим удобен для поиска ошибок в проблемных скриптах.

Global Script Tasks
Этот пункт меню служит для того чтобы можно было посмотреть какие глобальные скрипты выполняются в данный момент. Для рассмотрения используем тотже скрипт a.missile.fire, только выполним его как глобальный, тоесть без привязки к какому либо объекту, для этого на вопрос при запуске вместо выбора объекта выбираем null. Если скрипт запущен выбираем Global Script Tasks. Открывается окно содержащее листинг всех скриптов выполняющихся глобально.
Данные о скрипте выводимые редактором в Global Script Tasks:
PID – глобальный идентификатор задачи
Script Name – имя глобального скрипта
RefObject – ???

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 18:00 25-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Просмотр и редактирование НС

Все скрипты используемые в Х2 располагаются в папке, из паки в которую установлена игра (по умолчанию установка производится в каталог "C:\Program Files\Еgosoft\X2 - The threat"). В изначально установленной игре в папке \scripts находится два вида файлов *.PCK и *.XML. PCK – это файлы упакованные, как работать с этими файлами чуть ниже. XML – это файлы в XML-формате, именно в этом формате ScE хранит все скрипты. Также в этой папке находится файл x2script.XML это внутренний файл описатель, содержащий информацию необходимую для просмотра XML кода браузерах типа Internet Explorer.

Просмотр скриптов из папки /scripts

Для просмотра распакованных XML файлов (НС игры Х2), нужно открыть папку /scripts и кликнуть на любом из файлов с расширением XML (на компьютере должен быть браузер Internet Exlorer).

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

x2tool -unpack ascript.pck ascript.xml

но имеется и другая альтернатива, это программа unPaCKer.exe написанная пилотом сайта EliteGames, Алексейко Дмитрием aka Dimaxx данная программа имеет русскоязычный интерфейс и проста в использовании. Понять как она работает не составит труда.

После распаковки PCK файлов, если вы не выбирали в установках программы unPaCKer.exе удалить или переименовать исходные файлы, то следует либо удалить их либо переместить в какую ни будь другую папку. А все появившиеся файлы с расширением XML теперь стали доступны для просмотра через Internet Exlorer.

Просмотр сторонних скриптов
Сейчас в Интернете можно найти огромное количество скриптов для Х2 написанных пилотами. Если у вас имеется какой то скрипт написанный другим пилотом, то для того чтобы посмотреть его, необходимо в папку где находится скрипт (от есть файл XML) скопировать файл описатель x2script.XML из папки /scripts и кликните на файле скрипта.

Редактирование скриптов
Редактирование НС возможно только во встроенном в игру редакторе. Для редактирования файлы редактируемого скрипта должны находится в папке /scripts. Файл не должен начинаться с символа «!», иначе браузер скриптового редактора не увидит этот скрипт (см. структура скрипта).

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 18:07 25-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Структура НС

При просмотре НС в браузере IE очень хорошо отражается вся структура скрипта. Давайте рассмотрим ее подробней.

Код:
Script !ship.cmd.follow.pl
Version: 1
for Script Engine Version: 20

Description
Ship Player COMMAND FOLLOW

Arguments
•   1: target , Var/Ship , 'the target'

Source Text

001 @ = [THIS] -> call script '!ship.cmd.follow.std'  :       the target=$target     follow distance=null
002   return null

signde


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

Имя скрипта (Script)
Первое что мы видим это имя скрипта. В Х2 имя скрипта имеет большое значение, т.к. в имени скрипта содержится много важной информации обрабатываемой ScE. В нашем примере имя начинается со знака «!» это сообщает редактору о том, что данный скрипт является системным и не подлежит редактированию. Скрипты со знаком «!» не будут отражаться в списке доступных для редактирования скриптов. В Х2 присутствуют следующие типы имен: “init.* ”, ”setup.* ”, “al.plugin.* ”, “galaxy.* “. Каждое из имен имеет определенное значение, и скрипты с такими именами выполняются игрой автоматически.

o Init Scripts: скрипты с именами “init.* ” и “!init.* “ являются скриптами инициализации, тоесть они загружаются автоматически каждый раз когда вы запускаете игру или загружаете сейв. Но обратите внимание на то, что загрузка скриптов init происходит до инициализации галактики (то есть до создания кораблей и станций). Поэтому нужно быть осторожным используя данный тип имен для скриптов работающих с объектами в галактике.
o Setup Scripts: скрипты с именами “setup.* ” и “!setup.* “ запускаются автоматически при создании новой игры или загрузке сейва. Загрузка скриптов setup происходит после инициализации галактики (то есть все объекты уже созданы). Использование setup для скриптов активно работающих с объектами в галактике, позволяет избежать многих ошибок которые могут возникнуть при использовании init.
o AL Plugin Scripts: скрипты с именами “al.plugin.* ” и “!al.plugin.* “ отвечают за искусственную жизнь в галактике (патрули секторов, транспорты летающие между станциями (в том числе и станции игрока) любой скрипт данного типа отвечает за какой нибудь конкретный процесс происходящий в галактике связанный с искусственной жизнью.
o Galaxy Ship Init Scripts: скрипты с именами “galaxy.* “ используются для запуска иных чем встроенная в Х2 карта. Этот скрипт создает стартовый корабль игрока. ScE при запуске проверяет наличие скрипта с именем “galaxy.<имя карты> “ или “!galaxy.<имя карты> “

Обратите внимание на одну особенность при использовании имен скриптов init, setup, !init, !setup. Скрипты !init и !setup запускаются всегда при старте или загрузке сэйва. Если использовать скрипты такого типа, НЕ подписанные Егософтом (цифровая подпись скрипта, см. ниже), то игра автоматом приобретает статус Modified. Скрипты типа init и setup запускаются ТОЛЬКО в игре со статусом Modified, в немодифицированной игре они не будут запускаться, несмотря на то, что находятся в папке \scripts.

Версия (Version)
Каждый скрипт содержит в себе версию самого скрипта которая задается автором, сделано для того чтобы автор мог указать версию в случае если скрипт был модифицирован. Версия скрипта отражается в окне «Редактор скриптов» в листинге скриптов доступных для редактирования, в следующем столбце за именем скрипта.
В следуещей строке отражается версия ScE (Script engine version), а это делается для того чтобы определить будет ли данный НС скрипт работать под управлением установленной и вас игры. Начиная с версии 1.4 версия ScE выше 25 (включительно). Совместимость скриптов обеспечивается по принципу возрастания, то есть более новая весия ScE поддерживает скрипты написанные в более старой.

Описание (discription)
В этой строке содержится краткое описание скрипта. Создается автором данного скрипта. Описание скрипта отражается в окне «Редактор скриптов», сразу за версией скрипта. В нашем случае «Команда следовать, используемая для корабля игрока».

Аргументы (Arguments)

Аргументы это входные данные, от которых зависит результат выполнения скрипта (куда полетит корабль или какой товар покупать и т.п.). Аргумент в ScE Х2 состоит из трех частей:
Name: имя аргумента, должно состоять из символов любого регистра (строчные, прописные), цифр. ScE создаст переменную имя которой будет соответствовать имени аргумента, с которой скрипт сможет работать как с обычной переменной.
Type: тип данных переменной-аргумента. Информация для ScE о том какой тип донных содержит аргумент.
Description: описание. Задается краткое описание аргумента. Описание отражается в нижней части экрана, когда редактор запрашивает значение аргумента при запуске скрипта, что очень удобно для других пилотов использующих ваш скрипт. Так же Description будет отражаться при использовании команды call script, необходимые аргументы для вызова скрипта будут отображены как Description аргументов вызываемого скрипта. В нашем примере в строке 001 вызывается скрипт “!ship.cmd.follow.std” далее идет “the target” и “follow distance”, это говорит о том что в вызываемом командой call script скрипте “!ship.cmd.follow.std” имеются два аргумента необходимых для выполнения скрипта, у которых в описании первого записано “the target”, а второго “follow distance”

Исходный текст (Source text)
Исходный текст скрипта, от есть само тело скрипта. Состоит из последовательности команд, инструкций, операторов и наборов значений и переменных. Все это интерпретируется и выполняется ScE.

Цифровая подпись навигационного скрипта

Вы наверное обратили внимание на то, что ниже команды RETURN NULL находится строчка содержащая одно слово «signde». Наличие этой строчки в скрипте, говорит о том, что данный скрипт имеет цифровую подпись от Egosoft. Это означает, что данный скрипт прошел некую сертификацию, и официально допущен к использованию в не модифицированном режиме игры.
Скрипт написанный любым пилотом может быть подписан Egosoft’ом, для этого он должен соответствовать определенным условиям. Занимаются вопросами подписи скриптов два пилота BurnIt и mkess, именно они будут принимать решение подписывать или не подписывать ваш скрипт. Для рассмотрения вашего скрипта он должен быть выслан на адрес scripts@egosoft.com. Также, на подпись можно отправить скрипт автором которого вы не являетесь, после рассмотрения, если скрипт будет принят, то Egosoft свяжется с автором и в случае его согласия скрипт будет подписан.
Основные требования предъявляемые к скриптам:

• Скрипт не должен полностью автоматизировать работу экономики (то есть осуществлять полностью автоматическое управление всеми фабриками игрока). Хотя есть оговорка о том, что в принципе какой скрипт может быть подписан, в случае если например: игрок уже является владельцем не одного десятка фабрик и его торговый рейтинг не меньше чем Промышленник, то он может приобрести какое ни будь новое оборудование добавляемое этим скриптом за баснословные денги.
• Приветствуются скрипты расширяющие работу стандартных команд.
o Скрипты расширяющие структуру меню
o Микроменджмент (перевод денег на счет игрока, предупреждение о нехватке денег или ресурсов, и т.п.)
o Улучшающие стандартные боевые, добывающие, собирающие и т.п. скрипты
o Патрули секторов, галактик осуществляющих защиту собственности.
o Скрипты улучшающие AL.
o Улучшающие торговые и транспортные скрипты.
• Скрипты не должны без необходимости обращаться к системным скриптам. Например использовать системный скрипт !Move.movetostation для определения прибыл ли объект к точке следования, вместо команд "if THIS-> landed" или "If DOCKEDAT == $targetstation".

Если Egosoft находит мелкие недостатки в скрипте, то автору предлагается устранить их. И после устранения этих недостатков, скрипт получит долгожданную «signde».

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 18:16 25-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Grey Wolf :
И нашел места, где на мой взгляд, нужны комментарии и дополнения. Это те места, где стоят !!! Причем точно знаю, что в конфе это все обсуждалось и расписывалось. Ты ж вроде писал, что конфу используешь, как источник инфы, а почему тогда этого у тебя в проекте нету?


Я собираю информацию везде. Но самое трудное это систематизация информации полученной из конфы. Здесь люди часто пишут об экспериментах , и их результатах, а анализ не всегда является верным. Проверить лично, такой объем информации очень трудно (кроме того, я тоже человек, и не застрахован от ошибок. Мог и пропустить). Помимо, я пишу многие статьи, фактически с нуля основываясь на информации из конференции , так как большинство статей необходимо доводить, проверять. В связи с этим могут быть вопросы которые я упустил. Поэтому, я и прошу помощи. В ответ на твое сообщение я изложу как я вижу план работы над проектом.
• я излагаю в проекте черновик. (даже значок !!! не говорит о том что материал максимально полный и законченный. Поэтому я и указывал «ждет проверки» и отказался от выкладывания в «Учебнике скриптов»)
• Выложенный материал становиться доступным для всех. Начинается «Мозговая атака». При чем в этом процессе желательно участие не только профессионалов, но и новичков. Профессионалы указывают на ошибки и пишут статьи. Новички – читают и пишут о том что им не понятно.
• Если кто то берется дополнить какой либо раздел. То либо сообщает мне информацию для дополнения, но лучше сам пишет статью и отправляет ее мне, а я в свою очередь дополняю проект. Соответственно меняется дата последнего изменения, и начинается новая атака модифицированного раздела.

Именно по этому, я прошу первостепенно проверять разделы «!!!» так как их остается довести до конца и закрыть работу над ними. Вот собственно и все.

Если кто, хочет посоветовать какой либо другой план – советуйте. Для этого я и создал тему.

И прошу не забывать – я не писатель, мне просто учебник нужен Улыбка
_________________
Звезды зовут...
    Добавлено: 19:09 25-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Языковые файлы XML в Х2
 Что такое языковой файл

Вся текстовая информация использующаяся в Х2 (описания товаров, название команд меню, фразы в приходящих игроку сообщениях и т.п.) хранится во внешних XML файлах. Данные файлы содержат в себе полностью всю текстовку, что очень облегчает перевод Х2 на другие языки. Основным языковым файлом является файл ХХ0001.XML, где ХХ это цифровой идентификатор языка под который локализована информация содержащаяся в файле. Именно в этом файле хранится весь текст относящийся к игре. Также в комплекте с игрой идет файл ХХ0002.XML, он содержит тексты для первого диалогового окна, появляющегося перед запуском игры (настройка графики, логотип, управление и т.п). Ниже приведены ХХ коды и языки соответствующие им ( на самом деле коды соответствуют телефонным кодам стран, где данный язык является основным):

ХХ код Язык локализации
7 Русский
33 Французский
39 Итальянский
44 Английский
48 Польский
49 Немецкий

Эти файлы находятся в папке /t каталога в который установлена игра. Это верно для распакованной версии игры (изначально игра находится в упакованном виде).
Второй вариант расположения файлов это подобные zip архивам, файлы *.CAT - файлы каталогов, *.DAT - файлы данных. В веси 1.4 имеется четыре пары файлов от 01.CAT/01.DAT и соответственно до 04.CAT/04.DAT. Х2 имеет доступ к упакованным файлам, также как, если бы он находились в распакованном состоянии и были разложены по обычным папкам. Чтобы нам получить доступ к этим файлам, необходимо распаковать эти файлы. Делается это при помощи официальной программки «X2 modder kit» или «X2 modder» от OlisJ. Для русскоязычных пользователей гораздо удобней воспользоваться утилитой написанной пилотом Dimaxx’ом, называется она XTdat.exe. Программа имеет русскоязычный интерфейс и легка в использовании. Найти эту программку можно здесь: http://www.elite-games.ru/_egm_scripts/url.php?action=gotourl&url=/downloads/x2/xtdat.exe.
После распаковки, файлы содержащиеся в CAT/DAT файлах будут извлечены и разложены по соответствующим папкам. Открываем папку /t в игровой директории в ней должны появиться файлы 440001.XML и 440002.XML для англоязычной версии или 70001.XML и 70002.XML для русскоязычной (дальше, везде будет рассматриваться русская версия Х2). Если ваша игра локализована под другой язык, то идентификатор языка будет соответствовать языку локализации (см.табл).

 Как делается языковой файл и при помощи какой программы

Поняв основное назначение языкового файла и прежде чем перейти к более глубокому рассмотрению данного вопроса. Следует разобраться при помощи какой программы можно посмотреть содержимое языкового файла, редактировать и создавать новые. Ответ прост. Самой удобной программой для работы с языковыми файлами является стандартный виндосовский блокнот, а программой для просмотра содержимого Internet Explorer. Любой языковой файл легче всего не создавать с нуля а взять какой ни будь готовый и подредактировать его. Если у вас нет под рукой ни одного маленького языкового файла, то воспользуемся поставляемым с игрой файлом 70002.XML. Открываем папку /t из игровой директории и открываем файл 70002.XML при помощи блокнота. Удаляем текст от строки <page id="1912" title="Graphic Settings dialog" descr=""> до самого конца оставив только последнею строчку </language>. В разделе <page id="1910" title="About Dialogue" descr="First dialogue before start of game - About"> удаляем все между <t id="1">Запустить X2</t> и </page>

У нас должен получиться файл следующего содержания:

Код:
<?xml version="1.0" encoding="UTF-8" ?>
<language id="7">

<page id="1910" title="About Dialogue" descr="First dialogue before start of game - About">
 <t id="1">Запустить X2</t>
</page>
</language>


Удаляем 1910 в page id, «About Dialogue» в title и «First dialogue before start of game – About» в descry. Строчкой ниже удаляем 1 из “t id=” и «Запустить X2»

Получаем:

Код:
<?xml version="1.0" encoding="UTF-8" ?>
<language id="7">

<page id=" " title=" " descr=" ">
 <t id=" "> </t>
</page>
</language>


Выбираем «сохранить как», исправляем имя на 70005.XML (расширение указывать обязательно), устанавливаем кодировку UTF-8, сохраняем. Теперь у нас есть файл шаблон языкового файла с именем 70005.XML.

 Использование пользовательских языковых файлов при работе с командным меню
Теперь мы знаем, что обозначает первая часть имени языкового файла. Давайте теперь разберемся, что означают четыре оставшиеся цифры в имени. Эти цифры, называются персональным идентификатором языкового файла. Этот идентификатор (ID) нужен для того, чтобы любой скрипт мог получить доступ к содержимому любого языкового файла. Осуществляется этот доступ по средствам инструкции load text, инструкция использует ID для того, чтобы определить к какому из имеющихся языковых файлов хочет получить доступ текущий скрипт. Х2 позволяет пользователю использовать до 1000, произвольных языковых файлов (например имена файлов: 70003.XML, 70004.XML, 70010.XML и т.д., кроме зарезервированных системных файлов 70001.XML и 70002.XML).
Пользовательские языковые файлы могут быть использованы для загрузки в Х2 описаний новых товаров, команд в меню, размещения шаблонов текстов и т.п., используемых игроком в своих скриптах. Для того чтобы было понятно рассмотрим небольшой файл пример:

Код:
  <?xml version="1.0" encoding="UTF-8" ?>
- <language id="7">
- <page id="2008" title="Script Object Commands" descr=" ">
  <t id="715">Команда_мой_скрипт</t>
  </page>
- <page id="2010" title="Script Cmd Names" descr=" ">
  <t id="715">Запуск моего скрипта</t>
  </page>
- <page id="2011" title="Script Cmd Shorts" descr=" ">
  <t id="715">Тест</t>
  </page>
  </language>

Как видите язык файла указан не только в имени файла, но и в теле самого файла.

Любой языковой файл (в том числе и 70001.XML) разделен на страницы (page id= ), и на текстовые идентификаторы внутри страницы (t id= ), то есть принцип папок и подпапок в обыкновенной файловой системе.

Прежде чем двигаться дальше, объясню как будут располагаться в памяти языковые файлы. Основным файлом описания является файл 70001.XML, он загружается в память при загрузке игры. Все языковые файлы создаваемые и используемые вами, загружаемые в память при помощи инструкции load text, будут дополнять или изменять, уже загруженный основной языковой файл 70001.XML, а ScE будет обращаться непосредственно к нему. Имейте в виду, что если два пользовательских языковых файла обратятся к одному и тому же текстовому ID на одной странице и изменят его значение, то актуальным будет то значение которое было записано последним.

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

2008
Эта страница содержит все мнемонические имена команд/сигналов. Мнемонические имена используются инструкциям для которых команды/сигналы являются параметрами. Примером таких инструкций служат global script map и set script command upgrade. Если вы используете в вашем скрипте какую нибудь из этих инструкций то при выборе команды/сигнала редактор отразит весь список мнемонических имен команд содержащихся на странице 2008 основного языкового файла.
2010
Эта страница содержит текст являющийся длинной версией имени команды. То есть этот текст отражаемся в виде пункта в меню. Также именно этот текст будет отражен в разделе команда информационного экрана и в разделе команда списка вашей собственности (при условии что в теле вызываемого будет присутствовать инструкция set command, иначе во всех информационных окнах вместо имя выполняемой команды будет отражаться «Нет команд»)
2011
На этой странице находятся короткие имена команд. Короткие имена отражаются в командном меню справа от длинных имен, тек же короткое имя команды отражается в верхней части экрана также справа от длинного имени в главном окне командного меню .

В нашем примере на странице 2008 мы заменяем мнемоническое имя команды COMMAND_TYPE_CUSTOM_15 находящиеся за текстовым идентификатором 715 на имя заданное нами Команда_мой_скрипт (обратите внимание на то, что после изменения мнемонического имени команды, при попытке выбрать ее через меню редактора, вы можете не обнаружить ее на старом месте. То есть между COMMAND_TYPE_CUSTOM_14 и COMMAND_TYPE_CUSTOM_16 причина тому, фильтр редактора который сортирует список по латинскому алфавиту), далее на странице 2010 по ID=715 записываем Запуск моего скрипта, а на странице 2011 в ID с тем же номером записываем короткое имя нашей команды «Тест». Языковой файл для команды COMMAND_TYPE_CUSTOM_15 создан. Теперь когда мы произведем инициализацию нашей команды (как это сделать рассмотрим дальше), в командном меню в разделе Выборочные команды будет отражен пункт меню с названием «Запуск моего скрипта», а чуть правее в квадратных скобках будет указано краткое имя команды [Тест].

Далее в таблице будут приведены команды, их тип и ID, меню в которых они располагаются.

Тип ID Меню Мнемоническое имя
Navigation 200 Командное меню, Навигация COMMAND_TYPE_NAV_00 to 31
Combat 300 Командное меню, Боевые COMMAND_TYPE_FIGHT_00 to 31
Trade 400 Командное меню, Торговые COMMAND_TYPE_TRADE_00 to 31
Special 500 Командное меню, Специальные COMMAND_TYPE_SPECIAL_00 to 31
Piracy 600 Командное меню, Пиратские COMMAND_TYPE_PIRACY_00 to 31
Custom 700 Командное меню, Выборочные COMMAND_TYPE_CUSTOM_00 to 31
General 800 Командное меню, Общие COMMAND_TYPE_GENERAL_00 to 31
Turret 900 Меню турелей (из основного меню) COMMAND_TYPE_TURRET_00 to 31
Station 1100 Командная консоль станций COMMAND_TYPE_STATION_00 to 31
Ship 1200 Дополнительные корабельные команды COMMAND_TYPE_SHIP_00 to 31

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

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

Код:
Script init.a
Version: 0
for Script Engine Version: 25
Description
Описание
Arguments
Source Text

001   load text: id=5
002   $command = Команда_мой_скрипт
003   global script map: set: key=$command, class=Корабль, race=Player, script='a.missile.fire',prio=0
004   global script map: ignore: key=$command, class=Дрон, race=Player
005   set script command upgrade: command=Команда_мой_скрипт  upgrade=[TRUE]
006   return null

В строке 001 загружаем языковой файл 70005.XML, 003 устанавливаем связь между командой и скриптом a.missile.fire, для подключения в меню Выборочных команд у объектов класса Корабль пункта который будет вызывать наш скрипт. 004 Исключаем из списка объектов, класс объектов Дрон. Устанавливаем наличие апгрейда необходимого для активации пункта в меню, в нашем случае значение [TRUE], то есть пункт будет активен всегда. Если все готово производим реинициализацию скриптового КЭШа как это было описано в разделе «Редактор скриптов». Если все правильно то в меню должен появиться Выборочных команд появится команда « Запуск моего скрипта»

 Пользовательские языковые файлы для создания текстовых шаблонов

Если вы взялись за создание какого либо скрипта, то вполне возможно, что вам понадобится вывести какие либо текстовые данные (яркий пример, это любой текст на русском языке. Х2 не позволяет вводить русские символы в редакторе скриптов). Для того чтобы использовать текстовые шаблоны или просто обойти запрет на введение русских символов можно также использовать языковые файлы. Давайте попробуем записать какой ни будь русскоязычный текст в бортовой журнал нашего корабля.
Для начала определим на какой странице, и какой “t id” нам надо использовать для хранения шаблона нашего текста. Принцип выбора прост. Шаблон можно хранить на любой доступной странице, следует лишь использовать уникальный “t id” , то есть открываем в IE файл 70001.XML и смотрим. На странице 1 (<page id="1" title="Root page" descr="">) имеется пять элементов с “t id” 1,2,3,5, 9999999 соответственно все “t id” между 5 и 9999999 свободны.
Воспользуемся этим. Открываем наш файл шаблон в блокноте и заполняем данными page id="1", " title="Root page” должно получиться следующее:


Код:
<?xml version="1.0" encoding="UTF-8" ?>
<language id="7">
<page id="1" title="Root page" descr=" ">
 <t id="100"> </t>
</page>
</language>

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

Код:
Script Print.main.rustext
Version: 0
for Script Engine Version: 25
Description
Print to logbook russian text
Arguments
Source Text

001   load text: id=6
002   write to player logbook: printf: pageid=1 textid=100, null, null, null, null, null
003   return null


Запускаем созданный нами скрипт. Выходим из редактора и открываем бортовой журнал и если вы правильно выполнили все действия, то в журнале будет новая запись с текстом «Это мой русскоязычный текст»
_________________
Звезды зовут...
    Добавлено: 19:21 25-01-2005   
XenonTomb
 250 EGP


Рейтинг канала: 1(9)
Репутация: 65
Сообщения: 867
Откуда: Николаев, Украина
Зарегистрирован: 17.03.2004
Поддержу инициативу учебника, дав подробно прокомментированный скрипт, написанный мною. Это скрипт захвата астероида xt.dp.asteroidcollector из пакета "XenonTomb Device Pack". Скрипт задействует самые разные команды: торговые, навигационые, общесистемные, аудио, бортжурнала и проч., использует операторы условного и безусловного перехода, циклы, языковые ресурсы, команды поиска и поэтому, как мне кажется, будет достаточно полезным для обучения. Сам скрипт можно скачать на страничке "Собрание скриптов пилотов". Номера фраз борткомпьютера можно поглядеть в MSCI Handbook на стр. 98. Убил на описание 2 часа, поэтому прошу заценить мой титанический труд Улыбка .

001 $ship = [THIS]

Передаем переменной $ship указатель на корабль, на котором запущен этот скрипт.

002
003 skip if $ship == [PLAYERSHIP]
004 return null

Проверяем, является ли корабль тем кораблем, в котором сидит игрок, если нет, то выходим из скрипта.

005
006 $loaded = $ship -> get amount of ware Астероид in cargo bay

Получаем в переменную $loaded количество товара "Астероид", предположительно имеющегося на борту.

007 skip if not $loaded
008 goto label unload.asteroid

Проверяем, если товар есть ($loaded>0, что соответствует логическому значению TRUE. Значение 0 считается FALSE), то переходим на метку unload.asteroid (строка 088), чтобы выполнить разгрузку. Если же товара нет, будем загружаться (скрипт выполняется дальше).

009
010 * ---------------------- LOADING --------------------- Это просто коментарий "ЗАГРУЗКА"
011
012 if not $ship -> get free amount of ware Астероид in cargo bay
013 @ = wait 2000 ms
014 = speak text: page=13 id=135 priority=0
015 = speak text: page=13 id=1253 priority=0
016 return null
017 end

Смысл этого блока сводится к следующему: в строке 012 проверяем, сколько товара "Астероид" может поместится в трюм на текущий момент. Можно было бы поступить по-другому: зная, что товар "Астероид" и меет размер 10000 ST, можно узнатькол-во свободного места, поделить его на 10000 и получить кол-во. Команда get free amount of ware позволяет нам не заниматься арифметикой, ничего не знать о возможности корабля перевозить груз ST, и даже не знать, какой размер имеет единица товара, а сразу получить кол-во. Далее, если места для товара нет (команда get free amount of ware вернула 0), то в строке 013 ждем 2 секунды (в это время борткомпьютер договаривает фразу "Автопилот активирован"), в строках 014 и 015 заставляем тетку сказать "Команда отклонена" и "Нехватает места в трюме", и в строке 016 выходим из скрипта. Если же место в трюме у нас есть (команда get free amount of ware вернула число >0), то продолжаем выполнять скрипт.

018
019 $target = get player tracking aim
020 skip if $target -> is of class Астероид
021 goto label not.correct

Получаем в переменную $target указатель на объект, который находится в прицеле к орабля. Далее проверяем, принадлежит ли этот объект классу "Астероид". Если объект - не астероид, переходим по метке not.correct (строка 118), иначе продолжаем выполнять скрипт.

022
023 $dist = get distance between $ship and $target
024 skip if $dist <= 3000
025 goto label not.correct

Получаем в переменную $dist расстояние в метрах между кораблем $ship и целью $target (астероид). Если расстояние более 3000 метров, переходим по метке not.correct, иначе продолжаем выполнять скрипт.

Теперь начинется интересное: выяснение жирности (значения yield) астероида. Задача усложняется тем, что нет функции, которая бы вернула это значение, поэтому придется извращаться. Извращаться мы будем в строках 027-049, используя цикл while.

026
027 $yield = 100
028 while $yield > 0
029 * ore
030 $aster = find asteroid: sector=[SECTOR] resourcetype=0 min.yield=$yield flags=[Find.Nearest] refobj=$ship maxdist=3000 maxnum=null refpos=null
031 if $aster
032 $res.type = 0
033 break
034 end
035 * silicon
036 $aster = find asteroid: sector=[SECTOR] resourcetype=1 min.yield=$yield flags=[Find.Nearest] refobj=$ship maxdist=3000 maxnum=null refpos=null
037 if $aster
038 $res.type = 1
039 break
040 end
041 * nividium
042 $aster = find asteroid: sector=[SECTOR] resourcetype=2 min.yield=$yield flags=[Find.Nearest] refobj=$ship maxdist=3000 maxnum=null refpos=null
043 if $aster
044 $res.type = 2
045 break
046 end
047 dec $yield =
048 @ = wait 5 ms
049 end

Разберем подробно. В строке 027 присвоим переменной $yield значение 100 - это наша точка отсчета, максимальная жирность. Это значение можно сделать и побольше, если существуют такие астероиды небольшого размера. Далее организуем цикл (строки 028-049), который будет выполняться, пока значение $yield будет больше 0. В строке 030 мы попытаемся найти ближайший астероид (флаг поиска - Find.Nearest) с типом ресурса "руда", минимальной жирностью $yield (в первом витке цикла равной 100), находящийся на расстоянии не более 3000 м от корабля $ship. Результат поиска функции find asteroid возвращается в переменную $aster. Далее в строках 031-034, если искомый астероид обнаружен (переменная $aster не равна null), то переменой $res.type мы присваиваем значение 0 (тип ресурса - руда), и прерываем цикл командой break. В строках 036-040 и 042-046 мы делаем то же самое, только для ресурсов "кремний" и "нивидиум" (типы ресурсов 1 и 2 соответственно). В строке 047 мы уменьшаем значение $yield на единицу перед следующим витком цикла. Строка 048 - простая задержка, чтоб интенсивные вычисления в цикле не затормаживали игру. Подитожим: цикл выполняется либо до того, как $yield достигнет значения 0 (это значит что мы не нашли астероид, что маловероятно), либо цикл прерывается на любом витке при нахождении астероида. Во втором случае переменная $yield сохранит значение жирности астероида - помним об этом!

050
051 skip if $aster == $target
052 goto label not.correct

Проверяем, совпадает ли наш найденый астероид с тем астероидом, который у нас вприцеле. Если нет, то переходим по метке not.correct, иначе продолжаем выполнять скрипт. Значения $aster и $target могут не совпасть лишь в двух случаях: если мы не нашли астероид в цикле ($aster=null), или если в 3000 м от корабля были два астероида с одинаковой жирностью, причем нецелевой астероид оказался немного ближе к кораблю, чем целевой, что также маловероятно.

053
054 $energy = $ship -> get amount of ware Кристаллы in cargo bay
055 skip if $energy >= 25
056 goto label not.correct

Получаем в переменную $energy количество кристаллов, находящихся в трюме корабля. Если их меньше 25, то переходим по метке not.correct, иначе движемся дальше.

057
058 $aster.type = $aster -> get subtype

Получаем в переменную $aster.type подтип нашего астроида, отвечающий за его внешний вид.

059 $aster.param = array alloc: size=3
060 $aster.param[0] = $res.type
061 $aster.param[1] = $yield
062 $aster.param[2] = $aster.type

Распределяем в памяти массив $aster.param из трех ячеек, которым присваиваем значения ресурса, жирности и подтипа астероида.

063 $ship -> set local variable: name='asteroid' value=$aster.param

Объявляем для корабля $ship локальную переменную 'asteroid'и присваиваем ей значение массива $aster.param.

064
065 $ID = $aster -> get SectorObject ID
066 free sector object $ID

Получаем в переменную $ID уникальный номер астероида в секторе, и уничтожаем его. При уничтожении он просто пропадает.

067
068 = $ship -> add 1 units of Астероид
069 = $ship -> add -25 units of Кристаллы

Добавляем в трюм корабля 1 единицу товара "Астероид", и убираем из трюма 25 кристаллов.

070
071 = speak text: page=13 id=1257 priority=0
072 = speak text: page=17 id=3721 priority=0

Заставляем борткомпьютер сказать "Теперь трюм содержит..." "Астероид".

073
074 $owner = [SECTOR] -> get owner race

Получаем в переменную $owner расу-владельца сектора, в котором находимся.

075 if $owner == Аргон OR $owner == Борон OR $owner == Сплит OR $owner == Паранид OR $owner == Телади
076 @ = wait 500 ms
077 $sum = $yield * -1000
078 add money to player: $sum
079 $sum = - $sum
080 player loses police licence for race $owner
081 write to player logbook: printf: pageid=511 textid=20, $owner, $sum, null, null, null
082 = speak text: page=13 id=20 priority=0
083 end

Если раса-владелец одна их перечисленных в строке 075, то ждем полсекунды; в строке 077 вычисляем сумму штрафа (жирность*-1000); в строке 078 снимаем эту сумму со счета игрока (команда add money добавляет отрицательное число); в строке 079 меняем знак у суммы штрафа; в строке 080 лишаем игрока лицензии расы $owner; в строке 081 записываем в бортжурнал игрока матюков от расы-владельца, подставляя в
текст расу и сумму штрафа; в строке 082 тетка говорит, что "Получено сообщение". Текст матюков берется из языкового файла пакета, который подгружается при инициализации скрипта (здесь мы это не рассматриваем).

084
085 return null

Все, погрузка завершена, выход из скрипта.

086
087 * ---------------------- UNLOADING --------------------- Коментарий "РАЗГРУЗКА"
088 unload.asteroid:

Это наша метка "разгрузка", на которую мы переходим из начала скрипта, когда обнаруживаем наличие астероида на борту.

089
090 $energy = $ship -> get amount of ware Кристаллы in cargo bay
091 skip if $energy >= 25
092 goto label not.correct

Проверяем, есть ли у нас 25 кристаллов для операции разгрузки. Если их меньше, то переходим по метке not.correct, иначе движемся дальше.

093
094 $aster.param = $ship -> get local variable: name='asteroid'

Читаем значение локальной переменной 'asteroid', и предаем его в массив $aster.param.

095 $res.type = $aster.param[0]
096 $yield = $aster.param[1]
097 $aster.type = $aster.param[2]

Присваиваем значения ячеек массива переменным ресурса, жирности и подтипа астероида. Мы с ними уже знакомы.

098
099 $x = $ship -> get x position
100 $y = $ship -> get y position
101 $z = $ship -> get z position

Получаем в соответствующие переменные значения координат корабля в секторе.

102 $x = $x + 2000
103 $y = $y + 2000
104 $z = $z + 2000

Увеличиваем значения координат на 2000 м каждую.

105 $aster = create asteroid: type=$aster.type addto=[SECTOR] resource=$res.

type yield=$yield x=$x y=$y z=$z

Создаем астероид в текущем секторе с необходимыми параметрами, с координатами х,у и z, и передаем указатель на астероид пременной $aster.

106 skip if $aster
107 return null

На всякий случай проверяем, создался ли астероид. Если нет ($aster=null), то выходим из скрипта. Это может произойти в случае, если мы не захватывали астероид как положено, а тупо добавили его в трюм командой add ware. Соответственно, у нас не будет нужных параметров астероида, хранящихся в локальной переменной 'asteroid'. Но ведь мы не читеры, так делать не будем!

108
109 = $ship -> add -1 units of Астероид
110 = $ship -> add -25 units of Кристаллы

Удаляем из трюма астероид и 25 кристалов.

111
112 @ = wait 2000 ms
113 = speak text: page=17 id=3721 priority=0
114 = speak text: page=13 id=5 priority=0

Борткомпьютер говорит: "Астероид" "выброшен".

115
116 return null

Все, выход из разгрузки.

117
118 not.correct:
119 @ = wait 2000 ms
120 = speak text: page=13 id=135 priority=0
121 return null

А вот и махонькая подпрограмма, в которыю мы переходим при ошибках. Здесь автопилот говорит "Команда отклонена" и происходит выход из скрипта.
_________________
Будут предложения - присылайте на расчетный счет :)
    Добавлено: 12:35 26-01-2005   
Vitalii
 955 EGP


чОрный борон
Рейтинг канала: 1(1)
Репутация: 249
Сообщения: 7214
Откуда: Тула
Зарегистрирован: 13.08.2002
От себя могу предложить следующую помощь:
1.Прикрепить темку вверху канала Гы-гы - done.
2.Вырезать отсюда все, не относящиеся к проекту. - done.
3.Выложить (или начать выкладывать) проект в разделе www.elite-games.ru/x2/scripts/
_________________
Связь - это как воздух, незаметна, пока не испортишь.
    Добавлено: 14:05 26-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
XenonTomb :
Поддержу инициативу учебника, дав подробно прокомментированный скрипт, написанный мною

Спасибо за материал, я планирую в учебнике создать раздел где и будут подробно коментированные скрипты пилотов, если у тебя есть версия твоего разбора заточенная под Word вышли ее мне на мыло dragonp@narod.ru.

Vitalii :
От себя могу предложить следующую помощь:
1.Прикрепить темку вверху канала - done.
2.Вырезать отсюда все, не относящиеся к проекту. - done.
3.Выложить (или начать выкладывать) проект в разделе www.elite-games.ru/x2/scripts/


Очень хорошо было бы прикрепить темку и вырезать весь офтоп.

Насчет начать выкладывать, еще рановато проект не прошел "мозговой атаки", думаю к этому можно будет приступить после того, как работа над ошибками будет завершена. А к этой работе я надеюсь в ближайшее время подключиться много пилотов, думаю не затянется.
_________________
Звезды зовут...
    Добавлено: 18:37 26-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Всем!!!

Я перестаю выкладывать в тему тексты глав (огромное количество времени уходит на форматирование) все главы на странице проекта http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./. Здесь Буду выкладывать отчеты о сделанных изменения и исправленных ошибках. Так что, читаем на станице проекта, а обсуждаем, советуем и исправляем ошибки здесь

С уважением DragonP.
_________________
Звезды зовут...
    Добавлено: 18:40 26-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Отчет о изменениях от 26\01\2005

1. В раздел «Языковые файлы XML в Х2» добавлена глава «Использование тег'ов в языковых файлах»
2. Создан раздел «Советы бывалого скриптописателя»
3. В раздел «Вступление» добавлена глава «Запасемся инструментом»
4. Описаны команды из раздела «Работа с бортовым журналом»

___________________________________________________________________

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 18:43 26-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Отчет о изменениях от 27\01\2005

1. Дополнено описание имен скриптов Galaxy.ShipInit
2. Описаны команды раздела "Аудио команды"
3. Создан раздел "Особенности некоторых команд" Написаны статьи "Особенности навигационных команд (FLY). Возвращаемый код FLRET" и "Организация глобального поиска объектов. Флаги поиска (Find)".
4. Начато описание команд раздела "Навигационные команды"


Требуется помощь в проверке описаний "Аудио команды". Все что связано с текстовкой работает правильно, насчет воспроизведения голосом не знаю (голос в моей Х2 пропал давным давно). Если ктото возьмется сообщите!!!

___________________________________________________________________

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 18:51 27-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Крикну, а в ответ тишина...

Grey Wolf вроде говорил, помогать надо..., а сам... Сообщил, что есть узкие места ха-ха
Grey Wolf :
И нашел места, где на мой взгляд, нужны комментарии и дополнения. Это те места, где стоят !!!

а указать, что за места. Или все что со знаком "!!!" узкое место Вау!

и вообще неужели никто не нашел, чего добавить... или ошибочки...(это ж тема, типа для того, чтобы дезу в учебник не писать А правила почитать? )

Так что, братья пилоты не пролетаем мимо. Подключаемся, подключаемся !!!


Ну все, выговорился...пошел дальше Писатель.
_________________
Звезды зовут...
    Добавлено: 14:34 28-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Loeron :
Впринцепе то что у тебя там пока написано можно дополнить, расширить просто переводом MSCIHandbook.pdf

Не основе этой книги и составляю, но чем глубже копаешь тем больше дыр находишь. Многие команды описаны не полностью или не все варианты возвращаемых значений. Есть вобще как "не используемые", а я их в рабочих скриптах видал. Например get tactical, set tactical. в скрипте AUTOTRADE V.6 точно используется, а разобраться времени не хватает. Хочется основную работу, до конца довести, чтобы пользоваться все могли. А там уже дополнять, да поправлять.
_________________
Звезды зовут...
    Добавлено: 19:17 28-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Отчет о изменениях от 28\01\2005

1. Все тоже Писатель. команд раздела "Навигационные команды"
2. Создан раздел "Статьи пилотов", занесена статья пилота aka ANS "Station Manager"



___________________________________________________________________

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 19:22 28-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Отчет о изменениях от 30\01\2005

1. Реконструирована построение глав => Добавлен раздел "Ведение в скриптописание"
2. Добавлена статья "Операции" (описывающая все знаки операций)


___________________________________________________________________

Страница проекта «Скрипты - это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 09:27 31-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Если кто знает, подскажите где используются и на что указывают константы:
SSTYPE_BULLET
SSTYPE_SPACE
SSTYPE_BACKGROUND
SSTYPE_SUN
SSTYPE_PLANET
SSTYPE_DOCK
SSTYPE_FACTORY
SSTYPE_SHIP
SSTYPE_LASER
SSTYPE_SHIELD
SSTYPE_ROCKET
SSTYPE_W_ENERGY
SSTYPE_W_NATURAL
SSTYPE_W_BIO
SSTYPE_W_FOOD
SSTYPE_W_MINERALS
SSTYPE_W_TECH
SSTYPE_ASTEROID
SSTYPE_WARPGATE
SSTYPE_CAMERA
SSTYPE_SPECIAL
SSTYPE_NEBULA
SSTYPE_INSTATION
SSTYPE_DUMMY
SSTYPE_COMMAND
SSTYPE_COCKPIT
SSTYPE_DATATYP
_________________
Звезды зовут...
    Добавлено: 09:28 31-01-2005   
DragonP
 280 EGP


Рейтинг канала: 2(24)
Репутация: 108
Сообщения: 527
Откуда: Новосибирск
Зарегистрирован: 18.12.2004
Отчет о изменениях от 31\01\2005

1. Все тоже описание навигационных команд.
2. В раздел "Статьи пилотов" добавлена статья предоставленная XenonTomb "Скрипт захвата астероидов"
3. Добавлена статья "Константы" в раздел Введение
4. Описаны команды работы с галактикой


___________________________________________________________________

Страница проекта «Скрипты- это легко» http://www.Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./
_________________
Звезды зовут...
    Добавлено: 19:02 31-01-2005   
Канал X2: The Threat: «Скрипты - это легко...»
На страницу: 1, 2, 3, 4, 5, 6, 7, 8  След. | Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Пил, пока соображал. Пока ехал - опять соображать начал. (Pastor Shlagge)

  » Скрипты - это легко... | страница 1
Каналы: Новости | 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