Сайт Doom Power
 ПоискПоиск ВходВход
(G)ZDOOM - основы скриптинга 1, 2, 3, 4  След.
   Список разделов - Местечко Мапперов и Моддеров - (G)ZDOOM - основы скриптинга
АвторСообщение
Shadowman
UAC General
Next rank: Unavailable after 0 points
4393

Doom Rate: 1.66
Сообщение Отправлено: 12.10.07 14:08:38

В этой теме предлагаю постить наиболее частые скрипты, которые вы используете. Конечно, чтобы сделать что-то оригинальное, надо постараться (и полазить по вике), но для простых вещей не вижу смысла каждый раз отсылать к мануалам. Да и такая стандартная библиотечка, думаю, будет полезна не только начинающим мапперам, но и тем, кто давно использует гздум.
Пишем скрипт, комментируем отдельные вещи, а также поясняем, где что можно заменить на свои блоки.
======================================================
СОВЕРШЕНИЕ ДЕЙСТВИЯ ПОСЛЕ СМЕРТИ МОНСТРОВ ОПРЕДЕЛЕННОГО ВИДА
======================================================
Одним из наиболее частых скриптов является скрипт, запускающий какое-либо действие, после того, как игрок убъет определенное количество монстров определенного вида. Скрипт имеет стандартный вид:
script XX (void)
{
int MyMonsterCount1; // переменная для подсчета зверюг
int MyMonsterByNameCount1; //еще одна переменная для подсчета зверюг
Thing_Spawn(tid,thingtype,angle,newtid); // спавним нужных монстров на мап спотах
delay(tics);
for (MyMonsterCount1=0;MyMonsterCount1<5;MyMonsterCount1++) //проверка кол-ва оставшихся зверюг
{
MyMonsterByNameCount1 = thingcount(thingtype,tid);
if (MyMonsterByNameCount1!=0) {MyMonsterCount1=MyMonsterCount1-1;
delay(tics);}
}
Floor_LowerToLowest(7,16); // <- здесь помещаете экшены, которые активируются смертью монстров
}

В Thing_Spawn указываем tid - тид мап спота, где идет спавн,
thingtype - тип монстра (для стандартных можно юзать переменные типа t_cacodemon, t_hellknight),равен его ID, который указан в декорэйте (то есть если вы делаете своего монстра, не забудьте назначить ему ID в декорэйте), angle - угол, куда смотрит монстр (так же как и угол шмотки в ДБ), newtid - тид, который присваивается отспавненным монстрам (следите чтобы не пересекался с другими тидами шмоток на вашей карте). Когда все монстры с данным тидом (то есть все отспавненные) будут замочены, совершится действие (в данном примере Пол сектора с тагом 7 опустится до уровня нижнего из полов соседних секторов со скоростью 16). Здесь можно перенаправить на другой скрипт, вобщем, вставляйте любые действия и их комбинации Smile
Модификация данного скрипта.
Если вам надо не спавнить монстров, а перебить тех, что уже есть на уровне, то из скрипта надо убрать строчку Thing_Spawn(tid,thingtype,angle,newtid);
В этом случае проверка идет по тиду, который навешен на "нужных" монстров. Активатором скрипта сделайте одного из таких монстров (который есть у вас на всех уровнях сложности), то есть ему в свойство повесить экшен 80 - запуск данного скрипта.
1 5 2
entryway
-= DoomGod =-
2876

Doom Rate: 1.65
Сообщение Отправлено: 12.10.07 15:43:49

скрипты, думаю, надо обворачивать в тег code, а абзацы разделять дополнительным ентером, а то читать невозможно. Вот так приблизительно:

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

СОВЕРШЕНИЕ ДЕЙСТВИЯ ПОСЛЕ СМЕРТИ МОНСТРОВ ОПРЕДЕЛЕННОГО ВИДА

Одним из наиболее частых скриптов является скрипт, запускающий какое-либо действие, после того, как игрок убъет определенное количество монстров определенного вида. Скрипт имеет стандартный вид:

