Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » Скрипт-школа (Задачи для начинающих скриптописателей) | страница 6
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

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

   Страница 6 из 10
На страницу: Пред.  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  След. | Все страницы
Поиск в этой теме:
Канал X3: Reunion » Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)»
Нужна ли школа скриптописателей
Да. чем нас больше, тем игра веселее
95%
 95%  [ 65 ]
Нет, развелось вас.
4%
 4%  [ 3 ]
Всего проголосовало : 68
WhiteWolf
 55 EGP


Рейтинг канала: 2(13)
Репутация: 0
Сообщения: 53

Зарегистрирован: 24.10.2007
Andrei [<>Ace] :
Но вроде не выполним физически. Астероиды разрушены будут, а вот от обломков не избавиться. В неактивном секторе обломки условны, а в активном секторе корабль без игрока автоматически по обломку не попадет.

А как же тогда быть с вот этим <RetVar/IF><RefObj> move to debris/asteroid <Value> and turn turret <Var/Number> to target: timeout=<Var/Number>? Ну и потом дать команду турели на залп из буровой установки (конечно если дебрис еще не лезет в трюм)
    Добавлено: 17:04 06-12-2007   
AlexYar
 1851 EGP


Рейтинг канала: 13(2096)
Репутация: 324
Сообщения: 31640

Зарегистрирован: 26.10.2003
Andrei [<>Ace] :
Если идея цельная


Идея цельная Да.

Только один вопрос нерешенный - как скриптом активировать мину?
    Добавлено: 17:07 06-12-2007   
WhiteWolf
 55 EGP


Рейтинг канала: 2(13)
Репутация: 0
Сообщения: 53

Зарегистрирован: 24.10.2007
Andrei [<>Ace] :
так как дебрис - это скапление обломков.
Т.е. при развале астероида на обломки создается один дебрис из множества этих обломков?
_________________
Лучший способ в чем-то разобраться до конца — это попробовать научить этому компьютер © Дональд Кнут
    Добавлено: 05:12 07-12-2007   
ULiX
 320 EGP


Рейтинг канала: 7(691)
Репутация: 146
Сообщения: 573
Откуда: Комсомольск на-Амуре
Зарегистрирован: 12.07.2005
AlexYar :
Только один вопрос нерешенный - как скриптом активировать мину?


Возможно что в ExtПатче есть такие команды скриптов, но в стандарте нет. Хотя... есть обходной путь. Дело в том, что мину может взять по себя GodEngine, нужно только создать подходящие условия. Я этот вопрос не изучил до конца и пошёл другим обходным путём, тем более что для моих целей нужен был модифицированный алгоритм условий детанации мины. Я просто сделал абсолютный аналог алгоритма, согласовав его с алгоритмом в OBJ. Реализовал этот алгоритм в скриптах и использовал. Практически такое слежение мало чем отличается от стандартного, в OBJ тоже запускается фоновый поток на мине. Единственное что я изменил в этом алгоритме для своих мин, я сделал так чтоб мины не детонировали в присутствии контейнеров и скафандров. Стандартные мины к несчастью реагируют на присутствие в зоне детанации как контейнеров, так и астронавтов. У меня по сюжеты этого нельзя было делать, так как бедный мой Чуви никогда бы не спасся. Ну а контейнера отменил по причине той же самой. У меня по сюжету, если уничтожен Черный Ястреб, то на его месте останется контейнер с диском, а так как контейнер создаётся сразу после уничтожения корабля (а там в это время эффект взрыва), то контейнер может поместиться в случаные координаты в близа заданных и просто вызвать детанацию мины... сюжет бы стал непроходим... вернее сюжет был бы обречен на провал, т.е. Чуви погиб, диск погиб.

Andrei [<>Ace] :
Уже решаемый. Долго тренировался, но я это сделал

А так не хорошо, когда не делятся знаниями. Тут школа вроде, а ты учитель. Думаю всё таки дал мине шанс вщяться под управление движком игры. Если я не ошибаюсь, достигается это варьированием расы владельца логического контроля и Start Action.

WhiteWolf :
Т.е. при развале астероида на обломки создается один дебрис из множества этих обломков?

Ничего подобного создаётся несколько debris как отдельные объекты, это гарантия! Получить массив этих обломком можно командой:

<RetVar/IF> find debris: sector=<Var/Sector> resource=<Var/Ware> min yield=<Var/Number> flags=<Var/Number> refobj=<Value> num=<Var/Number> max distance=<Var/Number> refpos=<Var/Array>


Остаётся ещё вопрос. Как осуществить выстрел по астероиду или дебрису? Команда:

<RetVar/IF><RefObj> fits laser <Var/Ware> into turret <Var/Number>
Не позволяет открыть огонь по астероиду. Расстроен Хотя причины мне не понятны.

Не все дебрисы возможны для поднятия на борт корабля. Есть команда для определения этой возможности:

<RetVar/IF><RefObj> has collectible rocks

Возвращет [TRUE] если обломок можно поднять на борт корабля командой cath flyware

Начинаю читать тему с самого начала.
Коментарии пишу по ходу дела, извините, если повторю уже сказанное и объясненное.

AlexYar :
Т.е. будет что-то вроде null150, null324 и т.д

Не будет.
Ибо null имеет тип данных DATATYPE_NULL и не может выступать в роли строки "null".
Результатом будет значение null / DATATYPE_NULL, (0) /.
Ты кстати это прекрасно знаешь, так что не пытайся запутать новичков. Ещё дойдёт очередь до изучения работы со строками, и будешь потом сам объяснять почему null + "mama" = null, а не "nullmama".

FAQ :

$Size = $obj -> get size of object

Q: Нужно ли делить значение размера на 222.

