Автор | Сообщение |
Shadowman UAC General
| 8391 |
Doom Rate: 2.08 Posts quality: +1995 |
Отправлено: 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). Здесь можно перенаправить на другой скрипт, вобщем, вставляйте любые действия и их комбинации Модификация данного скрипта. Если вам надо не спавнить монстров, а перебить тех, что уже есть на уровне, то из скрипта надо убрать строчку Thing_Spawn(tid,thingtype,angle,newtid); В этом случае проверка идет по тиду, который навешен на "нужных" монстров. Активатором скрипта сделайте одного из таких монстров (который есть у вас на всех уровнях сложности), то есть ему в свойство повесить экшен 80 - запуск данного скрипта. | |
|
1 |
7 |
2 |
|
|
| |
entryway -= DoomGod =-
| 1795 |
Doom Rate: 2.74 Posts quality: +1 |
Отправлено: 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
| 8391 |
Doom Rate: 2.08 Posts quality: +1995 |
Отправлено: 12.10.07 16:08:04 | | | entryway: | Не знаю возможностей зlума, но нельзя ли середину заменить на такое? |
Не знаешь - лучше не пиши. А то народ лишь запутается. Спрашивать надо у тех, кто знает, в данном случае я сам взял этот скрипт, любезно раскопанный ЗЕРНОЕd'ом и пользую все время пока сбоев не было. Насчет оформления текста - хорошо, будем оформлять так, как ты предложил. | |
|
1 |
7 |
2 |
|
|
| |
3EPHOEd - Warrant Officer -
| 1111 |
Doom Rate: 2.34 Posts quality: +7 |
Отправлено: 12.10.07 16:23:24 | | | Да, что то в этом скрипте знакомое
По идее если "MyMonsterCount1++" работает то и "--" должно прокатить, я не пробовал. С-шный варинт чтоли, я к Басюковому привык. | |
|
1 |
2 |
2 |
|
|
| |
entryway -= DoomGod =-
| 1795 |
Doom Rate: 2.74 Posts quality: +1 |
Отправлено: 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 - Warrant Officer -
| 1111 |
Doom Rate: 2.34 Posts quality: +7 |
Отправлено: 12.10.07 16:53:11 | | | В ACS.CFG есть While = "While(expression)";
Но я не нахржу его описания в Оффлайн ВИКИ Здум.
Если оно работает так ака я предполагаю то наврено должно быть что-то типа:
while (thingcount(thingtype, tid) > 0)
{
delay(35);
}
| |
|
1 |
2 |
2 |
|
|
| |
entryway -= DoomGod =-
| 1795 |
Doom Rate: 2.74 Posts quality: +1 |
|
3 |
1 |
1 |
|
|
| |
3EPHOEd - Warrant Officer -
| 1111 |
Doom Rate: 2.34 Posts quality: +7 |
Отправлено: 12.10.07 17:01:15 | | | entryway While это у них цикл или оно просто весит и ждет пока условие не выполнится? | |
|
1 |
2 |
2 |
|
|
| |
nprotect - 2nd Lieutenant -
| 1343 |
Doom Rate: 2.45
|
Отправлено: 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 |
1 |
|
|
| |
entryway -= DoomGod =-
| 1795 |
Doom Rate: 2.74 Posts quality: +1 |
Отправлено: 12.10.07 17:05:25 | | | Ну ваил как везде. Переводится как "пока". То есть пока условие истинно выполняем тело. Равносильно фору в такой форме for(;условие;)
| просто цикл с неизвестным числом повторений |
это называется "цикл по условию". в вашем скрипте надо именно это: "пока все тиды живы" | |
|
3 |
1 |
1 |
|
|
| |
3EPHOEd - Warrant Officer -
| 1111 |
Doom Rate: 2.34 Posts quality: +7 |
Отправлено: 12.10.07 17:06:19 | | | nprotect Пока (КоличествоПредметов(УказанногоТипа, СИхИдом) > 0)
Выходит, цикл с повторением пока выполняется условие. Только тело цикла не могу понять где где казывается, он по идее ЗДУМ тормознет. | |
|
1 |
2 |
2 |
|
|
| |
entryway -= DoomGod =-
| 1795 |
Doom Rate: 2.74 Posts quality: +1 |
Отправлено: 12.10.07 17:11:13 | | | не понял что не можешь понять. проверяем условие, если истинно, то ждем секунду (35 тиков) (тут я понимаю здум хапает управление на себя), опять проверяем условие и так далее пока условие перестанет быть истинным. в скрипте шадовмена делается тоже самое, только зачем-то пять раз подряд. вот такое короткое должно работать точно так же
for (; thingcount(thingtype, tid) > 0;)
delay(tics); | |
|
3 |
1 |
1 |
|
|
| |
Eternal - Captain -
| 2306 |
Doom Rate: 3.7 Posts quality: +13 |
Отправлено: 12.10.07 19:32:54 | | | entryway Может ты знаешь почему в DB перестал работать компилер? Скрипт компилер... после перевиндоза. edit: Починилось... после полного сноса всех четырёх билдеров. | |
|
2 |
2 |
2 |
|
|
| |
Beloff - UAC Gunner -
| 47 |
Doom Rate: 1.31
|
Отправлено: 31.10.07 15:38:32 | | | А можно ВАД сделать, а то я что-то не вкуриваю... | |
|
| |
Dragon Hunter - Major -
| 2712 |
Doom Rate: 2.83 Posts quality: +443 |
Отправлено: 11.12.07 18:15:40 | | | народ где можно найти мануал по скриптам на РУССКОМ языке? | |
|
1 |
1 |
2 |
|
|
| |
Nil = 2nd Lieutenant =
| 1513 |
Doom Rate: 2.31 Posts quality: +64 |
Отправлено: 11.12.07 18:43:53 | | | Dragon Hunter, нигде. А тебе он нужен? спрашивай тут, если что-то не понятно. | |
|
1 |
2 |
1 |
|
|
| |
Dragon Hunter - Major -
| 2712 |
Doom Rate: 2.83 Posts quality: +443 |
Отправлено: 11.12.07 19:06:02 | | | ну к примеру:
Shadowman: | В Thing_Spawn указываем tid - тид мап спота, где идет спавн, |
что такое тид?
это что-то вроде задержки, т.е. время через которое выполнится действие после того как будет выполнено условие?
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 |
1 |
2 |
|
|
| |
Nil = 2nd Lieutenant =
| 1513 |
Doom Rate: 2.31 Posts quality: +64 |
Отправлено: 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/ тока она пока лежит | |
|
1 |
2 |
1 |
|
|
| |
Stalker Recruit
| 12 |
Doom Rate: 1.28
|
Отправлено: 20.12.07 11:36:33 | | | А как будет выглядет скрипт, который спавнит монстров на карте через определенные периоды времени до тех пор, пока игрок не закончит уровень? | |
|
| |
nprotect - 2nd Lieutenant -
| 1343 |
Doom Rate: 2.45
|
Отправлено: 20.12.07 14:58:35 | | | Stalker ну пишешь обычный open-скрипт (или enter-), ставишь оператор спавна, потом delay сколько тебе надо (интервал времени), и restart . при выходе с мапы он прекратит работу если в ACS совсем не рубишь - напиши, объяню более детально с примерами | |
|
1 |
2 |
1 |
|
|
| |