script XX (void)
{
  int MyMonsterCount1; // переменная для подсчета зверюг
  int MyMonsterByNameCount1; //еще одна переменная для подсчета зверюг
 
  // спавним нужных монстров на мап спотах 
  Thing_Spawn(tid, thingtype, angle, newtid);

  delay(tics);

  // проверка кол-ва оставшихся зверюг
  for (MyMonsterCount1 = 0; MyMonsterCount1 < 5; MyMonsterCount1++)
  {
    MyMonsterByNameCount1 = thingcount(thingtype, tid);
    if (MyMonsterByNameCount1 != 0)
    {
      MyMonsterCount1 = MyMonsterCount1 - 1;
      delay(tics);
    }
  }
 
  // здесь помещаете экшены, которые активируются смертью монстров
  Floor_LowerToLowest(7, 16);
}

где
tid - тид мап спота, где идет спавн;
thingtype - тип монстра (для стандартных можно юзать переменные типа t_cacodemon, t_hellknight), равен его ID, который указан в декорэйте (то есть если вы делаете своего монстра, не забудьте назначить ему ID в декорэйте);
angle - угол, куда смотрит монстр (так же как и угол шмотки в ДБ);
newtid - тид, который присваивается отспавненным монстрам (следите чтобы не пересекался с другими тидами шмоток на вашей карте);

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

Модификация данного скрипта:

Если вам надо не спавнить монстров, а перебить тех, что уже есть на уровне, то из скрипта надо убрать строчку Thing_Spawn(tid, thingtype, angle, newtid). В этом случае проверка идет по тиду, который навешен на "нужных" монстров. Активатором скрипта сделайте одного из таких монстров (который есть у вас на всех уровнях сложности), то есть ему в свойство повесить экшен 80 - запуск данного скрипта.


Ну и насчет внутренностей скрипта. Не знаю возможностей зlума, но нельзя ли середину заменить на такое?

if (!thingcount(thingtype, tid))
{
  MyMonsterCount1--;
  delay(tics);
}
3 1 1
Shadowman
UAC General
Next rank: Unavailable after 0 points
4393

Doom Rate: 1.66
Сообщение Отправлено: 12.10.07 16:08:04

entryway :
Не знаю возможностей зlума, но нельзя ли середину заменить на такое?

Не знаешь - лучше не пиши. А то народ лишь запутается. Спрашивать надо у тех, кто знает, в данном случае я сам взял этот скрипт, любезно раскопанный ЗЕРНОЕd'ом и пользую все время Smile пока сбоев не было.
Насчет оформления текста - хорошо, будем оформлять так, как ты предложил.
1 5 2
3EPHOEd
= Commissar =
Next rank: - UAC Commissar - after 127 points
2733

Doom Rate: 1.88
Сообщение Отправлено: 12.10.07 16:23:24

Да, что то в этом скрипте знакомое Smile

MyMonsterCount1--;

По идее если "MyMonsterCount1++" работает то и "--" должно прокатить, я не пробовал. С-шный варинт чтоли, я к Басюковому привык.
1 2 2
entryway
-= DoomGod =-
2876

Doom Rate: 1.65
Сообщение Отправлено: 12.10.07 16:28:47

Shadowman :
Не знаешь - лучше не пиши.

ну я то не знаю, но 99% что он работать будет ибо прослеживается 100% подобие синтаксису Си

Shadowman :
А то народ лишь запутается.

Народ скорее запутается в том что ты написал, ибо я как программист логику работы цикла понять не могу. Это абсурд менять счетчик цикла в теле цикла да еще в обратную сторону. Ну да и собственно сам цикл там с виду абсолютно не нужен, так же как и две переменные. Вот как я думаю это должно быть. Проверяйте на здуме ибо я понятия не имею как это делать.

script XX (void)
{
  Thing_Spawn(tid, thingtype, angle, newtid);

  while (thingcount(thingtype, tid) > 0)
    delay(35);
 
  Floor_LowerToLowest(7, 16);
}


