[AGFC: Valley of Gothic] М: Скриптинг в Готике

Страница 18 из 65 « Первая 81112131415161718 1920212223242528 Последняя »
Поиск в этой теме:

Расширенный поиск
Старый 09.08.2005, 15:18   #681
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Vam: 2marazmus: Большое вам спосибо.Всё получилось.Действительно не работало потому что не было ID.Но даже когда поставил ID компилятор выдал ошибку.Но я полностью переделал чела.И всё зароботло.Да и ещё действительно
AI_Teleport срабатывает только в связке с B_StartOtherRoutine!
Ответить с цитированием
Старый 09.08.2005, 15:35   #682
marazmus
A.G.F.C.
 
Регистрация: 02.09.2005
Сообщений: 6
marazmus вне форума

По умолчанию Re: Скриптинг в Готике

Клево.
И тебе спасибо, за постановку задачи и за то, что не поленился проверить. Теперь буду знать.

Вообще, мне кажется, нужно сделать факи по скриптингу некоторых игровых ситуаций.
Конечно, поднимать всю тему тоже прикольно, иногда.
Но все-таки часто требуется именно конкретное описание конкретного случая.
Голову никто не отменял :), но время такой фак может сэкономить очень сильно.

Добавление от 08/09/05, в 15:54:46
Например:

Перемещение NPC по миру.

Вейпойнт.

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

А чтобы он мог перемещаться по миру, нужны т.н. "связки" вейпойнтов.
Это просто несколько вейпойнтов, связанных между собой путями - в спейсере они выглядят как тонкие красные линии между вейпойнтами.

Итоговый маршрут NPC - это путь по таким связкам, от одного вейпойнта к другому.
Естественно, чтобы NPC дошел до пункта назначения, в связке не должно быть разрывов.

Вставка NPC в мир.

Чтобы вставить NPC в мир, нужно воспользоваться функцией Wld_InsertNPC().

У нее два параметра.
Первый - имя intance NPC, который вставляется.
Например - NONE_666_Ramirez

Второй - имя вейпойнта, на который будет вставляться наш NPC
Например, "NW_XARDAS_TOWER_VALLEY_09"

Итого: Wld_InsertNPC(NONE_666_Ramirez,"NW_XARDAS_TOWER_VA LLEY_09");

Здесь есть некоторые тонкости.

1) У NPC, который вставляется, в описании обязательно должна присутствовать функция типа RTN_***.
Например,
[pre]
      func void Rtn_PreStart_666()
      {
      TA_Guard_Passage (8,0,22,0,"NW_FARM1_OUT_01");
      TA_Guard_Passage (22,0,8,0,"NW_FARM1_OUT_01");
      };
[/pre]
2) Параметр daily_routine обязательно должен присутствовать и ему должно быть назначено имя существующей функции
[pre]
daily_routine = Rtn_PreStart_666;
[/pre]
Иначе NPC просто не вставится в мир.

Отсюда следует еще одно: у NPC в описании обязательно должен присутствовать ID.
[pre]
ID = 666;
[/pre]

Без ID или при его дублировании в описании другого NPC возможны ошибки при работе.

Перемещение NPC по миру.

Скриптовая основа - функция B_StartOtherRoutine() и функции типа RTN_*** конкретного NPC.

Как это использовать?

Простой пример:
пишем, например, в теле диалога
[pre]
B_StartOtherRoutine(NONE_666_Ramirez,"q");
[/pre]
Это означает, что для NPC с именем instance NONE_666_Ramirez была "включена" его RTN функция rtn_q_666(),
в которой написано, что он должен делать, т.е. информация о вейпойнтах
Туда он и пойдет, в зависимости от "внутренностей" RTN-функции.

Еще один способ - телепортация.
Функция - AI_Teleport().
Работает ТОЛЬКО в связке с B_StartOtherRoutine(), то есть:
сперва применяем AI_Teleport(),
затем B_StartOtherRoutine(),
причем имена вейпойнтов, использованных в этих функциях должны совпадать.
То есть - если в AI_Teleport() указали вейпойнт "NW_X_01",
то он должен быть в функции rtn_q_666, которая используется в B_StartOtherRoutine().

Уф, вроде все.
Пишите исправления. :)
Отправить личное сообщение для Ответить с цитированием
Старый 09.08.2005, 20:20   #683
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию Re: Скриптинг в Готике

2marazmus:
1) У NPC, который вставляется, в описании обязательно должна присутствовать функция типа RTN_***.
А еще по-моему в ней должно быть прописано как минимум два вызова функций TA_.

Без ID или при его дублировании в описании другого NPC возможны ошибки при работе.
При дублировании id продублируются и названия функций RTN_*, на что компилятор выдаст ошибку.

