ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Скрипт-школа (Задачи для начинающих скриптописателей) | страница 5 |
|
|
|
Канал X3: Reunion »
Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)» |
|
Нужна ли школа скриптописателей |
Да. чем нас больше, тем игра веселее |
|
95% |
[ 65 ] |
Нет, развелось вас. |
|
4% |
[ 3 ] |
|
Всего проголосовало : 68 |
|
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
WhiteWolf : |
а goto label позволяет оставить энное количество строк текста для подпрограмм
|
Перестаю понимать народ .
WhiteWolf : |
Решаются коллизии когда сферы объектов могут пересекаться (например М5 залетел в выемку в астероиде)
|
Да. И не только эти. Но и нахождение корабля внутри дебриса.
Последний раз редактировалось: Andrei [<>Ace] (19:07 28-11-2007), всего редактировалось 1 раз |
|
|
WhiteWolf 55 EGP
Рейтинг канала: 2(13) Репутация: 0 Сообщения: 53
Зарегистрирован: 24.10.2007 |
|
Andrei [<>Ace] : |
Перестаю понимать народ
|
А что тут не понятного? Говорю же, привычка осталась от старой закалки процедуры и функции писать до основного кода программы. Тем более, в случае с написанием скриптов в Х2/Х3 конструкция типа "label ... endsub" может находиться в любом месте скрипта, то оптимальными местами расположения таких конструкций могут быть либо начало, либо конец скрипта. И в любом случае придеться основной код ограничивать (в начале как "goto метка_начала_основного_кода_скрипта", а при расположении в конце как "return <RetVar>"). И несомненным плюсом расположения данных конструкций в начале скрипта является явное указание на переход к исполнению основного кода. Т.е. отсутствует возможность (в свете автоматической подстановки скрипт редактором "return null" последней строкой в скрипте и забывчивостью скриптописателей) исполнения кода внутри конструкций "label ... endsub" без их непосредственного вызова.
Код: |
... основной код скрипта
return null
metka :
... код подпрограммы
endsub
|
Этот код завершиться на "retun null"
Код: |
... основной код скрипта
metka :
... код подпрограммы
endsub
|
А этот на "endsub"
Далее...
Andrei [<>Ace] : |
Код правильный. То что ты заявил он выполняет.
|
Ну раз уж мы тут вроде как учимся, то лично мне бы хотелось, чтобы Гуру скриптописания подсказали бы и как можно оптимизировать код
PS. Что-то я не обнаружил в массиве $Ships = get ship array: of race Player class/type=null корабля с игроком Так и должно быть?
Снято. Нашел ошибку. Все на месте и присутствует
Последний раз редактировалось: WhiteWolf (22:00 28-11-2007), всего редактировалось 3 раз(а) |
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
WhiteWolf : |
А этот на "endsub"
|
Все скрипты в Х3 заканчиваются на retun .
WhiteWolf : |
Ну раз уж мы тут вроде как учимся, то лично мне бы хотелось, чтобы Гуру скриптописания подсказали бы и как можно оптимизировать код
|
Ну ваши коды я оптимизировать не буду - сами этим занимайтесь.
Мой вариант такой: Скрипт определяет вероятность заражения шляющегося между астероидами корабля игрока.
Код: |
001 while 1 Запускаем "пеленгатор"
002 $wait = = random value from 1 to 7 - 1
003 $wait = $wait * 10000
004 @ = wait $wait ms выборочно через 10000-60000мс.
005 $ship = get player ship Получаем указатель на корабль игрока
006 $sector = $ship -> get sector определяем сектор.
007 $object = find asteroid: sector=$sector resourcetype=null
min.yield=null flags=[Find.Nearest] refobj=$ship maxdist=10000
maxnum=null refpos=null Ближайший астероид.
008 skip if not $object
009 gosub attack Отправляем на проверку.
010 $object = find debris: sector=$sector resource=null min
yield=null flags=[Find.Nearest] refobj=$ship num=null
max distance=10000 refpos=null Ближайший дебрис.
011 skip if not $object
012 gosub attack Отправляем на проверку.
013 end Крутим это постоянно.
014 return null
015 attack: блок отвечающий за вероятность заражения корабля.
016 $size.ship = $ship -> get size of object Размер корабля.
017 $size.object = $object -> get size of object Размер объекта.
018 $distance = get distance between $ship and $object Дистанция. между ними
019 $distance = $distance - $size.ship - $size.object Дистанция между
поверхностями объектов.
020 if $distance < 2000 При дистанции меньше 2000м.
произвести заражение с вероятностью:
021 if $distance > 1500
022 $retvar = = random value from 0 to 9 - 1 -один к девяти
023 else if $distance > 1000
024 $retvar = = random value from 0 to 7 - 1 -один к семи
025 else if $distance > 500
026 $retvar = = random value from 0 to 5 - 1 -один к пяти
027 else
028 $retvar = = random value from 0 to 3 - 1 -один к трем.
029 end
030 skip if $retvar > 1
031 (Выполнить заражение корабля)
032 end
033 endsub
034 return null |
Последний раз редактировалось: Andrei [<>Ace] (11:57 29-11-2007), всего редактировалось 4 раз(а) |
|
|
WhiteWolf 55 EGP
Рейтинг канала: 2(13) Репутация: 0 Сообщения: 53
Зарегистрирован: 24.10.2007 |
|
Цитата: |
Ну ваши коды я оптимизировать не буду Улыбка - сами этим занимайтесь.
|
Я не просил оптимизировать, я просил подсказать как оптимизировать. Ну и раз уж вы отказываетесь, то займусь этим сам
Вместо вот этого кода
Код: |
019 if $distance > 1500
020 $retvar = = random value from 1 to 5 - 1 -один к четырем
021 else if $distance > 1000
022 $retvar = = random value from 1 to 4 - 1 -один к трем
023 else if $distance > 500
024 $retvar = = random value from 1 to 3 - -1один к двум (50/50)
025 else
026 $retvar = 1 -немедленно.
027 end
028 skip if $retvar > 1
029 (Выполнить заражение корабля)
|
я бы использовал вот этот
Код: |
$temp = $distance + 1
$retvar = random value from 0 to $temp - 1
skip if $retvar > 500
(Выполнить заражение корабля)
|
Выполняет тоже самое, избавляет от "if ... else ... end", ну и более плавно меняется шанс заражения корабля
Последний раз редактировалось: WhiteWolf (04:50 29-11-2007), всего редактировалось 1 раз |
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
WhiteWolf : |
я просил подсказать как оптимизировать.
|
А сам не видишь .
Строки 004-006 и 011-013 - одинаковые (уже почти одинаковые)
Ты в коде правил что-то или я не заметил сразу? 012 - Проверяешь к чему ближе корабль - астероиду или дебрису? Зачем? А если рядом будут два одинаковых объекта - тогда между ними тоже выбирать нужно.
Одинаковые строки можно вынести в блок и - gosub (одну две конечно не рационально). Ну и, персонально, для такой малой операции скрипт get.distance.between.objects. Можно было в то же gosub. И строки 003, 005 в одну . Все. Что тут еще оптимизировать ?
WhiteWolf : |
Выполняет тоже самое, избавляет от "if ... else ... end", ну и более плавно меняется шанс заражения корабля
|
Да, ты прав, так будет плавно.
Но не всегда плавно для цифровых изъяснений будет лучше.
Включи скрипт и запиши его работу в лог. Сравни когда плавно и когда не очень.
Я даже предлагаю вместо 002 @ = wait randomly from 5000 to 60000 ms - с плавным изменением, использовать:
Код: |
002 $wait = = random value from 1 to 7 - 1
003 $wait = $wait * 10000
004 @ = wait $wait ms |
Временные промежутки в 20000, 30000 - лучше смотрятся чем 24736, 36743
а блок:
Код: |
019 if $distance > 1500
020 $retvar = = random value from 0 to 5 - 1 один к четырем
021 else if $distance > 1000
022 $retvar = = random value from 0 to 4 - 1 один к трем
023 else if $distance > 500
024 $retvar = = random value from 0 to 3 - 1один к двум (50/50)
025 else
026 $retvar = 1 немедленно
027 end |
заменить на:
Код: |
021 if $distance > 1500
022 $retvar = = random value from 0 to 9 - 1 -один к девяти
023 else if $distance > 1000
024 $retvar = = random value from 0 to 7 - 1 -один к семи
025 else if $distance > 500
026 $retvar = = random value from 0 to 5 - 1 -один к пяти
027 else
028 $retvar = = random value from 0 to 3 - 1 -один к трем.
029 end |
Чтобы не плавно
2ALL - в ситуации с объектами разобрались? Как работает find, get distance...? Разрушать скриптом умем. Остается красиво заразить корабль, и обязательно тот который нужно .
Предложения есть? Пора уже заканчивать с этим заданием.
Последний раз редактировалось: Andrei [<>Ace] (13:57 30-11-2007), всего редактировалось 3 раз(а) |
|
|
KAlex
|
|
Andrei [<>Ace] : |
Пора уже заканчивать с этим заданием.
|
Стоп - я еще свой отлаженный скрипт не выложил... Скоро будет готов.
|
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
KAlex : |
Стоп - я еще свой отлаженный скрипт не выложил... Скоро будет готов.
|
Ждем, ждем. У меня уже готово новое задание - более интересное.
Вкратце: Новый апгрейд-вооружение, достаточно мощное и вполне выполнимое без модерства . Хотел сам сделать, но для меня это слишком легко .
|
|
|
WhiteWolf 55 EGP
Рейтинг канала: 2(13) Репутация: 0 Сообщения: 53
Зарегистрирован: 24.10.2007 |
|
Ну вот, что у меня получилось
Cкрытый текст (кликните здесь для просмотра)
Код: |
Script termit.invasion
Version: 0
for Script Engine Version: 32
Description
Arguments
Source Text
001 $distance = 2000
002 $Flag = [Find.Nearest] | [Find.Multiple]
003 $ship = [PLAYERSHIP]
004 $Time1 = 10000
005 $Time2 = 60000
006 $QuantityOfTermites = 0
007 while 1
008 @ = wait randomly from $Time1 to $Time2 ms
009 skip if $ship -> exists
010 return null
011 $Enviroment = $ship -> get environment
012 if not $Enviroment -> is of class Sector
013 $Type1 = $Enviroment -> is of class Shipyard
014 $Type2 = $Enviroment -> is of class Equipment Dock
015 if $Type1 OR $Type2
016 if $QuantityOfTermites > 0
017 send incoming message 'Your ship desinsected' to player: display it=[FALSE]
018 $QuantityOfTermites = 0
019 $Time1 = 10000
020 $Time2 = 60000
021 end
022 end
023 else
024 $sector = $ship -> get sector
025 $obj = find asteroid: sector=$sector resourcetype=null min.yield=null flags=$Flag refobj=$ship maxdist=10000 maxnum=1 refpos=null
026 if $obj != null
027 @ $TrueArrayOfObjects = $ship -> call script 'get.true.array.objects' : Ship=$ship Array of object=$obj Max distance=$distance
028 end
029 $obj = find debris: sector=$sector resource=null min yield=null flags=$Flag refobj=$ship num=1 max distance=3000 refpos=null
030 if $obj != null
031 @ $TempArray = $ship -> call script 'get.true.array.objects' : Ship=$ship Array of object=$obj Max distance=$distance
032 end
033 if $TrueArrayOfObjects != null AND $TempArray != null
034 $ArraySize = size of array $TrueArrayOfObjects
035 $TempArraySize = size of array $TempArray
036 inc $ArraySize =
037 $NewSize = $ArraySize + $TempArraySize
038 resize array $TrueArrayOfObjects to $NewSize
039 copy array $TempArray index 0 ... $TempArraySize into array $TrueArrayOfObjects at index $ArraySize
040 else if $TempArray != null
041 $TempArraySize = size of array $TempArray
042 $TrueArrayOfObjects = clone array $TempArray : index 0 ... $TempArraySize
043 else if $TrueArrayOfObjects != null
044 else
045 skip if $QuantityOfTermites == 0
046 goto label dam
047 continue
048 end
049 $ArraySize = size of array $TrueArrayOfObjects
050 $ArrayIndex = 0
051 while $ArrayIndex <= $ArraySize
052 $Element = $obj[$ArrayIndex]
053 $dist = get distance between $Element and $ship
054 $Size = $Element -> get size of object
055 $dist = $dist - $Size
056 $Size = $ship -> get size of object
057 $dist = $dist - $Size
058 skip if $dist >= 0
059 $dist = 0
060 if $Size > 3000
061 $MaxTermits = = random value from 1 to 11 - 1
062 else if $Size > 2000
063 $MaxTermits = = random value from 1 to 6 - 1
064 else if $Size > 1000
065 $MaxTermits = = random value from 1 to 3 - 1
066 else
067 $MaxTermits = 1
068 end
069
070 if $dist > 1500
071 $Shance = = random value from 0 to 10 - 1
072 else if $dist > 1000
073 $Shance = = random value from 0 to 5 - 1
074 else if $dist > 500
075 $Shance = = random value from 0 to 3 - 1
076 else
077 $Shance = = random value from 0 to 2 - 1
078 end
079 if $Shance != 0 AND $QuantityOfTermites == 0
080 send incoming message 'Yor ship insected space termites. Move to Shipyard or Equipment dock' to player: display it=[FALSE]
081 $Time1 = 1000
082 $Time2 = 5000
083 $QuantityOfTermites = $QuantityOfTermites + $MaxTermits
084 else if $Shance != 0
085 $QuantityOfTermites = $QuantityOfTermites + $MaxTermits
086 end
087 inc $ArrayIndex =
088 end
089 dam:
090 $Damage = = random value from 0 to 6 - 1
091 $Damage = $Damage * $QuantityOfTermites
092 * write to log file #56 append=[TRUE] value=$Damage
093 $Hull = $ship -> get hull
094 $Hull = $Hull - $Damage
095 if not $Hull > 0
096 $QuantityOfTermites = 0
097 $Time1 = 10000
098 $Time2 = 60000
099 $ship -> destruct: show no explosion=[FALSE]
100 $ship = get player ship
101 while $ship != null
102 @ = wait 1000 ms
103 $ship = get player ship
104 * write to log file #56 append=[TRUE] value='Ishem novuu posudinu'
105 skip if $ship -> is of class Astronaut
106 break
107 end
108 skip if $ship != null
109 return null
110 else
111 $ship -> set hull to $Hull
112 * write to log file #56 append=[TRUE] value=$Hull
113 end
114 end
115 end
116 return null
|
|
в довесок идет
Cкрытый текст (кликните здесь для просмотра)
Код: |
Script get.true.array.objects
Version: 0
for Script Engine Version: 32
Description
Arguments
1: Ship , RefObj , 'Ship'
2: obj , Var/Array , 'Array of object'
3: distance , Var/Number , 'Max distance'
Source Text
001 if $obj != null
002 $ArraySize = size of array $obj
003 $ArrayIndex = 0
004 while $ArrayIndex <= $ArraySize
005 $Element = $obj[$ArrayIndex]
006 $dist = get distance between $Element and $Ship
007 $Size = $Element -> get size of object
008 $dist = $dist - $Size
009 $Size = $Ship -> get size of object
010 $dist = $dist - $Size
011 skip if $dist >= 0
012 $dist = 0
013 if $dist > $distance AND $ArrayIndex == 0
014 $obj = null
015 break
016 else if $dist > $distance
017 $NewArraySize = $ArrayIndex - 1
018 resize array $obj to $NewArraySize
019 break
020 end
021 inc $ArrayIndex =
022 end
023 end
024 return $obj
|
|
Ну и стартовый скрипт из одной строки
Код: |
START $start -> call script "termit.invasion" :
|
Конечно не совсем хорошо, что количество термитов атаковавших корабль не сохраняются ни в локальной, ни в глобальной переменных, что дает возможность избавится от термитов сейв-лоадом. Но сейчас уже поздно (два часа ночи блин), а завтра на работу. Завтра доведу до ума и более - менее оптимального вида
Последний раз редактировалось: WhiteWolf (14:46 30-11-2007), всего редактировалось 1 раз |
|
|
KAlex
|
|
WhiteWolf : |
Script get.true.array.objects
...
002 $ArraySize = size of array $obj
003 $ArrayIndex = 0
004 while $ArrayIndex <= $ArraySize
...
|
Индексация идет от 0 до ($ArraySize - 1), так что: while $ArrayIndex < $ArraySize
WhiteWolf : |
017 $NewArraySize = $ArrayIndex - 1
018 resize array $obj to $NewArraySize
|
Если... Да нет - не катит полюбому... Практически полное обрезание массива...
добавлено спустя 50 секунд:
PS Могу только посоветовать с массивами поплотнее поработать
добавлено спустя 18 минут:
PPS А первый слишком большой - некогда смотреть - на работе...
|
|
|
Else 140 EGP
Рейтинг канала: 3(26) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007 |
|
Добавлю новое задание:
Тема задания навеяна повестью Э.Нортон "Саргассы в космосе"
Ваш корабль встречает в космосе разрушеную станцию. При подлете к станции на растояние 10 км управление кораблем перехватывается и корабль остается в космосе. Около станции висит еще один корабль класса М3, мы должны отключить устройство перехватывающее управление. Для этого катапультируемся с корабля подлетаем к станции на растояние 50 метров. Приходит сообщение что устройство отключено, сторониий еорабль можно захватить, для активации своего корабля надо долететь до определенной станции в соседнем секторе и забрать электронный ключ у вашего друга. Садимся на М3, летим на станцию, нам говорят что наш М3 пиратский корабль замеченный в нападении на транспорты сектора, друг говорит что поможет бежать, при подлете к разрушеной станции появляется пират на М4 и начинает атаковать, страшно ругаясь что ты забрал его корабль. В конце концов он катапультируется, захватываем его, он говорит что подтвердит ваше алиби в обмен на сохранение жизни. Летим обратно на станцию, пират дает показания, переднами извиняются, и все Хэппи Енд.
Сектора по вашему усмотрению, уважаемые преподаватели, если вы в описании увидели очень сложные или не реализуемые моменты, отпишите, отругайте или подскажите как обойти данные моменты.
_________________ Интересно, а пить водку в полночь, считается после работы или до? |
|
|
AlexYar 1851 EGP
Рейтинг канала: 13(2096) Репутация: 324 Сообщения: 31640
Зарегистрирован: 26.10.2003 |
|
Else : |
если вы в описании увидели очень сложные или не реализуемые моменты, отпишите
|
Судя по теме задания тут даются для начинающих скриптописателей. А то задание, что ты дал, не каждый ас скриптописания на ЕГе возьмётся выполнить
Тут людям сперва нужно объяснить что такое "переменная", каких типов они бывают, что такое "цикл" или "массив" - они даже это понимают с трудом судя по тому, что никто не пишет своих вопросов (когда непонятно абсолютно ничего, то ессно и не знаешь, что спрашивать).
А вы с Айсом даёте задания для одного двух человек всего, остальные смотрят на всё круглыми глазами и ничего не понимают.
2Айс, напиши людям пару лекций по простейшим понятиям. Для тех, кто не только никогда скрипты или программы не писал, а и вообще о программировании впервые слышит.
Тема же явно называется - школа для начинающих !
Либо тему переименуйте, либо хорош первоклассников "интегралами" грузить
|
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
AlexYar : |
А вы с Айсом даёте задания для одного двух человек всего, остальные смотрят на всё круглыми глазами и ничего не понимают.
|
Не сваливай всех в кучу . Конечно задание, предложенное Else, сложное, но выполнимое, может быть не во всех пунктах и не на данном этапе.
Задания даются для тех - кто хочет научиться составлять скрипты. Если "ученики" считают, что читать им матчасть здесь не нужно, и не умеют правильно задать вопрос, то возиться с такими бесполезно.
А кто всерьез воспринял "Школу" - тот уже показал первые результаты:
KAlex - выполнил задание. Немного своеобразно. С небольшими ошибками, но сказал, что будет пока занят и не сможет принимать участие.
WhiteWolf - выполнил задание в полной мере. Осталось привести скрипт в законченный вариант. За время выполнения задания задал уйму вопросов в теме "Скриптописание - делимся опытом, задаем вопросы". Завалил своими примерами мою личку. Получил ответы на все вопросы и сообщения.
Else - только темы предлагает .
Proteus - на примеры ответы получил, ни одного вопроса по существу не задал.
Lars - сказал, что здесь все просто и пропал.
AlexYar : |
А вы с Айсом даёте задания для одного двух человек всего, остальные смотрят на всё круглыми глазами и ничего не понимают
|
Когда не понимают - спрашивают. А то как узнать, что кто-то чего-то не понимает .
AlexYar : |
2Айс, напиши людям пару лекций по простейшим понятиям. Для тех, кто не только никогда скрипты или программы не писал, а и вообще о программировании впервые слышит.
|
Понимаешь, я не программист. Начальные понятия об АЛГОРИТМЕ, что такое "цикл" или "массив", получил на уроках в школе в 1993г. (один учебный год). Лекцию я не осилю.
PS. В этой теме ведь был пример по циклам, зачем его удалили?
Вот и NOsoft говорит, что у меня еще все впереди, и я научусь писать скрипты, или лекции (не разберу по пунктуации).
Последний раз редактировалось: Andrei [<>Ace] (22:39 04-12-2007), всего редактировалось 6 раз(а) |
|
|
NOsoft
|
|
Else : |
Добавлю новое задание:
Э.Нортон "Саргассы в космосе"
|
Со стороны "не сведущему человеку" кажется впринципе просто
Хотя если разложить по этапно (поделить на логические группы), будет лучше (наверное).
Andrei [<>Ace] : |
Понимаешь, я не програмист. Начальные понятия об АЛГОРИТМЕ, что такое "цикл" или "массив" получил на уроках в школе в 1993г. Лекцию я не осилю.
|
Главное начать Советовать и указывать на ошибки проще, по себе знаю.
Но если писать уроки в "инетреактивном режиме" (тобишь здесь на форуме) может получиться значительно больше, чем просто лекция...
|
|
|
Bob_Koh 61 EGP
Рейтинг канала: 3(31) Репутация: 4 Сообщения: 125 Откуда: Хмельник Зарегистрирован: 15.10.2007 |
|
Else : |
Добавлю новое задание:
Тема задания навеяна повестью Э.Нортон "Саргассы в космосе"
Ваш корабль встречает в космосе ...........................
|
Ну это уж очень сложное задание! Наверное проще "Анну Каренину" в скриптах сваять!
Ребята, а может опуститься на землю и пробовать наваять скрипты, от которых и какая-то польза окружению будет!
Вот например:
Скрипт, позволяющий в игровом формате дать пользу самому игроку, в виде увеличения ФПСа и освобождения игрового пространства от мусора!
Тема: "Утилизатор"
На каком-то доке оборудования продается мини-завод "Утилизатор". Данный мини-завод возможно разместить только на ТЛе. Если на ТЛе кроме него будет присутствовать определенный набор девайсов, то в меню "Специальные" появится команда "Начать утилизацию в секторе". Утилизации подлежат все дэбрисы и обломки астероидов, предварительно разваленных игроком астеров (за ненужностью).
Принцип работы утилизатора: подбирать (определенное расстояние) обломки в секторе, видимые на карте сектора, открытые в зоне действия сканера ТЛи или спутниками игрока. Переработке (затрат времени и батареек) подлежат все обломки, не имеющие ресурса превращаются в космопыль, те которые имеют ресурс, после переработки попадают в трюм в виде готового товара.
Возможно наладить переработку остатков (объектов) цивилизаций на металлолом.
Кроме стандартных может выслать игроку сообщения:
-Утилизация в секторе Х закончена
-Нет места в трюме для дальнейшей работы
-Нет батарей для дальнейшей работы
Последний раз редактировалось: Bob_Koh (03:37 05-12-2007), всего редактировалось 1 раз |
|
|
WhiteWolf 55 EGP
Рейтинг канала: 2(13) Репутация: 0 Сообщения: 53
Зарегистрирован: 24.10.2007 |
|
Вот, что у меня получилось после долгих мучений над задачей "Атака термитов":
Скрипт "Script termit.invasion" - его задача проверить все корабли принадлежащие игроку на расположение в опасной близости от астероидных объектов, сгенерировать шанс заражения и количество термитов нападающих на корабль, проверить был ли корабль заражен ранее и из полученных результатов сформировать реестр зараженных кораблей.
(помещаю в спойлер ибо код не маленький)
Cкрытый текст (кликните здесь для просмотра)
Код: |
Script termit.invasion
Version: 0
for Script Engine Version: 32
Description
Arguments
Source Text
001 $distance = 2000
002 $Flag = [Find.Nearest] | [Find.Multiple]
003 $GlbalVarName = 'InsectedShip'
004 while 1
005 $TS = = random value from 1 to 7 - 1
006 $TS = $TS * 10000
007 @ = wait $TS ms
008 $PlayerShips = get ship array: of race Player class/type=Мобильный корабль
009 $sizeplayershiparray = size of array $PlayerShips
010 while $sizeplayershiparray
011 @ = wait 100 ms
012 dec $sizeplayershiparray =
013 $ship = $PlayerShips[$sizeplayershiparray]
014 skip if $ship -> exists
015 continue
016 $Enviroment = $ship -> get environment
017 if $Enviroment -> is of class Сектор
018 $sector = $ship -> get sector
019 $TrueArrayOfObjects = array alloc: size=0
020 $obj = find asteroid: sector=$sector resourcetype=null min.yield=null flags=$Flag refobj=$ship maxdist=10000 maxnum=5 refpos=null
021 gosub gettrueobjects
022 $obj = find debris: sector=$sector resource=null min yield=null flags=$Flag refobj=$ship num=10 max distance=3000 refpos=null
023 gosub gettrueobjects
024 $ArraySize = size of array $TrueArrayOfObjects
025 while $ArraySize
026 @ = wait 100 ms
027 dec $ArraySize =
028 skip if $ship -> exists
029 break
030 $Element = $TrueArrayOfObjects[$ArraySize][0]
031 skip if $Element -> exists
032 continue
033 gosub getshanceandtermites
034 if $Shance == 0 AND $QuantityOfTermites == 0
035 if $ship == [PLAYERSHIP]
036 $String = 'Yor ship insected space termites. Move to Shipyard or Equipment dock'
037 else
038 $String = 'Yor ship: ' + $ship + ' in sector: ' + $sector + ' insected space termites. Move it to Shipyard or Equipment dock'
039 end
040 send incoming message $String to player: display it=[FALSE]
041 $QuantityOfTermites = $MaxTermits
042 $TempArray = array alloc: size=2
043 $TempArray[0] = $ship
044 $TempArray[1] = $QuantityOfTermites
045 append $TempArray to array $InsectedShips
046 set global variable: name=$GlbalVarName value=$InsectedShips
047 else if $Shance == 0
048 $QuantityOfTermites = $QuantityOfTermites + $MaxTermits
049 $InsectedShips[$TS][1] = $QuantityOfTermites
050 set global variable: name=$GlbalVarName value=$InsectedShips
051 end
052 end
053 end
054 end
055 end
056 return null
057 gettrueobjects:
058 $ArraySize = size of array $obj
059 $TS = 0
060 while $TS < $ArraySize
061 $Element = $obj[$TS]
062 $dist = get distance between $Element and $ship
063 $Size = $Element -> get size of object
064 $dist = $dist - $Size
065 $Size = $ship -> get size of object
066 $dist = $dist - $Size
067 if $dist > $distance
068 break
069 else
070 $TempArray = array alloc: size=2
071 $TempArray[0] = $Element
072 $TempArray[1] = $dist
073 append $TempArray to array $TrueArrayOfObjects
074 end
075 inc $TS =
076 end
077 endsub
078 getshanceandtermites:
079 $Size = $Element -> get size of object
080 $dist = $TrueArrayOfObjects[$ArraySize][1]
081 if $Size > 3000
082 $MaxTermits = = random value from 5 to 11 - 1
083 else if $Size > 2000
084 $MaxTermits = = random value from 2 to 6 - 1
085 else if $Size > 1000
086 $MaxTermits = = random value from 1 to 3 - 1
087 else
088 $MaxTermits = 1
089 end
090 if $dist > 1500
091 $Shance = = random value from 0 to 10 - 1
092 else if $dist > 1000
093 $Shance = = random value from 0 to 5 - 1
094 else if $dist > 500
095 $Shance = = random value from 0 to 3 - 1
096 else
097 $Shance = = random value from 0 to 2 - 1
098 end
099 $InsectedShips = get global variable: name=$GlbalVarName
100 $TS = size of array $InsectedShips
101 $QuantityOfTermites = 0
102 while $TS
103 dec $TS =
104 $SA = $InsectedShips[$TS]
105 $SI = get index of $ship in array $SA offset=-1 + 1
106 if not $SI
107 $QuantityOfTermites = $SA[1]
108 break
109 end
110 end
111 endsub |
|
Скрипт "Script plugin.termit.invasion.add.damag" - его задача работать с реестром зараженных кораблей и имитировать поведение термитов на корабле. Т.е. разрушать корпус корабля, уничтожать товар в трюме (так, что не удивляйтесь куда пропало некоторое количество того или иного товара) Если же термит набрел в трюме на батарейку, то вместе с ней покидает корабль (возите побольше батареек с собой, тогда будет неплохой шанс выжить в астероидном поле). Ну и собственно проводит дезинсекцию корабля при стыковке с верфью или доком оборудования.
Cкрытый текст (кликните здесь для просмотра)
Код: |
Script plugin.termit.invasion.add.damag
Version: 0
for Script Engine Version: 32
Description
Arguments
Source Text
001 $GlbalVarName = 'InsectedShip'
002 while 1
003 @ = wait 5000 ms
004 $InsectedShips = get global variable: name=$GlbalVarName
005 $Size = size of array $InsectedShips
006 while $Size
007 dec $Size =
008 $EnclosedArray = $InsectedShips[$Size]
009 $ship = $EnclosedArray[0]
010 $QuantityOfTermites = $EnclosedArray[1]
011 $Enviroment = $ship -> get environment
012 $Type1 = $Enviroment -> is of class Верфь
013 $Type2 = $Enviroment -> is of class Док оборудования
014 if $Type1 OR $Type2
015 $String = 'Your ship ' + $ship + ' desinsected'
016 send incoming message $String to player: display it=[FALSE]
017 remove element from array $InsectedShips at index $Size
018 continue
019 end
020 $WareArray = $ship -> get tradeable ware array from ship
021 $SizeWareArray = size of array $WareArray
022 if $SizeWareArray
023 $WareElement = = random value from 0 to $SizeWareArray - 1
024 $Ware = $WareArray[$WareElement]
025 if $Ware == Батареи
026 dec $QuantityOfTermites =
027 = $ship -> add -1 units of $Ware
028 if not $QuantityOfTermites
029 $String = 'Termites have left your ship: ' + $ship
030 send incoming message $String to player: display it=[FALSE]
031 remove element from array $InsectedShips at index $Size
032 continue
033 else
034 $InsectedShips[$Size][1] = $QuantityOfTermites
035 end
036 else
037 $Shance = = random value from 0 to 4 - 1
038 skip if $Shance
039 = $ship -> add -1 units of $Ware
040 end
041 end
042 $Damage = = random value from 0 to 6 - 1
043 $Damage = $Damage * $QuantityOfTermites
044 $Hull = $ship -> get hull
045 $Hull = $Hull - $Damage
046 if not $Hull > 0
047 $Enviroment = $ship -> get sector
048 $ship -> put into environment $Enviroment ->
049 remove element from array $InsectedShips at index $Size
050 $String = 'Yor ship: ' + $ship + ' in secnor: ' + $Enviroment + ' destroyed by termites.'
051 send incoming message $String to player: display it=[FALSE]
052 $ship -> destruct: show no explosion=[TRUE]
053 else
054 $ship -> set hull to $Hull
055 end
056 end
057 set global variable: name=$GlbalVarName value=$InsectedShips
058 end |
|
AlexYar, в этом скрипте у меня проблемка возникла, отправили к тебе суть вот в чем:
в справочнике команд Х3 написано про "<object>put into environment <environment>"
Цитата: |
Обратите внимание на то, что эта команда не запускает механизма создания секторальных объектов (генерации 3D-объектов), из чего следует – нельзя применять эту команду к кораблю игрока, т.к. теоретически перемещение произойдет и все внутренние ссылки на Playership будут изменены, а визуальные 3D-модели сектора-назначения и всех находящихся в нем объектов созданы не будут (вокруг будет чернота, но на карте сектора ваш корабль будет присутствовать – и соответственно может быть убит кем нибудь), то есть ScE считает, что корабль игрока находиться внутри сектора, а сектор система будет считать удаленным.
|
Если я правильно понял смысл этого, то в секторе в котором присутствует игрок команда переместит объект, а его 3D модель по новому месту расположения не создаст (этакий корабль невидимка)?
Ну и установочный скрипт:
Код: |
Script !setup.termit.invasion
Version: 0
for Script Engine Version: 32
Description
Arguments
Source Text
001 $GlbalVarName = 'InsectedShip'
002 $GlVarTermOn = 'GlVarTermOn'
003 $InsectedShips = get global variable: name=$GlbalVarName
004 $TermOn = get global variable: name=$GlVarTermOn
005 if not size of array $InsectedShips
006 $InsectedShips = array alloc: size=0
007 set global variable: name=$GlbalVarName value=$InsectedShips
008 end
009 if not $TermOn
010 set global variable: name=$GlVarTermOn value=1
011 @ START $start -> call script 'termit.invasion' :
012 @ START $start -> call script 'plugin.termit.invasion.add.damag' :
013 end |
PS. Извени Andrei [<>Ace] до деинсталлирующего скрипта руки так и не дошли, и сегодня уже не дойдут (Уезжаю на юбилей к отцу есть и водку )
Последний раз редактировалось: WhiteWolf (11:49 05-12-2007), всего редактировалось 1 раз |
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
WhiteWolf : |
Извени Andrei [<>Ace] до деинсталлирующего скрипта руки так и не дошли
|
А он уже и не нужен.
Я придумал как сделать скрипт, завершающийся после удаления его из папки scripts (Если кто-то это придумал до меня - я об этом не знал . Сам додумался.).
Вот простой пример:
Код: |
Script ace.test
Version: 0
for Script Engine Version: 32
Description
Описание
Arguments
1: Var , Var/Number , 'Var' - создаем аргумент
Source Text
001 skip if not $Var - при первом запуске скрипта $Var=0, при последующих - 1
002 return $Var
003
004 while 1
005 @ skip if [THIS] -> call script 'ace.test' : Var=1 - пока скрипт присутствует в папке scripts он будет возвращать - 1 и выполняться бесконечно, когда будет удален вернет null и завершится.
006 return null
007
008 @ = wait 5000 ms
009 end
010
011 return null |
Последний раз редактировалось: Andrei [<>Ace] (23:41 05-12-2007), всего редактировалось 2 раз(а) |
|
|
AlexYar 1851 EGP
Рейтинг канала: 13(2096) Репутация: 324 Сообщения: 31640
Зарегистрирован: 26.10.2003 |
|
Andrei [<>Ace] : |
Я придумал как сделать скрипт, завершающийся после удаления его из папки scripts
|
А ты тестировал этот способ?
А вообще есть способ намного проще. Вопросом автоперезагрузки скриптов начали интересоваться еще в х2. Тогда появился идеально просто способ -
1. Во-первых, если со скриптом идёт файл-описатель, то обычно с ним же он и удаляется.
2. Один из адресов файла-описателя (tID) может быть триггером.
3. В скрипте, не важно каком - локальном или глобальном, перед запуском или внутри цикла вставляется проверка tID по файлу описателю. Если он по длине строки больше "флага" (или своей версии скрипта - что удобнее), то скрипт завершается. Если скрипт удалён из игры вместе с файлом-описателем, то флагом будет длинная строка начинающаяся на ридтекст, и ессно она проверку не пройдёт, и скрипт будет выгружен из кэша.
Точно так же делается автообновление версии скрипта.
version read text page: 8000 id: 0
cur.version read text page: 8000 id: 0
while version == cur.version
cur.version read text page: 8000 id: 0
.....
end
Любой, даже глобальный скрипт, выгрузятся из памяти, если либо старый скрипт удалён из папки игры, либо там появилась новая версия скрипта
akm так же придумал и автозапуск сразу новой версии, чтобы не было необходимости делать новый setup-файл для каждой новой версии скрипта. Т.е. не по ретурну выходим, а сперва запускаем служебный универсальный скрипт, который запустит новую версию, а только потом вываливаемся по ретурну. Либо можно просто запустить самого себя - это будет эквивалентно, так как если новая версия есть, то будет запущена она, а если скрипт удалён, то будет просто выход по ретурну
|
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
AlexYar : |
А ты тестировал этот способ?
|
Конечно, или есть сомнения. Работает 100%
AlexYar : |
А вообще есть способ намного проще. Вопросом автоперезагрузки скриптов начали интересоваться еще в х2. Тогда появился идеально просто способ -
1. Во-первых, если со скриптом идёт файл-описатель, то обычно с ним же он и удаляется.
2. Один из адресов файла-описателя (tID) может быть триггером.
3. В скрипте, не важно каком - локальном или глобальном, перед запуском или внутри цикла вставляется проверка tID по файлу описателю. Если он по длине строки больше "флага" (или своей версии скрипта - что удобнее), то скрипт завершается. Если скрипт удалён из игры вместе с файлом-описателем, то флагом будет длинная строка начинающаяся на ридтекст, и ессно она проверку не пройдёт, и скрипт будет выгружен из кэша.
|
Да и это тоже можно. Но файл-описатель можно легко изменить. Или перевести на родной язык. Получается строка должна содержать только цифры.
Кому что понравится - выбирайте сами .
AlexYar : |
Любой, даже глобальный скрипт, выгрузятся из памяти, если либо старый скрипт удалён из папки игры, либо там появилась новая версия скрипта.
|
Это как. Или ты про файл-описатель, если его удалить, то скрипт с проверкой завершиться.
Если скрипт без проверки удалить из папки, то его хвосты сами не завершаться. Час на сете ждал этого чуда .
Последний раз редактировалось: Andrei [<>Ace] (23:37 05-12-2007), всего редактировалось 3 раз(а) |
|
|
WhiteWolf 55 EGP
Рейтинг канала: 2(13) Репутация: 0 Сообщения: 53
Зарегистрирован: 24.10.2007 |
|
Andrei [<>Ace] : |
Ждем, ждем. У меня уже готово новое задание - более интересное.
Вкратце: Новый апгрейд-вооружение, достаточно мощное и вполне выполнимое без модерства Улыбка . Хотел сам сделать, но для меня это слишком легко Гы-гы .
|
Анонсировано, но не сформировано
Else : |
Добавлю новое задание:
Тема задания навеяна повестью Э.Нортон "Саргассы в космосе"
|
и
Bob_Koh : |
Скрипт, позволяющий в игровом формате дать пользу самому игроку, в виде увеличения ФПСа и освобождения игрового пространства от мусора!
Тема: "Утилизатор"
|
В общем так и не определились с заданием Так над чем работать?
"Утилизатор" вроде как полезен, да и давно мечтал поставить на TS буровую установку, сканер минералов и сборщик руды и заставить его переработать все астероиды в секторе с содержанием полезных ископаемых менее определенного уровня
"Саргассы" интересны именно написанием кода и обработкой всех тонкостей.
Ну а про "Апгрейд-вооружение" сказать что-то очень сложно, но уже интересна сама такая возможность
|
|
|
Andrei [<>Ace] 303 EGP
Рейтинг канала: 6(416) Репутация: 108 Сообщения: 766 Откуда: Беларусь, Салiгорск Зарегистрирован: 29.03.2006 |
|
WhiteWolf : |
В общем так и не определились с заданием Так над чем работать?
|
А ты уже погулял!?
Надо сначала проработать языковой файл, или файл-описатель как его еще называют. Любому скрипту, создающему новый апгрейд или команду, нужен будет этот файл.
Можно об этом файле узнать из учебника по Х2 (DragonP)
Не хотелось бы цитировать то, что лучше уже не изложу.
Если не поймете, тогда задавайте вопросы - будем разбирать.
По предложениям на следующее задание:
Цитата: |
"Утилизатор" вроде как полезен
|
Уже существует в Bonus Pack v3.1.07.
Действительно - это интересно, но написание кода будет пока сложным, и скучным. Да и результат виден не сразу - летать туда сюда нужно.
Цитата: |
Новый апгрейд-вооружение
|
Думал я создать вооружение используя мины Сквош, с временной задержкой детонации, которые бы выбрасывались позади корабля по нажатию горячей клавиши. Полезно было бы при пересечении пиратских или ксенонских секторов в одиночку прикрывая свои транспорты, никого. так сказать , не трогая.
Если идея цельная - задание к утру будет .
Последний раз редактировалось: Andrei [<>Ace] (00:03 08-12-2007), всего редактировалось 1 раз |
|
|
|
|
|
Канал X3: Reunion ->
Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Концепция в общем виде готова - вэлкам, члены КП в разрезе пох./нах. не приветствуются - можете флудить тут. (CooL_SnipeR)
|
» Скрипт-школа (Задачи для начинающих скриптописателей) | страница 5 |
|