A: В X3:Reunion эта команда возвращает размер в метрах, и деление не нужно. Нужно принимать во внимание, что под размером подразумевается радиус (не диаметр) сферы, в которую вписывает данный обект. Таким образом если мы хотим оценить длину нашего объекта от кормы до носа, то полученное значение нужно умножить на два. В большинстве прикладных задач требуется знать именно радиус сферы, так как именно это значение влияет на корректировку расстояний до объектов.


Andrei [<>Ace] :
!init - не лучший способ запустить скрипт который работает с объектами.

Однозначно не верный. Но если запускается не при запуске новой игры, то работать будет. Если запустить новую игру, то скрипт запустится ещё до того момента когда во вселенной появится хоть один объект.

FAQ :

Q: Когда запускаются файлы начинающиеся на "init.*" или "!init.*"?

A: Данные скрипты запускаются после загрузки игры, инициализации ядра, но до инициализации секторов, объектов, переменных и констант. Однако константы, объекты и сектора не будут определены только при первом запуске - "Старт новой игры". Если загружается сохранка, то работать можно только с объектами ранее инициализированными. Например при старте новой игры в этом скрипте нельзя получить ссылку на корабль игрока ни через константу [PLAYERSHIP] ни командой "get playership". Как следствие создавать объекты и вообще работать с объектами в этих скриптах не рекомендуется. Хотя если сделать проверку на то, то это не старт новой игры, то можно работать и с объектами и даже создавать свои. Основное применение данного типа скриптов - это предусановки, коими являются предопределение глобальных обработчиков сигналов, задание обработчиков команд для кораблей. Также в этих скриптах можно предопределить глобальные переменные и загрузить текстовый модуль. Преимуществом определения глобальных переменных в скриптах данного типа является тот факт, что данные скрипты выполняются раньше скриптов "setup.*" или "!setup.*". Например у вас существует несколько процессов setup и все они пользуются единым текстовым файлом и страничка текста PageID задаётся в глобальной переменной, чтоб в будущем при перемещении текта в другую страничку (например, чтоб избежать конфликтов с другими скриптами) не приходилось править все скрипты ссылающиеся на эту страничку. Если учтановочных процедур много то будет нерационально использовать команду "load text: id=" в каждом скрипте setup.*, но так порядок загрузки скриптов неизвестен, то может получиться, что страничка текста не будет загружена при работе одного из скриптов, если использовать команду "load text: id=" только в одном модуле. Эти недоразумения помогают решить скрипты init.
Скрипты init являются глобальными скриптами и не привязаны ни к какому из объектов ( [THIS] = null ).

Q: Если в папке скриптов имеются скрипты с именами "init.myscript" и "!init.myscript", то какой из них будет выполнен?

A: Будут выполнены оба скрипта. Причем сначала скрипт НЕ содержащий восклицательный знак, а после уже тот, что содержит восклицательный знак.


Мдя... Когда я научусь писать кратко? В 8 классе нам задали сочинение на свободную тему. Раскрыть жизнь человека в виде маленького рассказика. Ну так я и написал "маленький рассказик" на 2 с половиной тетрадки... И так его и не закончил. История Юликса меня очень увлекла, но в итоге я сам стал Юликсом и рассказик не может закончится, так как я ещё жив.

Ну раз уже начал. Как истинно правильный "препод" буду грузить учеников теорией... а не решать за них поставленные задачи...
Я уже как-то попривык, что студент должен учиться сам. Но в реальности есть такой тип студента, что так допекёт распросами, что ради того, чтоб поскорее от него избавиться сделаешь всё за него. А тут я смотрю "учителям" терпежу не хватает ждать, когда ученики начнут справляться.

FAQ :

Q: Когда запускаются файлы начинающиеся на "job.*" или "!job.*"?

A: Данные типы скриптов запускаются автоматически согласно установкам в ".\types\Jobs.txt" сразу после старта работы согласно установленному JobID. Также эти скрипты запускаются после применения команды "start job". Назваие скрипта в Jobs.txt хранится для кораблей в позиции offset 4. Причем приставка job не указывается. Пример: trade.docktrader означает, что после старта работы на корабле запустится скрипт "!job.trade.docktrader". Данный тип скрипта является локальным навигационным и запускается в главном стеке корабля (стек 0).

Q: Если в папке скриптов имеются скрипты с именами "job.myscript" и "!job.myscript", то какой из них будет выполнен?

A: Будут выполнен один скрипт "!job.myscript". Только если не имеется скрипта с нужным названием и восклицательным знаком, то в этом случае будет выполняться скрипт без восклицательного знака.


Ну и ещё немного теории, тем более что об этой теории ни в одном из русскоязычных учебниках не написано, и такими знаниями обладают только опытные модописатели. Но скриптописатель тоже должен быть в этом осведомлён. Но то это и школа.

FAQ :

Q: Когда запускаются файлы начинающиеся на "config.*" или "!config.*"?

A: Данные типы скриптов запускаются автоматически согласно установкам в ".\types\Jobs.txt" сразу после создания корабля NPC движком игры. Скрипт служит для преустановок корабля. Главным образом применяется, чтоб загрузить корабль первоначальным объёмом товара. Для торговых JObID это принципиально. Если трюм торговца пуст он начнёт искать товар для закупки, а если его не найдёт то останется стоять на месте. Очень будет не красиво, если торговец повиснет в космосе без дела. Поэтому при создании торговца ему даётся некоторое число товаров. Даже если нет фабрик, куда можно продать, всегда есть торговые станции или доки оборудования. Назваие скрипта в Jobs.txt хранится для кораблей в позиции offset 5. Причем приставка config не указывается. Пример: add.wares.few.one означает, что после создания корабля запустится скрипт "!config.add.wares.few.one". Скрипты данного типа являются глобальными. Указатель на объект - корабль который нужно сконфигурировать, передается через первый аргумент скрипта.

Q: Если в папке скриптов имеются скрипты с именами "config.myscript" и "!config.myscript", то какой из них будет выполнен?

