Hexen 2 Russian Fans Четверг
2024-03-28
16:20:36
Приветствую Вас Гость | RSS Главная страница | Скрипты! - Форум | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: DraculaX, RaVeN, Reiko  
Форум » Редактирование игр » Редактирование игр Heretic, Hexen » Скрипты!
Скрипты!
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 неграмотные? biggrin
 
DraculaXДата: Понедельник, 2011-05-16, 14:44:40 | Сообщение # 5
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Quote (Sl@v@98)
Это значит, что разработчики Hexen неграмотные?

Уххаххах!!!
В оригинале нет такой карты.

Этот скрипт взят из отдельной карты, которую состряпал какой-то маппер.

Quote (Shadowcaster)
Неграмотно? Это значит что после того как я ударю по колоколу несколько раз, то ничего не произойдет?

Ну, в общем-то да. Но неграмотность не в этом... этот скрипт можно упростить в два раза smile

Я имею в виду не функционал, а написание.


Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©

Сообщение отредактировал DraculaX - Понедельник, 2011-05-16, 14:47:43
 
ShadowcasterДата: Понедельник, 2011-05-16, 21:19:36 | Сообщение # 6
Стремящийся
Группа: Пользователи
Сообщений: 33
Статус: Offline
Можешь предложить свой вариант?(чтобы с функционалом все было нормально happy )
 
DraculaXДата: Вторник, 2011-05-17, 19:56:04 | Сообщение # 7
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Свой вариант этого скрипта? Нет. smile Я же говорю, этот скрипт связан с другими скриптами на той же карте. И не могу его переписать, не видя то, за что отвечают другие скрипты. Можно не учесть всего один какой-то параметр, и всё... карта не функциональна.
В этом и есть идея подобных скриптов - связать события (а потом попробуйте развязать, чтобы понять что к чему (особенно в чужом коде)).

Могу привести достаточно простой пример, чтобы в нём можно было разобраться.

Например, у нас есть карта с дверью и двумя кнопками. Чтобы открыть дверь, надо нажать на две кнопки в любом порядке.
Для этого пишем три скрипта. Два из них будут подвешены на кнопки, третий на дверь.

Вот, например:

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.

Прикрепления: RotateCub.wad (8.4 Kb)


Только тот кто прошел тяжелое испытание сможет получить аудиенцию у Эйдолона ©
 
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, Спаибо большое, очень много узнал про скрипты, но я поставил твой скрипт в карту sad все осатлось как было sad
наверное не в скрипте дело sad

Добавлено (2011-05-18, 15:04:52)
---------------------------------------------
Кстати,"как было" это так: после первого удара все монстры с тэгом 49 умирают, но сообщение о том, что "вы убили своих врагов" не появляется, а дальше, сколько бы я ни стучал по колоколу, ничего не происходит.
Любопытно то, что когда подключаешь этот же вад с этим же скриптом не к порту, а к обычному хексену, сообщение появляется и враги умирают но опять же дальше ничего.

 
DraculaXДата: Четверг, 2011-05-19, 23:03:25 | Сообщение # 13
Sεrpεñτ Rιdεr
Группа: Хранители
Сообщений: 2435
Статус: Offline
Quote (Shadowcaster)
я поставил твой скрипт в карту все осатлось как было

biggrin Конечно так всё и останется! А вы что хотели? У нас зашёл разговор про грамотность написания скриптов, я объяснил в чём суть. Сравните мой скрипт с исходным и найдите 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
Ваще ниче не понял с этим колоколом dry
 
Форум » Редактирование игр » Редактирование игр Heretic, Hexen » Скрипты!
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:


Hexen 2 Russian Fans © 2006-2024 Хостинг от uCoz