ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Добавляем новые команды в скрипт редактор | страница 14 |
|
|
|
Канал X2: The Threat: «Добавляем новые команды в скрипт редактор» |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
1. Погрешность будет велика.
2. Надо делать при каждом попадании, иначе смысла нет.
3. Сначала попробую скриптом, потом, если понадобится, сделаю на внутреннем коде, если не лень будет (длинно может оказаться, плюс синхронизация может понадобиться).
4. Насчёт тормозов - поэкспериментировать надо. Игра и так очень много рассчётов делает, может и вообще разницы почти не будет.
|
|
|
Boron Friend 830 EGP
Рейтинг канала: 5(203) Репутация: 263 Сообщения: 1222 Откуда: Kingdom End Зарегистрирован: 24.12.2004 |
|
А что если сделать анимацию сдвига камеры в файл сцены, а скриптом запустить этот cut при попадании в корабль плазмы?
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
akm : |
А если не каждый, то вызов скрипта движком в игре уже имеется - это SIGNAL_ATTACKED.
|
...который не работает на кораблях, на которых не запущены скрипты в нулевом стеке, насколько я помню... Т.о. на корабле игрока сигнал этот никогда не сработает, а именно для корабля игрока вся эта петрушка и нужна
Кстати, считать направление плазмы совсем не нужно. Нужно всего-лишь тряхануть корабль несколькими колебаниями по направлению, перепендикулярному направлению корабля, т.е. по его оси-Х.
Три быстрых затухающих колебания от каждой пули, плюс жуткий звук удара по железной бочке (как во фриле попадания при отключенных щитах) - и этого вполне достаточно для полной жопы радости
А вот с отдачей от выстрелов сложнее. Тут тоже нужно ловить момент выстрела каждой пушки и запускать скрипт тряски (а в х3 сделали несинхронные пушки, тогда как в х2 все пушки синхронные), либо скрипт тряски и попадания запускать глобально, чтобы они постоянно следили за плаершипом (чтоб игру не заставлять скрипты каждый раз читать и запускать).
Применительно к всего одному кораблю в игре - плаершипу, данные процедуры не должны оказывать существенного снижения производительности. Я так думаю
А в том, что за переключение звука двигателя собственного корабля отвечает движок игры, а не обж - в этом я очень сильно сомневаюсь. Возможно не в х3стори, а в х3конфиге, но явно не в экзешнике (в х3 звуковые настройки и эффекты даже вынесли в отдельный конфиг, вот только про кокпиты плаершипа забыли).
В экзешнике, имхо, кроме стартовой менюшки с настройками (одна задняя картинка менюхи весит пол экзешника) и старфорсы ничего больше нет, всё в обжах зашито, имхо.
BORON FRIEND : |
А что если сделать анимацию сдвига камеры в файл сцены, а скриптом запустить этот cut при попадании в корабль плазмы?
|
Сложно это. Кстати в х2 камера и так в кабине двигается при перегрузках (ускорение, повороты, торможение). В х3 такого не заметил, правда там и кокпитов-то нету
|
|
|
akm 470 EGP
Рейтинг канала: 1(4) Репутация: 173 Сообщения: 1638 Откуда: Паразит Прайм Зарегистрирован: 23.10.2002 |
|
AlexYar : |
...который не работает на кораблях, на которых не запущены скрипты в нулевом стеке, насколько я помню... Т.о. на корабле игрока сигнал этот никогда не сработает
|
Проверил. Так и есть, этот сигнал не срабатывает на корабле игрока, похоже обработка прерываний вообще отключена на playership.
Кстати, корабль игрока заметно трясет в Х2 при попадании снарядов. Только амплитуда маленькая. Может можно найти как ее увеличить в obj?
AlexYar : |
Кстати, считать направление плазмы совсем не нужно. Нужно всего-лишь тряхануть корабль несколькими колебаниями по направлению, перепендикулярному направлению корабля, т.е. по его оси-Х.
|
Таки приятней, когда по направлению встряски можно почувствовать откуда плазма прилетела Поэтому я и говорил, что точность там +/- пол слона сгодится, т.е. погрешность в 45 градусов не смертельна.
AlexYar : |
либо скрипт тряски и попадания запускать глобально, чтобы они постоянно следили за плаершипом (чтоб игру не заставлять скрипты каждый раз читать и запускать).
|
Ну если самым оптимальным образом делать скрипт, чтобы минимально тормозил, то в идеале это глобальный скрипт с @-командой движку, типа команды @fly to... Т.е. в бесконечном цикле в данном глобальном скрипте запускается новоиспеченная команда, которая запускает процедурку OBJ, но выход из этой процедурки (т.е. передача управления обратно в глоб.скрипт) происходит только при попадении плазмы по Playership. В остальное время эта процедурка в OBJ болтается запущенной и делает циклическую проверку на попадение плазмы, аналогично работе команд @fly to...
Если конечно такие фокусы можно программить в OBJ...
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Глобальным скриптом конечно идеально. И нет проблем с корректной обработкой нескольких попаданий за короткий промежуток времени, только проверять надо с нехилой частотой. Плюс всё равно при попадании запускать нужно скрипт запускать через START, ибо синхронизация с глобальным скпиптом обязятельна. Поэтому, для начала, упрощу себе жизнь и сделаю просто по старту обработку попаданий независимо друг от друга (и плевать, что при нескольких крутых попаданиях может некорректно потрясти). А SIGNAL_ATTACKED мне на фиг не нужен - я могу врезаться в место, где он вызывается, обойдя ненужные проверки и т.п. Могу вообще его обработку улучшить.
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
akm : |
Проверил. Так и есть, этот сигнал не срабатывает на корабле игрока, похоже обработка прерываний вообще отключена на playership.
|
Врать не буду, чтоб не обмануть, но вроде она отключена на всех кораблях, на которых не запущены скрипты ("нет команд" в консоли). Т.е. без разницы, кто в корабле, и чей он.
Или от раслоджика обработка сигналов зависит.... не помню уже.
Darth Revan : |
Плюс всё равно при попадании запускать нужно скрипт запускать через START, ибо синхронизация с глобальным скпиптом обязятельна.
|
А сделать, как akm предложил, можно? Т.е. тряска от попаданий есть и так, но она слабая, и нужно только увеличить её амплитуду.
А с тряской при выстрелах нужно копать хт-шный обж и искать там кусок нужного кода, имхо, чтобы включить стандартную процедуру.
Просто в х2 орудия стали откатными, поэтому тряску отключили (и игра сразу потеряла половину адреналина). В х3 же орудия опять стали статичными (зато съемными, т.е. если пушки в слоте нет, то ствол не отображается на корабле ), а вот тряску вернуть забыли
|
|
|
sergej4341 460 EGP
Репутация: 148 Сообщения: 1593 Откуда: Химки/Брест Зарегистрирован: 16.01.2004 |
|
Мурзилка : |
2) А в X3 что - нету кокпитов? А что же там вместо них - вид от 3-го лица только? Или кокпиты "голые" - то есть видно только стекло и раму и никаких кнопочек мигающих, дисплеев с надписями, пультов, кресел, и.т.д, - т.е. все "голое" как во фриле?
|
вид от первого лица, просто экран с космосом, из индикаторов только слоты с оружием и инфа по ракетам, все
_________________ нажал клав. и затаил дыхание |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Сделал возможным добавлять свои посты в BBS и сделал новую версию команды send incoming question to player Shaddie. В частности, теперь возможно изменение текста сообщения (читай, создание нового меню) в одном и том же окне, т.е мгновенно. И в окнах сообщений, и в меню BBS.
Расскажу поподробнее. Я добавил несколько команд, рассмотрим их по порядку.
Код: |
471: offer = create BBS offer: params= parameters array |
Эта команда создает объект offer (предложение), предназначенный для хранения сообщения BBS. Это сообщение может быть запостено на станцию или отравлено игроку. Кто смотрел quesе289.inc Shaddie, то там для реализации команды send incoming question to player создан объект миссии BBS. Объект offer, формально, также представляет из себя миссию BBS, но он никак не связан с механизмами игры по управлению миссиями BBS. (я решил обойти стандартную обработку, поскольку она заточена под их компилятор и c ScE нормально не связывается - хотя бы потому, что требует создание внутреннего класса на каждый тип миссии).
Как видно из вида команды, у сообщения есть ряд параметров. Внутри команд их используется их восемь штук.
0: offer text. Текст сообщения.
1: script name. Имя скрипта, выполняющегося при нажатии кнопки в сообщении.
2: tIme.Время отправки сообщения игроку или поста в BBS.
3: display it. Открывать ли сообщение, когда оно будет отправлено игроку (т.е. аналог display it TRUE/FALSE у Shaddie).
4: start it. Запускать ли скрипт по нажатию кнопрки через START.
5: write to logbook. Записывать ли в лог полученное сообщение после выхода из обработчика script name.
6: close menu. Закрывать ли меню после выхода из обработчика script name.
7: reserved. Зарезервировано.
Код: |
472: parameters array = offer->get BBS offer params |
Возвращает по сообщению массив параметров (не забываем, что все массивы в иксах передаются по ссылке, а точнее, передаётся ссылка на объект exeшника массив).
Код: |
473: update active menu |
Обновляет активное BBS меню или меню сообщений.
Код: |
474: offer->make offer |
Собственно посылает сообщение игроку. Когда игрок нажимает кнопку, вызывается скрипт
script name (answer, offer).
Answer - строка, содержащая ответ (задается [select value='строка']), offer - объект сообщения.
Сразу отмечу, что я сделал так, что меню, созданное командой make offer, не закрывается автоматически. Чтобы оно закрылось после обработчика script name, нужно сделать offer->params[6]=1.
Допустим, мы хотим сделать последовательные меню. Для этого просто изменяем offer->params[0], а также, по желанию, остальные параметры сообщения, но выставляем offer->params[6]=0. Затем выполняем команду update active menu и выходим из обработчика script name. После выполнения update active menu происходит обновление сообщения и новое сообщение отображается в том же окне. Опять по нажатию кнопки вызывается script name (возможно, уже другой) и т.д.
Теперь перейдём к BBS меню. Реализовано событие event.bbs.getoffers(station), которое вызывается при каждом обновлении окна BBS меню (т.е. вызывается, если сидим на станции station, через каждые random (15, 45) секунд), которое возвращает массив сообщений offer, которые мы хотим разместить на станции station. Обработчик script name в случае BBS сообщения отличается лишь тем, что для него не обрабатываются флаги display it, write to logbook, close menu.
Как правило, сообщения offer должны генерироваться и удаляться вне зависимости от скрипта event.bbs.getoffers(station) и храниться в каком-нибудь массиве (глобальном или локальном для сектора). Тогда, Чтобы удалить сообщение из BBS меню, надо просто удалить его из этого массива и выполнить команду update active menu (если мы вызываем её, находясь в BBS меню). Опять же, сообщение можно не только удалить, но и изменить eсли мы хотим, чтобы оно осталось открытым перед игроком, то при изменении не надо менять время отправки, т.е. сообщения в BBS меню отсортированы по времени; однако даже в этом случае сообщение может сместиться, если при обновлении из BBS меню будет удалено сообщение с более ранним временем отправления).
Есть ещё команда
Код: |
475: object->destroy object |
Удаляет объект object. Может быть использована для удаления объекта Offer.
Примеры в архиве.
Ещё добавил отлов выстрела из пушек. Ну и сделал пробную версию отдачи. Я попытался сделать её разной в зависимости от типа корабля и пушек. Правда параметры настроил пока во многом от балды. firelaser.rar
А это, собственно, сам патч. ux2story13_dr1_11b.rar.
------------------------------------------------------------------------
2 Мурзилка
Мыслится мне, это было специально сделано, чтобы не надо было скриптом обратно всё выгружыть после стандартной загрузки.
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
Darth Revan : |
473: update active menu
Обновляет активное BBS меню или меню сообщений.
|
А блокировка нажатия Esc есть? Или по прежнему можно закрыть это меню нестандартным способом без нажатий кнопки ответа?
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
2 AlexYAr
Эачем тебе блокировка нажатия? Больше не надо глобального скрипта с wait. Всё что душе угодно, можно передавать через params. Смотри примеры. Теперь принцип работы с последовательными меню изменился.
2 Мурзилка
Если я не вру, то чтобы не было этой фишки, нужно первой строкой в !ship.rebuild.action добавить THIS->add default items. Чтобы открыть этот скрипт в ScE, можно откомпилировать мой патч, установив ShowAllScriptsInEditor = TRUE. Затем открыть скрипт, изменить, и сохранить изменения. Изменение сохраниться с расширением xml. Если у тебя был нераспакованный скрипт !ship.rebuild.action.pck, просто удали его.
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
Darth Revan : |
Эачем тебе блокировка нажатия? Больше не надо глобального скрипта с wait. Всё что душе угодно, можно передавать через params. Смотри примеры. Теперь принцип работы с последовательными меню изменился.
|
Ничего не понял
Вот пример - игрок запускает меню, затем жмет клавише Esc, меню уходит с экрана без ответа. Затем игрок опять запускает меню - получается две копии меню?
Сейчас пока ситуация именно такая. Блокировка нажатия Esc нужна обязательно, чтобы игрок не смог убрать меню с экрана не нажав одной из клавиш ответа (если параметр display it стоит TRUE).
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Никаких копий не возникает и возникнуть им неоткуда. Если ты, конечно,сам не создаёшь повторно. Я прошу прощения, я забыл выложить файл-описатель для примера.
<page id="1112" title="" descr="">
<t id="0">[author]Author question[/author][title]Title question %s[/title]
[text colwidth='500'][center]Text question\n\n
[select value="A0"]Do some actions and reject quest[/select]\n\n
[select value='A1']Do some actions and accept quest[/select]\n\n
[select value='A2']Change message text and post time[/select]\n\n
[select value='A3']Change message text[/select]\n\n[/center][/text]</t>
</page>
Может непонятка ещё в следующем. Я команду send incoming question to player не менял. Смотри example.bbs.makeoffer.xml для примера запуска по новому.
P.S. А понял, с send incoming question to player начались проблемы. Замените мой quest289.inc на оригинальный Shaddie (или просто в тексте изменить IncomingMessage2 на IncomingMessage).
Когда глюки на nm.ru закончатся, заменю архив.
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Ещё один момент. Можно ведь для разных меню использовать один и тот же объект offer. Для того, чтобы меню закрылось по кнопке, всё равно надо установить offer->params[6]=1. Перед тем, как запускать новое, можно проверить, чтобы offer->params[6] было равным 1. Если нет, то меню не закрыто. Если да, то обнуляем, и запускаем. Закрыть по ESC - святое право игрока. Это быстрый способ закрытия меню, если, например, ситуация стала опасной. Замочил непися, а потом можно вернуться. Я проблем не вижу. Можно создавать на разные типы меню разные offer. Например, меню корабля - один, меню на станции - другой и т.п. Тогда у игрока может осесть не более одного меню каждого типа. И это абсолютно нормально.
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
Darth Revan : |
Если ты, конечно,сам не создаёшь повторно.
|
Дык именно об этом и речь! Именно я, или другой игрок, и запустят воторую, третью, десятую копию меню, а потом будут мучаться с поиском активного окна, не имея доступа к меню вообще.
Делать блокировку дублей в скриптах - крайняя степень мазохизма (сложность отладки отбивает всё желание делать интерактивные меню вообще, а единственная ошибка заблокирует сразу всё дерево навсегда, т.е. до следующего патча для мода).
Вот именно поэтому активное окно, которое уже перед глазами игрока, обязательно должно блокировать нажатие клавиши Esc игроком. Тогда сразу море проблем будут решены.
Теперь понятно объяснил? Я уже с этими меню исплевался с год назад (когда еще её шадди сделал), и эта одна из причин, почему так и не вышел И-2 (задолбался отлаживать консоль и сотни скриптов блокировок писать).
Darth Revan : |
Закрыть по ESC - святое право игрока. Это быстрый способ закрытия меню, если, например, ситуация стала опасной.
|
Ни в коем случае! Если ситуация стала опасной - игрок сам виноват. Нефиг лезть в меню в опасных ситуациях Это раз.
А во-вторых - сделать кнопку отбоя (возврата в начало) - это обязанность скриптописателя, который делает меню.
Уж кнопку добавить - проблем не составит
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
То, что было раньше, было мазохизмом, согласен. И не стабильно. Я специально изменил способ навигации. И дерева вообще никакого нет. И блокировки как таковой специальной нет. Суть изменений:
1. Вызов нового меню происходит прямо в обработчике OnSelect.
2. Меню само по себе не закроется по нажатию, как было раньше, пока не установишь params[6]=1.
Раньше меню закрывалось по любому нажатию вне зависимости от того, что происходит в обработчике OnSelect. Сейчас ответственность за закрытие лежит на программере. Нажал ESC - меню ушло в Incoming messages. Одно.
Никаких десяти меню не может появиться и в помине, потому что новое меню ты запускаешь с тем же объектом offer, изменяя текст сообщения. Т.е. реально, это то же самое окно, и то же самое сообщение, но с другим текстом. Поэтому и отображается новое меню мгновенно. Ты хоть десять меню перебери, но иксовское сообщение одно и то же.
Это не иерархические, это последовательные меню. Открывая следующее, предыдущее пропадает. И кнопка возврата - это кнопка по созданию заново предыдущего меню. Конечно, при переходе из одного меню в другое, ты можешь запоминать состояния и т.п. Причём в параметрах offer->params - и не надо никаких глобальных переменных. В обработчике OnSelect offer всегда с тобой, и ты всегда сможешь определить, обработчик какого это меню (я не говорю уже о том, что скрипты обработчиков могут быть разными).
Проверяя offer->params[6] перед запуском (не из OnSelect, там меню всегда ещё открыто), ты обеспечиваешь, что одному объекту offer соответствует одно сообщение. И по значению offer->params[6] ты знаешь, не висит ли это одно сообщение в Incoming messages.
Это твоё дело, будешь ты делать один объект offer вообще на все меню, или несколько. Но только не по объекту offer на каждое новое меню. Тогда, действительно, ты получишь иерархию окон и траблы с увеличением числа иксовских сообщений со всеми вытекающими последствиями.
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
Darth Revan : |
Но только не по объекту offer на каждое новое меню.
|
Напиши тогда пример скрипта по иерархическому меню.
Т.е. на первой странице меню четыре кнопки: "1", "2", "3" и "выход".
Каждая кнопка (1-3) открывает своё окно с одной кнопкой "назад".
На примере этой навигации уже будет гораздо понятнее. Оки?
Просто таких вкладок может быть туева хуча (в зависимости от ситуации по игре окна могут меняться), поэтому максимальное упрощение создания такого меню будет способствовать развитию интерактивных меню.
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Патч 1.12 бета.
Добавил команды
476: show incoming messages
Открывает меню входящих сообщений.
477: result = sqrt number
Возвращает квадратный корень числа (есть он всё-таки в игре).
478: number = str2int string
Преобразует строку, содержащую число, в число.
479: offer->remove all offers from incoming messages
Удаляет из списка входящих сообщений все сообщения, созданные при помощи объекта offer.
Также добавил в perform operation:
88: GetMass obj - объект
89: SetMass obj - объект, par1 - масса
90: SetMaxAvoidShield obj - объект, par1 - величина щита
Кому интересно, можно поэкспериментировать с GetMass, SetMass, SetMaxAvoidShield. По умолчанию, масса корабля равна его полному размеру (т.е. вместе с размерами составляющих его body). SetMaxAvoidShield устанавливается при активации корабля равным (макс. корпус + макс. щит) / 8.
Добавил ещё примеры работы с меню.
2 AlexYar. Сделал, даже не один уровень, а два. В целом, сделал схему для удобства реализации иерархического меню (см. пример в архиве).
Патч - ux2story13_dr1_12b.rar (выложил, наконец, нормально).
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
Darth Revan : |
делал, даже не один уровень, а два. В целом, сделал схему для удобства реализации иерархического меню (см. пример в архиве).
|
Посмотрел - как-то чрезмерно усложненно всё А если вкладок меню 1000, то сколько придется писать скриптов?
По-старинке (с командой Шадди) делается всё горааааздо проще и читабельней. Вот пример:
Скрипт обработчик нажатий кнопок один на все окна и всего две строки:
alexyar.add3.mybbs.a.xml
001 set global variable: name='ay.mybbs' value=$ValueAnswer
002 return null
Далее основное меню:
001 load text: id=5000
002 $null = null
003
004 if get global variable: name='ay.con.work'
005 $menu = read text: page=7000 id=2003
006 START speak text: page=13 id=135 priority=1000
007 return null
008 end
009
010 $menu = read text: page=7000 id=2003
011
012 set global variable: name='ay.mybbs' value=null
013 set global variable: name='ay.con.work' value=1
014
015 @ = wait 250 ms
016 send incoming question $menu to player: display it=[TRUE] callback='alexyar.add3.mybbs.a'
017
018 while 1
019 $answ = get global variable: name='ay.mybbs'
020 skip if $answ == null
021 break
022 @ = wait 100 ms
023 end
024
025 @ = wait 250 ms
026
027 if $answ == 'R'
028 set global variable: name='ay.con.work' value=null
029 @ START $null -> call script 'alexyar.add1.stat' : Sample=null Display=1
030 return null
031 end
032
033 if $answ == 'L'
034 @ START $null -> call script 'alexyar.add3.mybbs.license' :
035 return null
036 end
037
038 if $answ == 'B'
039 @ START $null -> call script 'alexyar.add3.mybbs.bus' :
040 return null
041 end
042
043 if $answ == 'E'
044 set global variable: name='ay.con.work' value=null
045 return null
046 end
047
048
049 return null
Вполне легко читается и понимается...
C 29-ой строки запускаются скрипты окон/вариантов ответов (на каждое окно свой скрипт для удобства, хотя иногда бывает достаточно в одном скрипте пару окон реализовать).
add: Кстати, вышеприведенный скрипт легко унифицируется, тогда он будет вообще один на все окна меню, т.е. не придется для каждого окна писать скрипты. Достаточно будет просто его запустить с нужными аргументами, и он будет открывать окно с другими вопросами и принимать другие ответы Это я только что допёр
set global variable: name='ay.con.work' value=1
это блокировка повторного создания меню...
Возможно, что мне твой вариант просто кажется чрезвычайно сложным, так как нет возможности посмотреть в работе (не запустить х2), но имхо проще добавить команде Шадди блокировку нажатия Esc, да одну команду по очистке лога, и будет всё легко и четко
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Просто шапку я сделал большую. А сам код - по две строки на каждую вкладку. А шапка копируется. Ты заметил, что все обработчики - одинаковые. Т.е. совсем. Хочешь без шапки - просто заново вводи строку, которая будет выводится, и имя скрипта OnSelect. Это я сделал, чтобы автоматически сохранялись сообщения предыдущих уровней. Удали шапку: сама функциональность - десять строк на скрипт.
Каждый OnSelect - это меню. Вызов нового реально писать - две строки. Остальное - копируется из скрипта в скрипт без изменений.
Вот эти строки:
$offertext = sprintf: pageid=1113 textid=1, '1', '1', null, null, null
$onselect = 'example.bbs.onselect.1'
P.S. Я же сделал команду по очистке лога.
P.P.S. Можно и не писать шапку. Тогда чтобы вернуться назад в родительское окно, тебе придётся заново ввести его текст и callback. А так они сами запоминаются. Плюс - ты можешь запустить не с нулевого, а с любого уровня иерархии, и работать будт точно так же. Т.е. на нужном уровне back превратится в exit.
P.P.P.S. И эдесь ты можешь запустить один обработчик на все окна. В чём проблемы? Передавай хоть мегабайт параметров. Лучше всего прямо в offer->params.
Px4.S. Кстати, и блокировки не надо. Вызываешь
offer->remove all offers from incoming messages ,
а затем
offer->make offer.
С точки зрения объёма программирования, здесь тебе надо всего две вещи для создания новой вкладки: указать строку нового сообщения (читай, нового меню) и новый callback. При вызове родительского окна через offer->make offer кроме этого надо ещё занулить пару параметров. Всё.
Так что в сторону усложнения ничего не изменилось.
Мой пример проще простого реализовать именно на одном обработчике. Я специально для тебя их размножил. Их там столько не нужно.
Px5.S. A преимущества, между прочим, стоящие.
1. Нет проблем с блокировкой.
2. Мгновенное отображение нового окна меню (причём и в BBS ты можешь мгновенно сменить сообщение).
3. Возможность переброски сообщений из BBS в меню и обратно.
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 6(442) Репутация: 324 Сообщения: 31694
Зарегистрирован: 26.10.2003 |
|
Darth Revan : |
Я же сделал команду по очистке лога.
|
А блокировку Esc?
Я к чему про блокировку... Вот смотри. Скриптописатель ведь не зря ставит display it: TRUE, он делает это для того, чтобы окно было перед глазами игрока. А раз оно должно быть перед глазами игрока, то и иметь возможности его закрыть без ответа игрок не должен!
Если бы это было не критично - ставишь display it: FALSE , и никаких проблем. Но тут именно что критично, меню не должно иметь нестандартных способов отбоя, кроме как через кнопку меню "выход". Какая разница игроку нажать "выход" или "Esc"? А скриптописателю разница большая, состоящая в лишних строках, проверках и сотней часов отладки скриптов. Вот о чем речь.
Если сможешь сделать блокировку Esc для команды Шадди с параметром TRUE под х3 для тестов, то я тебе его последний патч на мыло скину сегодня. Можно туда и всё остальное добавить, но это наверное долго будет, пока блокировку хотелось-бы потестить (если не долго, то и свой способ туда добавь для посмотреть).
|
|
|
|
|
|
Канал X2: The Threat: «Добавляем новые команды в скрипт редактор» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Мы уже привыкли, что ты с нами через КПК пьешь (Ahilles - Samogon'у)
|
» Добавляем новые команды в скрипт редактор | страница 14 |
|