A: Будут выполнен один скрипт "!config.myscript". Только если не имеется скрипта с нужным названием и восклицательным знаком, то в этом случае будет выполняться скрипт без восклицательного знака.



Не бывает бесполезных знаний, знания могут со временем становиться не актуальными. © ULiX

Про скрипты "setup.*" и "al.plugin.*" писать не буду, таких вопросов не возникает и данные типы скриптов описаны во многих источниках.

Что там ещё осталось?

FAQ :

Q: Когда запускаются файлы начинающиеся на "!bbsnews.*"?

A: Много будете знать, скоро состаретесь. Из этого списка автоматически запускается только один скрипт: "!bbsnews.eval.ownerrace". Остальные скрипты с данной преставкой вызываются из других скриптов. Общение с Obj происходит через первый аргумент скрипта "!bbsnews.eval.ownerrace" , который является массивом строк с названиями тех рас на станциях которых можно отобразить задуманную новость. Если данный скрипт вернёт [TRUE] новость будет отображена, если же вернёт [FALSE] или null то новость не будет отображена на доске объявлений. Скрипт работает глобально в момент открытия и формирования доски объявлений.


Кстати немного отвлечемся. Хотелось бы обратить внимание что константы [FALSE] и null идентичны.
[FALSE] == null = [TRUE].

Если проверить условие

if null == [FALSE]
...
end

то будут выполнены команды внутри условного блока.

На сегодня я устал от теории. Оставить чтоль в качестве самостоятельного расмотрения вопросик...?


Я не знаю, по какой шкале вы тут мерите сложность вопросов, но следующий вопрос не менее чем на 8 балов если максимум 10.

===================================================
Вот вопрос:

Q: Когда запускаются файлы начинающиеся на "god.*" или "!god.*"?

Коментарий: файлы запускаются автоматически из Obj. Для новичков не обязательно изучать исходники обжей, о назначении скриптов можно догадаться из их содержания. А вот нашим "учителям" задание разобраться, когда именно в обжах происходит вызов этих скриптов. Из обжей запускаются скрипты god.setup.*, !god.setup.*, !god.conf. Последний только с восклицательным знаком, а первые два запускаются оба в порядке - без восклицательного зннака, а потом с восклицательным знаком.
===================================================

Всё. Дальше сами. Вопрос интересный и поможет раскрыть масу скрытых возможностей.


AlexYar :
Добавлю немного:

Дочитал до поста чуть позже чем успел написать весь этот талмут. Уже не буду править, будем считать дополнением.

AlexYar :
1. В скриптах, начинающихся на !init, init, !setup или setup - применять wait-команды запрещено!

Не забывай, кем ты являешься в этой теме. Любая теорема должна иметь доказательства. А доводы дожны иметь обоснование. Вот ты сказал "запрещено!", а ведь они ещё шкулеры (ученики). Вот еслиб мне в школе сказали, то вливать воду в серную кислоту нельзя и не объяснили, почему нельзя, я бы наверняка попробовал это сделать.

ОБОСНОВАНИЕ: Как только игра загрузится тут же выпадет в ОС с сообщением об ошибке.


AlexYar :
Если выкладываете здесь скрипты, то только те, что набраны в скриптредакторе игры (встроенном), так как вряд-ли кто-то будет разбираться, почему с ними игра вылетает, либо что-то неправильно работает. Скорее всего сразу последует delete file

Я же с вами.
Хотя начинающим скриптёрам действительно лучше пользоваться встроенным. На данный момент у меня большой опыт обхода ситуаций возникновения ошибок при наборе скриптов в ExSCE.

Самые распространенные ошибки, которые не заметны при наборе в ExSCE и правильно набираются только во встроенном редакторе:

1. $a = - $b

Исправляется путём применения в ExSCE аналога этой команды:
$a = 0 - $b
или
$a = -1 * $b


2. $sector = Argon Prime
Если вы применяете в скриптах указатель на конкретный сектор, то создать скрипт с правильным указателем можно только во встроенном редакторе.

Обходится эта проблема путём применения команды:

$sector = get sector from universe index: x= 1, y= 3

Либо можно подправить созданный скрипт во встроенном редакторе. После исправления укащатель на конкретный сектор будет сохраняться правильно при любых редактированиях скрипты в ExSCE. Однако если вы захотите задать новый сектор, то вам придётся провести повторную процедуру исправления.

Что-то ещё...
Ах да...


3. Нужно следить, чтоб оператор break не стоял перед оператором end. В этих ситуациях возможен неверный переход.


4. Нельзя определять метку и применять переходы командой goto label внутрь условного блока или блока цикла.
Хотя я сам считаю применение таких безусловнх переходов внутри цикла недопустимыми по этике программиста, но встроенный редактор позволяет определять метки внутри циклов и делать перехады внутрь цикла или условного блока даже из вне цикла или блока.


Ну, собственно, достаточно недостатки перечислять, думаю уже всем стало понятно. Хотя без ExSCE написать масштабный проект очень сложно. Вернее сложно его редактировать и отлаживать.


Andrei [<>Ace] :
Но одно точно. Чтобы в начале скрипта не пришлось клеить goto label main, Пусть gosub realdist отправляет в самый конец скрипта, за return $Rezult.

Налицо хватка ООП Ой, не могу!.. PE указывает на процедуру main, которая находится ближе к концу исполняемого файла, так как в начале как раз определены все процедуры и функции. Это такой метод организации ассемблерного кода в exe программах, в отличии от com программ где исполняемый код начинается как раз с самого начала файла.


AlexYar :
Сдаётся мне эта строка не найдёт ничего, если игрок пристыкован к станции Так как самого игрока в окружении сектора не будет, соот-но refobj будет некорректен.


