|
|
14.06.2005, 09:08
|
#442
|
|
|
|
|
A.G.F.C.
Регистрация: 02.09.2005
Сообщений: 6
|
|
|
|
|
|
Re: Скриптинг в Готике
Уважаемые Готы. Предлагаю небольшой "разбор" скриптов диалогов для начинающих. В частности, скрипт простого диалога с "повторным" выбором. На примере диалога с Ларесом. Если неактуально, просьба сильно не пинать :)
[pre] // Основное - ПУНКТ ДИАЛОГА
instance DIA_Lares_Kap1_EXIT(C_Info)
// Instance означает ввод нового пункта иалога
{ npc = VLK_449_Lares; // Кто формирует этот пункт nr = 999; // Чем больше NR, тем ниже в списке будет показан данный пункт condition = DIA_Lares_Kap1_EXIT_Condition; // Имя фунции, которая проверят, можно ли показывать этот пункт information = DIA_Lares_Kap1_EXIT_Info; // Имя функции, в теле которой программируется реакция на выбор этого пункта permanent = TRUE; // Если TRUE, то пункт показывается постоянно, если FALSE, то "одноразовый"
important = FALSE; // Если TRUE, то NPC сам начнет разговор
description = Dialog_Ende; // Что будет написано в строке списка пунктов // В данном случае подставляется строковая константа // Можно просто написать: = "Закончить диалог"; };
func int DIA_Lares_Kap1_EXIT_Condition() // Функция проверяет, можно ли показывать этот пункт меню, // если можно, возвращает TRUE { if(Kapitel == 1) // Условие проверки: в данном случае - герой должен быть в 1 главе { return TRUE; }; };
func void DIA_Lares_Kap1_EXIT_Info() // Функция, в которой программируется реакция на выбор этого пункта диалога { AI_StopProcessInfos(self); // Закончить диалог };
// ************************************************* // Скрипты с "постоянным" выбором - обучение и т.п. // *************************************************
// Почти всегда скрипты этого типа используют переменные, для того, чтобы узнать, // в каком пункте меню сейчас мы находимся
var int Lares_MerkeDEX; // Эти переменные нужны для того, чтобы Ларе мог сказать после обучения, var int Lares_MerkeSTR; // изменились сила или ловкость ГГ или нет
instance DIA_Lares_TEACH(C_Info) // Формируем пункт диалога "Тренировка" { npc = VLK_449_Lares; // nr = 20; condition = DIA_Lares_TEACH_Condition; // В этой функции проверим, спрашивал ли ГГ еще об обучении или нет information = DIA_Lares_TEACH_Info; // Здесь будет реакция на выбор этого пункта permanent = TRUE; // Пункт постоянный (не "одноразовый") description = "Научи меня чему-нибудь. "; // Текст пункта };
func int DIA_Lares_TEACH_Condition() { if(Lares_TeachDEX == TRUE) // Эта переменная становится TRUE чуть выше в скриптах, // когда ГГ српашивает Лареса, не может ли тот научить чему-либо { return TRUE; // Если спрашивал, то пункт диалога "Тренировка" можно показать }; };
func void DIA_Lares_TEACH_Info() // Реагируем на выбор пункта диалога "Тренировка" { AI_Output(other,self,"DIA_Addon_Lares_Teach_15_00 "); //Научи меня чему-нибудь. // Говорим что-либо от имени ГГ (конструкция other,self) Lares_MerkeDEX = other.attribute[ATR_DEXTERITY];// Запоминаем текущую силу и ловкость ГГ Lares_MerkeSTR = other.attribute[ATR_STRENGTH]; //
Info_ClearChoices(DIA_Lares_TEACH); // На случай, если эти пункты выбора уже показывались, // очищаем список, чтобы не было дублей
// AddChoice формирует список выбора снизу вверх, // т.е. пункт "Назад" будет самым нижним и т.д. Info_AddChoice(DIA_Lares_TEACH,Dialog_Back,DIA_La res_TEACH_BACK); Info_AddChoice ( DIA_Lares_TEACH, // Пункт диалога, к которому относится данный пункт выбора
// Что печатаем в данном пункте выбора; в данном случае это функция // B_BuildLearnString, которая формирует текстовую строку типа // Тренировать Ловкость (1 очко обучения) B_BuildLearnString ( PRINT_LearnDEX1, B_GetLearnCostAttribute(other,ATR_DEXTERITY) ), DIA_Lares_TEACH_1 // Функция, которая вызывается при выборе данного пункта ); Info_AddChoice ( DIA_Lares_TEACH, B_BuildLearnString ( PRINT_LearnDEX5, B_GetLearnCostAttribute(other,ATR_DEXTERITY) * 5 // Тренировать Ловкость (5 очков обучения) ), DIA_Lares_TEACH_5); Info_AddChoice(DIA_Lares_TEACH,B_BuildLearnString (PRINT_LearnSTR1,B_GetLea rnCostAttribute(other,ATR_STRENGTH)),DIA_Lares_TEA CHSTR_1); Info_AddChoice(DIA_Lares_TEACH,B_BuildLearnString (PRINT_LearnSTR5,B_GetLea rnCostAttribute(other,ATR_STRENGTH) * 5),DIA_Lares_TEACHSTR_5); };
// Функция, вызываемая при выборе пункта "Назад"
func void DIA_Lares_TEACH_BACK() { if(other.attribute[ATR_DEXTERITY] > Lares_MerkeDEX) // Если переменная изменилась, то есть научились чему-то { AI_Output(self,other,"DIA_Lares_TEACH_BACK_09_00" ); // (оценивающе) Твоя ловкость увеличилась. }; if(other.attribute[ATR_STRENGTH] > Lares_MerkeSTR) { AI_Output(self,other,"DIA_Addon_Lares_TEACH_BACK_ Add_09_00"); //(оценивающе) Твоя сила увеличилась. }; Info_ClearChoices(DIA_Lares_TEACH); };
// Функция, вызываемая при выборе пункта "Тренировать ловкость (1 очко обучения)" func void DIA_Lares_TEACH_1() { // Вызываем функцию, которая учит ГГ (self, other) // self в данном случае - Ларес // other - ГГ // T_MED - константа из Story\Story_Globals.d ("потолок" учителя) B_TeachAttributePoints(self,other,ATR_DEXTERITY,1 ,T_MED); // !! ВАЖНО !! // Так как пункт выбора, сформированный функцией Info_AddChoice, при выборе ИСЧЕЗАЕТ из списка, // то список нужно формировать ЗАНОВО, предварительно очистив "использованный" список // Этим достигается "ЦИКЛИЧНОСТЬ" списка пунктов выбора // Чистим "использованный" список Info_ClearChoices(DIA_Lares_TEACH); // Формируем список заново Info_AddChoice(DIA_Lares_TEACH,Dialog_Back,DIA_La res_TEACH_BACK); Info_AddChoice(DIA_Lares_TEACH,B_BuildLearnString (PRINT_LearnDEX1,B_GetLea rnCostAttribute(other,ATR_DEXTERITY)),DIA_Lares_TE ACH_1); Info_AddChoice(DIA_Lares_TEACH,B_BuildLearnString (PRINT_LearnDEX5,B_GetLea rnCostAttribute(other,ATR_DEXTERITY) * 5),DIA_Lares_TEACH_5); Info_AddChoice(DIA_Lares_TEACH,B_BuildLearnString (PRINT_LearnSTR1,B_GetLea rnCostAttribute(other,ATR_STRENGTH)),DIA_Lares_TEA CHSTR_1); Info_AddChoice(DIA_Lares_TEACH,B_BuildLearnString (PRINT_LearnSTR5,B_GetLea rnCostAttribute(other,ATR_STRENGTH) * 5),DIA_Lares_TEACHSTR_5); };
// Вкратце, алгоритм для формирования пункта ДИАЛОГА с разворачивающимся списком пунктов ВЫБОРА такой: // // 1. Формируем пункт ДИАЛОГА через Instance // Например, instance DIA_Lares_TEACH(C_Info) { ... } // Формируем для него функции int _Condition (Проверка на отображение) и void _Info (Реакция на выбор) // // 2. Список пунктов ВЫБОРА формируется в функции void _Info с помощью функции Info_AddChoice // Эта функция ссылается на: а) instance Родителя // Например, instance DIA_Lares_TEACH // б) Функцию реакции // Например, void DIA_Lares_TEACH_1 // Здесь важный момент: // // Если цикличность списка пунктов ВЫБОРА не важна, в фукнции реакции не надо делать Info_ClearChoices / Info_AddChoice, // так как пункт выбора, сформированный функцией Info_AddChoice, при выборе ИСЧЕЗАЕТ из списка, // достаточно запрограммировать только реакцию // // Если же нужно зациклить список пунктов ВЫБОРА, то в функции реакции нужно сделать последовательно: // Info_ClearChoices( ... instance Родителя ...) // - очистить "использованный" список // Info_AddChoice ( ... instance Родителя ... функция реакции) // - сформировать список снова, возможно, в том же виде (copy / paste :-) // !! В функции Info_AddChoice получается что-то вроде рекурсии (вызова самой себя) // Здесь важно не забыть сделать (желательно первым) Info_AddChoice для пункта выбора "НАЗАД", // иначе можно зациклить список "намертво", без возможности выхода // В функции реакции на выбор пункта "НАЗАД" достаточно сделать Info_ClearChoices (... instance Родителя ...), // это вернет нас к пункту ДИАЛОГА "Родителя".
[/pre]
|
|
|
14.06.2005, 13:51
|
#444
|
|
|
|
|
A.G.F.C.
Регистрация: 02.09.2005
Сообщений: 6
|
|
|
|
|
|
Re: Скриптинг в Готике
В продолжение моего предыдущего поста.
Сделаем небольшой мод
Смысл: научить героя ковать любое оружие, в т.ч. и стрелы
Очень много останется "за бортом", если что, спрашивайте.
Первый диалог скрипта, который я буду менять - это SMITHWEAPONS.D который отвечает за "диалог" с наковальней.
Осторожно! Сохраните старый SMITHWEAPONS.D
!! "Старый" диалог исчезнет полностью!
Попробуем начать с производства стрел и болтов.
!! Штучки, которые выглядят как || - это оператор ИЛИ
[pre]
const int MakeArrows_Value = 60; // Сколько стрел будет произведено за 1 раз const int MakeBolts_Value = 30; // Сколько болтов будет произведено за 1 раз
const int MakeArrows_Need_Raws = 1; // Затраты на одноразовое производство стрел - Раскаленная Сталь const int MakeArrows_Need_Maces = 10; // Затраты на одноразовое производство стрел - Палки (10 штук)
// Для удобства // Описания пунктов выбора
const string ChoiceDesc_MakeArrows = "Сделать стрелы или арбалетные болты"; const string ChoiceDesc_MakeRaws = "Сделать заготовки для оружия";
const string ChoiceDesc_MakeArrows_Bow = "Стрелы (1 раск.сталь, 10 дерев.палок) = "; const string ChoiceDesc_MakeArrows_Arb = "Болты (1 раск.сталь, 10 дерев.палок) = ";
var int IsEnterWCommon; // Зашли в диалог "КОВКА ОРУЖИЯ ИЗ ЗАГОТОВОК"
//************************************************** ***** // Основной диалог - ЗАКОНЧИТЬ //************************************************** ***** // Выход из всего диалога INSTANCE PC_SmithWeapon_End (C_Info) { npc = PC_Hero; nr = 999; condition = PC_SmithWeapon_End_Condition; information = PC_SmithWeapon_End_Info; permanent = TRUE; description = "ЗАКОНЧИТЬ КОВКУ"; };
FUNC INT PC_SmithWeapon_End_Condition () { if (PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON) { return TRUE; }; };
FUNC VOID PC_SmithWeapon_End_Info() {
CreateInvItems (self, ItMiSwordRawHot, 1); // Возвращаем RAW // Здесь "тонкость" - при использовании наковальни проверяется, // есть ли у ГГ РаскаленнаяСталь, если есть, то при начале // диалога она автоматически "отбирается", поэтому ее надо вернуть скриптами Print("Закончили ковку");
B_ENDPRODUCTIONDIALOG (); // Скрипт окончания ковки };
// ************************************************** ****** // Создаем поддиалог КОВАТЬ ОРУЖИЕ ИЗ ЗАГОТОВОК // ************************************************** ****** // // !! Здесь непонятка лично для меня. // Если этот пункт назвать иначе, чем PC_Common, то он НЕ ОТОБРАЖАЕТСЯ // Буду рад, если кто разъяснит
INSTANCE PC_Common (C_INFO) { npc = PC_Hero; nr = 1; condition = PC_Common_Condition; information = PC_Common_Info; permanent = TRUE; description = "КОВАТЬ ОРУЖИЕ ИЗ ЗАГОТОВОК ..."; };
FUNC INT PC_Common_Condition() { if ( (PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON) ) { return TRUE; }; };
var int IsMakeList; // Находимся в основном списке выбора (УРОВЕНЬ Make)
var int IsMakeListArrows; // Находимся в списке выбора "ДЕЛАТЬ СТРЕЛЫ"
var int IsMakeListRaws; // Находимся в списке выбора "ДЕЛАТЬ ЗАГОТОВКИ"
func void PC_Common_MakeChoiceList () { // Формируем основной (корневой) список выборов (УРОВЕНЬ - Make) // Для удобства формирование списка вынес в отдельную функцию (эту), чтобы не перегружать PR_Common_Info IsMakeList = TRUE; // Флаг создания основного списка
IsMakeListArrows = FALSE; // Флаги "подсписков" IsMakeListRaws = FALSE; Info_ClearChoices(PC_Common); // Т.к. при выборе пункта, созданного с помощью Info_AddChoice, // этот пункт исчезает, то нужно списко очистить и создать заново // Этот пункт ("НАЗАД") создаем в любом случае, чтобы не "застрять" в меню // Функция возврата PC_Common_BackFromChoices - одна на всех, так удобнее Info_AddChoice(PC_Common,"НАЗАД", PC_Common_BackFromChoices); // Добавляем пункты выбора // Делать стрелы // Новые константы WEAPON_ARROW и т.п. описаны в CONSTANTS.D, // массив PLAYER_TALENT_SMITH [] за счет них расширен (там же) if ( // Умеем делать стрелы PLAYER_TALENT_SMITH[WEAPON_ARROW] == TRUE ) { Info_AddChoice ( PC_Common, ChoiceDesc_MakeArrows, PC_Common_MakeArrows // Если выбрали, "раскрываем" список создания стрел ); };
if ( // Умеем делать заготовки для оружия (PLAYER_TALENT_SMITH[WEAPON_RAW_MELEE] == TRUE) || (PLAYER_TALENT_SMITH[WEAPON_RAW_DISTANT] == TRUE) ) { Info_AddChoice ( PC_Common, ChoiceDesc_MakeRaws, PC_Common_MakeRaws // Если выбрали, "раскрываем" список создания заготовок ); };
};
func void PC_Common_MakeChoiceList_Arrows () { // Т.к. будем создавать новый список (СозданиеСтрел), старый чистим Info_ClearChoices(PC_Common); Info_AddChoice(PC_Common,"НАЗАД", PC_Common_BackFromChoices); // Делаем стрелы // Делаем стрелы для арбалета if ( PLAYER_TALENT_SMITH[WEAPON_ARROW] == TRUE ) // Умеем делать стрелы { Info_AddChoice ( PC_Common, ConcatStrings(ChoiceDesc_MakeArrows_Arb,IntToStri ng(MakeBolts_Value)), PC_Common_MakeArrows_Arb // Если выбрали, делаем болты ); };
// Делаем стрелы для лука if ( PLAYER_TALENT_SMITH[WEAPON_ARROW] == TRUE ) // Умеем делать стрелы { Info_AddChoice ( PC_Common, ConcatStrings(ChoiceDesc_MakeArrows_Bow,IntToStri ng(MakeArrows_Value)), PC_Common_MakeArrows_Bow // Если выбрали, делаем стрелы ); };
};
FUNC VOID PC_Common_Info () { IsEnterWCommon = TRUE; // После того, как выбрали пункт КОВКА ОРУЖИЯ ИЗ ЗАГОТОВОК, формируем новый список PC_Common_MakeChoiceList (); };
func void PC_Common_BackFromChoices () { Print("НАЗАД из списка ВЫБОРА"); Info_ClearChoices(PC_Common);
if ( (IsMakeListArrows == TRUE) || (IsMakeListRaws == TRUE) ) {
PC_Common_MakeChoiceList ();
IsMakeListArrows = FALSE; IsMakeListRaws = FALSE; }; };
func void PC_Common_MakeArrows () { IsMakeListArrows = TRUE; Print("Зашли в диалог ДЕЛАТЬ СТРЕЛЫ"); PC_Common_MakeChoiceList_Arrows (); };
func void PC_Common_MakeArrows_Bow () { // ItMw_1h_Bau_Mace - тяжелая палка, нужна для производства
if ( (Npc_HasItems (hero, ItMw_1h_Bau_Mace) >= MakeArrows_Need_Maces) // Должна быть тяжелая палка && (Npc_HasItems (hero, ItMiSwordrawhot) >= MakeArrows_Need_Raws) // Должно быть раскаленное железо ) { // Убираем использованные предметы из инвентаря
Npc_RemoveInvItems(self, ItMw_1h_Bau_Mace, MakeArrows_Need_Maces);
Npc_RemoveInvItems(self, ItMiSwordrawhot, MakeArrows_Need_Raws); CreateInvItems (self, ItRw_Arrow, MakeArrows_Value); // Даем стрелы для лука Print(ConcatStrings(IntToString(MakeArrows_Value) ," стрел изготовлено")); } // if else { Print("Не хватает материалов ..."); }; // else
PC_Common_MakeChoiceList_Arrows (); };
func void PC_Common_MakeArrows_Arb () { Print(ConcatStrings(IntToString(MakeBolts_Value), " арбалетных болтов изготовлено"));
CreateInvItems (self, ItRw_Bolt, MakeBolts_Value); // Даем арбалетные болты
PC_Common_MakeChoiceList_Arrows (); };
func void PC_Common_MakeChoiceList_Raws () { Info_ClearChoices(PC_Common); Info_AddChoice(PC_Common,"НАЗАД", PC_Common_BackFromChoices); // Делаем заготовки // Делаем заготовки для ручного оружия if ( PLAYER_TALENT_SMITH[WEAPON_RAW_MELEE] == TRUE ) // Умеем делать заготовки для ручного оружия { Info_AddChoice ( PC_Common, "Сделать заготовку для ручного оружия (1 раск.железо + 1 кварц = 1 стальная заготовка)", PC_Common_MakeRaws_Weapon ); };
// Делаем заготовки для дистанционного оружия if ( PLAYER_TALENT_SMITH[WEAPON_RAW_DISTANT] == TRUE ) // Умеем делать заготовки для дистанционного оружия { Info_AddChoice ( PC_Common, "Сделать заготовку для дистанционного оружия (1 дерево + 1 лечебная трава = 1 деревянная заготовка", PC_Common_MakeRaws_Dist ); };
};
func void PC_Common_MakeRaws () { IsMakeListRaws = TRUE; Print("Зашли в диалог ДЕЛАТЬ ЗАГОТОВКИ"); PC_Common_MakeChoiceList_Raws (); // "Родительский" список };
func void PC_Common_MakeRaws_Weapon () { Print("Изготавливаем заготовки для ручного оружия"); PC_Common_MakeChoiceList_Raws (); };
func void PC_Common_MakeRaws_Dist () { Print("Изготавливаем заготовки для дистанционного оружия"); PC_Common_MakeChoiceList_Raws (); };
// ************************************************** ** // SMITHWEAPON_S1 // -------------- // Основная функция, которая вызывается при использовании наковальни // Необходимый предмет - РаскаленнаяСталь (SwordRawHot) // ************************************************** ***
FUNC VOID SMITHWEAPON_S1 () { var C_NPC her; her = Hlp_GetNpc(PC_Hero); if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(h er)) { self.aivar[AIV_INVINCIBLE] = TRUE; PLAYER_MOBSI_PRODUCTION = MOBSI_SMITHWEAPON; Ai_ProcessInfos (self); }; };
[/pre]
|
|
|
14.06.2005, 15:55
|
#445
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2marazmus: Это все очень хорошо, но не мог бы ты нормально форматировать текст, а то очень сложно разбирать ::)
Добавление от 06/14/05, в 16:15:36 Вот-с, кой-чего подправил :)
const int MakeArrows_Value * *= 60; * //Сколько стрел будет произведено за 1 раз const int MakeBolts_Value * * = 30; * //Сколько болтов будет произведено за 1 раз
const int MakeArrows_Need_Raws * = 1; * *//Затраты на одноразовое производство стрел - Раскаленная Сталь const int MakeArrows_Need_Maces *= 10; * //Затраты на одноразовое производство стрел - Палки (10 штук)
//Для удобства //Описания пунктов выбора
const string ChoiceDesc_MakeArrows * *= "Сделать стрелы или арбалетные болты"; const string ChoiceDesc_MakeRaws * * *= "Сделать заготовки для оружия";
const string ChoiceDesc_MakeArrows_Bow * = "Стрелы (1 раск.сталь, 10 дерев.палок) = "; const string ChoiceDesc_MakeArrows_Arb * = "Болты (1 раск.сталь, 10 дерев.палок) = ";
var int IsEnterWCommon; * * //Зашли в диалог "КОВКА ОРУЖИЯ ИЗ ЗАГОТОВОК"
//************************************************** ***** // * * Основной диалог - ЗАКОНЧИТЬ //************************************************** ***** //Выход из всего диалога instance PC_SmithWeapon_End(c_info) { * npc * * * * = PC_Hero; * nr * * * * *= 999; * condition * = PC_SmithWeapon_End_Condition; * information = PC_SmithWeapon_End_Info; * permanent * = TRUE; * description = "ЗАКОНЧИТЬ КОВКУ"; };
func int PC_SmithWeapon_End_Condition() { * if(PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON) * { * * * *return TRUE; * }; };
func void PC_SmithWeapon_End_Info() {
* CreateInvItems(self,ItMiSwordRawHot,1); * //Возвращаем RAW * //Здесь "тонкость" - при использовании наковальни проверяется, * //есть ли у ГГ Раскаленная Сталь, если есть, то при начале * //диалога она автоматически "отбирается", поэтому ее надо вернуть скриптами * Print("Закончили ковку");
* B_ENDPRODUCTIONDIALOG(); * * * * //Скрипт окончания ковки };
//************************************************** ****** // * * Создаем поддиалог КОВАТЬ ОРУЖИЕ ИЗ ЗАГОТОВОК //************************************************** ****** // //!! Здесь непонятка лично для меня. //Если этот пункт назвать иначе, чем PC_Common, то он НЕ ОТОБРАЖАЕТСЯ //Буду рад, если кто разъяснит
instance PC_Common(c_info) { * npc * * * * = PC_Hero; * nr * * * * *= 1; * condition * = PC_Common_Condition; * information = PC_Common_Info; * permanent * = TRUE; * description = "КОВАТЬ ОРУЖИЕ ИЗ ЗАГОТОВОК ..."; };
func int PC_Common_Condition() { * * if(PLAYER_MOBSI_PRODUCTION == MOBSI_SMITHWEAPON) * { * * * *return TRUE; * }; };
var int IsMakeList; * * * * *//Находимся в основном списке выбора (УРОВЕНЬ Make) var int IsMakeListArrows; * *//Находимся в списке выбора "ДЕЛАТЬ СТРЕЛЫ" var int IsMakeListRaws; * * *//Находимся в списке выбора "ДЕЛАТЬ ЗАГОТОВКИ"
func void PC_Common_MakeChoiceList() { * //Формируем основной (корневой) список выборов (УРОВЕНЬ - Make) * //Для удобства формирование списка вынес в отдельную функцию (эту), чтобы не перегружать PR_Common_Info * * IsMakeList = TRUE; * * * * *//Флаг создания основного списка * IsMakeListArrows = FALSE; * //Флаги "подсписков" * IsMakeListRaws = FALSE; * * * Info_ClearChoices(PC_Common); * *//Т.к. при выборе пункта, созданного с помощью Info_AddChoice, * //этот пункт исчезает, то нужно списко очистить и создать заново * * //Этот пункт ("НАЗАД") создаем в любом случае, чтобы не "застрять" в меню * //Функция возврата PC_Common_BackFromChoices - одна на всех, так удобнее * * Info_AddChoice(PC_Common,"НАЗАД",PC_Common_BackFro mChoices); * * //Добавляем пункты выбора * * //Делать стрелы * * //Новые константы WEAPON_ARROW и т.п. описаны в CONSTANTS.D, * //массив PLAYER_TALENT_SMITH [] за счет них расширен (там же) * if(PLAYER_TALENT_SMITH[WEAPON_ARROW] == TRUE) * *//Умеем делать стрелы * { * * *Info_AddChoice(PC_Common,ChoiceDesc_MakeArrows,PC _Common_MakeArrows); * *//Если выбрали, "раскрываем" список создания стрел * };
* if(PLAYER_TALENT_SMITH[WEAPON_RAW_MELEE] == TRUE ¦¦ PLAYER_TALENT_SMITH[WEAPON_RAW_DISTANT] == TRUE) * *//Умеем делать заготовки для оружия * { * * *Info_AddChoice(PC_Common,ChoiceDesc_MakeRaws,PC_C ommon_MakeRaws); * *//Если выбрали, "раскрываем" список создания заготовок * }; };
func void PC_Common_MakeChoiceList_Arrows() { * //Т.к. будем создавать новый список (СозданиеСтрел), старый чистим * Info_ClearChoices(PC_Common); * Info_AddChoice(PC_Common,"НАЗАД",PC_Common_BackFro mChoices); * * //Делаем стрелы * * //Делаем стрелы для арбалета * if(PLAYER_TALENT_SMITH[WEAPON_ARROW] == TRUE) * *//Умеем делать стрелы * { * * *Info_AddChoice(PC_Common,ConcatStrings(ChoiceDesc _MakeArrows_Arb,intToStri ng(MakeBolts_Value)),PC_Common_MakeArrows_Arb); * * *//Если выбрали, делаем болты * };
* //Делаем стрелы для лука * if(PLAYER_TALENT_SMITH[WEAPON_ARROW] == TRUE ) * *//Умеем делать стрелы * { * * *Info_AddChoice(PC_Common,ConcatStrings(ChoiceDesc _MakeArrows_Bow,intToStri ng(MakeArrows_Value)),PC_Common_MakeArrows_Bow); * * *//Если выбрали, делаем стрелы * }; };
func void PC_Common_Info() { * IsEnterWCommon = TRUE; * * //После того, как выбрали пункт КОВКА ОРУЖИЯ ИЗ ЗАГОТОВОК, формируем новый список * PC_Common_MakeChoiceList(); };
func void PC_Common_BackFromChoices() { * Print("НАЗАД из списка ВЫБОРА"); * *Info_ClearChoices(PC_Common);
* if(IsMakeListArrows == TRUE ¦¦ IsMakeListRaws == TRUE) * { * * *PC_Common_MakeChoiceList(); * * *IsMakeListArrows = FALSE; * * *IsMakeListRaws = FALSE; * }; * };
func void PC_Common_MakeArrows() { * IsMakeListArrows = TRUE; * Print("Зашли в диалог ДЕЛАТЬ СТРЕЛЫ"); * PC_Common_MakeChoiceList_Arrows(); };
func void PC_Common_MakeArrows_Bow() { // * ItMw_1h_Bau_Mace - тяжелая палка, нужна для производства
* if((Npc_HasItems(hero,ItMw_1h_Bau_Mace) >= MakeArrows_Need_Maces) //Должна быть тяжелая палка * && (Npc_HasItems(hero,ItMiSwordrawhot) >= MakeArrows_Need_Raws)) *//Должно быть раскаленное железо * { * * * *//Убираем использованные предметы из инвентаря * * *Npc_RemoveInvItems(self,ItMw_1h_Bau_Mace,MakeArro ws_Need_Maces); * * *Npc_RemoveInvItems(self,ItMiSwordrawhot,MakeArrow s_Need_Raws); * * * * * *CreateInvItems(self,ItRw_Arrow,MakeArrows_Value); * //Даем стрелы для лука * * *Print(ConcatStrings(intToString(MakeArrows_Value) ," стрел изготовлено")); * } * else * { * * Print("Не хватает материалов..."); * }; * PC_Common_MakeChoiceList_Arrows(); };
func void PC_Common_MakeArrows_Arb() { * Print(ConcatStrings(intToString(MakeBolts_Value)," арбалетных болтов изготовлено")); * CreateInvItems(self,ItRw_Bolt,MakeBolts_Value); * //Даем арбалетные болты * PC_Common_MakeChoiceList_Arrows(); };
func void PC_Common_MakeChoiceList_Raws() { * Info_ClearChoices(PC_Common); * Info_AddChoice(PC_Common,"НАЗАД",PC_Common_BackFro mChoices); * * //Делаем заготовки * * //Делаем заготовки для ручного оружия * if(PLAYER_TALENT_SMITH[WEAPON_RAW_MELEE] == TRUE) * //Умеем делать заготовки для ручного оружия * { * * *Info_AddChoice(PC_Common,"Сделать заготовку для ручного оружия (1 раск.железо + 1 кварц = 1 стальная заготовка)",PC_Common_MakeRaws_Weapon); * };
* //Делаем заготовки для дистанционного оружия * if(PLAYER_TALENT_SMITH[WEAPON_RAW_DISTANT] == TRUE) * //Умеем делать заготовки для дистанционного оружия * { * * *Info_AddChoice(PC_Common,"Сделать заготовку для дистанционного оружия (1 дерево + 1 лечебная трава = 1 деревянная заготовка",PC_Common_MakeRaws_Dist); * }; };
func void PC_Common_MakeRaws() { * IsMakeListRaws = TRUE; * Print("Зашли в диалог ДЕЛАТЬ ЗАГОТОВКИ"); * PC_Common_MakeChoiceList_Raws(); * * *//"Родительский" список };
func void PC_Common_MakeRaws_Weapon() { * Print("Изготавливаем заготовки для ручного оружия"); * PC_Common_MakeChoiceList_Raws(); };
func void PC_Common_MakeRaws_Dist() { * Print("Изготавливаем заготовки для дистанционного оружия"); * PC_Common_MakeChoiceList_Raws(); };
//************************************************** ** //SMITHWEAPON_S1 //-------------- //Основная функция, которая вызывается при использовании наковальни //Необходимый предмет - РаскаленнаяСталь (SwordRawHot) //************************************************** ***
func void SMITHWEAPON_S1() { * var C_NPC her; * * * her = Hlp_GetNpc(PC_Hero); * if(Hlp_GetinstanceID(self)==Hlp_GetinstanceID(her) ) * { * * * *self.aivar[AIV_INVINCIBLE] = TRUE; * * *PLAYER_MOBSI_PRODUCTION = MOBSI_SMITHWEAPON; * * *Ai_ProcessInfos(self); * }; };
|
|
|
14.06.2005, 21:15
|
#446
|
|
|
|
|
A.G.F.C.
Регистрация: 02.09.2005
Сообщений: 6
|
|
|
|
|
|
Re: Скриптинг в Готике
Цитата:
Сообщение от TycoooN link=board=gothic&t=1105030050&start=425#444 date=06/14/05, в 15:55:39
2marazmus: Это все очень хорошо, но не мог бы ты нормально форматировать текст, а то очень сложно разбирать ::)
|
"Кривые" табуляторы пришли из UltraEdit; в нем же с подсветкой все смотрится очень даже ничего, собственно, в расчете на это и писалось; привычка разбивать строки на более мелкие - не порок, а жестокая необходимость, для меня, начинающего, потому что так удобне искать ошибки, выдаваемые zSpy (он ссылается на номер строки). Работа идет медленно, но верно :) Научил героя делать заготовки для ручного и дистанционного оружия, со всякими кварцами и травками, и оружие из этих заготовок. Оружие из продажи уберу, кроме самого простого. Пусть ГГ кует сам или находит. В планах - разбить учителей по типам оружия, топоры и двуручи - Беннет, мечи - Харад, луки - Боспер и т.п. Обучение завязать на золото и квесты. Возможность в награду обучаться ковать уникальное оружие. Надо еще точить баланс, чтобы не было скучно играть.
|
|
|
16.06.2005, 07:35
|
#448
|
|
Re: Скриптинг в Готике
Цитата:
Сообщение от finch link=board=gothic&t=1105030050&start=425#446 date=06/15/05, в 23:58:44
Всем привет! =) Давно здесь не появлялся... Обращаюсь в очередной раз с наболевшим вопросом: как сделать, чтобы в игре нельзя было прописать marvin? очень надо! =)
|
Vam уже говорил о том, что функция задаётся EXE-шником, и скриптами тут не поможешь, если только делать патч на .EXE И ещё он говорил что Марвин не единственный режим в игре.
|
|
|
16.06.2005, 08:43
|
#449
|
|
|
|
|
A.G.F.C.
Регистрация: 02.09.2005
Сообщений: 6
|
|
|
|
|
|
Re: Скриптинг в Готике
Уважаемые готы.
Вопрос: часто не получается добавить пункты диалога некоторым NPC.
Я знаю, что для instance диалога возможность его отображения задается соответствующей функцией _Condition, но часто получается так, что если даже в _Condition поставить просто TRUE, то пункт диалога все равно не отображается.
Г2 версия 2.6 инструменты: компилятор/декомпилятор Vam'a, UltraEdit.
Может, у кого уже возникали такие проблемы, просьба помочь советом.
p.s. Есть подозрение на то, что игра не воспринимает новый датник (вернее, новые instance из него), когда я загружаюсь со старой сохраненки. Начинать заново еще не пробовал, может, в этом и дело. С другой стороны, правка функций со "старыми" именами и добавка новых подфункций (AddChoice и реакция на них) работает с сохраненок нормально.
Спасибо заранее.
p.p.s. Если начинать новую игру, есть ли "быстрый" способ добежать до города? Читами или типа того?
Извиняюсь за лишний пост:
Проверил началом новой игры На самом деле, если грузиться с сохраненки, то игра воспринимает нормально только "старые" instance, а новые появляются только с началом новой игры.
|
|
|
16.06.2005, 09:44
|
#450
|
|
Re: Скриптинг в Готике
2marazmus:
Есть подозрение на то, что игра не воспринимает новый датник (вернее, новые instance из него), когда я загружаюсь со старой сохраненки. Начинать заново еще не пробовал, может, в этом и дело. С другой стороны, правка функций со "старыми" именами и добавка новых подфункций (AddChoice и реакция на них) работает с сохраненок нормально.
|
Да, это так, об этом где-то уже говорилось, все instance (вернее их идентификационные номера) записываются в сейвы. При запуске игры создается список инстанций из датника, при записи он сохраняется в сейве, но если загрузить старый сейв (не соответствующий датнику) то список инстанций перезагрузится из сейва. Это относится только к инстанциям, вся обработка других типов производится из датника.
|
|
|
19.06.2005, 14:04
|
#455
|
|
Re: Скриптинг в Готике
2Мерлин: К сожалению, сейчас нету времени и возможности, чтобы все объяснить... Большую часть работы придется делать в спейсере. 2Bliz@rd:
А где можно взять русские скрипты?
|
Декомпилировать любой русский датник прогой Vam'a.
|
|
|
20.06.2005, 11:05
|
#457
|
|
|
|
|
A.G.F.C.
Регистрация: 02.09.2005
Сообщений: 6
|
|
|
|
|
|
Re: Скриптинг в Готике
Уважаемые готы. Выкладываю для ознакомления свой квази-мод "Кузнец, охотник, травник". Кладу весь, чтобы не засорять форум кусками кода. Архив RAR, внутри папка _decompiled, в ней декомпилированные программой Vam'a скрипты Готики 2.6 с русским переводом (не Акелла), и скомпилированные Gothic.DAT и OU.BIN. Архив предназначается не сколько для игры, сколько для начинающих скриптеров типа меня - покопаться, разобраться, узнать. В расчете на это НЕ жду вопросов типа "куда положить эти файлы", уже, думаю, все знают :) Ссылка для скачивания: http://<br>http://rapidshare.de/file...d.rar.html<br>Примечание. Тем, кто не пользовался rapidshare.de В браузере появится страница с двумя кнопками - Free и Premium Account. Нажать Free, загрузится страница со счетчиком времени (менее минуты), когда счетчик обнулится, будет видна непосредственно ссылка на скачивание. Качать браузером или DownloadMaster'ом, который недавно подерживает rapidshare.de, в один поток. Размер файла - 4 527 495 Bytes. !Внимание! Иногда файл будет обновляться, с последующими изменениями, буду менять ссылку. Изменения: КвазиМод "Кузнец, охотник и травник" Квази - потому что не вносит изменений в сюжет игры. Все нижесказанное актуально только для первой главы. В остальных главах еще не тестировалось! Монстры. Экспы за монстров стало немного меньше. 1 Глава. Немного больше мелких монстров, крупные изъяты. 2 Глава. Большой респаун, много мелких, немного крупных (все по своим местам в первой главе). Ковка (все главы) Харад - Одноручные и двуручные мечи. Нужно стать учеником. Беннет - Дуручные мечи и топоры. За золото. Карл - Шпаги. За золото. Боспер - Луки и Арбалеты. За золото. Все кузнецы - стрелы и болты. Да,да, стрелы и болты теперь можно изготавливать самому ! :))) Копите "Тяжелые палки", которые роняют гоблины. В связи с этим стрелы и болты из продажи в крупных количествах изъяты. Учеба за деньги и очки обучения. Ковать можно по семь видов каждого указанного типа оружия (итого 42 новых оружия). Кованое оружие гораздо лучше любого найденного оружия. Оружия в продаже нет, кроме самого простого. Нет "Кулакам Тролля" в первой главе !!! :))) Ищите и обрящете. По поводу приема мечей и охотничьих трофеев. Даже если прием идет за полцены, это очень хорошо в сравнении с тем, что продажный курс всего 20% (0.2) Самокованое оружие не принимается, оно и так дорогое, можно просто продавать. Прием мечей Харадом. Чтобы сдавать Хараду мечи, не обязательно становиться его учеником. Достаточно выполнить квесты об оружии орка или о бандитах, напавших на Хакона. Принимаются только мечи, одноручные (17 видов) и двуручные (8 видов). Мечи принимаются за полцены. Охотничьи трофеи. Чтобы сдавать Босперу трофеи, не обязательно становиться его учеником, достаточно выполнить его квест с волчьими шкурами. В этом случае прием идет за полцены, а если ГГ - ученик Боспера, то за полную цену. Боспер принимает теперь не только шкурки, но и клыки, когти и т.п. Алхимический хлам (кости, крылья, жвала) Принимает Константино, если ГГ - его ученик, то за полную цену, если только выполнил квест с травками - то за полцены. Хлам подорожал, так что сдавать его Константино стало выгодно. В планах: Сдавать Хараду или Беннету ржавое оружие и оружие орков в обмен на стальные заготовки (один к одному). Заготовки, соответственно, из продажи убрать. p.s. Огромная благодарность: 1) Пираньям - это первая игра, в которую захотелось "влезть" настолько глубоко и надолго. А когда я узнал, что ее можно скриптить ... :)) 2) мегачеловеку Vam'u - за мегаинструмент скриптера (компилятор/декомпилятор скриптов) 3) AG.ru и форумцам - за поддержку Добавление от 06/20/05, в 11:25:04
Уважаемые готы. Вопрос по непосредственно скриптингу. Есть такая папка Story\Dialog_Mobsis В ней содержатся скрипты взаимодействия с мобами типа наковальни, книжной подставки и т.п. Вопрос: не нашел скриптов для некоторых важных мобов типа кузнечной печи, точильного станка и т.п. Примечание: при открытии zen-файлов миров я нашел, что некоторым мобам, в частности, наковальне, присвоен аргумент "Использвать скрипт" - Наименование скрипта, здесь это SmithWeapon, который я и правил в своем квазиМоде. У кузнечной печи же это поле пустое. Тем не менее, какие-то действия все равно происходят, неужели это жестко зашито в exeшнике? Как же все-таки прописать этот момент в скриптах, не редактируя zen-файлы (не присваивая руками названия скриптов мобам)?
|
|
|
20.06.2005, 21:51
|
#459
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Вот что я делал: установил Готику 2 аддон(от Акелы),потом установил прогу от Vama,декомпелировал Gothic dat,потом установил ГМДК(весит около 7 мегов),вставил в папку _decompiled своего NPC.Закомпелировал Gothic src прогой от Vama.Потом поменял старый *Gothic src на новый.Дальше зашёл в спайсер, но прежде удалил из папки *Gothic II\_work\Data\Scripts\Content\Cutscene файлы *OU.Bin и OU.src и потом обновил их.Захожу в игру,но моего NPC нету.Что я сделал не правильно?
|
Зачем так сложно? Декомпилятор работает сразу с датником и оушником. Шаг 1:(получить русские скрипты): Берем Акелловские дат и оу файлы -> декомпиляция. Шаг 2: Добавляем что хотим. Шаг 3: Компилируем декомпилированные скрипты -> получили оу и дат файлы. Шаг 4: Суем файлы в игру. Шаг 5: Начинаем игру с нуля и смотрим изменения (с сейвами изменения могут не работать!!!). И всё!!!
|
|
|
22.06.2005, 14:07
|
#463
|
|
Re: Скриптинг в Готике
2Bliz@rd:И ещё ты говорил что после компеляции появятся дат и оу файлы в папке _decompiled(где именно?в папке Cutscene) *но у меня там ничего не появилось,почему?И ещё в конце компеляци красным пишет 00:06 Fatal:-1 U: PAR: STORY/B_CONTENT/B_ADDON_PIRATESGOHOME.D:Unknown indentifier:ELSE(line 94)… <zParser.cpp,#599>Это как-нибудь связано то что он не компилирует?Конечно это влияет,надо исправить ошибку(в этой теме эти ошибки уже разбирались).Ou.bin и Gothic.dat появляется в папке _decompiled.
|
|
|
22.06.2005, 21:24
|
#467
|
|
Re: Скриптинг в Готике
Цитата:
Сообщение от ХуулРех link=board=gothic&t=1105030050&start=450#465 date=06/22/05, в 17:17:14
2Bliz@rd: Засунь файл *NONE_666_Leo.d в папку _decompiled\Story\NPC\.Дальше пропиши в файле *NPC_Globals(который я не нашел после декомпиляции декомпилятором,но он есть после установки g2mdk-small :lol:.Пример: var C_NPC Ramon;) и в файле Startup(куда нужно всавить нпс,например Wld_InsertNpc (PIR_1350_Addon_Francis,"STRAND")).
|
Я так и делал.Но в конце компиляции он выдаёт ошибку 00:02 Fatal:-1 U: PAR::File STORY/NPC/NONE_666_Leo.d not found (line 35)… < zParser.cpp,#599>(если только я его прописываю в Gothic src),а если не прописываю то такая ошибка 00:06 Fatal:-1 U: PAR::File/STORY/B_CONTENT/B_ADDON_PIRATESGOHOME.D:Unknown identifier:ELSE(line 93)...<zParser.cpp,#599 Почему вроде всё делаю правильно?
|
|
|
22.06.2005, 21:54
|
#468
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2Bliz@rd: Я же тебе ответил. Если просишь помощи, изволь отвечать, помог тебе совет или нет. Вообще, ошибка
File STORY/NPC/NONE_666_Leo.d not found (line 35
|
означает, что компилятор не может найти файл, который ты прописал для компиляции в SRC. Так что ты его, видимо, просто куда-то не туда положил.
ile/STORY/B_CONTENT/B_ADDON_PIRATESGOHOME.D:Unknown identifier:ELSE(line 93)
|
В том скрипте действительно ошибка, ее разработчики допустили. Спейсер ее просто не замечает, а вот прога от Вама видит всё :) Нужно эту ошибку исправить, как именно - в одной из тем уже писалось, и ссылку туда уже кто-то давал.
|
|
|
23.06.2005, 22:02
|
#472
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Я исправил эту и ещё несколько ошибок но как исправить эту ошибку: 00:11 Fatal:-1 U: PAR: Content/story/Dialoge/Dia_sld_DAR.d:Unknown indentifier: TRUESELF.AIVAR (line 245)…<zParser.cpp,#599
|
Исправляется таким образом (вызвана ошибкой в датнике): * *self.aivar[AIV_LastFightComment] = FALSE; * *return TRUE;
|
|
|
24.06.2005, 12:38
|
#474
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Vam спосибо ту ошибку я исправил,но появилась ещё одна 00:34 Fatal:-1 U: PARrocess stopped-32 erro(s)…<zParser.cpp,#599> Что эта за ошибка и как её можно исправить?
|
Ты файл "Ошибки компилятора.doc" читал, если нет, то прочитай обязательно!!! Там всё расписано, эта ошибка говорит о том, что до останова компилятора у тебя в скриптах встретилось 32 ошибки, которые необходимо исправить (ищи красный цвет в логе).
|
|
|
24.06.2005, 17:16
|
#476
|
|
Re: Скриптинг в Готике
2Bliz@rd:
Но у меня не отмечено красным цветом, только синим и зелёным.
|
Значит исправляй то, что синее. Формат всех сообщений zSpy смотри в теме Декомпилятор скриптов Готики.
|
|
|
24.06.2005, 20:53
|
#477
|
|
Re: Скриптинг в Готике
Когда делал декомпиляцию DAT файла(для Готики 2 Аддон) выскочило 3 ошибки(синие): 1)00:07 Fault:0 U: PAR::U:PAR:Error in Stack decompile script-‘COLL_APPLYDOUBLEDAMAGE’(line 210)…<zError.cpp,#477> 2)00:18 Fault:0 U: RAP:Error in Stack decompile script-TRUEself.aivar[AIV_LastFightComment]==FALSE(line245)… )…<zError.cpp,#477> 3) 00:07 Fault:0 U: PAR::U:PAR:Error in Stack decompile script-Bosper_TrollFuSold==TRUE(line834) …<zError.cpp,#477> Как и где их можно исправить? За ранее спосибо! И ещё могут ли эти ошибки влиять на незавершение компиляции?
Добавление от 06/24/05, в 21:13:35 1)Установил Готику 2 Аддон(от Акелы). 2)Установил мод Alternative_G2a. 3)С помощью проги VDFS распоковал Alternative_G2a.MOD в отдельную папку и скопировал Gothic dat и OU.BIN. 4)Рапоковал прогу от Vama в отдельную папку и вставил в папку _compiled Gothic dat а в папку content\Cutscene вставил OU.BIN. 5)Декомпелировал DAT файл и всё нужное появилось в папке _decompiled. 6)В папку NPC(C:\Decompiler\_work\data\Scripts\_decompiled\S tory\NPC) вставил скрипт NPC(NONE_666_Leo.d): INSTANCE NONE_666_Leo (Npc_Default) { // ------ NSC ------ name = "Лео"; guild = GIL_NONE; id = 666; voice = 6; flags = FALSE; npctype = NPCTYPE_MAIN; // ------ Attribute ------ B_SetAttributesToChapter (self, 2); // ------ Kampf-Taktik ------ fight_tactic = FAI_HUMAN_NORMAL; // ------ Equippte Waffen ------ // ------ Inventory ------ CreateInvItems (self,ITWr_Addon_William_01,1);//Joly: nicht austauschen oder umbenennen. CreateInvItems (self,ITKe_Lockpick,2); CreateInvItems (self,ITFo_Apple,1); // ------ visuals ------ B_SetNpcVisual (self, MALE, "Hum_Head_Thief", Face_N_Homer, BodyTex_N, ITAR_BAU_L); Mdl_SetModelFatness (self, 0.9); Mdl_ApplyOverlayMds (self, "Humans_Relaxed.mds"); // ------ NSC-relevante Talente vergeben ------ B_GiveNpcTalents (self); // ------ Kampf-Talente ------ B_SetFightSkills (self,30);
// ------ TA anmelden ------ daily_routine = Rtn_Start_666; };
FUNC VOID Rtn_Start_666 () { TA_Stand_Eating (08,00,23,00,"NW_FARM1_OUT_01"); TA_Stand_ArmsCrossed (23,00,08,00,"NW_FARM1_OUT_01"); }; Потом в папке NPC_Globals вставил следующее: После var C_Npc Vino; вставил var C_Npc Leo; Потом после Vino = Hlp_GetNpc(BAU_952_Vino); вставил Leo = Hlp_GetNpc(NONE_666_Leo); Потом в папке Startup.d после Wld_InsertNpc(BAU_952_Vino,"NW_FARM1_OUT_01"); прописал Wld_InsertNpc(NONE_666_Leo,"NW_FARM1_OUT_01"); Всё это сохранил. 7)потом все эти папки которые находились в папке _decompiled(уже с моим сохранённым NPC) перенёс в папку content. 8)И начал компиляцию декомпелированных файлов.Но в конце выдаёт ошибку 00:14 Fatal:-1 U: PAR STORY/NPC_Globals.d:Unknown identifier:NONE_666_Leo…<zParser.cpp,#599>(до этого ошибок не было ни синих ни красных по идее больше ошибок и не должно быть после того как я исправлю ошибку).Но почему он выдаёт эту ошибку я же в глобалсе прописал своего неписся?
|
|
|
25.06.2005, 11:32
|
#479
|
|
|
|
|
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
|
|
|
|
|
|
Re: Скриптинг в Готике
2Bliz@rd:
1)00:07 Fault:0 U: PAR::UAR:Error in Stack decompile script-‘COLL_APPLYDOUBLEDAMAGE’(line 210)…<zError.cpp,#477> 2)00:18 Fault:0 U: RAP:Error in Stack decompile script-TRUEself.aivar[AIV_LastFightComment]==FALSE(line245)… )…<zError.cpp,#477> 3) 00:07 Fault:0 U: PAR::UAR:Error in Stack decompile script-Bosper_TrollFuSold==TRUE(line834) …<zError.cpp,#477> Как и где их можно исправить? За ранее спосибо!
|
1. там надо сделать
Код:
return COLL_APPLYDOUBLEDAMAGE;
2.
Код:
self.aivar[AIV_LastFightComment] = FALSE;return TRUE;
3.
Код:
Bosper_TrollFuSold = TRUE;
[q]И ещё могут ли эти ошибки влиять на незавершение компиляции?[/q] Да, именно они и влияют :) [q]00:14 Fatal:-1 U: PAR STORY/NPC_Globals.d:Unknown identifier:NONE_666_Leo…<zParser.cpp,#599>(до этого ошибок не было ни синих ни красных по идее больше ошибок и не должно быть после того как я исправлю ошибку).[/q] А ты ведь прописывал в GOTHIC.SRC свой файл? А куда именно? Нужно прописать рядом с остальными файлами неписей. [q]Но почему он выдаёт эту ошибку я же в глобалсе прописал своего неписся?[/q] от глобалса в данном случае вообще ничего не зависит, он нужен только если ты хочешь использовать короткое имя своего НПС в скриптах - не NONE_666_Leo, а просто Leo.
|
|
|
Здесь присутствуют: 6 (пользователей: 0 , гостей: 6)
|
|
Ваши права в разделе
|
|
|
|
Текущее время: 05:54. Часовой пояс GMT +4.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|