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

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

Расширенный поиск
Старый 13.06.2005, 21:35   #441
TSYLin

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

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

Объясняю:

visual = "ItAr_Thorus_ADDON.3ds" - это 3Д-модель на которую оптягивается
visual_change = "Armor_DHT.asc" - это файл в котором содержится анимация и инфоирмация по оптяжке текстур.

Armor_DHT.asc это файл собственного производства, я взял Armor_Thorus_ADDON.asc открыл в редакторе и заменил Armor_Thorus.tga на Hum_Dht_Armor_V0.tga и всё, но оптягивается 3Д-модель ItAr_Djg_Crawler.3ds
Ответить с цитированием
Старый 14.06.2005, 09:08   #442
marazmus
A.G.F.C.
 
Регистрация: 02.09.2005
Сообщений: 6
marazmus вне форума

По умолчанию 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, 11:34   #443
Bliz@rd

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

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

Молодец продолжай в таком же духе!
Ответить с цитированием
Старый 14.06.2005, 13:51   #444
marazmus
A.G.F.C.
 
Регистрация: 02.09.2005
Сообщений: 6
marazmus вне форума

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

В продолжение моего предыдущего поста.

Сделаем небольшой мод

Смысл: научить героя ковать любое оружие, в т.ч. и стрелы

Очень много останется "за бортом", если что, спрашивайте.

Первый диалог скрипта, который я буду менять - это
SMITHWEAPONS.D
который отвечает за "диалог" с наковальней.

Осторожно! Сохраните старый SMITHWEAPONS.D

!! "Старый" диалог исчезнет полностью!

Попробуем начать с производства стрел и болтов.

!! Штучки, которые выглядят как &#124&#124 - это оператор ИЛИ

[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
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию 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
marazmus
A.G.F.C.
 
Регистрация: 02.09.2005
Сообщений: 6
marazmus вне форума

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

Цитата:
Сообщение от TycoooN link=board=gothic&t=1105030050&start=425#444 date=06/14/05, в 15:55:39
2marazmus:
Это все очень хорошо, но не мог бы ты нормально форматировать текст, а то очень сложно разбирать ::)

"Кривые" табуляторы пришли из UltraEdit;
в нем же с подсветкой все смотрится очень даже ничего,
собственно, в расчете на это и писалось;
привычка разбивать строки на более мелкие - не порок, а
жестокая необходимость, для меня, начинающего, потому что так удобне искать ошибки, выдаваемые zSpy (он ссылается на номер строки).

Работа идет медленно, но верно :)
Научил героя делать заготовки для ручного и дистанционного оружия, со всякими кварцами и травками, и оружие из этих заготовок.
Оружие из продажи уберу, кроме самого простого. Пусть ГГ кует сам или находит.

В планах - разбить учителей по типам оружия, топоры и двуручи - Беннет, мечи - Харад, луки - Боспер и т.п.

Обучение завязать на золото и квесты.
Возможность в награду обучаться ковать уникальное оружие.

Надо еще точить баланс, чтобы не было скучно играть.
Отправить личное сообщение для Ответить с цитированием
Старый 15.06.2005, 23:58   #447
finch

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

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

Всем привет! =)
Давно здесь не появлялся...
Обращаюсь в очередной раз с наболевшим вопросом: как сделать, чтобы в игре нельзя было прописать marvin?
очень надо! =)
Ответить с цитированием
Старый 16.06.2005, 07:35   #448
TSYLin

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

По умолчанию 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
marazmus
A.G.F.C.
 
Регистрация: 02.09.2005
Сообщений: 6
marazmus вне форума

По умолчанию 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
Vam

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

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

2marazmus:
Есть подозрение на то, что игра не воспринимает новый датник (вернее, новые instance из него), когда я загружаюсь со старой сохраненки. Начинать заново еще не пробовал, может, в этом и дело. С другой стороны, правка функций со "старыми" именами и добавка новых подфункций (AddChoice и реакция на них) работает с сохраненок нормально.
Да, это так, об этом где-то уже говорилось, все instance (вернее их идентификационные номера) записываются в сейвы. При запуске игры создается список инстанций из датника, при записи он сохраняется в сейве, но если загрузить старый сейв (не соответствующий датнику) то список инстанций перезагрузится из сейва. Это относится только к инстанциям, вся обработка других типов производится из датника.
Ответить с цитированием
Старый 17.06.2005, 15:05   #451
Boris_Tor

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

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