На словах это выглядит так. Спавним то что хотим с уникальным одинаковым тидом для последующего подсчета. Ждем пока количество этого "того что хотим" больше нуля, то есть присутствует на уровне в живом виде. Как только условие перестает быть истинным (все подохли) - выполняем задуманное действие. Это не то, что планировалось?
3 1 1
3EPHOEd
= Commissar =
Next rank: - UAC Commissar - after 127 points
2733

Doom Rate: 1.88
Сообщение Отправлено: 12.10.07 16:53:11

В ACS.CFG есть While = "While(expression)";

Но я не нахржу его описания в Оффлайн ВИКИ Здум. Sad

Если оно работает так ака я предполагаю то наврено должно быть что-то типа:

  while (thingcount(thingtype, tid) > 0)
   { 
      delay(35);
   }   
1 2 2
entryway
-= DoomGod =-
2876

Doom Rate: 1.65
Сообщение Отправлено: 12.10.07 16:56:10

Вот собственно: http://208.78.96.242/wiki/ThingCount
Один в один то, что я написал
3 1 1
3EPHOEd
= Commissar =
Next rank: - UAC Commissar - after 127 points
2733

Doom Rate: 1.88
Сообщение Отправлено: 12.10.07 17:01:15

entryway
While это у них цикл или оно просто весит и ждет пока условие не выполнится?
1 2 2
nprotect
= Colonel =
Next rank: - Commissar - after 44 points
2546

Doom Rate: 1.48
Сообщение Отправлено: 12.10.07 17:02:48

3EPHOEd :
While это у них цикл или оно просто весит и ждет пока условие не выполнится?

по логике, просто цикл с неизвестным числом повторений

script 1 OPEN
{
   While(ThingCount(T_BARON, 10) > 0)
      Delay(35);
   
   Floor_LowerToLowest(15, 20);
}


именно так, цикл с неизвестным числом повторений, и висеть будет до тех пор, пока выполняется условие. через каждую секунду проверяет, а как узнает, что условие не выполняется, сделает Флоор_ЛоверТуЛовест
1 2
entryway
-= DoomGod =-
2876

Doom Rate: 1.65
Сообщение Отправлено: 12.10.07 17:05:25

Ну ваил как везде. Переводится как "пока". То есть пока условие истинно выполняем тело. Равносильно фору в такой форме for(;условие;)


просто цикл с неизвестным числом повторений

это называется "цикл по условию". в вашем скрипте надо именно это: "пока все тиды живы"
3 1 1
3EPHOEd
= Commissar =
Next rank: - UAC Commissar - after 127 points
2733

Doom Rate: 1.88
Сообщение Отправлено: 12.10.07 17:06:19

nprotect
Пока (КоличествоПредметов(УказанногоТипа, СИхИдом) > 0)

Выходит, цикл с повторением пока выполняется условие.
Только тело цикла не могу понять где где казывается, он по идее ЗДУМ тормознет.
1 2 2
entryway
-= DoomGod =-
2876

Doom Rate: 1.65
Сообщение Отправлено: 12.10.07 17:11:13

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

for (; thingcount(thingtype, tid) > 0;)
  delay(tics);
3 1 1
Eternal
= UAC Marshal =
Next rank: UAC General after 84 points
3366

Doom Rate: 1.93
Сообщение Отправлено: 12.10.07 19:32:54

entryway
Может ты знаешь почему в DB перестал работать компилер? Скрипт компилер... после перевиндоза.
edit: Smile Починилось... после полного сноса всех четырёх билдеров.
1 2 2
Beloff
- UAC Gunner -
Next rank: = UAC Gunner = after 25 points
85

Doom Rate: 1.08
Сообщение Отправлено: 31.10.07 15:38:32

А можно ВАД сделать, а то я что-то не вкуриваю...
1
Dragon Hunter
= Master Sergeant =
Next rank: - Sergeant Major - after 7 points
613

Doom Rate: 1.63
Сообщение Отправлено: 11.12.07 18:15:40

