Скрипты!
|
|
Shadowcaster | Дата: Четверг, 2011-05-05, 15:16:33 | Сообщение # 1 |
Стремящийся
Группа: Пользователи
Сообщений: 33
Статус: Offline
| В одной из карт хексена нашел колокол а к нему привязан скрипт: script 8 (void) { if(mapvar0 == 1) { bell++; if(bell == 1) { mapvar0 = 0; Thing_Destroy(49); print(s:"YOU HAVE KILLED YOUR ENEMIES"); terminate; } else if(bell == 3) { mapvar0 = 0; prepared = 1; print(s:"YOU ARE PREPARED FOR BATTLE"); terminate; } else if(bell == 7) { mapvar0 = 0; floor_lowerbyvalue(64, 1, 128); print(s:"YOU HAVE DECLARED VICTORY"); terminate; } } } Что это означает?
|
|
| |
DraculaX | Дата: Вторник, 2011-05-10, 17:02:33 | Сообщение # 2 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Этот скрипт связан с другими скриптами, параметры из которых подхватываются в этом скрипте. Чтобы понять смысл работы колокола, надо изучать карту и все скрипты. Но если почитать данный скрипт, то могу предположить, что после определённых действий мы бьём по колоколу и у нас уничтожаются все враги с тегом 49. После ряда других действий, выводится сообщение, что ты готов битве (и меняется параметр prepared для работы какого-то другого скрипта). Ну а в третьем варианте, опускается пол с определённым тегом... При этом скрипт работает только раз, о чём говорит параметр terminate; P.S.: Вообще, скрипт написан несколько неграмотно...
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
Сообщение отредактировал DraculaX - Вторник, 2011-05-10, 17:06:26 |
|
| |
Shadowcaster | Дата: Четверг, 2011-05-12, 22:26:21 | Сообщение # 3 |
Стремящийся
Группа: Пользователи
Сообщений: 33
Статус: Offline
| Неграмотно? Это значит что после того как я ударю по колоколу несколько раз, то ничего не произойдет?
|
|
| |
Sl@v@98 | Дата: Пятница, 2011-05-13, 15:42:43 | Сообщение # 4 |
Искушённый
Группа: Хранители
Сообщений: 109
Статус: Offline
| Quote (DraculaX) P.S.: Вообще, скрипт написан несколько неграмотно... Это значит, что разработчики Hexen неграмотные?
|
|
| |
DraculaX | Дата: Понедельник, 2011-05-16, 14:44:40 | Сообщение # 5 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Quote (Sl@v@98) Это значит, что разработчики Hexen неграмотные? Уххаххах!!! В оригинале нет такой карты. Этот скрипт взят из отдельной карты, которую состряпал какой-то маппер. Quote (Shadowcaster) Неграмотно? Это значит что после того как я ударю по колоколу несколько раз, то ничего не произойдет? Ну, в общем-то да. Но неграмотность не в этом... этот скрипт можно упростить в два раза Я имею в виду не функционал, а написание.
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
Сообщение отредактировал DraculaX - Понедельник, 2011-05-16, 14:47:43 |
|
| |
Shadowcaster | Дата: Понедельник, 2011-05-16, 21:19:36 | Сообщение # 6 |
Стремящийся
Группа: Пользователи
Сообщений: 33
Статус: Offline
| Можешь предложить свой вариант?(чтобы с функционалом все было нормально )
|
|
| |
DraculaX | Дата: Вторник, 2011-05-17, 19:56:04 | Сообщение # 7 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Свой вариант этого скрипта? Нет. Я же говорю, этот скрипт связан с другими скриптами на той же карте. И не могу его переписать, не видя то, за что отвечают другие скрипты. Можно не учесть всего один какой-то параметр, и всё... карта не функциональна. В этом и есть идея подобных скриптов - связать события (а потом попробуйте развязать, чтобы понять что к чему (особенно в чужом коде)). Могу привести достаточно простой пример, чтобы в нём можно было разобраться. Например, у нас есть карта с дверью и двумя кнопками. Чтобы открыть дверь, надо нажать на две кнопки в любом порядке. Для этого пишем три скрипта. Два из них будут подвешены на кнопки, третий на дверь. Вот, например: Code #include "zcommon.acs"
int Sequence == 0;
Script 1 (void) { Sequence++; Print(s:"ONE MORE TO GO..."); }
Script 2 (void) { Sequence++; Print(s:"SEQUENCE COMPLETE!"); }
Script 3 (void) { if(Sequence == 2) Door_Open(1, 10); else Print(s:"BAD SEQUENCE..."); } Теперь, разберём подробно: int Sequence == 0; // Задаём переменную Sequence (Последовательность), равную нулю. К этой переменной будут обращаться все наши скрипты. Script 1 (void) { // Пишем первый скрипт и привязываем его к одной из кнопок Sequence++; // Увеличиваем нашу переменную на единицу, т.е. она уже будет равнятся единице а не нулю Print(s:"ONE MORE TO GO..."); // И выводим сообщение, что осталось нажать ещё одну кнопку } Script 2 (void) { // Пишем второй скрипт и привязываем его к одной из кнопок Sequence++; // Снова увеличиваем нашу переменную на единицу, т.е. она уже будет равнятся двойке Print(s:"SEQUENCE COMPLETE!"); // И выводим сообщение, что последовательность завершена } Script 3 (void) { // Пишем третий скрипт и привязываем его к нашей дверке if(Sequence == 2) // Тут задаём условие, что если наша переменная равна двойке, то: Door_Open(1, 10); // ...дверь откроется! else // Но если она не равна двойке, но любому другому числу, то: Print(s:"BAD SEQUENCE..."); // Выдаём любое сообщение, говорящее о том, что дверь пока нельзя открыть }
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
Сообщение отредактировал DraculaX - Вторник, 2011-05-17, 20:03:03 |
|
| |
DraculaX | Дата: Вторник, 2011-05-17, 20:01:45 | Сообщение # 8 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Конечно, так никто и не будет писать. Я привёл такой пример просто как простейший вариант. Если интересно, то подобный функционал пишется одним скриптом и не привязывается к двери, а дверь окрывается автоматически, как в Hexen 2, например. Вот скрипт: Code int Sequence = 0;
Script 1 (void) {
int Name; Sequence++; if(Sequence == 1) Name = "ONE MORE TO GO"; if(Sequence == 2) { Name = "SEQUENCE COMPLETE!" Door_Open(1, 10); } AmbientSound("Chat", 127); HudMessage(s:Name; HUDMSG_FADEINOUT, 0, CR_GREEN, 1.5, 0.5, 2.0); }
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
Сообщение отредактировал DraculaX - Вторник, 2011-05-17, 20:02:49 |
|
| |
DraculaX | Дата: Вторник, 2011-05-17, 20:17:08 | Сообщение # 9 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Кстати, нашёл у себя в библиотеке старую тестовую карту, с подобной системой взаимодействия скриптов. Но тут всё посложнее. Впрочем, качайте и смотрите сами. P.S. Обычно я маплю под gzdoom.
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
|
|
| |
Reiko | Дата: Вторник, 2011-05-17, 20:26:16 | Сообщение # 10 |
Темный воин внешнего мира
Группа: Модераторы
Сообщений: 2482
Статус: Offline
| Shadowcaster, Кстати карту в студию
аниме спасет мир :3
|
|
| |
DraculaX | Дата: Вторник, 2011-05-17, 20:51:45 | Сообщение # 11 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Shadowcaster, посмотри, моя версия твоего скрипта: Code Script 8 (void) { if(mapvar0 == 1) { bell++; mapvar0 = 0; int Name; switch(bell) { case 1: Name = "YOU HAVE KILLED YOUR ENEMIES"; Thing_Destroy(49); break; case 3: Name = "YOU ARE PREPARED FOR BATTLE"; prepared = 1; break; case 7: Name = "YOU HAVE DECLARED VICTORY"; Floor_LowerByValue(64, 1, 128); break; } HudMessage(s:Name; HUDMSG_FADEINOUT, 0, CR_GREEN, 1.5, 0.5, 2.0); Terminate; } }
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
|
|
| |
Shadowcaster | Дата: Среда, 2011-05-18, 15:04:52 | Сообщение # 12 |
Стремящийся
Группа: Пользователи
Сообщений: 33
Статус: Offline
| Reiko, Залить ф архив или сюда? DraculaX, Спаибо большое, очень много узнал про скрипты, но я поставил твой скрипт в карту все осатлось как было наверное не в скрипте дело Добавлено (2011-05-18, 15:04:52) --------------------------------------------- Кстати,"как было" это так: после первого удара все монстры с тэгом 49 умирают, но сообщение о том, что "вы убили своих врагов" не появляется, а дальше, сколько бы я ни стучал по колоколу, ничего не происходит. Любопытно то, что когда подключаешь этот же вад с этим же скриптом не к порту, а к обычному хексену, сообщение появляется и враги умирают но опять же дальше ничего.
|
|
| |
DraculaX | Дата: Четверг, 2011-05-19, 23:03:25 | Сообщение # 13 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Quote (Shadowcaster) я поставил твой скрипт в карту все осатлось как было Конечно так всё и останется! А вы что хотели? У нас зашёл разговор про грамотность написания скриптов, я объяснил в чём суть. Сравните мой скрипт с исходным и найдите 10 отличий. Функционал тот же, а написание разное. Quote (Shadowcaster) враги умирают но опять же дальше ничего Я же обяснил, что в скрипте так и написано, что колокол работает только раз. Функция terminate убивает скрипт. И она написана не случайно. Автором так и было запланировано. Т.е. скрипт убивает сам себя после разового использования. P.S. К вопросу о неграмотности написания - в исходном варианте скрипта функция terminate написана аж три раза, что глупо. В моём скрипте только один раз, а разницы никакой. Понимаете? Грамотно написанный скрипт - облегчённый и аккуратный. Программа (в данном случае игра) легче воспринимает такие скрипты. Их проще обработать и выдать результат без каких либо задержек или (не дай Бог) глюков.
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
Сообщение отредактировал DraculaX - Четверг, 2011-05-19, 23:05:39 |
|
| |
DraculaX | Дата: Четверг, 2011-05-19, 23:22:11 | Сообщение # 14 |
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
| Quote (Shadowcaster) после первого удара все монстры с тэгом 49 умирают, но сообщение о том, что "вы убили своих врагов" не появляется, а дальше, сколько бы я ни стучал по колоколу, ничего не происходит. Чтобы были другие варианты, надо делать какие-то действия, описанные в других скриптах. Или наоборот, не делать. Как я уже написал, есть три варианта событий: 1. Умирают все монстры. 2. Вывод сообщения YOU ARE PREPARED FOR BATTLE. 3. Опускается пол с определённым тегом. Выкладывай карту сюда. Ну или в любой файл-менеджер. Давай на ifolder что-ли, если сюда не прикрепится.
Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
Сообщение отредактировал DraculaX - Четверг, 2011-05-19, 23:24:57 |
|
| |
Shadowcaster | Дата: Пятница, 2011-05-20, 15:15:43 | Сообщение # 15 |
Стремящийся
Группа: Пользователи
Сообщений: 33
Статус: Offline
| Ваще ниче не понял с этим колоколом
|
|
| |