Я согласен, что применение этой команды в данной задаче лишнее, но не согласен с утверждением, что команда ничего не найдёт. refobj в данной команде при даннойм флаге поиска задаётся для определения ближайшего из существующих в секторе объектов. Именно в секторе а не в окружении корабля. Если бы в секторе было бы несколько доков оборудования, то вопрос о работоспособности скрипта стал бы ребром. ПОЧЕМУ? Расстояния от пристыкованного объекта до другого объекта в том же секторе дают непредсказуемый результат и поэтому при наличии нескольких доков оборудования в одном секторе не факт, что данная команда выдала бы именно тот док оборудования, к которому пристыкован игрок.

WhiteWolf :
Привычка еще с Паскаля осталась процедуры, функции, переменные должны быть объявлены до начала основного кода. Да и мне так удобней в разросшихся скриптах отыскивать их для редактирования.


Я угадал. ООП Улыбка


WhiteWolf :
Тогда можно уточнить какие команды в Х3 возвращают размеры в юнитах?


Принимаем за правило:
Пользуемся справочником от Chem.
Если в команде сказано, что она возвращвет значение в юнитак и нужно делить на 222, значит в X3:Reunion эта команда уже возвращает значение в метрах. Если же сказано, что возвращает в унитах и нужно делить на 500, то значит точно юниты и нужно делить на 500. Если сказано метры - значит метры. Я уже на многие команды ему (Chem) отослал рапорт об необходимых исправлениях, но он исчез и исправления так и не попали в справочник. Если видишь цифорку 222 значит описание команды устарел и смело обращайся к "учителям" за консультацией. Но в целом как я уже сказал все они теперь возвращают метры. Только одна комнада есть возвращающая не в метрах, как это было предположено вначале а в юнитах:

<RetVar> = get range of missile type <Var/Ware>

Причем есть аналог этой команды:

<RetVar> = get missile range of <Var/Ware>

Но вторая команда возвращает тоже значение уже в метрах а не юнитах.


WhiteWolf :
Ну и раз уж мы в школе, то прошу досточтимых учителей ткнуть носом в скрипт оптимального поиска всех кораблей (получить массив) определенной рассы в галактике вне зависимости от окружения искомых кораблей. А то впал в ступор. Крутил и так и эдак, не выходит каменный цветок


<?> get ship array: of race <?> class/type=<?>

Команда находится в разделе "Команды секторов и галактик (Universe and Sector Commands)"

Если нужны все корабли определённой расы, то значением class/type указываешь null или Ship.


Else :
уважаемые преподаватели, если вы в описании увидели очень сложные или не реализуемые моменты, отпишите, отругайте или подскажите как обойти данные моменты.


Мне кажется, что новичков нужно сначала перевести из первого класса хотя бы во второй прежде чем учить делать квестоподобные скрипты. Обучить я этому могу, благо сабаку съел, а вот ученикам придётся спотыкаться обо все камни, что я после себя осталял. Даже скриптёры XTM не пришли к универсальному методу организации контролёра сюжетных событий, хотя этот метод навязывают нам сами программисты Egosoft. Но мы ведь самые умные, мы лёгких путей не ищем.

Предлагаю всё таки ещё потренероваться на более простых задачах.

Wunderscripter'ами не рождаются, ими становятся в резултате напряженных тренировок в практике.

Дорогие "ученики" не бойтесь делать замечания своим "учителям". Они тоже люди и им свойственно ошибаться. Ни один из ваших учителей, в том числе и я, не знают всех ньансов скриптописания, и фактически учителя учатся вместе с вами, повышая свои навыки и расширяя кругозор знаний. Большинство скриптёров, как в прочем и большинство программистов выбирают свою нишу в которой отрабатывают навыки до профессианализма, но стоит поставить перед ними задачу не по его профилю и профи сам становится учеником. Вот поставьте передо мной задачу организвать новости BBS и я сяду в лужу. Я как-то рассматривал этот вопрос, но там столько ньюансов, что я решил пока этим вопросом не заниматься, слишком много строгих привязак к конкретным текстовым индексам в заданной странице новостей. Фактически новостями можно управлять создав небольшую начинку из скриптов и изменяя потом только текстовый модуль, но как это работает я ещё сам не выяснял.

Когда я был студентом я был на шаг впереди своих преподавателей, так как все мои получаемые знания были более новыми, чем те,которым мог обучить меня преподаватель. Сейчас я сам преподаватель и меня радует, когда находится студент, который может меня чему-то научить. Хотя в последнее время контенгент студентов совсем поплохел.

Andrei [<>Ace] :
Я придумал как сделать скрипт, завершающийся после удаления его из папки scripts


Вот собственно, о чем я и говорил. Учителя тоже учатся.
Не боись айс, ты был не первым. Этот метод применялся даже где-то в сатндартных скриптах, но не для отключения скрипта а для проверки наличия скрипта. Я тоже этот метод применяю. В скриптах дроида, например, я проверяю наличие библиотечного скрипта. Запускаем скрипт с предопределенным аргуменитом например первым аргуметом даём значение "TEST" если возвращаемое значение получено "DONE" значит библиотека установлена. Это стандартный метод проверки наличия стандартных драйверов. Есть одна точка входа для теста любого драйвера. У каждого драйвера свой ID. Если драйвер установлен, то при тестировании вызовом функции с заданным ID драйвер выдаст положительный ответ. Если ID не зарегистрирован, т.е. драйвера нет, то результат будет отрицательным.

В качестве учительского наставления - это очень дельный совет ученикам.


to Andrei [<>Ace] & AlexYar
По личным вопросам "учителя" перепираются в привате, т.е. в "учительской" а не на "уроках в классе"


to WhiteWolf
У меня созрело одно задание. Для решения задачи нужен творческий подход. Программист привыкший к ООП может с этим справиться.

====================================
ЗАДАНИЕ:

Создать скрипт создающий отчет и сохраняющий его в лог файл.
Отчет должен содержать:

1. Cтатистическую информацию о наличии товаров в каждом секторе. Для каждого товара имеющегося в секторе должен быть приведён спрос, предложение, средняя закупочная цена, средняя цена реализации.

2. Cтатистическую информацию о видах товара и общем спросе и предложении у конкретной расы, а также средней закупочной и реализуемой цене на товар.

3. Cтатистическую информацию о видах товара и общем спросе и предложении во вселенной и цен закупочной и реализации.


....Теория......

Спрос - количество ресурса, которое может приобрести потребитель.
Предложение - количество продукта, которое способен реализовать производитель.

====================================

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

Есть ситуации когда производители завалены продуктом, а потребители пусты. Т.е. высокий спрос, высокое предложени, но не работают транспорты, чтоб сбалансировать эти потребности.

Данная статистика поможет сбалансировать число торговцев торгующих определённым видом товара с потребностями вселенной.



Для тех, кто не уверен в своих силах, задание послабее

====================================
ЗАДАНИЕ:

Просканировать сектор на наличие секретных контейнеров.
В случае обнаружения записать в бортовой журнал координаты контейнера.



....Теория......

Истинно секретные контейнеры нельзя найти командой:

<?> find flying ware: sector=<?> maintype=<?> subtype=<?> flags=<?> refobj=<?> maxdist=<?> maxnum=<?>, refpos=<?>

Этой командой вы сможете получить только не секретные контейнеры, либо псевлрсекретные созданные скриптами бонус пака например. Однако в активном секторе вы можете исследовать конкретно все вподряд секторные объекты. Секторные объекты идентифицируются обычными целыми числами. Получить ссылку на объект зная его секторный номер можно командой:

<RetVar/IF> get object from SectorObject <Var/Number>

Определить существует ли объект с заданным номером можно командой:

<RetVar/IF> exists SectorObject <Var/Number>

И наконец определить тип товара связанного с объектом можно командой:

<RetVar> = get ware type of SectorObject <Var/Number>

Этой командой в итоге вы определите, что же содержит секретный контейнер.


Нужно принять во внимание, что нужно исключить при сканировании секторных объектов те контейнеры, которые могут присутствовать в секторе, но не являться секретными. Это можно добиться проверкой того, чтоб проверяемый контейнер отсутствовал в массиве всех несекретных контейнеров. Массив этот можно получить командой:

$ContainerArray = find flying ware: sector= [SECTOR] maintype=null subtype=null flags=Find.Multiple refobj=null maxdist=null maxnum=999, refpos=null

Далее проверить наличие объекта в массиве командой:

$index = get index of $SecContainer in array $ContainerArray offset= -1 + 1

Если объект отсутствует, то $index примет значение -1

Получить объет нужно предварительно командой:

$SecContainer = get object from SectorObject $NumObj

Осталось только правильно перебрать все $NumObj.

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

====================================

Извините за длинный пост. Короткие у меня в последнее время получаются очень редко.
_________________
Новое ещё не значит лучшее
    Добавлено: 10:05 07-12-2007   
Andrei [<>Ace]
 303 EGP


Рейтинг канала: 6(416)
Репутация: 108
Сообщения: 766
Откуда: Беларусь, Салiгорск
Зарегистрирован: 29.03.2006
ULiX в своем репертуаре. Влетел, втоптал мух в котлеты и извинился Улыбка .
ULiX тебя прошу еще раз персонально, будем опытом делиться здесь Скриптописание - делимся опытом, задаем вопросы. А здесь как на контрольной: задание - ответ - работа над ошибками. Зачем две темы об одном и том же, в теме "Скриптописание - делимся опытом, задаем вопросы" есть уже много полезной информации, и переносить ее оттуда сюда - зачем. Нужно отсюда - туда учеников на внекласное чтение отправлять Улыбка .

ULiX :
А так не хорошо, когда не делятся знаниями. Тут школа вроде, а ты учитель. Думаю всё таки дал мине шанс вщяться под управление движком игры. Если я не ошибаюсь, достигается это варьированием расы владельца логического контроля и Start Action.

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

ULiX :
Цитата:
1. В скриптах, начинающихся на !init, init, !setup или setup - применять wait-команды запрещено!

ОБОСНОВАНИЕ: Как только игра загрузится тут же выпадет в ОС с сообщением об ошибке.

Ну так не выдает, не вылетает.

ULiX :
Если нужны все корабли определённой расы, то значением class/type указываешь null или Ship.

Только Ship, с null ничего не найдет.

ULiX :
По личным вопросам "учителя" перепираются в привате, т.е. в "учительской" а не на "уроках в классе"

В споре рождается истина. Улыбка
    Добавлено: 11:10 07-12-2007   
WhiteWolf
 55 EGP


Рейтинг канала: 2(13)
Репутация: 0
Сообщения: 53

Зарегистрирован: 24.10.2007
ULiX :
Практически всё, что нужно для выполнения задания я рассказал. Удачи в выполнении.
Практически полностью расписал решение задачи Улыбка А это снижает интерес к задаче Расстроен
ULiX :
Остаётся ещё вопрос. Как осуществить выстрел по астероиду или дебрису? Команда:

<RetVar/IF><RefObj> fits laser <Var/Ware> into turret <Var/Number>
Не позволяет открыть огонь по астероиду. Расстроен Хотя причины мне не понятны.

и цитата из справочника команд Х3 от Chem
Цитата:
<RetVar/IF><RefObj> fits laser <Var/Ware> into turret <Var/Number>

· Команда проверяет возможно ли установить орудие laser <Var/Ware> в турель с номером turret <Var/Number> корабля <RefObj>.

· Если возможно - выдает [TRUE], если нет – [FALSE].