народ где можно найти мануал по скриптам на РУССКОМ языке?
1
Nil
= 1st Lieutenant =
Next rank: - 2nd Lieutenant - after 38 points
1402

Doom Rate: 1.79
Сообщение Отправлено: 11.12.07 18:43:53

Dragon Hunter, нигде. А тебе он нужен? спрашивай тут, если что-то не понятно.
1 1 1
Dragon Hunter
= Master Sergeant =
Next rank: - Sergeant Major - after 7 points
613

Doom Rate: 1.63
Сообщение Отправлено: 11.12.07 19:06:02

ну к примеру:
Shadowman :
В Thing_Spawn указываем tid - тид мап спота, где идет спавн,

что такое тид?
Shadowman :
delay(tics);

это что-то вроде задержки, т.е. время через которое выполнится действие после того как будет выполнено условие?
Shadowman :
Floor_LowerToLowest(7,16); // <- здесь помещаете экшены, которые активируются смертью монстров

что значит 7, 16? т.е. сектор таг 7 и экшн 16 чтоли?

вот попробовал сам написать скрипт, но не получилось, подскажите где ошибки. значит на карте сделал 5 импов и хотел сделать эффект "открыть дверь" после их убийства . вот что вышло у меня

script DOOROPEN
{
if (ThingCount(T_IMP = 0))
delay (3) ;

DOOR_OPEN STAY(1, 1);
}
1
Nil
= 1st Lieutenant =
Next rank: - 2nd Lieutenant - after 38 points
1402

Doom Rate: 1.79
Сообщение Отправлено: 11.12.07 20:12:12

Dragon Hunter, есть такая весч, как синтаксис. Его надо соблюдать.
синтаксис опратора if:

if(int condition)

что такое int? это тип - в данном случае целое число. если оно равно 0, то комманда за if не выполняется, иначе выполняется(или даже целый блок {})
синтаксис функции
Имя(параметры)
имя - в твоём случае ThingCount
параметры - это переменные или константы, которые будут переданны в функцию. у функции ThingCount 2 параметра - строка, в которой указывается имя монстра, и tid - thingID(можно указать в редакторе, это свойство предмета на карте), причём любой из параметров может быть пустым
ThingCount("",1) - возвращает количество вещей с тагом 1(возвращаемое значение - int)
ThingCount("ZombieMan",0) - возвращает количество зомбименов на карте вне зависимости от тага(tid).
ThingCount("ZombieMan",2) - возвращает количество зомбименов на карте с тагом 2.

все функции можно найти в вике
http://zdoom.org/wiki/
тока она пока лежит Sad
1 1 1
Stalker
Recruit
Next rank: Marine after 15 points
25

Doom Rate: 1.09
Сообщение Отправлено: 20.12.07 11:36:33

А как будет выглядет скрипт, который спавнит монстров на карте через определенные периоды времени до тех пор, пока игрок не закончит уровень?
nprotect
= Colonel =
Next rank: - Commissar - after 44 points
2546

Doom Rate: 1.48
Сообщение Отправлено: 20.12.07 14:58:35

Stalker
ну пишешь обычный open-скрипт (или enter-), ставишь оператор спавна, потом delay сколько тебе надо (интервал времени), и restart . при выходе с мапы он прекратит работу Surprised если в ACS совсем не рубишь - напиши, объяню более детально с примерами
1 2
Shadowman
UAC General
Next rank: Unavailable after 0 points
4393

Doom Rate: 1.66
Сообщение Отправлено: 20.12.07 15:45:07

Кстати, насчет спавнов. Если спавнить на одних и тех же мап спотах, то надо, чтобы отспавненные ранее монстры сошли со своих точек, в противном случае - если они останутся стоять там - дальнейший спавн не будет проходить, так как по умолчанию монстры не могут телефрагить друг друга.
1 5 2
Nil
= 1st Lieutenant =
Next rank: - 2nd Lieutenant - after 38 points
1402