Отправить личное сообщение для Ответить с цитированием
Старый 09.08.2005, 20:26   #684
Killer-XXX
Строители Миртаны
 
 
Регистрация: 19.06.2004
Адрес: г. Белая Калитва.
Сообщений: 204
Killer-XXX вне форума

По умолчанию Re: Скриптинг в Готике

2SATANIZMatik:
Я не пользуюсь вообще никакими прогами для упощенного написания диалогов.
Все ручками в UltraEdit.
Да и что там переводить? Там все и так понятно.
Ответить с цитированием
Старый 09.08.2005, 21:48   #685
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Возник ещё один вопрс:
Вот допустим я создал нрс(с гильдией NONE),а после разговора с ним гильдия у него поменялась на бандитскую(т.е после разговора чтобы он меня атоковал,как и все его атаковали)?Можно ли так сделать?
Или хотя бы чтобы после разговора с ним он меня атаковал(без изменение гильдий)?Я посмотрел функцию атаки у булко B_Attack(self,other,AR_NONE,1);
но я не понимаю что означает AR_NONE,1?
Ответить с цитированием
Старый 10.08.2005, 09:08   #686
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
B_Attack(self,other,AR_NONE,1);
но я не понимаю что означает AR_NONE,1?
Читай Уроки скриптологии, эта функция с параметрами там подробно рассмотрена.

2marazmus:
Вставка NPC в мир.
Всё, что ты написал при вставке НПС в мир  необязательно, (rtn_ функции может не быть, daily_routine прописывать необязательно, id может отсутствовать), НПС вставиться в любом случае, если его имя (есть нужная инстанция) и вайпоинт правильны.

Перемещение NPC по миру.
Функция - AI_Teleport().
Работает ТОЛЬКО в связке с B_StartOtherRoutine(),
Тоже необязательно, AI_Teleport сработает на любого НПС и перенесет его в любую точку, если у НПС отсутствует присвоение daily_routine.
Большинство того, что ты написал относится не к перемещению НПС по миру, а к смене его распорядка дня при различных воздействиях.
Необходимо понять главное, что если у НПС задана начальная функция daily_routine, то куда бы его не посылали, он всегда будет возвращаться в точку этой начальной функции, поэтому и необходимо задать новый распорядок дня НПС. (Каждая rtn_ функция является распорядком дня НПС, сколько у него задано функций, столько распорядков дня для него и существует).
Ответить с цитированием
Старый 10.08.2005, 11:26   #687
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Vam: А можно ли сделать так.Поставить неписю гильдию бандит
но только чтобы когда я к нему подхожу был сначало диалог а потом он начал уже драться?
Ответить с цитированием
Старый 10.08.2005, 12:01   #688
SATANIZMat

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
Вряд ли. Зачем это делать? Можно просто сделать чтобы он представился ка кбандит а на самом деле гильдия None. Хотя есть же Бандит в Готике который самый первый нас встречает у башни Ксардаса.
Ответить с цитированием
Старый 10.08.2005, 12:15   #689
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
А можно ли сделать так.Поставить неписю гильдию бандит
но только чтобы когда я к нему подхожу был сначало диалог а потом он начал уже драться?
Есть постоянные отношения между гильдиями, а есть временное отношение конкретного НПС к ГГ, так вот его необходимо для данного бандита поставить на дружеское. (т.е. для бандита установить npctype = NPCTYPE_FRIEND, тогда вне зависимости от гильдии данный НПС будет другом ГГ).
Ответить с цитированием
Старый 10.08.2005, 13:06   #690
Finsernis

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Люди, как мне проверить, прошло ли 2 дня от какого-то события, например начала квеста. И если прошло - выполнить какую либо функцию, например грохнуть кого-нибудь( или вставить). Уже 3 дня ломаю голову над этой проблемой и, наверное, как всегда, ответ получится проще простого.
Помогите плиз!!!!!!!!!!!!!!!!!
2DEDROIT:
Ты попробуй поставить неписю гильдию Ищущих - их тоже вроде бы никто не любит и они так же после диалога нападут.
А проще всего поступи так:
1) Скопируй скрипт какого-нибудь искателя.
2) Придай ему уникальность - ID и имя инстанции, анимацию и визуализацию.
3) Скопируй скрипт диалога этого искателя.
4) Просто измени ему фразы на свои.
5) Он должен напасть на тебя после диалога. Если ты от него драпанешь - он побежит за тобой и на него по идее все будут нападать.

В общем попробуй так, потом скажешь получилось или нет.


