|
|
|
|
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]
|