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

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

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

   Страница 5 из 10
На страницу: Пред.  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  След. | Все страницы
Поиск в этой теме:
Канал X3: Reunion » Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)»
Нужна ли школа скриптописателей
Да. чем нас больше, тем игра веселее
95%
 95%  [ 65 ]
Нет, развелось вас.
4%
 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 раз
    Добавлено: 19:04 28-11-2007   
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 раз(а)
    Добавлено: 20:54 28-11-2007   
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 раз(а)
    Добавлено: 00:07 29-11-2007   
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 раз
    Добавлено: 04:40 29-11-2007   
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 раз(а)
    Добавлено: 15:33 29-11-2007   
KAlex
 





Andrei [<>Ace] :
Пора уже заканчивать с этим заданием.

Стоп - я еще свой отлаженный скрипт не выложил... Скоро будет готов.
    Добавлено: 20:41 29-11-2007   
Andrei [<>Ace]
 303 EGP


Рейтинг канала: 6(416)
Репутация: 108
Сообщения: 766
Откуда: Беларусь, Салiгорск
Зарегистрирован: 29.03.2006
KAlex :
Стоп - я еще свой отлаженный скрипт не выложил... Скоро будет готов.

Ждем, ждем. У меня уже готово новое задание - более интересное.
Вкратце: Новый апгрейд-вооружение, достаточно мощное и вполне выполнимое без модерства Улыбка . Хотел сам сделать, но для меня это слишком легко Гы-гы .
    Добавлено: 21:25 29-11-2007   
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 раз
    Добавлено: 22:59 29-11-2007   
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 А первый слишком большой - некогда смотреть - на работе...
    Добавлено: 11:41 30-11-2007   
Else
 140 EGP


Рейтинг канала: 3(26)
Репутация: 29
Сообщения: 313
Откуда: Тверская обл.
Зарегистрирован: 08.11.2007
Добавлю новое задание:

Тема задания навеяна повестью Э.Нортон "Саргассы в космосе"
Ваш корабль встречает в космосе разрушеную станцию. При подлете к станции на растояние 10 км управление кораблем перехватывается и корабль остается в космосе. Около станции висит еще один корабль класса М3, мы должны отключить устройство перехватывающее управление. Для этого катапультируемся с корабля подлетаем к станции на растояние 50 метров. Приходит сообщение что устройство отключено, сторониий еорабль можно захватить, для активации своего корабля надо долететь до определенной станции в соседнем секторе и забрать электронный ключ у вашего друга. Садимся на М3, летим на станцию, нам говорят что наш М3 пиратский корабль замеченный в нападении на транспорты сектора, друг говорит что поможет бежать, при подлете к разрушеной станции появляется пират на М4 и начинает атаковать, страшно ругаясь что ты забрал его корабль. В конце концов он катапультируется, захватываем его, он говорит что подтвердит ваше алиби в обмен на сохранение жизни. Летим обратно на станцию, пират дает показания, переднами извиняются, и все Хэппи Енд.

Сектора по вашему усмотрению, уважаемые преподаватели, если вы в описании увидели очень сложные или не реализуемые моменты, отпишите, отругайте или подскажите как обойти данные моменты.
_________________
Интересно, а пить водку в полночь, считается после работы или до?
    Добавлено: 09:05 04-12-2007   
AlexYar
 1851 EGP


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

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


Судя по теме задания тут даются для начинающих скриптописателей. А то задание, что ты дал, не каждый ас скриптописания на ЕГе возьмётся выполнить Улыбка

Тут людям сперва нужно объяснить что такое "переменная", каких типов они бывают, что такое "цикл" или "массив" - они даже это понимают с трудом судя по тому, что никто не пишет своих вопросов (когда непонятно абсолютно ничего, то ессно и не знаешь, что спрашивать).

А вы с Айсом даёте задания для одного двух человек всего, остальные смотрят на всё круглыми глазами и ничего не понимают.


2Айс, напиши людям пару лекций по простейшим понятиям. Для тех, кто не только никогда скрипты или программы не писал, а и вообще о программировании впервые слышит.
Тема же явно называется - школа для начинающих !

Либо тему переименуйте, либо хорош первоклассников "интегралами" грузить Хы...
    Добавлено: 17:43 04-12-2007   
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 раз(а)
    Добавлено: 20:40 04-12-2007   
NOsoft
 





Else :
Добавлю новое задание:
Э.Нортон "Саргассы в космосе"

Со стороны "не сведущему человеку" кажется впринципе просто Подмигиваю
Хотя если разложить по этапно (поделить на логические группы), будет лучше (наверное).
Andrei [<>Ace] :
Понимаешь, я не програмист. Начальные понятия об АЛГОРИТМЕ, что такое "цикл" или "массив" получил на уроках в школе в 1993г. Лекцию я не осилю.