Да, вот еще впрос (извините, что не в тему) как можно конвертнуть из WAV в SGT ?
Ответить с цитированием
Старый 10.08.2005, 13:31   #691
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Finsternis:
Уже 3 дня ломаю голову над этой проблемой и, наверное, как всегда, ответ получится проще простого.
Помогите плиз!!!!!!!!!!!!!!!!!
Тут и ломать то нечего, в скриптах полно примеров, используй два раза функцию Wld_GetDay(), первый раз для сохранения текущего дня в своей переменной, а второй раз для сравнения с ней же, чтобы получить разницу, сколько дней прошло.
Ответить с цитированием
Старый 10.08.2005, 21:05   #692
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Finsternis: Я попытался сделать как ты сказал но он всё равно атакует и разговора никакого нет!Может быть что-то сделал не правильно
вот скрипт непися
instance DMT_666_Bad (Npc_Default)
{
//-------------Данные персонажа-------

name = "Зомби";
guild = GIL_DMT;
npctype = npctype_main;
level = 15;
voice = 8;
id = 666;
//-------------Аттрибуты---------------
attribute[ATR_STRENGTH] = 150;
attribute[ATR_DEXTERITY] = 150;
attribute[ATR_MANA_MAX] = 120;
attribute[ATR_MANA] = 110;
attribute[ATR_HITPOINTS_MAX] = 200;
attribute[ATR_HITPOINTS] = 200;
//-------------Визуализация------------
Mdl_SetVisual(self,"HumanS.mds");
Mdl_SetVisualBody(self,"Zom_Body",0,0,"Zom_Head",0 ,DEFAULT,itar_pal_skel);
//-------------Таланты----------------
B_GiveNpcTalents (self);
B_SetFightSkills (self, 60);
//-------------Инвентарь---------------
EquipItem (self, ItMw_1H_Special_01);
EquipItem (self, ItRw_Sld_Bow);
//-------------Чувства-------------------
senses = SENSE_SEE | SENSE_SMELL | SENSE_HEAR;
senses_range = 2000;

//-------------АИ------------------------
fight_tactic = FAI_HUMAN_MASTER;

daily_routine = Rtn_Start_666;
      };
      func void Rtn_Start_666()
      {
      TA_Smoke_Joint           (8,0,22,0,"NW_FARM1_OUT_01");
      TA_Smoke_Joint           (22,0,8,0,"NW_FARM1_OUT_01");
      };
      func void Rtn_q_666()
      {
      TA_Smoke_Joint                          (8,0,22,0,"NW_XARDAS_TOWER_SECRET_CAVE_04");
      TA_Smoke_Joint                          (22,0,8,0,"NW_XARDAS_TOWER_SECRET_CAVE_04");
      };  
а вот скрипт диалога
instance DIA_DMt_666_Bad_EXIT(C_Info)
{
     npc = DMT_666_Bad;
     nr = 999;
     condition = DIA_DMt_666_Bad_EXIT_Condition;
     information = DIA_DMt_666_Bad_EXIT_Info;
     permanent = TRUE;
     description = Dialog_Ende;
};


func int DIA_DMt_666_Bad_EXIT_Condition()
{
     return TRUE;
};

func void DIA_DMt_666_Bad_EXIT_Info()
{
     Wld_StopEffect("DEMENTOR_FX");
     B_SCIsObsessed(self);
     AI_StopProcessInfos(self);
     Npc_SetRefuseTalk(self,30);
     B_Attack(self,other,AR_NONE,1);
     Snd_Play("MFX_FEAR_CAST");
};


instance DIA_DMt_666_Bad(C_Info)
{
     npc = DMt_666_Bad;
     nr = 1;
     condition = DIA_DMt_666_Bad_Condition;
     information = DIA_DMt_666_Bad_Info;
     permanent = TRUE;
     important = TRUE;
};


func int DIA_DMt_666_Bad_Condition()
{
     if(Npc_RefuseTalk(self) == FALSE)
     {
           return TRUE;
     };
};

func void DIA_DMt_666_Bad_Info()
{
     Wld_PlayEffect("DEMENTOR_FX",hero,hero,0,0,0,FALS E);
     Wld_PlayEffect("spellFX_Fear",self,self,0,0,0,FAL SE);
     AI_PlayAni(self,"T_PRACTICEMAGIC5");
     AI_Output(self,other,"DIA_BridgeDementor_19_0 0");      //текст
     AI_Output(self,other,"DIA_BridgeDementor_19_0 1");      //текст
     AI_Output(self,other,"DIA_BridgeDementor_19_0 2");      //текст
     Npc_SetRefuseTalk(self,30);
};
Что я делаю не правильно?