Doom Rate: 1.79
Сообщение Отправлено: 20.12.07 16:40:50

Shadowman, можно не на слопах, а просто spawn. и вычислять как
Xточки.0 + random(-300,300) << 8
Yточки.0 + random(-300,300) << 8
только циферки, понятно, другие
1 1 1
nprotect
= Colonel =
Next rank: - Commissar - after 44 points
2546

Doom Rate: 1.48
Сообщение Отправлено: 20.12.07 17:47:07

Nil :
Shadowman, можно не на слопах

каких слопах? слопы тут ни при чем вообще, Shadowman писал об объектах Map Spot. не надо путать Smile
1 2
Nil
= 1st Lieutenant =
Next rank: - 2nd Lieutenant - after 38 points
1402

Doom Rate: 1.79
Сообщение Отправлено: 20.12.07 18:02:33

nprotect :
Map Spot

ну ошибся в 1 букву, давно их не ставил...
1 1 1
Shadowman
UAC General
Next rank: Unavailable after 0 points
4393

Doom Rate: 1.66
Сообщение Отправлено: 20.12.07 20:09:54

Как сделать расширенное условие для открытие двери после смерти монстров НЕСКОЛЬКИХ ВИДОВ?
Во всех примерах, что выше, там только для 1 вида тварей было, потому что в thingCount нужно указывать тип монстра, а не только его тид.

ЗЫ. Вводить счетчик переменной и отправлять на скрипт открывания двери когда ее значение достигнет нужной отметки (то есть количества видов убитых монстров) что-то долго...
1 5 2
Nil
= 1st Lieutenant =
Next rank: - 2nd Lieutenant - after 38 points
1402

Doom Rate: 1.79
Сообщение Отправлено: 20.12.07 20:43:20

Shadowman, не указывай тип монстра :
bool killall = thingcount("",10) ==10;
//в killall хрантся, убили ли мы 10 монстров с тагом 10. тип монстра роли не играет.
1 1 1
Shadowman
UAC General
Next rank: Unavailable after 0 points
4393

Doom Rate: 1.66
Сообщение Отправлено: 20.12.07 21:37:17

Nil
Спасибо, хоть я уже и сделал через 3 скрипта, но на будущее пригодится.

Nil :
bool killall = thingcount("",10) ==10;

Это переменная? Ее нужно там где переменные писать? или как? Можно простенький завершенный примерчик все же?
1 5 2
nprotect
= Colonel =
Next rank: - Commissar - after 44 points
2546

Doom Rate: 1.48
Сообщение Отправлено: 20.12.07 21:44:26

Nil :
bool killall = thingcount("",10) ==10;

а такое вообще будет работать в ACS? в Си работало бы, а вот насчет скриптов непонятно Smile и потом, оно же должно проверять постоянно, а в этом примере переменная только объявляется. правильнее было бы наверно так:

bool killall;

script 1 open {... ляляля ...
...
killall = thingcount("",10)==10;
delay(...);
restart;
}
1 2
Nil
= 1st Lieutenant =
Next rank: - 2nd Lieutenant - after 38 points
1402

Doom Rate: 1.79
Сообщение Отправлено: 20.12.07 22:18:50

nprotect, не обязательно проверять постоянно. Это даже нежелательно. Просто повесте ACS_Execute в качестве экшена у монстра и он вызовется после смерти. Я просто привёл пример, Shadowman же спрашивал не о переменных, а о thingcount() Smile
1 1 1
nprotect
= Colonel =
Next rank: - Commissar - after 44 points
2546

Doom Rate: 1.48
Сообщение Отправлено: 20.12.07 22:42:29

Nil :
Просто повесте ACS_Execute в качестве экшена у монстра и он вызовется после смерти.

да, это пожалуй оптимальный вариант Smile *взял на заметку* Razz
1 2
Страница 1 из 4Перейти наверх 1, 2, 3, 4  След.
   Список разделов - Местечко Мапперов и Моддеров - (G)ZDOOM - основы скриптинга