Главное начать Подмигиваю Советовать и указывать на ошибки проще, по себе знаю.
Но если писать уроки в "инетреактивном режиме" (тобишь здесь на форуме) может получиться значительно больше, чем просто лекция...
    Добавлено: 20:52 04-12-2007   
Bob_Koh
 61 EGP


Рейтинг канала: 3(31)
Репутация: 4
Сообщения: 125
Откуда: Хмельник
Зарегистрирован: 15.10.2007
Else :
Добавлю новое задание:
Тема задания навеяна повестью Э.Нортон "Саргассы в космосе"
Ваш корабль встречает в космосе ...........................

Ну это уж очень сложное задание! Наверное проще "Анну Каренину" в скриптах сваять!
Ребята, а может опуститься на землю и пробовать наваять скрипты, от которых и какая-то польза окружению будет!
Вот например:
Скрипт, позволяющий в игровом формате дать пользу самому игроку, в виде увеличения ФПСа и освобождения игрового пространства от мусора!
Тема: "Утилизатор"
На каком-то доке оборудования продается мини-завод "Утилизатор". Данный мини-завод возможно разместить только на ТЛе. Если на ТЛе кроме него будет присутствовать определенный набор девайсов, то в меню "Специальные" появится команда "Начать утилизацию в секторе". Утилизации подлежат все дэбрисы и обломки астероидов, предварительно разваленных игроком астеров (за ненужностью).
Принцип работы утилизатора: подбирать (определенное расстояние) обломки в секторе, видимые на карте сектора, открытые в зоне действия сканера ТЛи или спутниками игрока. Переработке (затрат времени и батареек) подлежат все обломки, не имеющие ресурса превращаются в космопыль, те которые имеют ресурс, после переработки попадают в трюм в виде готового товара.
Возможно наладить переработку остатков (объектов) цивилизаций на металлолом.
Кроме стандартных может выслать игроку сообщения:
-Утилизация в секторе Х закончена
-Нет места в трюме для дальнейшей работы
-Нет батарей для дальнейшей работы

Последний раз редактировалось: Bob_Koh (03:37 05-12-2007), всего редактировалось 1 раз
    Добавлено: 01:47 05-12-2007   
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 раз
    Добавлено: 11:27 05-12-2007   
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 раз(а)
    Добавлено: 16:40 05-12-2007   
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-файл для каждой новой версии скрипта. Т.е. не по ретурну выходим, а сперва запускаем служебный универсальный скрипт, который запустит новую версию, а только потом вываливаемся по ретурну. Либо можно просто запустить самого себя - это будет эквивалентно, так как если новая версия есть, то будет запущена она, а если скрипт удалён, то будет просто выход по ретурну Улыбка
    Добавлено: 19:34 05-12-2007   
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 раз(а)
    Добавлено: 21:33 05-12-2007   
WhiteWolf
 55 EGP


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

Зарегистрирован: 24.10.2007
Andrei [<>Ace] :
Ждем, ждем. У меня уже готово новое задание - более интересное.
Вкратце: Новый апгрейд-вооружение, достаточно мощное и вполне выполнимое без модерства Улыбка . Хотел сам сделать, но для меня это слишком легко Гы-гы .

Анонсировано, но не сформировано Расстроен
Else :
Добавлю новое задание:

Тема задания навеяна повестью Э.Нортон "Саргассы в космосе"

и
Bob_Koh :
Скрипт, позволяющий в игровом формате дать пользу самому игроку, в виде увеличения ФПСа и освобождения игрового пространства от мусора!
Тема: "Утилизатор"

В общем так и не определились с заданием Расстроен Так над чем работать?
"Утилизатор" вроде как полезен, да и давно мечтал поставить на TS буровую установку, сканер минералов и сборщик руды и заставить его переработать все астероиды в секторе с содержанием полезных ископаемых менее определенного уровня Улыбка
"Саргассы" интересны именно написанием кода и обработкой всех тонкостей.
Ну а про "Апгрейд-вооружение" сказать что-то очень сложно, но уже интересна сама такая возможность Улыбка
    Добавлено: 07:10 06-12-2007   
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 раз
    Добавлено: 16:13 06-12-2007   
Канал X3: Reunion -> Модовый и скриптовый отсек X3: Reunion: «Скрипт-школа (Задачи для начинающих скриптописателей)»
На страницу: Пред.  1, 2, 3, 4, 5, 6, 7, 8, 9, 10  След. | Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Концепция в общем виде готова - вэлкам, члены КП в разрезе пох./нах. не приветствуются - можете флудить тут. (CooL_SnipeR)

  » Скрипт-школа (Задачи для начинающих скриптописателей) | страница 5
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18