Добавление от 08/10/05, в 18:00:07
Ещё один вопрос можно ли чтобы перед начало разговора чел должен выполнить несколько функций например чтобы у него было 100 золотых и чтобы он перед этим с кем то поговорил
Вот пример:
func int dia_Lobart_q3_condition()
{
     if(Npc_KnowsInfo(other, DIA_Lobart_q ))
{
if(Npc_HasItems(other, ItMi_Gold,100))
     {
           return TRUE;
     };
};
Но компилятор выдаёт ошибку вот она
00:08 Fatal:-1 U: PAR:STORY/DIALOGE/DIA_BAU_950_LOBART.D: EXPECTED ')'(LINE 1104)..<Zparser.cpp,#599>


Добавление от 08/10/05, в 21:25:45
Со вторым вопросом  разобрался!Так что отвечать не надо!А вот с первым ещё нет?
Ответить с цитированием
Старый 10.08.2005, 22:58   #693
Finsernis

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
Ты писал:
func int dia_Lobart_q3_condition()
{
* * if(Npc_KnowsInfo(other, DIA_Lobart_q ))
{
if(Npc_HasItems(other, ItMi_Gold,100))
* * {
* * * * * return TRUE;
* * };
};
Вот как надо:

func int dia_Lobart_q3_condition()
{
* * if(Npc_KnowsInfo(other, DIA_Lobart_q ))
* * {
* * if(Npc_HasItems(other, ItMi_Gold,100))
* * * * * {
* * * * * * * *return TRUE;
* * * * * };
* * };
};

или вот как:

func int dia_Lobart_q3_condition()
{
* * if(Npc_KnowsInfo(other, DIA_Lobart_q )) (2 палки) if(Npc_HasItems(other, ItMi_Gold,100))
* * * * * {
* * * * * * * *return TRUE;
* * * * * };
};


С неписем посмотрю, если че получится на мыло кину.
Ответить с цитированием
Старый 11.08.2005, 11:13   #694
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

func int dia_Xardas_q5_condition()
{
   if(Npc_KnowsInfo(other, dia_Xardas_q4))
   {
   if(TOPIC_q_r,LOG_SUCCESS)
         {
              return TRUE;
         };
   };
};
Что у меня здесь не правильно компилятор выдаёт ошибку
00:10 Fatal:-1 U: PAR:STORY/DIALOGE/DIA_NONE_100_XARDAS.D:Exprected')'(line 1275)...<zParser.cpp,#599>
Ответить с цитированием
Старый 11.08.2005, 11:21   #695
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
if(TOPIC_q_r,LOG_SUCCESS)
А это как понимать? Вместо , должно быть условие сравнения (==, != и т.д.)
Ответить с цитированием
Старый 11.08.2005, 12:34   #696
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Finsternis: То что ты посоветовал с ищущими на половину работает на половину нет.Если не разговаривать с неписем(после разговора которого должен телепортироваться другой непись) а просто подойти где стоит на первом веппоинте то он ведёт себя как ищущий(говорит а потом драка).А если поговорить с неписем(т.е другой непись телепортанётся на другой веппоинт) то он сразу начинает драться!Как можно сделать чтобы после телепортации он тоже вёл себя как ищущий?
И ещё один вопрос1Вот допустим я создал диалог и в этом диалоге 3 варианта ответа,как сделать чтобы после нажатия какого-нибудь ответа другие 2 пропали?
Ответить с цитированием
Старый 11.08.2005, 13:22   #697
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию Re: Скриптинг в Готике

2Finsternis:
if(Npc_KnowsInfo(other, DIA_Lobart_q )) (2 палки) if(Npc_HasItems(other, ItMi_Gold,100))
Ну вот, еще один знаток. Не так, второго if не надо ::)

Добавление от 08/11/05, в 13:28:28

2DEDROIT:
З.Ы.
if(TOPIC_q_r,LOG_SUCCESS)
Вообще-то переменные TOPIC_* обычно имеют тип string, так что ты навернор имел в виду что-то вроде
Код:
if(MIS_q_r == LOG_SUCCESS)
Отправить личное сообщение для Ответить с цитированием
Старый 11.08.2005, 13:43   #698
Finsernis

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2TycoooN:
А ну да, ифа не надо, это понятно, просто я ради экономии времени копи-пастил. Прошу прощения за помарку. И еще вместо (2х палок) надо &&.

2DEDROIT:
Для того чтобы убрать остальные варианты ответа используй функцию  Info_ClearChoices.
А потом сформируй нужные варианты с помощью Info_AddChoice.

Например, есть 3 варианта ответа: 1) Да, Нет, Не знаю.
Ответ "Не знаю" не принимается и тебя просят выбрать "Да" или "Нет". Поэтому ты убираешь все варианты ответа с помощью Info_ClearChoices, а затем формируешь варианты "Да" или "Нет" с помощью Info_AddChoice.
Ответить с цитированием
Старый 11.08.2005, 14:17   #699
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Ещё один вопрос.Вот скрипт моего диалога:
instance DIA_Lobart_q (C_Info)
{
* * *npc = BAU_950_Lobart;
* * *nr = 1;
* * *condition = dia_Lobart_q_condition;
* * *information = dia_Lobart_q_info; * * * * * * * * * * * * * *
* * *permanent = FALSE;
* * *important = FALSE;
* * *description = "текст";
};
func int dia_Lobart_q_condition()
{
* * *if(Npc_KnowsInfo(other, DIA_Kiranor_q2 ))
* * *{
* * * * * *return TRUE;
* * *};
};
func void dia_Lobart_q_info()
{
AI_Output(other,self,"DIA_Lobart_q_15_00"); * * *//AI_Output(other,self,"DIA_Lobart_q_15_00"); * * *//текст
AI_Output(self,other,"dia_Lobart_q_03_01"); * //текст
Info_ClearChoices(dia_Lobart_q);
Info_AddChoice(DIA_Lobart_q ,"текст",dia_Lobart_q_a);
Info_AddChoice(DIA_Lobart_q ,"текст",dia_Lobart_q_s);
};
func void dia_Lobart_q_a()
{
AI_Output(other,self,"dia_Lobart_q_a_15_00"); * * *//текст.
AI_Output(self,other,"dia_Lobart_q_a_03_01"); * //текст
AI_StopProcessInfos (self);
};
func void dia_Lobart_q_s()
{
AI_Output(other,self,"DIA_Lobart_q_s_15_00"); * * *//текст
AI_Output(self,other,"dia_Lobart_q_s_03_01"); * //текст
AI_Output(other,self,"DIA_Lobart_q_s_15_01"); * * *//текст
AI_Output(self,other,"dia_Lobart_q_s_03_02"); * //текст
AI_StopProcessInfos (self);
};
instance DIA_Lobart_q2 (C_Info)
{
* * *npc = BAU_950_Lobart;
* * *nr = 1;
* * *condition = dia_Lobart_q2_condition;
* * *information = dia_Lobart_q2_info; * * * * * * * * * * * * * *
* * *permanent = FALSE;
* * *important = FALSE;
* * *description = "текст";
};
func int dia_Lobart_q2_condition()
{
* * *if(Npc_KnowsInfo(other,dia_Lobart_q_a) && (Npc_HasItems(other,ItMi_Gold) >= 100))
* * *{
* * * * * *return TRUE;
* * *};
};
func void dia_Lobart_q2_info()
{
AI_Output(other,self,"DIA_Lobart_q2_15_00"); * * *//текст
b_giveinvitems(self,other,ItMi_Gold,100);
B_GivePlayerXP(100);
B_LogEntry(TOPIC_q2,"текст.");
};
instance DIA_Lobart_q3 (C_Info)
{
* * *npc = BAU_950_Lobart;
* * *nr = 1;
* * *condition = dia_Lobart_q3_condition;
* * *information = dia_Lobart_q3_info; * * * * * * * * * * * * * *
* * *permanent = FALSE;
* * *important = FALSE;
* * *description = "текст";
};
func int dia_Lobart_q3_condition()
{
* * *if(Npc_KnowsInfo(other,dia_Lobart_q_s) && (Npc_HasItems(other,ItMi_Gold) >= 280))
* * *{
* * * * * *return TRUE;
* * *};
};
func void dia_Lobart_q3_info()
{
AI_Output(other,self,"DIA_Lobart_q3_15_00"); * * *//текст
b_giveinvitems(self,other,ItMi_Gold,100);
B_GivePlayerXP(100);
B_LogEntry(TOPIC_q2,"текст.");
};
Компилятор выдаёт ошибку:
00:29 Fatal:-1 U: PAR:STORY/DIALOGE/DIA_BAU_LOBART.D:Wrong type:DIA_LOBART_Q_A...<zParser.cpp,#599.
Как её можно исправить?Если я уберу DIA_LOBART_Q_A и поставлю DIA_LOBART_Q товсё работает!
Но мне нужно имено чтобы я сначала сказал DIA_LOBART_Q_A и чтобы при мне было 100 монет.
Как мне можно сделать?
Ответить с цитированием
Старый 11.08.2005, 14:24   #700
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
00:29 Fatal:-1 U: PAR:STORY/DIALOGE/DIA_BAU_LOBART.D:Wrong typeIA_LOBART_Q_A...<zParser.cpp,#599.
Как её можно исправить?
Прежде чем вызывать любую функцию, её необходимо предварительно объявить, а у тебя так сначала вызов
Info_AddChoice(DIA_Lobart_q ,"текст",dia_Lobart_q_a);
а затем объява
func void dia_Lobart_q_a()
. Просто функцию void dia_Lobart_q_a() пропиши выше функции void dia_Lobart_q_info(), аналогично и функцией _q_s(). Здесь нужно быть внимательнее!  ;)
Ответить с цитированием
Старый 11.08.2005, 15:50   #701
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Вот так или нет?
instance DIA_Lobart_q (C_Info)
{
    npc = BAU_950_Lobart;
    nr = 1;
    condition = dia_Lobart_q_condition;
    information = dia_Lobart_q_info;                            
    permanent = FALSE;
    important = FALSE;
    description = "текст";
};
func int dia_Lobart_q_condition()
{
    if(Npc_KnowsInfo(other, DIA_Kiranor_q2 ))
    {
          return TRUE;
    };
};
func void dia_Lobart_q_info()
{
AI_Output(other,self,"DIA_Lobart_q_15_00");      //AI_Output(other,self,"DIA_Lobart_q_15_00");      //текст
AI_Output(self,other,"dia_Lobart_q_03_01");   //текст
};
func void dia_Lobart_q_a()
{
AI_Output(other,self,"dia_Lobart_q_a_15_00");      //текст.
AI_Output(self,other,"dia_Lobart_q_a_03_01");   //текст
Info_AddChoice(DIA_Lobart_q ,"текст",dia_Lobart_q_a);
AI_StopProcessInfos (self);
};
Ответить с цитированием
Старый 11.08.2005, 16:49   #702
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
Вот так или нет?
Что-то я тут с тобой запутался, вернее ты сам всё запутал.
1. Возьми старый вариант, этот неправилен.
2. В старом варианте в во втором аргументе функции Npc_KnowsInfo(other,dia_Lobart_q_s) должно стоять имя инстанции диалога, а у тебя стоит имя функции, и это повторяется в нескольких местах. Понял?
Ответить с цитированием
Старый 11.08.2005, 18:01   #703
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Vam: Можешь показать на примере моего старого диалога!
Я чё то не никак вьеду!
Ответить с цитированием
Старый 11.08.2005, 18:16   #704
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
Можешь показать на примере моего старого диалога!
У тебя есть 3 инстанции диалогов instance DIA_Lobart_q(C_Info), ххх_q2 и xxx_q3, которые образованы от класса C_Info, и есть несколько функций условий (ххх_condition) и информации (xxx_info) и функции ххх_a и ххх_s. Так вот в строке Npc_KnowsInfo(other,dia_Lobart_q_s) вместо dia_Lobart_q_s (это имя функции), нужно поставить имя инстанции (одной из DIA_Lobart_q, ххх_q2 или xxx_q3), то есть той в которой ГГ уже поговорил, посмотри сам по смыслу, я смотрю только на грамматику, а не на сюжет.
Ответить с цитированием
Старый 11.08.2005, 20:01   #705
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Vam: спосибо конечно но то что ты обьяснил я знаю,я имел ввиду другое.Вот допустим!Рассмотрим предыдущий мой диалог!Вот у меня 2 варианта диалога
если я нажму на  Info_AddChoice(DIA_Lobart_q ,"текст",dia_Lobart_q_a);
То я буду должен(допустим что-нибудь купить) 100 монет,а если я нажму второй вариант ответа(
Info_AddChoice(DIA_Lobart_q ,"текст",dia_Lobart_q_s);)
то я буду должен заплатить 200 монет.Вот я и не знаю как сделать?
Ответить с цитированием
Старый 11.08.2005, 23:49   #706
Finsernis

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
Посоветую тебе искать примеры в оригинальных скриптах Готики 2, написанных разработчиками.
1) Все, что только можно придумать в игре уже было придумано разрабами, ими же описано и отлажено.
2) Там 100% правильный вариант скрипта.
3) ИМХО, если ты вьедешь сам, то это будет намного лучше для твоих личных знаний в каком-либо роде деятельности (как опыт в Готике), чем если тебе все преподнесут в готовом виде, ты это используешь, а сути так и не поймешь (Мой личный опыт, проверено много раз).