Друзья, вспомните пожалйста начало Диккурика. В самом начале Ардарик залезает на смотровую площадку, и, вдруг, камера начинает свое движение, показывая как прибегают волки. Я захотел попробовать сделать что-то подобное, т к выглядит очень эффектно. Но, облазив все скрипты нашел только вот эту функцию(тиггер)Wld_SendTrigger("TS_CAMERA_HOCHSTAN D"); Больше упомянание о ней(в скриптах)нигде не встретил(может плохо искал). Поэтому прошу помочь разобраться, как можно *управлять камерой и как это можно заскриптовать.
Заранее спасибо.
Ответить с цитированием
Старый 18.06.2005, 20:00   #452
Bliz@rd

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

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

Возник вопрос:
После того как я вставляю в Готику 2 Аддон NPC или  какой-нибудь диалог,то игра становиться немецкой.Пытался закомпелировать Gothic src не спайсером а прогой от
Vama,но когда закомпелировал прогой от Vama и зашёл в игру,то моего NPC там не было.
Кто-нибудь мог бы подробно написать как можно сделать игру русской после вставления NPC или диалогов?
Ответить с цитированием
Старый 18.06.2005, 22:57   #453
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

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

2Bliz@rd:
"Язык" игры зависит от того, какие скрипты ты компилируешь. Ты, видимо, компилировал немецкие скрипты, добавляя в них своего НПС, вот игра и становилась немецкой.
Так что юзай русские скрипты.

З.Ы. Эх, который раз уже приходится это объяснять новичкам... ;D :pivo:
Отправить личное сообщение для Ответить с цитированием
Старый 19.06.2005, 13:09   #454
Bliz@rd

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

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

А где можно взять русские скрипты?
Ответить с цитированием
Старый 19.06.2005, 14:04   #455
finch

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

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

2Мерлин: К сожалению, сейчас нету времени и возможности, чтобы все объяснить... Большую часть работы придется делать в спейсере.

2Bliz@rd:
А где можно взять русские скрипты?
Декомпилировать любой русский датник прогой Vam'a.
Ответить с цитированием
Старый 19.06.2005, 16:13   #456
Boris_Tor

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

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

2finch:
Жаль... что нет времени. А когда время будет?
Ответить с цитированием
Старый 20.06.2005, 11:05   #457
marazmus
A.G.F.C.
 
Регистрация: 02.09.2005
Сообщений: 6
marazmus вне форума

По умолчанию 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, 20:03   #458
Bliz@rd

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

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

Пытался сделать игру русской, после того как вставил в игру своего  NPC.Но ничего не получилось.
Вот что я делал: установил Готику 2 аддон(от Акелы),потом установил прогу от Vama,декомпелировал Gothic dat,потом установил ГМДК(весит около 7 мегов),вставил
в папку _decompiled своего NPC.Закомпелировал Gothic src прогой от Vama.Потом поменял старый  Gothic src на новый.Дальше зашёл в спайсер, но прежде удалил из папки  Gothic II\_work\Data\Scripts\Content\Cutscene файлы  OU.Bin и OU.src и потом обновил их.Захожу в игру,но моего NPC нету.Что я сделал не правильно?

Ответить с цитированием
Старый 20.06.2005, 21:51   #459
Vam

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

По умолчанию 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: Начинаем игру с нуля и смотрим изменения (с сейвами изменения могут не работать!!!).
И всё!!!
Ответить с цитированием
Старый 21.06.2005, 12:10   #460
Bliz@rd

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

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

Установил Готику 2 Аддон(от Акелы), установил прогу от Vama в Готику 2,потом прогой от Vama сделал декомпиляцию dat файла,в папке Scripts появилась папка
_decompiled.Туда вставил NPC прописал его.Закомпелировал прогой от вама(т.е открыл toolsloader(граф.оболочка) указал путь GothicSourcer,компеляция src файла и Готика2) .Потом все папки которые находились в папке _decompiled вставил  Scripts. Начал игру заного, но моего NPC в игре не появился.Когда вручную открыл Gothic src то моего NPC там не было прописано.Почему?И ещё когда компелировал Gothic src он вконце красным написал content/ Gothic src not Found.Это как-нибудь связано с моей ошибкой?
Ответить с цитированием
Старый 21.06.2005, 13:58   #461
Vam

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

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

