|
|
|
Канал X3: Reunion »
Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)» |
|
Нужна ли школа скриптописателей |
Да. чем нас больше, тем игра веселее |
|
95% |
[ 65 ] |
Нет, развелось вас. |
|
4% |
[ 3 ] |
|
Всего проголосовало : 68 |
|
|
|
Bob_Koh 61 EGP
Рейтинг канала: 3(31) Репутация: 4 Сообщения: 125 Откуда: Хмельник Зарегистрирован: 15.10.2007 |
|
Andrei [<>Ace] : |
AlexYar если развить тему можно неплохой скрипт сделать в рамках ШКОЛЫ
Допустим история:
В скоплениях и на отдельных астероидах завелись некие биомеханические существа, целые колонии. Замечено нападение данных существ на корабли приближающиеся к астероидам менее чем на 1000 м или 2000 м. Атакованный ими корабль получает повреждения корпуса и оборудования до прохождения корантина на Верфи или Доке оборудования.
|
А может лучше рендомно раскидать по карте теми же скриптами радиоактивные участки или создать объект - радиоактивное облако (причем облака сделать с центрами плотности степень поедания увеличить к центру) и сделать апдэйт-жопс или апдэйт-карту!
|
|
|
Proteus 88 EGP
Рейтинг канала: 5(113) Репутация: 35 Сообщения: 443 Откуда: Латвия Зарегистрирован: 17.03.2007 |
|
Andrei [<>Ace] : |
А если применить нормальные команды:
|
Я эти команды незаметил попробую исправится.
Andrei [<>Ace] : |
$hull.percent = $hull * 10 / 100
|
А ты на словах можеш описать что твоя строка делает а то у меня фигня получается.
_________________ На пыльных тропинках далёких планет останутся наши мозги.
Последний раз редактировалось: Proteus (16:12 24-11-2007), всего редактировалось 2 раз(а) |
|
|
Lars 440 EGP
Рейтинг канала: 1(5) Репутация: 77 Сообщения: 2450 Откуда: Архангельск Зарегистрирован: 28.03.2007 |
|
Andrei [<>Ace] : |
AlexYar если развить тему можно неплохой скрипт сделать в рамках ШКОЛЫ
Допустим история:
|
Давайте вначале закончим текущий скрипт, а то превратим тему в сплошную кашу, из непонятно к какому заданию принадлежащих постов.
Andrei [<>Ace] : |
Допустим история:
В скоплениях и на отдельных астероидах завелись некие биомеханические существа, целые колонии. Замечено нападение данных существ на корабли приближающиеся к астероидам менее чем на 1000 м или 2000 м. Атакованный ими корабль получает повреждения корпуса и оборудования до прохождения корантина на Верфи или Доке оборудования.
|
А эт историю можно использовать как следующее задание
_________________ "Мозги... нам нужны мозги!"(с) "Живые мертвецы" |
|
|
AlexYar 1856 EGP
Рейтинг канала: 13(2096) Репутация: 324 Сообщения: 31707
Зарегистрирован: 26.10.2003 |
|
Lars : |
Давайте вначале закончим текущий скрипт, а то превратим тему в сплошную кашу, из непонятно к какому заданию принадлежащих постов.
|
Поддерживаю. Сперва нужно доделать простое, а уж потом усложнять. К тому же тема для обучения, а не создания новых суперскриптов
При создании чего-либо в первую очередь нужно приучить себя доводить дело до конца. Даже если на горизонте появилось что-то более интересное
|
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
Bob_Koh : |
А может лучше рендомно раскидать по карте теми же скриптами радиоактивные участки или создать объект - радиоактивное облако (причем облака сделать с центрами плотности степень поедания увеличить к центру) и сделать апдэйт-жопс или апдэйт-карту!
|
Ерунда получиться. В Х2 такая туманность была. Может она и в Х3 работала бы?
Proteus : |
А ты на словах можеш описать что твоя строка делает а то у меня фигня получается.
|
Десять процентов от переменной $hull
Lars : |
Давайте вначале закончим текущий скрипт,
|
А я разве говорил не заканчивать ?
AlexYar : |
Сперва нужно доделать простое, а уж потом усложнять.
|
Делать заново всегда проще чем переделывать старое!
AlexYar : |
При создании чего-либо в первую очередь нужно приучить себя доводить дело до конца.
|
И в первую очередь нужно довести до конца задание, придать ему смысл. Заинтересовать. Правильно поставленная задача это уже 70% работы.
|
|
|
Proteus 88 EGP
Рейтинг канала: 5(113) Репутация: 35 Сообщения: 443 Откуда: Латвия Зарегистрирован: 17.03.2007 |
|
Andrei [<>Ace] : |
Создавать одним скриптфайлом корабль и тут же выполнять алгоритм задания - просто неправильно.
|
А можно пример попроще, как из одного скрипта запустить другой. А то какой командой это делается я вроде нашел а описание всех необходимых параметров в справочниках мне не по зубам. Мозг пухнет.
Все остальные недочеты вроде устранил.
_________________ На пыльных тропинках далёких планет останутся наши мозги. |
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
Proteus : |
А можно пример попроще, как из одного скрипта запустить другой.
|
Ща попробуем
Для этого нужны два скрипта минимум:
1. Создает корабль и запускает скрипт повреждения - create.ship
2. скрипт повреждения - damage
Начнем со второго - damage.
В нем нужно создать:
1. аргумент - 1: ship , Var/Ship , 'ship' - сюда пеервый скрипт передаст указатель на созданный им корабль.
2. сам алгоритм повреждения.
Первый скрипт - create.ship - создает корабль:
$ship = create ship: type .....
В переменной $ship содержиться "указатель" на этот корабль.
Далее запускаешь, в нашем случае, глобальный скрипт, предварительно создав переменную - к примеру:
$global.script =null
и собственно команда на запуск глобального скрипта -
@ START $global.script -> call script 'damage': ship=$ship
Понятно?
Последний раз редактировалось: Andrei [<>Ace] (19:18 24-11-2007), всего редактировалось 2 раз(а) |
|
|
AlexYar 1856 EGP
Рейтинг канала: 13(2096) Репутация: 324 Сообщения: 31707
Зарегистрирован: 26.10.2003 |
|
Andrei [<>Ace] : |
Далее запускаешь, в нашем случае, глобальный скрипт, предварительно создав переменную - к примеру:
|
А глобальный скрипт откуда узнает, что корабль дезинфицировали?
В глобальном скрипте в цикл повреждения после while нужно так же вставить проверку глобальной (в данном случае можно локальной) переменной. Например:
skif if get global variable 'test001.infected'
break
А перед запуском скрипта повреждения эту переменную выставить в 1.
set global variable 'test001.infected' to 1
@ START $global.script -> call script 'damage': ship=$ship
Впоследствии, когда корабль вылечится, эта переменная будет выставлена в 0, и скрипт повреждения сам вывалится из памяти, прекратив свою работу.
|
|
|
Proteus 88 EGP
Рейтинг канала: 5(113) Репутация: 35 Сообщения: 443 Откуда: Латвия Зарегистрирован: 17.03.2007 |
|
Andrei [<>Ace] : |
Понятно?
|
Да с заданием всю получилось. Только мне надо было 2 указателя во второй скрипт передать, вроде удалось.
А вот про то что пишет AlexYar совсем непонятно, как это делать я понял а вот зачем неочень(может он боится что мы вырастем и отправим его на пенсию вот и сыпет непонятными терминами ).
_________________ На пыльных тропинках далёких планет останутся наши мозги. |
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
AlexYar : |
А глобальный скрипт откуда узнает, что корабль дезинфицировали?
|
А он сам это проверить не может?
Мы с тобой ща все сами сделаем, друг перед другом чет доказывая.
Я только пример показаваю, как кому идею реализовать пусть сам решает.
Proteus : |
А вот про то что пишет AlexYar совсем непонятно, как это делать я понял а вот зачем неочень(может он боится что мы вырастем и отправим его на пенсию вот и сыпет непонятными терминами ).
|
Все понятно , только способов решить задачу много.
AlexYar предлагает создать глобальную переменную - переключатель со значениями 0- корабль инфецирован и 1- дизинфецирован. Отвечать за это будет еще один глобальный скрипт, а скрипт разрушения бедет ждать изменения этой переменной в 1- для положительного завершения.
И вообще предлагаю вопросы как, подскажите - сюда: Скриптописание - делимся опытом, задаем вопросы
А здесь готовые примеры и их обсуждение!
|
|
|
AlexYar 1856 EGP
Рейтинг канала: 13(2096) Репутация: 324 Сообщения: 31707
Зарегистрирован: 26.10.2003 |
|
Andrei [<>Ace] : |
А он сам это проверить не может?
|
Дык я и предлагаю в него самого (скрипт повреждения корпуса) добавить эту проверку
Andrei [<>Ace] : |
Мы с тобой ща все сами сделаем
|
Ну и ладно, зато в данном случае быстрее люди поймут, как правильнее сделать, чем мы будем ждать, пока сами все всё поймут
Andrei [<>Ace] : |
AlexYar предлагает создать глобальную переменную - переключатель со значениями 0- корабль инфецирован и 1- дизинфецирован. Отвечать за это будет еще один глобальный скрипт
|
Нет, не еще один, а тот же самый, что запустил скрипт-разрушитель
1. Первый скрипт:
а) посылает сообщение (прилетите сюда)
б) ждёт, пока игрок прилетит.
в) запускает скрипт разрушения.
г) посылает сообщение - "лечитесь там".
д) ждёт игрока на станции лечения.
е) ставит глоб.переменную в 0, отключая скрипт разрушения.
ж) Посылает сообщение игроку "вы вылечены" и завершается.
2. Второй скрипт:
а) Разрушает корпус, пока глоб.переменная равна 1.
б) Завершается, если глоб.переменная равна 0.
Собственно и всё. Надеюсь, я понятно изъяснил свой способ решения задачи
Proteus : |
может он боится что мы вырастем и отправим его на пенсию
|
Я буду только рад, если на ЕГе будет больше скриптеров и моддеров. Мне меньше работы будет по добавлению в игру чего-нить интересного, можно пользоваться трудами других пилотов
|
|
|
Proteus 88 EGP
Рейтинг канала: 5(113) Репутация: 35 Сообщения: 443 Откуда: Латвия Зарегистрирован: 17.03.2007 |
|
Старый вариант удалил вот новый по заданию предложенному пилотом Else с исправлениями тех моментов на которые указали опытные скриптописатели.
скрипт ааcreateship
001 $Ship= create ship: type=Деметра owner=Player addto=Свет Надежды x=0 y=0 z=0
002 $Ship -> add default items to ship
003 $Ware= create flying ware: maintype=14 subtype=2 count=20 sector=Свет Надежды x=0 y=0 z=200 selfdestruct=0
004 $global.script=null
005 @ START$global.script -> call script 'aadamage' : Ship=$Ship Ware=$Ware
006 return null
скрипт aadamage
001 @ =wait 20000 ms
002 =$Ship -> catch ware object $Ware
003 @ =wait 20000 ms
004 send incoming message 'Обнаружена аномалия в трюме' to player: display it=[TRUE]
005 @ =wait 5000 ms
006 $hull=$Ship -> get hull
007 $hullperc=$hull * 10 / 100
008 while$hull > $hullperc
009 $hull=$hull - $hullperc / 10
010 $Ship -> set hull to $hull
011 @ =wait 1000 ms
012 end
013 send incoming message 'Аномалия устранена' to player: display it=[TRUE]
014 return null
_________________ На пыльных тропинках далёких планет останутся наши мозги.
Последний раз редактировалось: Proteus (20:57 24-11-2007), всего редактировалось 1 раз |
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
Ну наверно какое задание такое и решение - никакой эстетики.
1.
Proteus : |
001 $Ship= create ship: type=Деметра owner=Player addto=Свет Надежды x=0 y=0 z=0
...
003 $Ware= create flying ware: maintype=14 subtype=2 count=20 sector=Свет Надежды x=0 y=0 z=200 selfdestruct=0
|
sector=Свет Надежды - так делать не стоит. Для сектора еще проходит, но с объектами уже нет. Лучше сектор или объект получить в скрипт, а не указать. В данном случае добавит выше команду $sector=get sector from universe index: x=1, y=4 и соответственно:
001 $Ship= create ship: type=Деметра owner=Player addto=$sector x=0 y=0 z=0
003 $Ware= create flying ware: maintype=14 subtype=2 count=20 sector=$sector x=0 y=0 z=200 selfdestruct=0
2.
Proteus : |
009 $hull=$hull - $hullperc / 10
|
Зачем делить на 10?
3. В цикле не учтены возможные повреждения от столкновения или боя.
4.
Proteus : |
001 @ =wait 20000 ms
002 =$Ship -> catch ware object $Ware
|
Для приличия подлететь к контейнеру стоит - 200м как никак.
|
|
|
Proteus 88 EGP
Рейтинг канала: 5(113) Репутация: 35 Сообщения: 443 Откуда: Латвия Зарегистрирован: 17.03.2007 |
|
Andrei [<>Ace] : |
Зачем делить на 10?
|
Чтоб убирался 1% от первоначального хулла в секунду а не 10%.
Andrei [<>Ace] : |
В цикле не учтены возможные повреждения от столкновения или боя.
|
Как это делается незнаю и идей нет, может кто из из начинающих скриптеров идеи подаст а то списывая у старшекласников ничему ненаучимся у нас ведь начальная Школа.
Все остальные замечания постараюсь учесть.
_________________ На пыльных тропинках далёких планет останутся наши мозги. |
|
|
Expert 423 EGP
Рейтинг канала: 9(1073) Репутация: 154 Сообщения: 533 Откуда: Златоуст, Южный Урал Зарегистрирован: 15.08.2004 |
|
Proteus : |
Как это делается незнаю и идей нет, может кто из из начинающих скриптеров идеи подаст а то списывая у старшекласников ничему ненаучимся у нас ведь начальная Школа.
|
Прежде чем обновлять значение хулла нужно перечитать его текущее состояние.
$Hull = $Ship -> get hull
А уже потом отнимать проценты от этого текущего состояния и вписывать обновленное значение.
$Hull = $Hull - $damage
$Ship -> set hull to $Hull
Последний раз редактировалось: Expert (22:08 24-11-2007), всего редактировалось 1 раз |
|
|
AlexYar 1856 EGP
Рейтинг канала: 13(2096) Репутация: 324 Сообщения: 31707
Зарегистрирован: 26.10.2003 |
|
Andrei [<>Ace] : |
Ну наверно какое задание такое и решение - никакой эстетики.
|
Вот. Ты давай тогда рули здесь пока (только не пропадай), а я другими делами займусь, коих тоже немало
|
|
|
KAlex
|
|
Предлагаю немного усложнить задачу...
Оценка 5+++
1) Есть свой корабль (корабль игрока), есть контейнер (созданный скриптом)... Выполняем скрипт на корабле - аналог "Подобрать контейнер"
2) При подборе контейнера звуковое предупреждение: "Внимание: в грузовом отсеке обнаружено увеличение уровня радиации." {17,250101} (перевод от НД)
3) Сначала происходит вот что:
- корабль теряет управление, его начинает кидать из стороны в сторону все время выполнения скрипта (команда - лететь в точку уклоняясь от врага)
- начинает, мелкими частями, вываливаться груз из грузового отсека (процентов до 40-30)
- корабль начинает "терять" установленные компоненты: оружие, щиты, модули расширения (например ТМП-1 и т.п.) - от 15% до 25% но не все
- начинает повреждаться корпус до 20%
4) Далее должно быть 3 варианта окончания сюжета:
- корабль разрушается полностью - взрыв, на 5%-10% корпуса происходит катапультирование пилота (пилот сбежал от чужого)
- чужой захватывает пилота и управляет им (корабль становится враждебным - смена расы пилота на хаака/ксенона)
- с корабля вылетает контейнер с чужим (пилот справился с чужим) - еще пилот может расстрелять контейнер (отомстить
PS Вот это будет действительно интересно... полюбоваться на то, как будут развиваться события
PPS Можно еще добавить звуков и т.п. - типа сообщений от того пилота: "Помогите, с кораблем творится что-то неладное"
PPPS Много думал... это вполне реально сделать - если кто сделает, то я у него скриптик скачаю 100% (отпишитесь плиз
PPPPS Если никто не возьмется - сам напишу
|
|
|
Lars 440 EGP
Рейтинг канала: 1(5) Репутация: 77 Сообщения: 2450 Откуда: Архангельск Зарегистрирован: 28.03.2007 |
|
Скрипт "поедания" хула, запускающий его скрипт сделал, а скрипт редактор его грохнул (с ним какая-то проблема, скрипты не сохраняет )
Код: |
Arguments
1: ship , Перем/Корабль , 'player.ship'
Source Text
001 $t=get global variable: name=$mode
002 $hull=$ship -> get hull
003 while$t != 0
004 while$hull > 0
005 @ =wait 1000 ms
006 dec $hull=
007 $ship -> set hull to $hull
008 $hull=$ship -> get hull
009 end
010 if$hull == 0
011 $ship -> destruct: show no explosion=[TRUE]
012 end
013 $t=get global variable: name=$mode
014 end
015 return null |
глобальная переменная mode: если mode=1, значит чужой еще на корабле, если mode=0, значит чужого "обезвредили"
_________________ "Мозги... нам нужны мозги!"(с) "Живые мертвецы" |
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
AlexYar : |
Вот. Ты давай тогда рули здесь пока (только не пропадай), а я другими делами займусь, коих тоже немало
|
Автор темы Else - ему бы и рулить.
Да и учиников то - один Proteus отметился и тот сам думать лениться.
Интересно кто те 20 , что в голосовании да сказали.
Я то буду за темой присматривать. Но и последней инстанцией быть не хочу.
Вообщето есть тема - К скриптерам просьба - идеи для заданий можно брать оттуда.
KAlex : |
Предлагаю немного усложнить задачу...
Оценка 5+++ ...
PPPS Много думал... это вполне реально сделать - если кто сделает, то я у него скриптик скачаю 100% (отпишитесь плиз
|
Эт ты хорошо придумал , Чужими руками себе скриптик написать.
Lars : |
Скрипт "поедания" хула
|
Не - ты действительно програмированием часто занимаешься?
Зачем такие сложности?
Ты посты других участников темы читаешь?
Теперь по коду:
1. 001 $t=get global variable: name=$mode
ГДЕ переменная - $mode?
ГДЕ, хотябы $t участвует?
2. Понимаешь, за время ожидания 005 @ =wait 1000 ms множество скриптов может с хуллом корабля сделать что угодно и 008 $hull=$ship -> get hull - уже будет не верным.
3. 010 if$hull == 0 - а если после выполнения цикла 004 while$hull > 0 - значение $hull будет меньше 0 - уничтожение не произойдет.
4.
Lars : |
запускающий его скрипт сделал, а скрипт редактор его грохнул
|
Наверно тоже сектор или объекты указал, а не получил коммандами.
5.
Lars : |
глобальная переменная mode: если mode=1, значит чужой еще на корабле, если mode=0, значит чужого "обезвредили"
|
Не сработает она в твоем варианте. Не переменную ставить нужно , а имя ее - текстовое значение.
Последний раз редактировалось: Andrei [<>Ace] (14:36 25-11-2007), всего редактировалось 4 раз(а) |
|
|
AlexYar 1856 EGP
Рейтинг канала: 13(2096) Репутация: 324 Сообщения: 31707
Зарегистрирован: 26.10.2003 |
|
Andrei [<>Ace] : |
Автор темы Else - ему бы и рулить.
|
Рулить нужно тому, кто разбирается в скриптописании, а он, насколько я понял, создал тему для того, чтобы научиться самому и другие тоже бы научились. Идея хорошая на мой взгляд, так как на примерах проще учиться, да еще если кто-то может объяснить, почему написано так, а не иначе.
Andrei [<>Ace] : |
Я то буду за темой присматривать. Но и последней инстанцией быть не хочу.
|
Главное - чтобы было кому отвечать на вопросы новичков
Andrei [<>Ace] : |
ГДЕ, хотябы $t участвует?
|
В цикле (строка 003).
Andrei [<>Ace] : |
3. 010 if$hull == 0 - а если после выполнения цикла 004 while$hull > 0 - значение $hull будет меньше 0
|
Не может оно стать меньше нуля
Andrei [<>Ace] : |
Не переменную ставить нужно , а имя ее - текстовое значение.
|
...и запрашивать её нужно на каждом витке цикла, а не один раз в начале скрипта.
Вот так бы сделал я:
Код: |
Arguments
1: ship , Var/Ship , 'ship'
Source Text
001 $gvarname = 'test001.infected' (задаём имя глобальной переменной)
002 $damage = $ship -> get max hull (узнаём макс.значение корпуса)
003 $damage = $damage / 100 (определяем, на какое значение будем "повреждать", 1%)
004 set global variable: name=$gvarname value=1 (устанавливаем глоб.переменную в 1 перед работой цикла)
*Далее работа повреждалки.
005 while $ship -> get hull (пока корпус "есть", т.е. не равен нулю, начало цикла)
006 skip if get global variable: name=$gvarname (пропускать следующую строку, пока глоб.переменная не равна нулю)
007 return null (выход из скрипта)
008 $hull = $ship -> get hull (узнаём текущее значение корпуса)
009 $hull = $hull - $damage (рассчитываем новое значение)
010 skip if $hull > 0 (пропустить следующую строку, если новое значение больше нуля)
011 break (выйти из цикла на строку 015)
012 $ship -> set hull to $hull (устанавливаем корпусу новое значение)
013 @ = wait 10000 ms (ждём 10 секунд)
014 end (конец цикла)
015 $ship -> destruct: show no explosion=[FALSE] (уничтожить корабль)
016
017 return null (завершение скрипта)
|
Пояснения:
1. Имя глоб.переменной воизбежания совпадения с скриптами других пилотов лучше делать уникальным. В данном примере в начале имени стоит название тестового "устройства", а потом через точку - за что переменная отвечает. И понятно, и вероятность совпадения мала. Роль глобальной переменной - триггер, т.е. переключатель.
Если она станет равной нулю, то скрипт будет принудительно завершён.
2. Почему во второй и третье строке одна и та же переменная используется? Просто для экономии памяти Так как значение в итоге нам нужно всего одно, то и переменная для этого тоже может использоваться одна. В строке 003 сперва выполняется правая часть выражения, а затем результат присваивается переменной $damage. Если, к примеру, в строке 002 переменная имела значение 1000, то в строке 003 значение будет равно 10.
3. Зачем глобальную переменную устанавливать в скрипте повреждения в 1. Просто для того, чтобы этого не делать в запускающем скрипте Операция эта проводится всего один раз, поэтому я её и вынес из большого скрипта в маленький. Т.е. чтобы разгрузить большой скрипт от лишних строк и команд.
4. Строка 005 - цикл, он будет работать до тех пор, пока значение корпуса корабля больше нуля (меньше нуля оно быть не может в игре).
5. Строки 006 и 007 как раз и являются переключателем, они завершат работу скрипта, если значение глоб.переменной станет равным нулю или null.
6. Строки 010 и 011 - завершат работу цикла (цикл начинается на строке 005 и заканчивается строкой 014), приведя к уничтожению корабля командой Destruct. Значение FALSE в команде нужно для того, чтобы корабль взорвался как положено, т.е. с анимацией взрыва и звуком. Если значение будет TRUE, то корабль просто исчезнет.
Последний раз редактировалось: AlexYar (16:44 25-11-2007), всего редактировалось 2 раз(а) |
|
|
|
|
|
Канал X3: Reunion ->
Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)» |
|