2Всем:
Кто-нибудь знает как конвертнуть в формат SGT, пересмотрел уже 5 дисков, посвященных цифровой музыке, проюзал все поисковики - нашел только DirectMusic, который позволяет только прослушивать музыку в этом формате.

Заранее спасибо за ответ.

2Модераторам:
Сорри за оффтоп. *
Ответить с цитированием
Старый 12.08.2005, 08:19   #707
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
спосибо конечно но то что ты обьяснил я знаю,я имел ввиду другое. ..... Вот я и не знаю как сделать?
Ты спрашивал про ошибку, я объяснил, если ты сам знал как её исправить - зачем спрашивать.
Если ты хочешь, чтобы в зависимости от вызова функций первого диалога (_q_a или _q_s) срабатывали далее разные диалоги, то введи переменную, которой в функции _q_a присваивается 1, а в функции _q_s - 2, а далее (в функции проверки условия нужного диалога) сравнивай эту переменную с нужным значением и начинай разные диалоги,... а вообще-то вариантов реализации очень много, думай сам и смотри примеры!  :)
Ответить с цитированием
Старый 12.08.2005, 14:10   #708
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Vam: 2Finsternis: Спосибо вам
я в принципе нашёл выход из ситуации!

Добавление от 08/12/05, в 14:30:28
Ещё ворос.
Вот допустим у меня стоит 2 нрс(стоят рядом).После разговора с одним из них оба должны отправиться на другой веппоинт.Как это сделать?Я смог сделать только чтобы после разговора с одним неписем(например Leo)
ЭТОТ же непись отправился на другой веппоинт(Делал с помощью этой функцииB_StartOtherRoutine(OXT_668_Leo,"q");С этим всё получилось,но как сделать чтобы после разговора с Leo,другой непись(например MAX) то же отправился на другой веппоинт(не телепортировался а пошёл)?
Ответить с цитированием
Старый 12.08.2005, 14:53   #709
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
но как сделать чтобы после разговора с Leo,другой непись(например MAX) то же отправился на другой веппоинт(не телепортировался а пошёл)?
Код:
B_StartOtherRoutine(OXT_668_Leo,"q");B_StartOtherRoutine(OXT_xxx_Max,"q");
Разумеется, у Max'a должна быть тоже прописана функция
Код:
RTN_q_xxx()
Отправить личное сообщение для Ответить с цитированием
Старый 12.08.2005, 14:56   #710
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2DEDROIT:
но как сделать чтобы после разговора с Leo,другой непись(например MAX) то же отправился на другой веппоинт(не телепортировался а пошёл)?
Да точно также, отличий никаких нет, вызвать там же и ту же функцию B_StartOtherRoutine(xxx_MAX,"q");, у MAX тоже должна быть функция распорядка дня с именем Rtn_q_xxx.

PS: TycoooN: Одинаково думаем  ;D
Ответить с цитированием
Старый 12.08.2005, 18:44   #711
Finsernis

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Всем:
Прошу проверить (логически) то, что я напишу ниже, просто не уверен на все 100%

2DEDROIT:

Для того, чтобы проверить, читал ли ты письмо нужно ввести новую переменную. Для этого в начале скрипта, где описана инстанция твоего письма напиши:
*
Var Int Letter_Riding_For_Hero; // переменная-флаг

Далее тебе предстоит создать письмо:
*
instance ItWr_MyLetter_DontUse_MIS(C_Item)
{
* * *name = "Запечатанное письмо";
* * *mainflag = ITEM_KAT_DOCS;
* * *flags = ITEM_MISSION;
* * *value = 0;
* * *visual = "ItWr_Scroll_02.3DS";
* * *material = MAT_LEATHER;
* * *on_state[0] = UseMyLetterSealed; // читаем запечатанное письмо
* * *scemeName = "MAPSEALED"; //письмо исчезнет из инвентаря после прочтения
* * *description = name;
};

instance ItWr_MyLetter_Use_MIS(C_Item)
{
* * *name = "Открытое письмо";
* * *mainflag = ITEM_KAT_DOCS;
* * *flags = ITEM_MISSION;
* * *value = 0;
* * *visual = "ItWr_Scroll_01.3DS";
* * *material = MAT_LEATHER;
* * *on_state[0] = UseMyLetter; //читаем открытое письмо
* * *scemeName = "MAP";
* * *description = name;
};

Далее идет функция чтения открытого письма, тут все ясно:

func void UseMyLetter ()
{
** * *var int nDocID;
* * *nDocID = Doc_Create ();
* * *Doc_SetPages (nDocID, 1);
* * *Doc_SetPage (nDocID, 0, "letters.TGA", 0);
* * *Doc_SetFont (nDocID, 0, FONT_BookHeadline);
* * *Doc_SetMargins (nDocID, -1, 50, 50, 50, 50, 1);
* * *Doc_PrintLine (nDocID, 0, "Заголовок письма");
* * *Doc_SetFont (nDocID, 0, FONT_Book);
* * *Doc_PrintLine (nDocID, 0, "");
* * *Doc_PrintLines (nDocID, 0, "Bla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla blaBla bla");
* * *Doc_Show (nDocID);
};

А вот функция чтения закрытого письма:

func void UseMyLetterSealed ()
{
// если NPC игрок и письмо еще небыло прочитано
If ((Npc_IsPlayer (self)) && (Letter_Riding_For_Hero == FALSE))
* * *{
* * * * * *// Создаем в инвентаре распечатанное письмо
* * * * * *CreateInvItems (self, ItWr_MyLetter_Use_MIS, 1);
* * * * * *Letter_Riding_For_Hero = TRUE; // устанавливаем флаг чтения письма
* * * * * *UseMyLetter (); // выводим на экран само письмо
* * *};
};

Потом вот что должно быть в диалоге для того, чтобы проверить, читал ли ГГ письмо:

AI_Output (other, self, "DIA_MyNPC_01_01"); * * *//У меня для тебя письмо.
* * *AI_Output (self, other, " DIA_MyNPC_01_02"); * * *//Для меня?
* * *// если письмо не читано
* * *if (Letter_Riding_For_Hero == FALSE)
* * *{
* * * * * *B_GivePlayerXP (200);
* * * * * *B_GiveInvItems (other, self, ItWr_MyLetter_DontUse_MIS, 1);
* * * * * *AI_Output (self, other, " DIA_MyNPC_01_03"); * * *//Ты не читал письмо, молодец!
* * *}
* * *else
* * *{
* * * * * *B_GivePlayerXP (150);
* * * * * *B_GiveInvItems (other, self, ItWr_MyLetter_Use_MIS, 1);
* * * * * *AI_Output (self, other, " DIA_MyNPC_01_04"); * * *//Ты прочитал письмо, это тебе с рук не сойдет!
* * *};

Вот и все. ;)
Ответить с цитированием
Старый 12.08.2005, 21:57   #712
TSYLin

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Когда делаешь НПС торговцем или учеником нужно ли  прописывать ещё что-нибудь в каком-нибудь скрипте?
Ответить с цитированием
Старый 12.08.2005, 22:17   #713
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию Re: Скриптинг в Готике

