ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Как пользоваться внешними переменными: пособие для детей | страница 1 |
 |
Страница 1 из 1 |
|
|
|
Канал X3: Reunion »
Модовый и скриптовый отсек X3: Reunion: «Как пользоваться внешними переменными: пособие для детей» |
|
|
4o
64 EGP
 Рейтинг канала: 1(6) Репутация: 8 Сообщения: 111
Зарегистрирован: 16.01.2011
 |
|
-Редистка! Гадость! А! А! Тьфу!
-Спокойствие, только спокойствие. малыш, так и было задуманно.
или как пользоваться "внешними" (глобальными, локальными переменными на объектах) переменными для извращенцев на бронетанке, которые до сих пор маются реюнионом и знают мало о программировании (типа меня).
В общем. чтобы никто не подумал, что я занимаюсь саморекламой - не буду давать ссылку откуда это все началось)
Если я правильно понял, то в реюнионе нет глобальных переменных) есть глобальные ссылки, которые (надеюсь) изредка превращаются в переменные.
Суть.
Внешние переменные по идее используются для взаимодействия скриптов (другого применения я пока не придумал)). тоесть есть 2 скрипта, полтьзующие 1 переменную.
Ситуация.
Есть скрипт1
Код: |
...
a=value
object1->set local var name 'name' value $a
...
start script2 with arg 'name'
|
тоесть скрипт, который по доброте душевной взял да и сделал публичной какую-то... интересную вещь. например массив с красивыми девушками.
и когда этот скрипт запускал скрипт 2, то он ему бескорыстно рассказал про то, где взять хороший массив с красивыми девушками.
есть скрипт2
Код: |
...arg1 = 'name' //вот так скрипт2 узнал про то, где халява валяется
...
PrettyGirls = object1-> get local var 'name' //и он как только смог - сразу полез на размерность массива смотреть.
SIZE = size of PrettyGirls //никакой смысловой нагрузки на строчку. просто захотелось ему посмотреть размер)
...
onePrettyGirl = girl //а у второго скрипта, пока он работал, тоже завелась одна красивая девушка.
//он все никак не мог решить, куда бы ее деть, чтобы не потерять. и решил положить в тот массив, где уже было много хороших девушек. чтобы до кучи. потом их просматривать удобнее будет.
append onePrettyGirl to array PrettyGirls //вот он это делает.
//потом навалилась на него работа, дела. пришлось заниматься какой-то фигней, которую его припахали делать.
=wait 60000 ms //и наконец у него нашлась свободная минутка
//тут он вспоминает, что у него же там валяется целый массив девушек большой размерности (массив большой размерности))
//но все-таки та самая onePrettyGirl была ему всех милее. и он решил найти ее в массиве с девушками. а память то у него слабая была, видать геймер на комп давно не апгрейдивал. поэтому ему надо было сначала найти девушку в массиве
indexOnePrettyGirl = get index of element 'prettiestGirl' in array PrettyGirls
//вернули ему адрес той самой. а он смотрит
write to player logbook printf 'prettiest girl index is %s, 'indexOnePrettyGirl'
сообщение от: Неизвестно
prettiest girl index is -1
//а девушки то нет... кто? когда? как? это же моя личная истинно локальная переменная! какого хрена кто туда и вообще как смог залезть и спереть?! |
в общем типа того. так как на самом деле переменная была не переменной, а ссылкой хитрого скрипт1, который сначала якобы бескорыстно поделился массивом, а потом и спер чужую девушку.
итак. теперь чтобы у ваших сриптов никто ничего не сперал неведомо как - предлагаю простое правило.
Код: |
array = object->get local var name 'name'
or
array = get global var name 'name'
// прочитал внешние данные
size = get size array 'array'
localАrray = array alloc size $size
//создай свою переменную
size = size-1
copy array array index 0 ... size to array localArray index 0...size
//и копируй чужую переменную в свою переменную. чтоб никто не уволок) |
добавлено спустя 33 минуты:
сказка вторая: про фокусников.
[code]пошел скрипт3 на тусовку скриптов. и видит:два фокусника (скрипт1 и скрипт2) чудеса творят неведомые. решил подойти посмотреть, что за хрень там у них происходит.
//скрипт3: чего делаете, коллеги?
//скрипт2 и скрипт1: фокусы показываем. вот смотри - магическая шляпа magic_hat. заглянив в нее.
скрипт3:
whatIsInside = get global var name 'magic_hat'
write to player logbook value 'whatIsInside'
сообщение от: Неизвестно
null
//скрипт3: да вроде ничего там нет. нуль квадратный четырехбуквенный обыкновенный.
//скрипт1 и скрипт2: правильно. а вот мы сейчас за спиной поколдуем так, чтобы ты ничего не видел, и оттуда начнут вылезать всякие разные интересные штуки
//скрипт3:херня. не верю. давай показывай.
скрипт1:
object = bunny
set global var name 'magic_hat' value $object
//скрипт1: на, смотри)) раз не веришь
скрипт3:
whatIsInside = get global var name 'magic_hat'
write to player logbook value 'whatIsInside'
сообщение от: Неизвестно
bunny
//скрипт3: круто. как это ты так. а еще слабо?
скрипт2:
object = playBoyBunny
set global var name 'magic_hat' value $object
//скрипт2: да пожалуйста
скрипт3:
whatIsInside = get global var name 'magic_hat'
write to player logbook value 'whatIsInside'
сообщение от: Неизвестно
playBoyBunny
//скрипт3: не, не, не. знаю я вас всякую порнографию из шляп вытаскивать. а без колдовства слабо? руки на стол и рукава засучить!
//скрипт2 и скрипт1:да без проблем. проверь шляпу.
скрипт3:
whatIsInside = get global var name 'magic_hat'
write to player logbook value 'whatIsInside'
сообщение от: Неизвестно
null
//скрипт3: пусто
//скрипт2 и скрипт1:а вот теперь ты два раза из нее достанешь зайшев, а мы ничего делать не будем. нука давай
скрипт3:
whatIsInside = get global var name 'magic_hat'
write to player logbook value 'whatIsInside'
сообщение от: Неизвестно
bunny
whatIsInside = get global var name 'magic_hat'
write to player logbook value 'whatIsInside'
сообщение от: Неизвестно
playBoyBunny
//скрипт стоит и не может ничего понять - как же там из ничего зайцы плодятся. и не заметил он как десятком строк раньше скрипты 1 и 2 свалили нафиг
//скрипт1: return 'скрипт3 - лопух'
//скрипт2: return 'еще какой'
добавлено спустя 17 минут:
сказка 3. короткая. про то, как радио читали
[code]скрипт1: a = radioTransaction
set global var 'radio' value a
скрипт2:readRadio = get global var 'radio'
скрипт1: a = 'позавчера вечером в Аргон Прайм на торговой станции произошло самопроизвольное возгорание кислородных балонов в стыковочном отсеке номер 666. по словам пострадавших работников стыковочного отсека - тех немногих, которых удалось привести в себя к настоящему моменту - по всей видемости в стыковочном отсеке находился транпорт с космотравой. этот случай стал бесперецендентным провалом для спасательных бригад всего сектора, так как пожар до сих пор не потушен. население станции живым щитом заслонило все остальные стыковочные отсеки и всеми силами препятствует любым попыткам потушить огонь. для рашения сложной ситуации было принято решение привлечь специалистов расы Сплит, так как согласно последней радиопередаче со станции, ее население возомнило себя космомухами и завтра, если правда не будет шквального ветра с градом, собирается выйти в открытый космос и поиграть со своими собратьями. '
скрипт2:write to player logbook value $readRadio
сообщение от: Неизвестно
позавчера вечером в Аргон Прайм на торговой станции произошло самопроизвольное возгорание кислородных балонов в стыковочном отсеке номер 666. по словам пострадавших работников стыковочного отсека - тех немногих, которых удалось привести в себя к настоящему моменту - по всей видемости в стыковочном отсеке находился транпорт с космотравой. этот случай стал бесперецендентным провалом для спасательных бригад всего сектора, так как пожар до сих пор не потушен. население станции живым щитом заслонило все остальные стыковочные отсеки и всеми силами препятствует любым попыткам потушить огонь. для рашения сложной ситуации было принято решение привлечь специалистов расы Сплит, так как согласно последней радиопередаче со станции, ее население возомнило себя космомухами и завтра, если правда не будет шквального ветра с градом, собирается выйти в открытый космос и поиграть со своими собратьями.
скрипт2:везет же людям...
добавлено спустя 6 минут:
ну и дальше про то, как по радио был установлен близкий контакт тридцать третьего уровня.
суть в том, что один передает по одному каналу ('переменная1') имя другого канала ('переменная2'). а скрипт, по случайности слушавший канал 'переменная1' услышал воззвание невидимо кого из неведомо откуда и взял да и ответил по каналу 'переменная2'. и у них установилась устойчивая связь. правда ничего в этой сказке не говорится про то, какой кавардак там начался когда там еще третий затесался.
в общем мне уже лень рассказывать несмешные анекдоты. надеюсь, хоть кто-нибудь уловил в них здравый смысл. первые два - типа про то, как делать нельзя, а вторые - про то как можно.
добавлено спустя 33 минуты:
а вот посленего даже я от себя не ожидал.
впринципе, если закрыть глаза на неэффективность, то...
тут один "пелот" очень хотел чтобы в том числе в иксах было радио. так вот оно. сообщения, переданные таким макаром, можно одинаково приятно интерпретировать как:
1. команды запуска скриптов с параметрами кораблям - типа сигналов
2. сообщения радиосвязи.
или реализовать TCI/IP)
Последний раз редактировалось: 4o (09:37 30-03-2012), всего редактировалось 9 раз(а) |
|
|
SergejU
72 EGP
 Рейтинг канала: 3(36) Репутация: 2 Сообщения: 243 Откуда: DONETSK Зарегистрирован: 11.08.2009
 |
