Показать сообщение отдельно
Старый 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]
Отправить личное сообщение для Ответить с цитированием