На сайте онлайн (человек): 80 
|  |
|
 | |
Урок 10. Разбираем скрипт Точка-в-точку Здесь, как и в 7 уроке я не бу... |  |
|  |
 | |
|
Terran Conflict (X3TC) / Форум / Скрипты и моды для X3 Terran Conflict / Учимся простейшим скриптам
|
Урок 10. Разбираем скрипт "Точка-в-точку"
Здесь, как и в 7 уроке я не буду составлять табицу. Как можно догадаться из названия, я буду объяснять структуру этого скрипта и пары инициализирующих. П.С. Код не оптимизирован, но работает)
Часть I. Основной скрипт
Для начала взглянем на него:
 Ссылка на сам скрипт внизу. Разбираем: В верхней части название, версия, описание.
Arguments (Аргументы): Именно это спрашивается у нас, когда запускается скрипт, т.е. просит выбрать сектор и позицию. То что мы ввели ввели записывается в переменную $sector типа Массив.
Source Text (код): непосредственно исполняемая часть скрипта. Поехали попорядку:
| Код:- 001 $ship=[PLAYERSHIP] -> get ware type code of object
- 002 if$ship != Экспериментальный шаттл
- 003 |=speak text: page=17 id=3983 priority=2
- 004 |=speak text: page=13 id=1356 priority=2
- 005 else
- ...
- 061 end
- 062 return null
|
| |
001 - мы получаем тип объекта, в котором находится игрок и записываем полученное знасение в переменную $ship 002 - "если (if) значение переменной шип($ship) не равно (!=) Экспериментальный шаттл", то тут возможно два варианта: TRUE (далее "T") или FALSE (далее "F"), т.е. если условие выполняется (T), то выполняются строчки, идущие до else (иначе). Если условие не выполняется (F), то выполняются строчки от else до end. при выполнении 003 и 004 бортовой компьютер произносит (далее "Бетти") фразу "Прыжковый двигатель... не отвечает". По идее именно эта часть скрипта определяет является ли корабль Экспериментальным Шаттлом.
| Код:- 006 |$currshield=[PLAYERSHIP] -> get current shield strength
- 007 |$maxshield=[PLAYERSHIP] -> get maximum shield strength
- 008 |if$maxshield > 0
- 009 ||if$currshield >= $maxshield / 2
- ...
- 055 ||else
- 056 |||=speak text: page=13 id=1100056 priority=10
- 057 ||end
- 058 |else
- 059 ||=speak text: page=13 id=1100056 priority=10
- 060 |end
|
| |
Сейчас нам нужно узнать достаточно ли энергии щита для прыжка: 006 Получаем значение текущей энергии щита (в джоулях) 007 Получаем маскимальное значение щита (в джоулях) 008 Т.к. если на корабле щита вообще не будет, то и энергия будет отсутствовать. Проверяем установлен ли щит. Если T, то идем дальше, если F, то переходим к 58 строке, где бетти говорит, что недостаточно энергии. И переходим к 62 строке, т.е. аборт. 009 Проверяем выше ли текущий щит 50%. Если T, то идем дальше. Если F - "Недостаточно энергии" и аборт. Строки 057 и 060 завершают работу оператора условного перехода (т.е. if). Строки 055 и 058 - "иначе". Больше к ним возвращаться не будем.
| Код:- 010 |||$x=$sector[0]
- 011 |||$y=$sector[1]
- 012 |||$z=$sector[2]
- 013 |||$sector=$sector[3]
- 014 |||=speak text: page=13 id=6 priority=3
- 015 @ |||=wait randomly from 1500 to 2500 ms
- 016 |||$batery=[PLAYERSHIP] -> needed jump drive energy for jump to sector $sector
- 017 |||$bateryest=[PLAYERSHIP] -> get volume of ware Батареи in cargo bay
- 018 |||if$bateryest >= $batery
- ...
- 052 |||else
- 053 ||||=speak text: page=13 id=1100056 priority=10
- 054 |||end
|
| |
010 - 013 записываем координаты в переменные. 014 - бетти говорит: "Наведение на цель" 015 - задержка от 1,5-2,5 сек. (типа наведение ) 016 - получаем необходимое кол-во батарей для прыжка в целевой сектор 017 - получаем кол-во батарей в трюме. 018 - сравниваем. Если в трюме батарей больше либо равно необходимому кол-ву, то получаем T и идем дальше, если F, то "Энергии не хватает" и аборт.
| Код:- 019 ||||$jumps=$batery / 5
- 020 ||||$veroyat= = random value from 0 to 6 - 1
- 021 ||||if$veroyat != 0
- ...
- 029 ||||else
- ...
- 051 ||||end
|
| |
019 - получаем кол-во прыжков 020 - Вот он ВЕЛИКИЙ И МОГУЧИЙ НЕМЕЦКИЙ РАНДОМ! 021 - если рандомное число не 0, то начинает выполняться прыжок туда, куда нужно. 029 - Если рандомное число 0, то начиает выполняться прыжок с отклонением от заданного курса 051 - завершает условие
| Код:- 022 |||||=speak text: page=13 id=1294 priority=3
- 023 |||||=[PLAYERSHIP] -> use jump drive: target=$sector
- 024 |||||[PLAYERSHIP] -> set position: x=$x y=$y z=$z
- 025 |||||$shield=[PLAYERSHIP] -> get maximum shield strength
- 026 |||||$shield=$shield / 20
- 027 |||||[PLAYERSHIP] -> set current shield strength to $shield
- 028 |||||=speak text: page=13 id=1100014 priority=1
|
| |
022 - бетти говорит: "Готово" (наведение на цель) 023 - прыжок 024 перемещение корабля по заданным координатам. Дело в том, что в 023 строке target (цель) может быть или врата или сектор. Если сектор, то вы появляетесь в его центре. А мы прыгаем по координатам. 025 - получаем макс. мощность. 026 - делим на 20. 027 - устанавливаем щиты корабля на одну двадцатую от макс энергии щита. 028 - бетти: "Бортовой компьютер ожидает новых команд" 051 - аборт
| Код:- 030 |||||=speak text: page=13 id=1351 priority=1
- 031 |||||=speak text: page=13 id=1282 priority=1
- 032 |||||$randsect= find a random sector: startsector=$sector, jumps=$jumps, owner=null
- 033 |||||=[PLAYERSHIP] -> use jump drive: target=$randsect
- 034 |||||$x= = random value from 0 to 100000 - 1
- 035 |||||$y= = random value from 0 to 100000 - 1
- 036 |||||$z= = random value from 0 to 100000 - 1
- 037 |||||[PLAYERSHIP] -> set position: x=$x y=$y z=$z
- 038 |||||[PLAYERSHIP] -> set current shield strength to 0
- 039 |||||$damage= = random value from 0 to 10 - 1
- 040 |||||$hull=[PLAYERSHIP] -> get hull
- 041 |||||$hullperc=$hull / 100 * $damage
- 042 |||||$hull=$hull - $hullperc
- 043 |||||[PLAYERSHIP] -> set hull to $hull
- 044 |||||=speak text: page=13 id=1280 priority=1
- 045 @ |||||=wait 1000 ms
- 046 |||||=speak text: page=13 id=1270 priority=1
- 047 @ |||||=wait 1000 ms
- 048 |||||=speak text: page=13 id=1324 priority=1
- 049 @ |||||=wait 1000 ms
- 050 |||||=speak text: page=13 id=1100014 priority=0
|
| |
030-031 - опять бетти 032 - еще один рандом. Теперь рандомный сектор. Макс удаление - энергия, деленная на пять, необходимая для прыжка. 033 - прыжок 034-036 - получение случайных координат 037 перемещение корабля по координатам 038 - снимаем щит 039 - опять рандом - процент повреждения корпуса 040-043 - повреждаем корпус 044-050 - проверка корабля и задержка.
Ну вот. Основной скрипт готов. Теперь надо его офрмить:
Часть II. Текстовый файл
В текстовом файле находятся все тексты из игры. Текстовый файл хранится в расширении *.xml. Приступим: Создадим блокнотом в папке t файл формата ХХХХ-L0YY.xml, где ХХХХ - id файла (у меня 4531), а YY - язык (07 - Русский). Шаблон текстового файла:
| Код:- <?xml version="1.0" encoding="UTF-8" ?>
- <language id="7">
-
- <page id=" " title=" " descr=" ">
- <t id=" "> </t>
- </page>
- </language>
|
| |
Внимание! Пересохраните документ, указав в кодировке UTF-8 Если посмотреть, то структура его проста. Но для редактирования я предпочитаю программу XML Notepad. Она на английском. Как редактировать вы разберетесь. Вот мануал. Не смотрите, что для Х2. В Х3 практичеки ничего не поменялось.
Часть III. Инициализация
Скрипт инициализации команды и текстового файла (назовем его setup.masltrime.jump.text(!!!Внимание! префикс setup. (с точкой) очень важен!):
| Код:- 001 load text: id=4531
- 002 $command=COMMAND_TYPE_SHIP_55
- 003 global script map: set: key=$command, class=M3, race=Player, script='Malstrime.Jump', prio=1
- 004 set script command upgrade: command=$command upgrade=Прыжковый двигатель
- 005 return null
|
| |
001 - подгружаем текстовый файл, id которго мы указали в названии текстового файла. 002 - присваиваем переменной команду COMMAND_SHIP_TYPE_55 003 - устанавливаем связь между командой и скриптом (класс корабля - М3, владелец - Игрок) 004 - ограничиваем появление команды на кораблях, на которых отсутствует джампдрайв 005 - аборт строку 004 можно повторять несколько раз для более точного фильтра. Команде COMMAND_SHIP_TYPE_55 соответствует номер 1255 (12 - допонительные, 55 - порядковый номер).
Часть IV. Дорабатываем тесктовый файл
Открывем текстовый файл. Нам нужно четыре страницы. Копипастим, чтобы было вот так:
| Код:- <?xml version="1.0" encoding="utf-8"?>
- <language id="7">
- <page id=" " title=" " descr=" ">
- <t id=" "></t>
- </page>
- <page id=" " title=" " descr=" ">
- <t id=" "> </t>
- </page>
- <page id=" " title=" " descr=" ">
- <t id=" "></t>
- </page>
- <page id=" " title=" " descr=" ">
- <t id=" "> </t>
- </page>
- </language>
|
| |
Меняем значения, чтобы было вот так:
| Код:- <?xml version="1.0" encoding="utf-8"?>
- <language id="7">
- <page id="2010" title="Script Cmd Names" descr=" ">
- <t id="1255">Полное имя</t>
- </page>
- <page id="2011" title="Script Cmd Shorts" descr=" ">
- <t id="1255">Краткое имя</t>
- </page>
- <page id="2022" title="Command Info" descr=" ">
- <t id="1255">Описание (любой текст)</t>
- </page>
- <page id="2008" title="Script Object Commands" descr=" ">
- <t id="1255">Malstrime_Jump</t>
- </page>
- </language>
|
| |
| Код:- <page id="2010" title="Script Cmd Names" descr=" ">
|
| |
2010 - это полное имя команды, 2011 - краткое, 2022 - описание, 2008 - название команды (в РС) Script Cmd Names и другие - имена. Их надо ставить в соответствии с id страницы. descr роли не играет
1255 - id текста для команды под таким же id. Заполняем поля текста. Сохраняем. Тесктовый файл готов.
Часть V. Дорабатываем инициализирующий скрипт Переименуйте имя скрипта setup.malstrime.jump.text в !setup.malstrime.jump.text Откройте этот скрипт блокнотом. Вверху ищите <name>setup.malstrime.jump.text</name>. Точно также добавьте ! Внизу найдите:  И тоже добавтьте !. Сохраните. Вот впринципе и все. Удачи! "Точка-в-точку"
Урок закончен. |
|
дерево темы → Учимся простейшим скриптам
Учимся простейшим скриптам »
Список игр
|  |
|  |
 |  |  | |
| | | |
|  |