|
4o : |
Внешние переменные по идее используются для взаимодействия скриптов (другого применения я пока не придумал)). тоесть есть 2 скрипта, полтьзующие 1 переменную.
|
Похоже что и для хранения в сейве данных о наличии объекта во вселенной.
Используется одним и тем же скриптом.
|
|
|
4o
64 EGP
 Рейтинг канала: 1(6) Репутация: 8 Сообщения: 111
Зарегистрирован: 16.01.2011
 |
|
не допер. можно еще раз?)
|
|
|
SergejU
72 EGP
 Рейтинг канала: 3(36) Репутация: 2 Сообщения: 243 Откуда: DONETSK Зарегистрирован: 11.08.2009
 |
|
4o : |
не допер. можно еще раз?)
|
Скрипт создания тренировочного корабля создает корабль,присваивает его глобальной переменной и затем по ней проверяет наличие корабля если он уничтожен создает заново и снова присваивает глобальной переменной.
|
|
|
4o
64 EGP
 Рейтинг канала: 1(6) Репутация: 8 Сообщения: 111
Зарегистрирован: 16.01.2011
 |
|
а - ну типа того. только почему бы не прицепить SIGNAL_KILLED тренировочного корабля к скрипту (пусть будет пресловутый script1) создания нового тренировочного корабля)
ну если хочется все-таки запустить дефолтный скрипт сигнала, то из script1 можно его руками вызвать после вызова скрипта на создание нового тренировочного корабля.
|
|
|
4o
64 EGP
 Рейтинг канала: 1(6) Репутация: 8 Сообщения: 111