· Проверяется только возможность установки, соответственно наличие самих пушек не нужно. Если установить turret 0, то проверится возможность установки пушек как носовых орудий.
т.е. она и не должна открывать огонь Улыбка Наверно имелась в виду команда <RetVar/IF><RefObj> fire lasers on target <Value> using turret <Var/Number>, но есть ведь еще и <RetVar> = <RefObj> fire laser of turret <Var/Number> ahead на нее нет описания в справочнике, но судя по всему эта команда должна дать залп из турели просто туда, куда направлена, ведь цель для турели не обозначена Улыбка Сейчас под рукой игры нет, проверю как доберусь Улыбка
PS. Пишу здесь, так как напрямую относится к заданию "Утилизатор"
    Добавлено: 11:29 07-12-2007   
Andrei [<>Ace]
 303 EGP


Рейтинг канала: 6(416)
Репутация: 108
Сообщения: 766
Откуда: Беларусь, Салiгорск
Зарегистрирован: 29.03.2006
WhiteWolf :
<RetVar/IF><RefObj> fire lasers on target <Value> using turret <Var/Number>

Работает эта команда и на астероиды и на дебрисы.

Последний раз редактировалось: Andrei [<>Ace] (00:00 08-12-2007), всего редактировалось 1 раз
    Добавлено: 12:01 07-12-2007   
Bob_Koh
 61 EGP


Рейтинг канала: 3(31)
Репутация: 4
Сообщения: 125
Откуда: Хмельник
Зарегистрирован: 15.10.2007
Ребята! А где написано что по дебрису нужно стрелять?
Корабль подбирает дебрис в трюм, как объект, как тот же контейнер, а в трюме идет его переработка на мини-заводе, если он нулевой по проверке - то идет на космопыль, если есть ресурс - то отбирает этот ресурс в виде товара!
    Добавлено: 12:34 07-12-2007   
бухой джедай
 182 EGP


Рейтинг канала: 5(141)
Репутация: 70
Сообщения: 7906 Предупреждений: 1
Откуда: Одесса:)
Зарегистрирован: 08.09.2007
Bob_Koh :



Ребята! А где написано что по дебрису нужно стрелять?
Корабль подбирает дебрис в трюм, как объект, как тот же контейнер, а в трюме идет его переработка на мини-заводе, если он нулевой по проверке - то идет на космопыль, если есть ресурс - то отбирает этот ресурс в виде товара!

не всякий дебрис можно собрать некоторые ище нужно дробить дальше
_________________
Так Добрый вечер...Превед с большого Бодуна...
Магистр Непросыхаемость...
Злобный Рецедивист...
    Добавлено: 12:37 07-12-2007   
WhiteWolf
 55 EGP


Рейтинг канала: 2(13)
Репутация: 0
Сообщения: 53

Зарегистрирован: 24.10.2007
бухой джедай :
не всякий дебрис можно собрать некоторые ище нужно дробить дальше
Поправка не дебрис, а осколок входящий в состав дебриса, и если вручную еще можно прицелится и выстрелить, то скриптом нельзя получить осколок Расстроен для передачи его параметром как цель для турели
    Добавлено: 13:19 07-12-2007   
бухой джедай
 182 EGP


Рейтинг канала: 5(141)
Репутация: 70
Сообщения: 7906 Предупреждений: 1
Откуда: Одесса:)
Зарегистрирован: 08.09.2007
WhiteWolf :
Поправка не дебрис, а осколок входящий в состав дебриса, и если вручную еще можно прицелится и выстрелить, то скриптом нельзя получить осколок для передачи его параметром как цель для турели


может быть но тут есть вапросУлыбка люди осколок в секторе без игрока координаты ваабше имеет ???
_________________
Так Добрый вечер...Превед с большого Бодуна...
Магистр Непросыхаемость...
Злобный Рецедивист...

Последний раз редактировалось: бухой джедай (13:37 07-12-2007), всего редактировалось 1 раз
    Добавлено: 13:36 07-12-2007   
Else
 140 EGP


Рейтинг канала: 3(26)
Репутация: 29
Сообщения: 313
Откуда: Тверская обл.
Зарегистрирован: 08.11.2007
Господа пилоты, к сожелению создавая тему я стремился популязовать её, и как задание давал сложный пример, который будет интересно решать более или менее опытным скриптописателям, а не первоклашкам. В результате вместо школы мы получили "кружок судомоделизма" в котором немногие делают скрипты, а остальные только смотрят.
Как бывший студент пед.вуза забыл об одной простой вещи, которую можно охарактеризовать одной фразой "От простого к сложному", в наших занятиях нет системы (как впрочем небыло в 1996 г. официальной системы преподавания компютерной грамотности). ULiX своим заданием показал как организовать такую систему:
1) Тема
2) Задание
3) Изучаемые операторы
3) Следющее задание опирается на предыдущее

По моему это правильная организация заданий

Предлогаю преподавателей предерживаться таких предположений:
1) Подготовишки владеют основными понятиями программирования как переменная, тип переменной, условный и безусловный переход, цикл, подпрограмма, но не умеют реализовывать их в среде скриптов Х3.
2) Дается задание с указанием операторов, структур которые изучаются. за дополнительной информацией об изучаемой информацией см учебники или тему о скриптописании.
3) По возможности следующее задание опирается на предыдущее

4) Параллельно с базовым курсом идет дополнительный, в котором рассматриваются задания, подобные тем которые рассматриваются в теме сейчас предназначенный для более опытных учеников.

5) В теме не пишутся посты а-ля FAQ X3, для этого существуют Вопросницы, А знаете ли что.. и т.д.

6) В теме допускается описание скрипт-команд, но только применимых к конкретному заданию в момент разборки ошибок или при прямом обращении к преподователю при выполнении задания (в этом случае поощрение за выполненое задание не дается см. ниже (или пиши в тему о скриптописанни)).
7) В теме допускаются FAQ касаемый вопросов скриптописания и близких к ним тем.
8) В теме допускается теория, желательно, но не обязательно касающаяся конкретного задания (дабы не перегружать информацией).
9) Все выполненые задания выкладываются в теме, а не высылаются в личку преподавателей, наше дело научится, а не поразить своим знанием отдельных учителей.
Единственное чего боюсь, что такая система окажется слишком скучной для преподавателей.

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