2Bliz@rd:
1. Работать лучше и нужно в отдельной от Готики директории. Ты пост №445 на странице 18 в теме "Декомпилятор скриптов Готики" читал? Если нет, то прочитай.
Добавление к посту в п3. В папку C:\Decompiler\_work\data\scripts\Content\Cutscene положи соответствующий датнику ou.bin
2. Если ты добавляешь новый файл в скрипты, то его имя нужно добавить в gothic.src (в соответствующее место), который создается в папке _decompiled.
3. Ты что компилируешь после внесения изменений, оригинальные скрипты или декомпилированные? Нужно компилировать декомпилированные (опция -zcomp:1,1).
4. Забираешь из папки _decompiled дат и оу файлы и кидаешь их в игру.
...и всё.
Ответить с цитированием
Старый 22.06.2005, 11:18   #462
Bliz@rd

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

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

1)Установил Готику 2 Аддон от Акелы.
2)На диске С создал папку Decompiler и разархивировал туда декомпилятор(GothicToolsV2_12).Дальше из Готики 2(Gothic II\_work\Data\Scripts\_compiled) взял GOTHIC.DAT и вставил его в
C:\Decompiler\_work\data\Scripts\_compiled и из Gothic II\_work\Data\Scripts\Content\Cutscene взял OU.BIN и поместил его в
C:\Decompiler\_work\data\Scripts\content\Cutscene.
3)Создал ярлыки для C:\Decompiler\system\GothicSourcerV2_12.exe
и C:\Decompiler\GothicTools\system\zSpy.exe поместил их на робочий стол.
И ещё в свойствах указал C:\Decompiler\system\GothicSourcerV2_12.exe -zlog:8,s -zfile:gothic -zcomp:0,0 -zgame:1.
4)Потом захожу в toolsloader(граф.оболочка) указываю путь GothicSoucer,декомпеляция DAT файла.
5)Начинаю работать в папке _decompiled.Вставляю своего непися в папку NPC,
потом прописываю его в папках Npc_Globals.D и Startup.D
6)Захожу в toolsloader указываю путь к GothicSourcer и нажимаю
Компиляция декомпилированного файла и Готика 2.
7)Но когда захожу в Gothic src то моего NPC там нет. Почему у меня о не компилирует? И ещё если вставляешь NPC то нужно кроме OU.BIN переносить
OU.CSL? И ещё ты говорил что после компеляции появятся дат и оу файлы в папке
_decompiled(где именно?в папке Cutscene)  но у меня там ничего не появилось,почему?И ещё в конце компеляци красным пишет 00:06 Fatal:-1 U: PAR:
STORY/B_CONTENT/B_ADDON_PIRATESGOHOME.D:Unknown indentifier:ELSE(line 94)… <zParser.cpp,#599>Это как-нибудь связано то что он не компилирует?
Ответить с цитированием
Старый 22.06.2005, 14:07   #463
XyylPex

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

По умолчанию 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, 15:21   #464
Bliz@rd

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

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

После всего я ещё прописал своего непися в папке Gothic src .Делаю компеляцию а он
Вконце выдаёт ошибку :
00:04 fatal:-1 U: PAR:File STORY/NPC/NONE_666_Leo not found.(line 40)… zParser.cpp,#599.почему он его невидит?
Ответить с цитированием
Старый 22.06.2005, 15:57   #465
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

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

2Bliz@rd:
Ты свой файл NONE_666_Leo.d в какую папку суешь? В _decompiled или content?
Поробуй на всякий случай в обе :)
Отправить личное сообщение для Ответить с цитированием
Старый 22.06.2005, 17:17   #466
XyylPex

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

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

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")).
Ответить с цитированием
Старый 22.06.2005, 21:24   #467
Bliz@rd

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

По умолчанию 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
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию 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, 14:57   #469
Bliz@rd

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

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

Я исправил эту и ещё несколько ошибок но как исправить эту ошибку:
00:11 Fatal:-1 U: PAR: Content/story/Dialoge/Dia_sld_DAR.d:Unknown indentifier:
TRUESELF.AIVAR (line 245)…<zParser.cpp,#599>
И ещё TycoooN если своего непися встывляешь в папку content/story/NPC то в папке Gothic src прописывать его ненадо?
Ответить с цитированием
Старый 23.06.2005, 20:32   #470
basilio58

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

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