Зарегистрирован: 16.01.2011
 |
|
продолжаем тему для тех, кто "если вдруг такие же".
здача - распилить скрипт внутреннего снабжения и сделать так, чтобы можно было сохранять конфиг снабженца на станции приписки.
входные данные:
нужный конфиг снабженца валяется в переменных (локальных на снабженце):
-goods.dev.source
-goods.dev.destination
-goods.dev.product
-goods.dev.product.price
(кстати, там есть переменная для полки по доставке (дефолт 5% и интерфейса к ней я не нашел)
решение первое.
берем все переменные со снабженца, пакуем в массив и кинаем в локалку на станции приписки.
конкретно:
скрипт 1 - скинуть переменные на станцию
скрипт 2 - загрузить конфиг со станции
косяк
1. берем одного снабженца в левую руку и настраиваем его
2. закидываем его конфиг на станцию
3. берем второго снабженца в правую руку и читаем конфиг со станции.
и получаем на выходе:
когда изменяем конфиг снабженца в правой руке (номер два), то меняется и конфиг того, что в левой руке (номер одын).
да - данный момент можно использовать, чтобы конфигурировать всех снабженцев разом изменяя конфиг единственного. но
это черевато тем, что когда убьют снабженца номер адын - все остальные останутся без конфига. проверено опытом.
краткое объяснения для меня - когда мы скидывали конфиг на станцию, то в локалке на станции появилась ссылка на конфиг номер адын. когда мы потом другими снабженцами получали конфиг со станции, то они опять же получили сцылку на конфиг первого. и поэтому когда его убивают, то его локалки дематериализуются.
результативное решение, не пренетдующее на оптмальность
после того, как скидываем конфиг на станцию - делаем первый финт ушами.
со станции берем конфиг и тут же кладем его на место. то же значение в ту же локалку.
когда загружаем конфиг - делаем второй фигнт ушами.
берем с корабля локалки и переписываем эти же локалки значениями, полченными из них же.
в итоге получаем предсказуемые последствия - конфиги всех снабженцев не зависят друг от друга и от сохраненных на станции.
с другой стороны - можно таки сдлать так, чтобы на снабженцах в конфиге были ссылки на локалку на станции. опять же - при этом изменяя конфиг на станции, мы изменяем конфиг всех снабженцев, загузивших конфиг. иногда удобно.
как доберусь до компа - выкину скрипты.
|
|
|
4o
64 EGP
 Рейтинг канала: 1(6) Репутация: 8 Сообщения: 111
Зарегистрирован: 16.01.2011
 |
|
все это чтобы обойти логику внутреннего снабжения по поределению типа (производитель/потребитель) станции.
пока не написано другое - все запускается на корабле, который надо сконфигурировать.
a.task.goods.dev.add.dest.xml - добавить потребителя
a.task.goods.dev.add.product.xml - добавить продукт с ценой 0. насколько я понимаю, можно пользовать и стандартное добавление товаров
a.task.goods.dev.add.source.xml - добавить производителя
a.task.goods.dev.download.conf.xml - считать со станции конфиг
a.task.goods.dev.ship.upd.conf.xml
a.task.goods.dev.st.upd.conf.xml
a.task.goods.dev.upd.config.xml
a.task.goods.dev.upload.config.xml - загрузить на станцию конфиг
приятного аппетита
3.zip |
Описание: |
скрипты к внутреннему снабженцу |
|
Имя файла: |
3.zip |
Размер файла: |
9.79 KB |
Скачано: |
567 раз(а) |
|
|
|
|
|
|
Канал X3: Reunion ->
Модовый и скриптовый отсек X3: Reunion: «Как пользоваться внешними переменными: пособие для детей» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: "Скотный двор" Оруэла. Все звери равны, только некоторые равнее....(Dr. Livesey)
|
» Как пользоваться внешними переменными: пособие для детей | страница 1 |
|