|
|
|
Канал X3: Reunion »
Модовый и скриптовый отсек X3: Reunion: «Скриптописание - делимся опытом, задаем вопросы» |
|
|
l0m
340 EGP
    Репутация: 87 Сообщения: 1062
Зарегистрирован: 18.03.2006
 |
|
sergej4341 : |
как текст конечно писать сложнее
|
именно для этого есть возможность самому длинному и самому уникальному имени во вселенной Х придать самое удобное и самое легкоусваиваемое имя в конкретном модуле скрипта. В самом верху, в шапке можно написать что-то типа name='супер.пупер.сложное.имя.глобальной.переменной.используемой.пару.раз.за.весь.скрипт'
более того, можно то имя передавать из модуля в модуль, во избежание ошибок, и, что самое приятное, теперь его можно выбирать из списка.
а о чём говорим-то? Вроде как вопрос решён.
|
|
|
void_main(){}
77 EGP
 Репутация: 15 Сообщения: 165 Откуда: Планета Земля Зарегистрирован: 04.12.2006
 |
|
Привет. У меня есть очень хороший вопрос по реализации диалоговых окон. Т.е. к примеру, пользователь(правильнее наверно игрок) выбрал команду в меню корабля. Ему приходит сообщение с запросом. Как мне узнать, кокой ответ из предложенных выбрал пользователь? В учебники скриптов по этому поводу ниче не написано...
_________________ Последний раз редактировалось: void_main(){} (14:20 07-05-2011), всего редактировалось 5376209 раз |
|
|
Andrei [<>Ace]
303 EGP
   Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006
 |
|
void_main(){} : |
Привет. У меня есть очень хороший вопрос по реализации диалоговых окон. Т.е. к примеру, пользователь(правильнее наверно игрок) выбрал команду в меню корабля. Ему приходит сообщение с запросом. Как мне узнать, кокой ответ из предложенных выбрал пользователь? В учебники скриптов по этому поводу ниче не написано...
|
Еще один человек задался подобным вопросом. Трейтим будешь .
Посмотри скрипт
дроида ULiX-а найдешь здесь
или мой Пакет скриптов V2 и UMC
или вот этот «Find Ships in Galaxy»
Будет нагляднее.
Есть команда:
send incoming question <Var\String> to player: callback= <Script>
<Var\String> диалоговое окно. Его нужно создать самому.
<Script> скрипт который обработает ответ из диалога.
Есть недостаток - весь диалог пишеться в журнал.
Как создать кнопки, описано в учебнике, там написано, что они не работают - уже работают.
|
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Вопрос, можно ли через
Код: |
register hotkey <Hot Key> to call script <Script Name>
|
использовать конструкцию
Код: |
call script <Script Name>:<Parameter>
|
.
т.е. имеет место быть несколько скриптов, однотипных, не хочется их держать в отдельных файлах, а сделать один и вызывать с параметром.
_________________ Умножим энтропию на 0 :-) |
|
|
Andrei [<>Ace]
303 EGP
   Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006
 |
|
Chem : |
Вопрос, можно ли через
Код:
register hotkey <Hot Key> to call script <Script Name>
использовать конструкцию
Код:
call script <Script Name>:<Parameter>
.
т.е. имеет место быть несколько скриптов, однотипных, не хочется их держать в отдельных файлах, а сделать один и вызывать с параметром.
|
Напрямую нет. А через глобальные переменные много чего сделать можно.
|
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Andrei [<>Ace] : |
Напрямую нет. А через глобальные переменные много чего сделать можно.
|
А можешь немного подробнее, или послать в какой-нибудь скрипт, где это используется?
И еще, такой вопрос.
Количество турелей, посадочных мест в них у корабля, определить в скрипте можно. Установленное оружие тоже. А вот как узнать из скрипта название турели ? Т.е. носовая, кормовая, и т.п. ?
_________________ Умножим энтропию на 0 :-) |
|
|
Andrei [<>Ace]
303 EGP
   Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006
 |