И ещё TycoooN если своего непися встывляешь в папку content/story/NPC то в папке Gothic src прописывать его не надо?



в папке Gothic src такой папки не знаю ;D
а вообще любой скрипт (*.d файл), котрый ты создаешь, надо прописывать в *.src
Ответить с цитированием
Старый 23.06.2005, 21:19   #471
Alexus_G

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

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

А легче вообще на некоторые папки, такие как \npc и \Dialoge в файле src поставить полную обработку. То есть заменить все файлы из этих папок на \npc\*.d и соответственно \dialoge\*.d , тогда и не придется прописывать каждого созданного персонажа или диалог отдельно.
Ответить с цитированием
Старый 23.06.2005, 22:02   #472
Vam

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

По умолчанию 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, 11:18   #473
Bliz@rd

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

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

Vam спосибо ту ошибку я исправил,но появилась ещё одна
00:34 Fatal:-1 U: PAR:Process stopped-32 erro(s)…<zParser.cpp,#599>
Что эта за ошибка и как её можно исправить?
Ответить с цитированием
Старый 24.06.2005, 12:38   #474
Vam

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

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

2Bliz@rd:
Vam спосибо ту ошибку я исправил,но появилась ещё одна
00:34 Fatal:-1 U: PARrocess stopped-32 erro(s)…<zParser.cpp,#599>
Что эта за ошибка и как её можно исправить?
Ты файл "Ошибки компилятора.doc" читал, если нет, то прочитай обязательно!!! Там всё расписано, эта ошибка говорит о том, что до останова компилятора у тебя в скриптах встретилось 32 ошибки, которые необходимо исправить (ищи красный цвет в логе).
Ответить с цитированием
Старый 24.06.2005, 16:34   #475
Bliz@rd

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

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

Но у меня не отмечено красным цветом, только синим и зелёным.
Ответить с цитированием
Старый 24.06.2005, 17:16   #476
Vam

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

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

2Bliz@rd:
Но у меня не отмечено красным цветом, только синим и зелёным.
Значит исправляй то, что синее. Формат всех сообщений zSpy смотри в теме Декомпилятор скриптов Готики.
Ответить с цитированием
Старый 24.06.2005, 20:53   #477
Bliz@rd

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

По умолчанию 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>(до этого ошибок не было ни синих ни красных по идее больше ошибок и не должно быть после того как я исправлю ошибку).Но почему он выдаёт эту ошибку я же в глобалсе прописал своего неписся?


Ответить с цитированием
Старый 24.06.2005, 23:55   #478
dixie

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

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

Народ, такой вопрос: как в mds вставить вызов процедуры?
*event там есть, но какие параметры и работает ли он? пробовал вставлять - виснет :)
Т.е. задача простая - без правки newworld.zen любым способом научить героя пилить бревно на стрелы и варить суп в котле ;)
Самый шизанутый способ я уже придумал, но хоца несколько попрямее :)
Ответить с цитированием
Старый 25.06.2005, 11:32   #479
TycoooN
Строители Миртаны
  Аватар для TycoooN
 
 
Регистрация: 15.04.2004
Адрес: Санкт-Петербург
Сообщений: 372
TycoooN вне форума

По умолчанию 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.
Отправить личное сообщение для Ответить с цитированием
Старый 25.06.2005, 13:19   #480
Bliz@rd

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

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

После того что я привёл выше(с NONE_666_Leo),я ещё дописал в
Gothic src(в папке Scripts\_decompiled и в папке Scripts\content) следующее:
После после Story\NPC\NONE_100_Xardas.d ниже прописал Story\NPC\NONE_666_Leo.d
Начинаю компиляцию декомпилированного файла и в конце выдаёт ошибку:
00:08 Fatal:-1 U: PAR::File  STORY/NPC/NONE_666_Leo.d not found.(line 58)…<zParser.cpp,#599>


Ответить с цитированием
Страница 12 из 65 « Первая 256789101112 131415161718192262 Последняя »


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

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


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

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

AGFC: Valley of Gothic © 2004-2022

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