|
|
09.08.2005, 16:35
|
#682
|
|
|
|
|
A.G.F.C.
Регистрация: 02.09.2005
Сообщений: 6
|
|
|
|
|
|
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, 21:20
|
#683
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2marazmus:
1) У NPC, который вставляется, в описании обязательно должна присутствовать функция типа RTN_***.
|
А еще по-моему в ней должно быть прописано как минимум два вызова функций TA_.
Без ID или при его дублировании в описании другого NPC возможны ошибки при работе.
|
При дублировании id продублируются и названия функций RTN_*, на что компилятор выдаст ошибку.
|
|
|
09.08.2005, 21:26
|
#684
|
|
|
|
|
Регистрация: 19.06.2004
Адрес: г. Белая Калитва.
Сообщений: 204
|
|
|
|
|
|
Re: Скриптинг в Готике
2SATANIZMatik: Я не пользуюсь вообще никакими прогами для упощенного написания диалогов. Все ручками в UltraEdit. Да и что там переводить? Там все и так понятно.
|
|
|
10.08.2005, 10:08
|
#686
|
|
Re: Скриптинг в Готике
2DEDROIT:
B_Attack(self,other,AR_NONE,1); но я не понимаю что означает AR_NONE,1?
|
Читай Уроки скриптологии, эта функция с параметрами там подробно рассмотрена. 2marazmus:
Всё, что ты написал при вставке НПС в мир необязательно, (rtn_ функции может не быть, daily_routine прописывать необязательно, id может отсутствовать), НПС вставиться в любом случае, если его имя (есть нужная инстанция) и вайпоинт правильны.
Функция - AI_Teleport(). Работает ТОЛЬКО в связке с B_StartOtherRoutine(),
|
Тоже необязательно, AI_Teleport сработает на любого НПС и перенесет его в любую точку, если у НПС отсутствует присвоение daily_routine. Большинство того, что ты написал относится не к перемещению НПС по миру, а к смене его распорядка дня при различных воздействиях. Необходимо понять главное, что если у НПС задана начальная функция daily_routine, то куда бы его не посылали, он всегда будет возвращаться в точку этой начальной функции, поэтому и необходимо задать новый распорядок дня НПС. (Каждая rtn_ функция является распорядком дня НПС, сколько у него задано функций, столько распорядков дня для него и существует).
|
|
|
10.08.2005, 13:15
|
#689
|
|
Re: Скриптинг в Готике
2DEDROIT:
А можно ли сделать так.Поставить неписю гильдию бандит но только чтобы когда я к нему подхожу был сначало диалог а потом он начал уже драться?
|
Есть постоянные отношения между гильдиями, а есть временное отношение конкретного НПС к ГГ, так вот его необходимо для данного бандита поставить на дружеское. (т.е. для бандита установить npctype = NPCTYPE_FRIEND, тогда вне зависимости от гильдии данный НПС будет другом ГГ).
|
|
|
10.08.2005, 14:06
|
#690
|
|
Re: Скриптинг в Готике
Люди, как мне проверить, прошло ли 2 дня от какого-то события, например начала квеста. И если прошло - выполнить какую либо функцию, например грохнуть кого-нибудь( или вставить). Уже 3 дня ломаю голову над этой проблемой и, наверное, как всегда, ответ получится проще простого. Помогите плиз!!!!!!!!!!!!!!!!! 2DEDROIT: Ты попробуй поставить неписю гильдию Ищущих - их тоже вроде бы никто не любит и они так же после диалога нападут. А проще всего поступи так: 1) Скопируй скрипт какого-нибудь искателя. 2) Придай ему уникальность - ID и имя инстанции, анимацию и визуализацию. 3) Скопируй скрипт диалога этого искателя. 4) Просто измени ему фразы на свои. 5) Он должен напасть на тебя после диалога. Если ты от него драпанешь - он побежит за тобой и на него по идее все будут нападать.
В общем попробуй так, потом скажешь получилось или нет.
Да, вот еще впрос (извините, что не в тему) как можно конвертнуть из WAV в SGT ?
|
|
|
10.08.2005, 14:31
|
#691
|
|
Re: Скриптинг в Готике
2Finsternis:
Уже 3 дня ломаю голову над этой проблемой и, наверное, как всегда, ответ получится проще простого. Помогите плиз!!!!!!!!!!!!!!!!!
|
Тут и ломать то нечего, в скриптах полно примеров, используй два раза функцию Wld_GetDay(), первый раз для сохранения текущего дня в своей переменной, а второй раз для сравнения с ней же, чтобы получить разницу, сколько дней прошло.
|
|
|
10.08.2005, 22:05
|
#692
|
|
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, 23:58
|
#693
|
|
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, 12:21
|
#695
|
|
Re: Скриптинг в Готике
2DEDROIT:
if(TOPIC_q_r,LOG_SUCCESS)
|
А это как понимать? Вместо , должно быть условие сравнения (==, != и т.д.)
|
|
|
11.08.2005, 14:22
|
#697
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
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, 15:17
|
#699
|
|
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, 15:24
|
#700
|
|
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, 16:50
|
#701
|
|
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, 17:49
|
#702
|
|
Re: Скриптинг в Готике
2DEDROIT:
Что-то я тут с тобой запутался, вернее ты сам всё запутал. 1. Возьми старый вариант, этот неправилен. 2. В старом варианте в во втором аргументе функции Npc_KnowsInfo(other,dia_Lobart_q_s) должно стоять имя инстанции диалога, а у тебя стоит имя функции, и это повторяется в нескольких местах. Понял?
|
|
|
11.08.2005, 19:16
|
#704
|
|
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), то есть той в которой ГГ уже поговорил, посмотри сам по смыслу, я смотрю только на грамматику, а не на сюжет.
|
|
|
12.08.2005, 00:49
|
#706
|
|
Re: Скриптинг в Готике
2DEDROIT: Посоветую тебе искать примеры в оригинальных скриптах Готики 2, написанных разработчиками. 1) Все, что только можно придумать в игре уже было придумано разрабами, ими же описано и отлажено. 2) Там 100% правильный вариант скрипта. 3) ИМХО, если ты вьедешь сам, то это будет намного лучше для твоих личных знаний в каком-либо роде деятельности (как опыт в Готике), чем если тебе все преподнесут в готовом виде, ты это используешь, а сути так и не поймешь (Мой личный опыт, проверено много раз).
2Всем: Кто-нибудь знает как конвертнуть в формат SGT, пересмотрел уже 5 дисков, посвященных цифровой музыке, проюзал все поисковики - нашел только DirectMusic, который позволяет только прослушивать музыку в этом формате.
Заранее спасибо за ответ.
2Модераторам: Сорри за оффтоп. *
|
|
|
12.08.2005, 09:19
|
#707
|
|
Re: Скриптинг в Готике
2DEDROIT:
спосибо конечно но то что ты обьяснил я знаю,я имел ввиду другое. ..... Вот я и не знаю как сделать?
|
Ты спрашивал про ошибку, я объяснил, если ты сам знал как её исправить - зачем спрашивать. Если ты хочешь, чтобы в зависимости от вызова функций первого диалога (_q_a или _q_s) срабатывали далее разные диалоги, то введи переменную, которой в функции _q_a присваивается 1, а в функции _q_s - 2, а далее (в функции проверки условия нужного диалога) сравнивай эту переменную с нужным значением и начинай разные диалоги,... а вообще-то вариантов реализации очень много, думай сам и смотри примеры! :)
|
|
|
12.08.2005, 15:53
|
#709
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2DEDROIT:
но как сделать чтобы после разговора с Leo,другой непись(например MAX) то же отправился на другой веппоинт(не телепортировался а пошёл)?
|
Код:
B_StartOtherRoutine(OXT_668_Leo,"q");B_StartOtherRoutine(OXT_xxx_Max,"q");
Разумеется, у Max'a должна быть тоже прописана функция
|
|
|
12.08.2005, 15:56
|
#710
|
|
Re: Скриптинг в Готике
2DEDROIT:
но как сделать чтобы после разговора с Leo,другой непись(например MAX) то же отправился на другой веппоинт(не телепортировался а пошёл)?
|
Да точно также, отличий никаких нет, вызвать там же и ту же функцию B_StartOtherRoutine(xxx_MAX,"q");, у MAX тоже должна быть функция распорядка дня с именем Rtn_q_xxx. PS: TycoooN: Одинаково думаем ;D
|
|
|
12.08.2005, 19:44
|
#711
|
|
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, 23:17
|
#713
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2TSYLin:
Когда делаешь НПС торговцем или учеником нужно ли прописывать ещё что-нибудь в каком-нибудь скрипте?
|
Учеником - это как? А торговцем - нужно прописать те предметы, которыми НПС будет торговать (это не обязательно его инвентарь). Прописывается это в папке Story/B_GiveTradeInv/. Думаю, там все понятно.
|
|
|
12.08.2005, 23:26
|
#714
|
|
Re: Скриптинг в Готике
|
|
|
13.08.2005, 14:32
|
#718
|
|
Re: Скриптинг в Готике
2) В каком файле описаны названия миссий
|
LOG_Constants_Yoly LOG_Constants_Hoshi
|
|
|
13.08.2005, 14:50
|
#719
|
|
|
|
|
Регистрация: 19.06.2004
Адрес: г. Белая Калитва.
Сообщений: 204
|
|
|
|
|
|
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, 18:39
|
#720
|
|
Re: Скриптинг в Готике
2Finsternis:
Все, что только можно придумать в игре уже было придумано разрабами, ими же описано и отлажено.
|
Ну я б не сказал ;) Вот, например, вчера реализовал такой прикол - получение экспы за выбрасывание предмета в определенной комнате замка ;)
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
Опции темы |
Поиск в этой теме |
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 01:22. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|