ПС А так-же комнату "Курилка в туалете" где ученики могут высказаться о преподавателях и других учениках. Шутка

Последний раз редактировалось: Else (15:31 07-12-2007), всего редактировалось 2 раз(а)
    Добавлено: 13:57 07-12-2007   
бухой джедай
 182 EGP


Рейтинг канала: 5(141)
Репутация: 70
Сообщения: 7906 Предупреждений: 1
Откуда: Одесса:)
Зарегистрирован: 08.09.2007
ну так по мне сначало надо дать характеристику скрипт языку как языку програмирования
_________________
Так Добрый вечер...Превед с большого Бодуна...
Магистр Непросыхаемость...
Злобный Рецедивист...
    Добавлено: 14:10 07-12-2007   
AlexYar
 1851 EGP


Рейтинг канала: 13(2096)
Репутация: 324
Сообщения: 31640

Зарегистрирован: 26.10.2003
WhiteWolf :
но есть ведь еще и <RetVar> = <RefObj> fire laser of turret <Var/Number> ahead на нее нет описания в справочнике


Эта команда не работает из-за бага в коде обжа, поэтому и описание ей не нужно Улыбка

ULiX :
Возможно что в ExtПатче есть такие команды скриптов


Для мин пока нет, но топерь будет Улыбка

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

ULiX :
Цитата:
Т.е. будет что-то вроде null150, null324 и т.д


Не будет.
Ибо null имеет тип данных DATATYPE_NULL и не может выступать в роли строки "null".
Результатом будет значение null / DATATYPE_NULL, (0) /.


Вот яркий пример. Свои фантазии выдаёшь за истину, да ещё и поучаешь кого-то Улыбка

Бегом набирать скрипт и проверять его в игре, потом долго думать:

Код:

001   $a = 'mama'
002   $b = 145
003   
004   $c = $c + $a
005   write to player logbook $c
006   $d = $d + $b
007   write to player logbook $d


Смотреть логи и ДОЛГО думать Улыбка


2All: Всем новичкам будет не лишним набрать такой же скрипт и попытаться понять, почему числовые переменные нужно изначально инициализировать нулём (0), а строковые - пустой строкой (в последней версии игры её можно набрать прибегнув к хитрости).

Andrei [<>Ace] :
Цитата:
ОБОСНОВАНИЕ: Как только игра загрузится тут же выпадет в ОС с сообщением об ошибке.


Ну так не выдает, не вылетает.


Уликс тут преувеличил Улыбка Скорее всего скрипт будет выгружен из памяти на строке с альфа-командой, а после неё код выполнен не будет. Такое наблюдалось на игре более ранних версий (до 2.0.02), на последней версии я не проверял, поэтому точно не скажу.
Пример с логами может и тут помочь.

Последний раз редактировалось: AlexYar (17:17 07-12-2007), всего редактировалось 1 раз
    Добавлено: 17:01 07-12-2007   
WhiteWolf
 55 EGP


Рейтинг канала: 2(13)
Репутация: 0
Сообщения: 53

Зарегистрирован: 24.10.2007
Andrei [<>Ace] :
Что за палемика в классе. Ругаюсь, недоволен!
Ну не стоит строить из себя такого строгого учителя Улыбка Ну решила молодая поросль пойти на мозговой штурм (вы ведь уже сражались на этом поле, так дайте и молодым копья поломать). Тем более, что в теме "Скриптописание - делимся опытом, задаем вопросы" найти ответы довольно затруднительно, ибо многа букв, да и вопрос с однозначным ответом могут разносится на несколько страниц Расстроен А вот такого однозначного ответа там совсем нет:
AlexYar :
Цитата:
но есть ведь еще и <RetVar> = <RefObj> fire laser of turret <Var/Number> ahead на нее нет описания в справочнике

Эта команда не работает из-за бага в коде обжа, поэтому и описание ей не нужно Улыбка
, ну или я не нашел (поиском пользовался)
Кроме того, на текущий момент в справочниках по командам скриптового языка Х2/Х3 от DragonP и Chem (прошу прошение если ошибся в написании) нет исчерпывающей информации. А раз уж в этом теме вы нас молодых, начинающих скриптописателей собрали, то и где нам после этого свои вопросы задавать? (тем более в ветке "скриптописание - делимся опытом, задаем вопросы" они будут выглядеть глупо и не к месту)


ULiX :
У меня созрело одно задание. Для решения задачи нужен творческий подход. Программист привыкший к ООП может с этим справиться. Создать скрипт создающий отчет и сохраняющий его в лог файл.
Отчет должен содержать:

1. Cтатистическую информацию о наличии товаров в каждом секторе. Для каждого товара имеющегося в секторе должен быть приведён спрос, предложение, средняя закупочная цена, средняя цена реализации.

2. Cтатистическую информацию о видах товара и общем спросе и предложении у конкретной расы, а также средней закупочной и реализуемой цене на товар.

3. Cтатистическую информацию о видах товара и общем спросе и предложении во вселенной и цен закупочной и реализации.
Ну получим мы всю эту ооогромную статистику в лог файл, ну разделим спецсимволом-разделителем, а дальше, что? Чем обрабатывать? Вроде скрипты тут уже не подойдут, нужно преобразование в БД или хотябы в распределенную таблицу...

Последний раз редактировалось: WhiteWolf (22:20 07-12-2007), всего редактировалось 1 раз
    Добавлено: 22:03 07-12-2007   
AlexYar
 1851 EGP


Рейтинг канала: 13(2096)
Репутация: 324
Сообщения: 31640

Зарегистрирован: 26.10.2003
2All: Чтобы быстрее и проще понять, почему необходима первичная инициализация переменных, которые планируется использовать в арифметических выражениях (сложения например) - поможет расширенная версия скрипта:

Код:

001   $a = 'mama'
002   $b = 145
003   
004   $c = $c + $a
005   write to player logbook $c
006   $d = $d + $b
007   write to player logbook $d
008   
009   if $c == $a
010    write to player logbook 'c = a'
011   else
012    write to player logbook 'c != a'
013   end
014   
015   if $d == $b
016    write to player logbook 'd = b'
017   else
018    write to player logbook 'd != b'
019   end



Самое важное в данном примере это:

A + NULL != A


Вообще, так же следует запомнить, что:

NULL != 0


С этой ошибки начинают практически все, думая что null равен нулю (0). Но это не так Улыбка

Поэтому в своих скриптах, если вы работаете с числовыми переменными, то в условиях никогда не проверяйте их на null !
Всегда проверяйте на ноль (0).

Вот такой код некорректен:

Код:

$b = $b - $a
if $b != null


Правильно писать так:

Код:

$b = $b - $a
if $b


Т.е. условиям пофиг, null там или ноль, они проверяют переменную сразу как на неравенство (в данном случае) и null и 0.

То, что 0 != NULL, можно с успехом использовать в собственных скриптах. Например в проверках тех же глобальных переменных, была-ли когда-либо использована какая-то переменная. Если до этого скрипты её "обнуляли" (ставили равной 0), то мы это легко узнаем:

Код:

if $var == null


Если переменная не равна null, а будет равна 0, то условие выполнено не будет, а значит переменной уже пользовались Улыбка


ULiX :
3. Нужно следить, чтоб оператор break не стоял перед оператором end. В этих ситуациях возможен неверный переход.


Без разницы, где будет стоять break, всё равно выход будет только из ближайшего цикла. Даже если за ним будет десяток end-ов Улыбка

А вот о таком финте игры наверное мало кто знает, наверное даже в самом Егософте Гы-гы

Если end будет стоять после skip, вот так:

Код:

001   $b = 1
002   while 1
003 @  = wait 100 ms
004    if $b
005     write to player logbook $b
006     inc $b =
007     skip if $b
008     
009    end
010   end
011   write to player logbook 'test'
012   
013   return null


то какие будут последствия? По идее никаких, вечный цикл...


На самом деле произойдёт выход из цикла на строку 11 Есть предложение!

Т.е. команда skip if $b будет выполнена эквивалентно коду

Код:

if $b
break
end


И это самый наглядный пример, а сколько еще таких финтов в коде иксов - искать не переискать Хы...


Особенно важно новичкам - для блокировки какой-либо части кода никогда не комментируйте строку, стоящую после строки skip ! Баг будете неделю искать Улыбка
    Добавлено: 23:40 07-12-2007   
WhiteWolf
 55 EGP


Рейтинг канала: 2(13)
Репутация: 0
Сообщения: 53

Зарегистрирован: 24.10.2007
Т.е. проще говоря skip if относится к первому значащему оператору (команде). Комментарий и пустая строка таковыми не являются, по этому и пропускается строка 009.
А если
Код:
007     skip if $b
008      NOP
?

Последний раз редактировалось: WhiteWolf (00:04 08-12-2007), всего редактировалось 1 раз
    Добавлено: 23:57 07-12-2007   
бухой джедай
 182 EGP


Рейтинг канала: 5(141)
Репутация: 70
Сообщения: 7906 Предупреждений: 1
Откуда: Одесса:)
Зарегистрирован: 08.09.2007
WhiteWolf :
007 skip if $b
008 NOP


если NOP в томже цикле что и skip if $b то он не будет выполнен
_________________
Так Добрый вечер...Превед с большого Бодуна...
Магистр Непросыхаемость...
Злобный Рецедивист...

Последний раз редактировалось: бухой джедай (02:41 08-12-2007), всего редактировалось 1 раз
    Добавлено: 02:37 08-12-2007   
AlexYar
 1851 EGP


Рейтинг канала: 13(2096)
Репутация: 324
Сообщения: 31640

Зарегистрирован: 26.10.2003
WhiteWolf :
Т.е. проще говоря skip if относится к первому значащему оператору (команде). Комментарий и пустая строка таковыми не являются, по этому и пропускается строка 009.


Нет. Не строка 009 пропускается, а происходит выход из цикла по строке 010 Улыбка Первый значащий оператор - это IF. Только потом WHILE.

Т.е. по сути skip работает на как skip if, а как break if Улыбка


зыж А что за NOP ? Такой команды нету вроде.
    Добавлено: 03:19 08-12-2007   
бухой джедай
 182 EGP


Рейтинг канала: 5(141)
Репутация: 70
Сообщения: 7906 Предупреждений: 1
Откуда: Одесса:)
Зарегистрирован: 08.09.2007
WhiteWolf :
Ну получим мы всю эту ооогромную статистику в лог файл, ну разделим спецсимволом-разделителем, а дальше, что? Чем обрабатывать? Вроде скрипты тут уже не подойдут, нужно преобразование в БД или хотябы в распределенную таблицу...

несогласен
ULiX :
Программист привыкший к ООП может с этим справиться. Создать скрипт создающий отчет и сохраняющий его в лог файл.

скрипт пишется так чтоб лог был с метками по типу тегов
ну а далее данному програмисту не шибко стоит усилий написать
просмотровшик к своему логу (кстати чем и является на 60% карта скорпа)
_________________
Так Добрый вечер...Превед с большого Бодуна...
Магистр Непросыхаемость...
Злобный Рецедивист...
    Добавлено: 04:01 08-12-2007   
Канал X3: Reunion -> Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)»
На страницу: Пред.  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  След. | Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: У меня жена брюнетка, а посему мне нравятся блондинки... (tomcat)

  » Скрипт-школа (Задачи для начинающих скриптописателей) | страница 6
Каналы: Новости | 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