|
Chem : |
А можешь немного подробнее, или послать в какой-нибудь скрипт, где это используется?
|
Смысл в том, что создается глобальная переменная, в нее записывается нужный пораметр, по горячей клавише вызывается скрипт и считывает эту глобальную переменную.
Ну посмотри скрипт про "горячие клавиши" новый, из пакета v2. Там наверно небольшая ошибочка есть но смысл понять можно.
Chem : |
Т.е. носовая, кормовая, и т.п. ?
|
Вот выдержка из учебника.
Код: |
<RetVar/IF> <object> fire lasers on target <target> using turret <turretid>
Дать команду <object> «стрелять лазерами» по цели <target> используя орудийную башню <turretid> . Если номер турели установлен как 0, то выстрел будет сделан из носового орудия, независимо от того находится цель target в зоне поражения или нет орудия все равно выстрелят и команда вернет [TRUE]. Если команда дана для выстрела именно из турели (номера больше 0), то следует позаботиться чтобы цель была в зоне видимости данной турели (именно видимости, точнее турель должна быть лицом к объекту), расстояние значения не имеет, если направленность правильная то будет сделан выстрел и функция вернет [TRUE]. В случае если цель вне зоны видимости, выстрела не произойдет и возвращаемое значение будет [FALSE].
В таблице указаны соответствующие номерам турели
0 Центр (носовые)
1 Носовая
2 Кормовая
3 Левая
4 Правая
5 Верхняя
6 Нижняя
Возвращаемые значения: TRUE (1) или FALSE (null)
<RetVar>=<ship> get max. number of lasers in turret <turret>
Получить число лазеров в турели <turret> корабля <ship>. Также, если установить turret=0, то вернет количество носовых орудий.
<RetVar>=<ship> get laser type in turret <turret> at slot <slot>
Возвращает тип пушки установленной на корабле <ship>, на турели <turret>, в слоте <slot>. Нумерация слотов начинается с 0 и идет слева на право. Например, если turret=0 slot=0, то инструкция вернет тип пушки левого носового орудия.
|
Если не то читай учебник, что-нить подходящее найдешь.
|
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Andrei [<>Ace] : |
Chem : |
А можешь немного подробнее, или послать в какой-нибудь скрипт, где это используется?
|
Смысл в том, что создается глобальная переменная, в нее записывается нужный пораметр, по горячей клавише вызывается скрипт и считывает эту глобальную переменную.
Ну посмотри скрипт про "горячие клавиши" новый, из пакета v2. Там наверно небольшая ошибочка есть но смысл понять можно.
|
Ок, спасибо, посмотрю.
Посмотрел, понял. Так собственно и думал . Спасибо!
Andrei [<>Ace] : |
Chem : |
Т.е. носовая, кормовая, и т.п. ?
|
Вот выдержка из учебника.
Код: |
<RetVar/IF> <object> fire lasers on target <target> using turret <turretid>
В таблице указаны соответствующие номерам турели
0 Центр (носовые)
1 Носовая
2 Кормовая
3 Левая
4 Правая
5 Верхняя
6 Нижняя
<RetVar>=<ship> get laser type in turret <turret> at slot <slot>
Возвращает тип пушки установленной на корабле <ship>, на турели <turret>, в слоте <slot>. Нумерация слотов начинается с 0 и идет слева на право. Например, если turret=0 slot=0, то инструкция вернет тип пушки левого носового орудия.
|
Если не то читай учебник, что-нить подходящее найдешь.
|
Спасиб, это я нашел ,но понимаешь какая фишка получается,
вот тут в скрипте
для работы с турелями (запоминание , сохранение, сброс состояния) используется цикл.
Код: |
109 $i = 0
110 $turret = [PLAYERSHIP] -> get number of turrets
111 while $i < $turret
112 $j = 0
113 $laserbays = [PLAYERSHIP] -> get max. number of lasers in turret $i
114 while $j < $laserbays
115 $laser = [PLAYERSHIP] -> get laser type in turret $i at slot $j
116 append $laser to array $weapon
117 inc $j =
118 end
119 inc $i =
120 end
|
т.е. получается, если в корабле только "Основная" и "Кормовая", то число тарретов 2, и от просмотрит айдишки от 0 до 1.
А по учебнику - надо получается просмотреть все, от 0 до 6.
Да и с названиями получается странно, я например на Гиперионе летаю,
так там кроме основной 2 передних, две задних, и под учебник никак
З.Ы. Это я просто рассуждаю, а не претензии предъявляю. (я просто разместил объяву )
_________________ Умножим энтропию на 0 :-) |
|
|
Andrei [<>Ace]
303 EGP
   Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006
 |