2TSYLin:
Когда делаешь НПС торговцем или учеником нужно ли  прописывать ещё что-нибудь в каком-нибудь скрипте?
Учеником - это как?

А торговцем - нужно прописать те предметы, которыми НПС будет торговать (это не обязательно его инвентарь).
Прописывается это в папке Story/B_GiveTradeInv/. Думаю, там все понятно.
Отправить личное сообщение для Ответить с цитированием
Старый 12.08.2005, 22:26   #714
TSYLin

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2TycoooN:
Учеником
Ой! Учителем.
Ответить с цитированием
Старый 13.08.2005, 00:05   #715
DEDROIT

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Finsternis: Спосибо то что ты написал выше правильно,сначало кое-что не получалось в диалоге а потом пправил и всё работает!
Ответить с цитированием
Старый 13.08.2005, 11:08   #716
SATANIZMat

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2TSYLin:
ЧТобы он учил чему-нибудь надо это прописывать у него в диалоге.
На примере любого учителя можно увидеть.
Ответить с цитированием
Старый 13.08.2005, 13:13   #717
TSYLin

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

Не хочу быть назойливым, но всё эе ещё 2 вопроса:
1) какой скрипт отвечает за скрин при смене глав?
2) В каком файле описаны названия миссий
Ответить с цитированием
Старый 13.08.2005, 13:32   #718
SATANIZMat

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2) В каком файле описаны названия миссий
LOG_Constants_Yoly
LOG_Constants_Hoshi
Ответить с цитированием
Старый 13.08.2005, 13:50   #719
Killer-XXX
Строители Миртаны
 
 
Регистрация: 19.06.2004
Адрес: г. Белая Калитва.
Сообщений: 204
Killer-XXX вне форума

По умолчанию Re: Скриптинг в Готике

2TSYLin:
1. Открываешь UltraEdit и делаешь поиск в cкриптах по слову IntroduceChapter. Найдутся скрипты, где описан вывод рисунков.

Или же:
B_Story\B_Kapitelwechselю.d - 1, 2 глава.
B_Story\B_Enter_NewWorld.d - 3, 5 глава.
B_Story\B_Enter_OldWorld.d - 4 глава.
Events\Enter_DI_FirstTime_Trigger.d - 6 глава.
Ответить с цитированием
Старый 13.08.2005, 17:39   #720
dixie

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Скриптинг в Готике

2Finsternis:
Все, что только можно придумать в игре уже было придумано разрабами, ими же описано и отлажено.
Ну я б не сказал ;) Вот, например, вчера реализовал такой прикол - получение экспы за выбрасывание предмета в определенной комнате замка ;)
Ответить с цитированием
Страница 18 из 65 « Первая 81112131415161718 1920212223242528 Последняя »


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 

Ваши права в разделе

Смайлы Вкл.
[IMG] код Вкл.
HTML код Вкл.


Текущее время: 10:25. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot

AGFC: Valley of Gothic © 2004-2022

Яндекс.Метрика