|
Chem : |
т.е. получается, если в корабле только "Основная" и "Кормовая", то число тарретов 2, и от просмотрит айдишки от 0 до 1.
А по учебнику - надо получается просмотреть все, от 0 до 6.
|
$turret = [PLAYERSHIP] -> get number of turrets - вернуть количество турелей на корабле, если их две значит 2 если шесть значит 6.
$laserbays = [PLAYERSHIP] -> get max. number of lasers in turret $i - получить количество лазеров в турели.
Chem : |
так там кроме основной 2 передних, две задних, и под учебник никак
|
Сдвоенная передняя, Сдвоенная задняя.
Код: |
<RetVar>=<ship> get max. number of lasers in turret <turret>
Получить число лазеров в турели <turret> корабля <ship>. Также, если установить turret=0, то вернет количество носовых орудий. |
|
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Andrei [<>Ace] : |
Chem : |
т.е. получается, если в корабле только "Основная" и "Кормовая", то число тарретов 2, и от просмотрит айдишки от 0 до 1.
А по учебнику - надо получается просмотреть все, от 0 до 6.
|
$turret = [PLAYERSHIP] -> get number of turrets - вернуть количество турелей на корабле, если их две значит 2 если шесть значит 6.
$laserbays = [PLAYERSHIP] -> get max. number of lasers in turret $i - получить количество лазеров в турели.
Chem : |
так там кроме основной 2 передних, две задних, и под учебник никак
|
Сдвоенная передняя, Сдвоенная задняя.
Код: |
<RetVar>=<ship> get max. number of lasers in turret <turret>
Получить число лазеров в турели <turret> корабля <ship>. Также, если установить turret=0, то вернет количество носовых орудий. |
|
Ок. В общем не зная подробно всех моделей кораблей, определить как она у него называется получается нельзя. Ладно, фиг с ним
З.Ы. ну они редиски, нет чтоб доку полную сделать на скрипты (это про ЕС).
_________________ Умножим энтропию на 0 :-) |
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Новый вопрос
Продолжаю копаться в скриптах как таковых
И вот была идея в группы оружия дополнительно сохранять текущее состоянии команд Турелей.
Нашел как стартовать команду в стеке Турелей
Учебник ... : |
Задачи 1-6 (Task 1-Task 6) на объектах-кораблях служат для запуска скриптов управления турелями больших кораблей. Номер задачи соответствует номеру турели в консоли управления турелями.
<RefObj> start task <Var/Number1> with script <Script Name> and prio <Var/Number2>: arg1=<Value1> arg2=<Value2> arg3=<Value3> arg4=<Value4> arg5=<Value5>
Запускает скрипт <Script Name> в стеке Task <Var/Number1> объекта <RefObj> с приоритетом <Var/Number2> и параметрами <Value1> ... <Value5>, при этом вытеснив (удалив) все остальные скрипты из этого же стека.
<RefObj> interrupt task <Var/Number1> with script <Script Name> and prio <Var/Number2>: arg1=<Value1> arg2=<Value2> arg3=<Value3> arg4=<Value4>
Формирует запрос на прерывание (см. IntReq в статистике объекта) скриптом <Script Name> в стеке Task <Var/Number1> объекта <RefObj> с приоритетом <Var/Number2> и параметрами <Value1> ... <Value4>, но только при условии, что в соответствующем стеке уже запущен хоть 1 скрипт и указанный приоритет <Var/Number2> выше приоритета активного в данном стеке скрипта.
<RetVar/IF>get task ID
Возвращает номер стека на объекте, в котором выполняется текущий скрипт. Когда вы пользуетесь командами из главного меню, «Торговые», «Навигационные», «Боевые» и т.д. то запускаемые скрипты имеют свой Task ID.
|
А вот как определить, какой скрипт сидит в данный момент в стеке данной Турели ?
Или тапки ?
_________________ Умножим энтропию на 0 :-) |
|
|
Andrei [<>Ace]
303 EGP
   Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006
 |
|
Chem : |
А вот как определить, какой скрипт сидит в данный момент в стеке данной Турели ?
|
Скриптовыми командами видно никак, ну или методом перебора с помощью команды :
Код: |
<RetVar/IF> <RefObj> is script <Script Name> on stack of task <Var/Number>
Позволяет узнать, не выполняется ли скрипт <Script Name> (выбирается из списка имеющихся в папке scripts) в стеке <Var/Number> указанного объекта <RefObj>. |
А визуально смотреть, где и все запущенные на объекте скрипты.
|
|
|
whirlwind
77 EGP
 Рейтинг канала: 4(57) Репутация: 26 Сообщения: 338 Откуда: Spb Зарегистрирован: 18.02.2005
 |
|
get number of resources per cycle for ware работает правильно для фабрик, но для комплексов всегда возвращает null. Хочу рассчитать стоимость производственного цикла. Есть какая нибудь другая возможность получить кол-во ресурса на цикл? Может как то выдрать фабрики из комплекса или еще чего подобное?
|
|
|
sergej4341
460 EGP
  Рейтинг канала: 5(139) Репутация: 148 Сообщения: 1593 Откуда: Химки/Брест Зарегистрирован: 16.01.2004
 |
|
хелпь
Код: |
034 $flags = [Find.Enemy] | [Find.Multiple]
035 $enemy.array = find ship: sector=$control.sector class or type=Мобильный корабль race=null flags=$flags refobj=null maxdist=null maxnum=99 refpos=null |
$control.sector равна удаленному сектору (трасировка это подтверждает)
в этом секторе гарантированно есть пират, он в космосе
на выходе в $enemy.array всегда null
если
Код: |
034 $flags = [Find.Multiple] |
выдается весь массив кораблей, только не проверял его, есть ли в этом массиве этот пират
если
Код: |
034 $flags = [Find.Enemy] |
опять же результат поиска null
запускал скрипт на своем корабле с устанвками Пират Чужой
что не так? почему поиск с таким флагом не возвращает этого долбанного пирата?
зы пришлось городить цикл на перебор в команде поиска всех рас с явным указанием в $race = Пират и поочередно всех остальных ксенов, хааков и Джулиана
т.е. type=Мобильный корабль race=$race
_________________ нажал клав. и затаил дыхание |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Ответ: refobj=null. Enemy смотрится по настройкам этого самого refobj.
_________________ Не спешите меня. |
|
|
Chem
780 EGP
          Рейтинг канала: 15(2610) Репутация: 248 Сообщения: 4751 Откуда: Киев Зарегистрирован: 08.01.2007
 |
|
Еще вопрос:
Есть необходимость в скрипте выводить некую информацию в цикле, с одинаковым форматированием, например
Код: |
$i = 0
while $i < $max
...
$out= sprintf: pageid= $page.id textid= 20000, $text, null, ...
...
end
|
имеет ли смысл сделать так:
Код: |
$i = 0
$fmt = read text: page= $page.id id= 20000
while $i < $max
...
$out= sprintf: fmt=$fmt, $text, null, ...
...
end
|
Или лучше не плодить переменных ?
Что скажут скриптеры со стажем ?
----- upd -----
Спасибо всем!
Начал делать по привычке, подгружая данные, чтобы на диск не лазил. А потом задумался, почитал, понял что оно языковые файлы к тому моменту подгружает в оперативку. Потому и спросил.
Еще раз спасибо, пойду оптимизировать
_________________ Умножим энтропию на 0 :-) |
|
|
Andrei [<>Ace]
303 EGP
   Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006
 |
|
Chem : |
Что скажут скриптеры со стажем ?
|
Вопервых малопонятен вопрос и вообще мало информации.
По мне второй вариант не рационален, если подходит первый.
|
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Andrei [<>Ace] : |
Вопервых малопонятен вопрос и вообще мало информации.
|
Вопрос, видимо, в том, какой код будет исполняться быстрее. В первом случае каждую итерацию происходит чтение формата с языковой страницы, во втором случае формат берётся из локальной переменной. Имхо - одинаково, поскольку и то, и другое находится в оперативной памяти. Ну, может, немножко быстрее второе - там выборку из памяти по адресу делать не надо
_________________ Не спешите меня. |
|
|
dim
85 EGP
 Рейтинг канала: 3(27) Репутация: 16 Сообщения: 304 Откуда: Москва, Россия Зарегистрирован: 31.08.2004
 |
|
ИМХО, второй правильнее.
Конечно зависит от числа циклов и размера повторяемого текста. И на малом числе циклов выигрыша не увидишь.
Можно легко проверить: поставь MAX побольше (1 000 000) и возьми по окончании время
Думаю, результат тебя потрясёт...
_________________ Слон космический, занесён в Красную и другие книги.
Добрый и ласковый, но "крыс" не люблю! |
|
|
AlexYar
1916 EGP
               Рейтинг канала: 13(2096) Репутация: 325 Сообщения: 32767
Зарегистрирован: 26.10.2003
 |
|
dim : |
ИМХО, второй правильнее.
|
Нет, правильнее первый, потому что:
1. Скорость выполнения одинаковая, потому что делаешь одно и то же (проверял на 5000 циклах, больше ждать надоело).
2. Экономия памяти и сейвов на размер одной переменной.
3. Меньше строк в скрипте.
4. Лучше читаемость скрипта.
2all: Кстати, при 140 фпс задержка в 1 мс в команде "wait 1 ms" равна на самом деле 7 мс
1000 раз цикл перебирается за 7 секунд, а 5000 за 35. Это если без вышеприведенных примером операций (просто пустой цикл). А вместе с ними - за 36 секунд
Т.е. можно легко рассчитать примерное время выполнения скрипта с долгими циклами, типа поиска и перебора станций и т.д.
|
|
|
|
|
|
Канал X3: Reunion ->
Модовый и скриптовый отсек X3: Reunion: «Скриптописание - делимся опытом, задаем вопросы» |
|