• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, доброго времени суток!
    Стартовал новый литературный конкурс от "Ордена Хранителей" - "Пираты Миртанского моря".
    Каждый может принять в нём участие и снискать славу и уважение, а в случае занятия призового места ещё и получить награду. Дерзайте
  • Дорогие друзья, год подходит к концу, и пришло время подвести его итоги и наградить достойных

    Не ленитесь, голосуйте в этой теме за тех форумчан, которые по вашему мнению больше всех проявили себя в этом году
    По желанию, аргументировать свой выбор можете в теме обсуждения голосования.

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 577
Последнее редактирование модератором:

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.049
Благодарности
1.170
Баллы
340
Это можно, просто хотел узнать, можно ли это сделать через скрипт, прежде чем ковырять модель.
Так эта функция работает только на людях?

А зачем тебе если не секрет худой тролль? Голодом его морить собрался, изверг? :D
А по теме, возможно вводимые координаты неверны. Пробуй другие значения, экспериментируй.
 

107-й

Участник форума
Регистрация
18 Дек 2011
Сообщения
59
Благодарности
3
Баллы
155
А зачем тебе если не секрет худой тролль? Голодом его морить собрался, изверг? :D
Ну да, Тролль после 30 летней изоляции в заваленной пещере должен быть худым! Если он вообще выжил :D
 

Диккен

Участник форума
Регистрация
12 Июн 2004
Сообщения
469
Благодарности
127
Баллы
210
Подскажите, как можно изменить модель анимации героя при использовании заклинания. Конкретно меня интересует тормозная анимация Мора Уларту, к. требуется поменять на шуструю анимацию закла "телепрорт орков".

В Готик.дат ничего не нашел, мне нужно распаковать другие ДАТ-файлы?
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
666
Баллы
245
Диккен,
Во-первых, ищещь в скриптах gothic такой массив const string spellFxAniLetters[100] =. это так называемый массив схем анимаций для заклинаний. ищешь по порядковому номеру заклинания схему. К примеру, заклинанию № 0 - SPL_PalLight (Святой свет) соответствует схема анимации: "SLE".
Остальное уже редактируется в файле Humans.mds и самих файлах анимаций со схемой SLE :
ani ("T_MAGRUN_2_SLESHOOT" 1 "S_SLESHOOT" 0.1 0.0 M. "HUM_MAGLIGHT_M01.ASC" F 1 39 FPS:10)
ani ("S_SLESHOOT" 1 "S_SLESHOOT" 0.0 0.0 M. "HUM_MAGLIGHT_M01.ASC" F 40 40)
ani ("T_SLESHOOT_2_STAND" 1 "" 0.0 0.1 M. "HUM_MAGLIGHT_M01.ASC" F 41 59)

а это уже другая стезя.
 

Sandrin

Почетный форумчанин
Регистрация
5 Авг 2009
Сообщения
8.586
Благодарности
4.047
Баллы
1.290
Ребят, всем снова привет. *flowers* Такой вопрос. Буду очень благодарна, если поможете. Ибо хотя чуточку стала вникать в скрипты, все одно - чайник.

Скажите, куда могут пропадать вещи из ассортимента торговца?
Вот такой скриптик:
var int henry_itemsgiven_chapter_1;
var int henry_itemsgiven_chapter_2;
var int henry_itemsgiven_chapter_3;
var int henry_itemsgiven_chapter_4;
var int henry_itemsgiven_chapter_5;

func void b_givetradeinv_henry(var C_Npc slf)
{
if(HENRY_ITEMSGIVEN_CHAPTER_1 == FALSE)
{
CreateInvItems(slf,ItMw_1H_Sword_L_03,1);
CreateInvItems(slf,ItMw_Nagelknueppel,1);
CreateInvItems(slf,ItMw_1h_Vlk_Axe,1);
CreateInvItems(slf,ItMw_1h_Bau_Mace,4);
CreateInvItems(slf,ItMw_1h_MISC_Sword,1);
CreateInvItems(slf,ItMw_1h_Misc_Axe,1);
CreateInvItems(slf,ItMw_1H_Mace_L_01,1);
CreateInvItems(slf,ItMw_1h_Vlk_Mace,1);
CreateInvItems(slf,ItMw_1h_Nov_Mace,1);
CreateInvItems(slf,ItMw_2H_Axe_L_01,2);
CreateInvItems(slf,ItMw_ShortSword3,1);
CreateInvItems(slf,ItMw_1h_MISC_Sword,1);
CreateInvItems(slf,ItMw_1h_Mil_Sword,1);
CreateInvItems(slf,ItMw_2H_Sword_M_01,2);
CreateInvItems(slf,ItMw_1h_Sld_Sword,2);
CreateInvItems(slf,ItMw_1h_Sld_Axe,2);
CreateInvItems(slf,ItRw_Arrow,386);
CreateInvItems(slf,ItRw_Sld_Bow,1);
CreateInvItems(slf,ItRw_Bow_L_01,1);
CreateInvItems(slf,ItRw_Bow_L_02,1);
CreateInvItems(slf,ItRw_Bow_L_03,1);
CreateInvItems(slf,ItRw_Bow_L_04,2);
CreateInvItems(slf,ItFoMuttonRaw,3);
CreateInvItems(slf,ItFo_Apple,3);
CreateInvItems(slf,ItFo_Fish,2);
CreateInvItems(slf,ItFo_Water,14);
CreateInvItems(slf,ItPl_Beet,7);

CreateInvItems(slf,ItPl_Mana_Herb_01,9);
CreateInvItems(slf,ItPl_Mana_Herb_02,5);
CreateInvItems(slf,ItPl_Mana_Herb_03,1);
CreateInvItems(slf,ItPl_Health_Herb_01,17);
CreateInvItems(slf,ItPl_Health_Herb_02,9);
CreateInvItems(slf,ItPl_Health_Herb_03,1);
CreateInvItems(slf,ItPl_Mushroom_01,11);
CreateInvItems(slf,ItPl_Mushroom_02,4);

CreateInvItems(slf,ItPl_Blueplant,8);
CreateInvItems(slf,ItPl_Forestberry,9);
CreateInvItems(slf,ItPl_Planeberry,9);
HENRY_ITEMSGIVEN_CHAPTER_1 = TRUE;
};
if(Npc_HasItems(slf,ItPl_Health_Herb_01) < 10)
{
CreateInvItems(slf,ItPl_Health_Herb_01,8);
};
if(Npc_HasItems(slf,ItRw_Arrow) < 100)
{
CreateInvItems(slf,ItRw_Arrow,30);
};
if((Kapitel >= 2) && (HENRY_ITEMSGIVEN_CHAPTER_2 == FALSE))
{
HENRY_ITEMSGIVEN_CHAPTER_2 = TRUE;
};
if((Kapitel >= 3) && (HENRY_ITEMSGIVEN_CHAPTER_3 == FALSE))
{
HENRY_ITEMSGIVEN_CHAPTER_3 = TRUE;
};
if((Kapitel >= 4) && (HENRY_ITEMSGIVEN_CHAPTER_4 == FALSE))
{
HENRY_ITEMSGIVEN_CHAPTER_4 = TRUE;
};
if((Kapitel >= 5) && (HENRY_ITEMSGIVEN_CHAPTER_5 == FALSE))
{
HENRY_ITEMSGIVEN_CHAPTER_5 = TRUE;
};
};
При первом обращении к торговцу:
instance NONE_2240_HENRY_LETSTRADE(C_Info)
{
npc = none_2240_henry;
condition = none_2240_henry_letstrade_condition;
information = none_2240_henry_letstrade_info;
important = FALSE;
permanent = TRUE;
description = "Можешь ли ты продать мне что-то?";
trade = TRUE;
};


func int none_2240_henry_letstrade_condition()
{
if(Npc_KnowsInfo(hero,none_2240_henry_werdu))
{
return TRUE;
};
};

func void none_2240_henry_letstrade_info()
{
AI_Output(other,self,"NONE_2240_Henry_LetsTrade_Info_15_01"); //Можешь ли ты продать мне что-то?
AI_Output(self,other,"NONE_2240_Henry_LetsTrade_Info_08_02"); //Вот, сам смотри что у меня есть.
B_GiveTradeInv(self);
};

появляется весь вышеуказанный инвентарь. При повторном (сделанном хоть через несколько секунд, хоть через пару дней) бесследно исчезают и больше не появляются выделенные красным вещи. В чем дело?
Пыталась экспериментировать. Удалила кое-что:
var int henry_itemsgiven_chapter_1;

func void b_givetradeinv_henry(var C_Npc slf)
{
if(HENRY_ITEMSGIVEN_CHAPTER_1 == FALSE)
{
CreateInvItems(slf,ItMw_1H_Sword_L_03,1);
CreateInvItems(slf,ItMw_Nagelknueppel,1);
CreateInvItems(slf,ItMw_1h_Vlk_Axe,1);
CreateInvItems(slf,ItMw_1h_Bau_Mace,4);
CreateInvItems(slf,ItMw_1h_MISC_Sword,1);
CreateInvItems(slf,ItMw_1h_Misc_Axe,1);
CreateInvItems(slf,ItMw_1H_Mace_L_01,1);
CreateInvItems(slf,ItMw_1h_Vlk_Mace,1);
CreateInvItems(slf,ItMw_1h_Nov_Mace,1);
CreateInvItems(slf,ItMw_2H_Axe_L_01,2);
CreateInvItems(slf,ItMw_ShortSword3,1);
CreateInvItems(slf,ItMw_1h_MISC_Sword,1);
CreateInvItems(slf,ItMw_1h_Mil_Sword,1);
CreateInvItems(slf,ItMw_2H_Sword_M_01,2);
CreateInvItems(slf,ItMw_1h_Sld_Sword,2);
CreateInvItems(slf,ItMw_1h_Sld_Axe,2);
CreateInvItems(slf,ItRw_Arrow,386);
CreateInvItems(slf,ItRw_Sld_Bow,1);
CreateInvItems(slf,ItRw_Bow_L_01,1);
CreateInvItems(slf,ItRw_Bow_L_02,1);
CreateInvItems(slf,ItRw_Bow_L_03,1);
CreateInvItems(slf,ItRw_Bow_L_04,2);
CreateInvItems(slf,ItFoMuttonRaw,3);
CreateInvItems(slf,ItFo_Apple,3);
CreateInvItems(slf,ItFo_Fish,2);
CreateInvItems(slf,ItFo_Water,14);
CreateInvItems(slf,ItPl_Beet,7);
CreateInvItems(slf,ItPl_Mana_Herb_01,9);
CreateInvItems(slf,ItPl_Mana_Herb_02,5);
CreateInvItems(slf,ItPl_Mana_Herb_03,1);
CreateInvItems(slf,ItPl_Health_Herb_01,17);
CreateInvItems(slf,ItPl_Health_Herb_02,9);
CreateInvItems(slf,ItPl_Health_Herb_03,1);
CreateInvItems(slf,ItPl_Mushroom_01,11);
CreateInvItems(slf,ItPl_Mushroom_02,4);
CreateInvItems(slf,ItPl_Blueplant,8);
CreateInvItems(slf,ItPl_Forestberry,9);
CreateInvItems(slf,ItPl_Planeberry,9);
HENRY_ITEMSGIVEN_CHAPTER_1 = TRUE;
};
if(Npc_HasItems(slf,ItPl_Health_Herb_01) < 10)
{
CreateInvItems(slf,ItPl_Health_Herb_01,8);
};
if(Npc_HasItems(slf,ItRw_Arrow) < 100)
{
CreateInvItems(slf,ItRw_Arrow,30);
};
};


То же самое. Не помогает.
Удалила еще больше:
func void b_givetradeinv_henry(var C_Npc slf)
{
CreateInvItems(slf,ItMw_1H_Sword_L_03,1);
CreateInvItems(slf,ItMw_Nagelknueppel,1);
CreateInvItems(slf,ItMw_1h_Vlk_Axe,1);
CreateInvItems(slf,ItMw_1h_Bau_Mace,4);
CreateInvItems(slf,ItMw_1h_MISC_Sword,1);
CreateInvItems(slf,ItMw_1h_Misc_Axe,1);
CreateInvItems(slf,ItMw_1H_Mace_L_01,1);
CreateInvItems(slf,ItMw_1h_Vlk_Mace,1);
CreateInvItems(slf,ItMw_1h_Nov_Mace,1);
CreateInvItems(slf,ItMw_2H_Axe_L_01,2);
CreateInvItems(slf,ItMw_ShortSword3,1);
CreateInvItems(slf,ItMw_1h_MISC_Sword,1);
CreateInvItems(slf,ItMw_1h_Mil_Sword,1);
CreateInvItems(slf,ItMw_2H_Sword_M_01,2);
CreateInvItems(slf,ItMw_1h_Sld_Sword,2);
CreateInvItems(slf,ItMw_1h_Sld_Axe,2);
CreateInvItems(slf,ItRw_Arrow,386);
CreateInvItems(slf,ItRw_Sld_Bow,1);
CreateInvItems(slf,ItRw_Bow_L_01,1);
CreateInvItems(slf,ItRw_Bow_L_02,1);
CreateInvItems(slf,ItRw_Bow_L_03,1);
CreateInvItems(slf,ItRw_Bow_L_04,2);
CreateInvItems(slf,ItFoMuttonRaw,3);
CreateInvItems(slf,ItFo_Apple,3);
CreateInvItems(slf,ItFo_Fish,2);
CreateInvItems(slf,ItFo_Water,14);
CreateInvItems(slf,ItPl_Beet,7);
CreateInvItems(slf,ItPl_Mana_Herb_01,9);
CreateInvItems(slf,ItPl_Mana_Herb_02,5);
CreateInvItems(slf,ItPl_Mana_Herb_03,1);
CreateInvItems(slf,ItPl_Health_Herb_01,17);
CreateInvItems(slf,ItPl_Health_Herb_02,9);
CreateInvItems(slf,ItPl_Health_Herb_03,1);
CreateInvItems(slf,ItPl_Mushroom_01,11);
CreateInvItems(slf,ItPl_Mushroom_02,4);
CreateInvItems(slf,ItPl_Blueplant,8);
CreateInvItems(slf,ItPl_Forestberry,9);
CreateInvItems(slf,ItPl_Planeberry,9);

if(Npc_HasItems(slf,ItPl_Health_Herb_01) < 10)
{
CreateInvItems(slf,ItPl_Health_Herb_01,8);
};
if(Npc_HasItems(slf,ItRw_Arrow) < 100)
{
CreateInvItems(slf,ItRw_Arrow,30);
};
};

Инвентарь стал появляться полным, но зато начали при каждом обращении к торговцу размножаться в странной прогрессии лечебные травы и, что вообще уже непонятно, кирки. Их изначально было две штуки (CreateInvItems(slf,ItMw_2H_Axe_L_01,2) и занимали они каждая по клетке инвентаря, а при каждом обращении их становится еще на две больше. И инвентарь торговца... все увеличивается и увеличивается. А травы вообще могут расти и расти и достигать числа нескольких сотен... Тоже не выход, сами видите.

Что такое и как это исправить? Не то чтобы это мешало сюжету, но уж коли просто попалось на глаза... Интересно узнать.
Заранее спасибо. *flowers*
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
666
Баллы
245
Sandrin, удаляются вещи при каждом обращении в торговлю вот здесь: B_ClearJunkTradeInv
 

Диккен

Участник форума
Регистрация
12 Июн 2004
Сообщения
469
Благодарности
127
Баллы
210
redleha, разобрался.
"Waterwall", >> "FEA", >> // Fear, Massdeath, Fire-Rain, Ice-Wave
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.577
Благодарности
4.171
Баллы
915
Думаю, что многие скриптеры знают о не реализованных в игре диалогах с Ханной в Gothic II (скрипт Story\Dialoge\DIA_VLK_414_Hanna.d):
Код:
func void Hanna_Blubb()
{
	AI_Output(other,self,"DIA_Hanna_Add_15_37");	//В логове все в порядке?
	AI_Output(self,other,"DIA_Hanna_Add_17_39");	//Я давно уже не видела их.
	AI_Output(self,other,"DIA_Hanna_Add_17_40");	//Я, пожалуй, схожу туда, когда у меня будет время и проверю, как у них дела.
	AI_Output(self,other,"DIA_Hanna_Add_17_38");	//Да. Но тебе лучше не говорить об этом...
	//-------------------
	AI_Output(other,self,"DIA_Hanna_Add_15_25");	//Ты знала о логове воров?
	AI_Output(self,other,"DIA_Hanna_Add_17_26");	//(глупо улыбается) Я не понимаю, о чем ты говоришь...
	//-------------------
	AI_Output(self,other,"DIA_Hanna_Add_17_32");	//Здесь было ополчение... Кто-то предал наше убежище!
	AI_Output(self,other,"DIA_Hanna_Add_17_33");	//Мне они ничего не смогли предъявить, но Кассия и ее люди мертвы!
	AI_Output(self,other,"DIA_Hanna_Add_17_34");	//Я уверена, что это ТЫ...
	AI_Output(self,other,"DIA_Hanna_Add_17_35");	//Я купила это специально для тебя.
	AI_Output(self,other,"DIA_Hanna_Add_17_36");	//Это обошлось мне в кругленькую сумму. Но для тебя ничего не жалко, свинья...
};
Я попробовал разблокировать эти диалоги, но почему-то ГГ, который успел присоединиться к гильдии воров, не спрашивает Ханну о логове:
Код:
instance DIA_Hanna_Blubb(C_Info)
{
	npc = VLK_414_Hanna;
	nr = 1;
	condition = DIA_Hanna_Blubb_Condition;
	information = DIA_Hanna_Blubb_Info;
	permanent = TRUE;
	description = "(Спросить о логове воров)";
};

func int DIA_Hanna_Blubb_Condition()
{
	if(Npc_KnowsInfo(other,DIA_Hanna_AusKeller))
	{
		return TRUE;
	};
};

func void DIA_Hanna_Blubb_Info()
{
	if(Knows_SecretSign == TRUE)
	{
		AI_Output(other,self,"DIA_Hanna_Add_15_37");	//В логове все в порядке?
		AI_Output(self,other,"DIA_Hanna_Add_17_39");	//Я давно уже не видела их.
		AI_Output(self,other,"DIA_Hanna_Add_17_40");	//Я, пожалуй, схожу туда, когда у меня будет время и проверю, как у них дела.
		AI_Output(self,other,"DIA_Hanna_Add_17_38");	//Да. Но тебе лучше не говорить об этом...
	}
	else
	{
		AI_Output(other,self,"DIA_Hanna_Add_15_25");	//Ты знала о логове воров?
		AI_Output(self,other,"DIA_Hanna_Add_17_26");	//(глупо улыбается) Я не понимаю, о чем ты говоришь...
	};
	if(Andre_Diebesgilde_aufgeraeumt == TRUE)
	{
		AI_Output(self,other,"DIA_Hanna_Add_17_32");	//Здесь было ополчение... Кто-то предал наше убежище!
		AI_Output(self,other,"DIA_Hanna_Add_17_33");	//Мне они ничего не смогли предъявить, но Кассия и ее люди мертвы!
		AI_Output(self,other,"DIA_Hanna_Add_17_34");	//Я уверена, что это ТЫ...
		AI_Output(self,other,"DIA_Hanna_Add_17_35");	//Я купила это специально для тебя.
		AI_Output(self,other,"DIA_Hanna_Add_17_36");	//Это обошлось мне в кругленькую сумму. Но для тебя ничего не жалко, свинья...
//		Здесь должна быть месть Ханны - какая именно???
	};
};
Как видите, условием для появления диалога является разговор с Ханной, когда она ловит ГГ, вышедшего из двери, ведущей в подвал гостиницы. Прошу знатоков подсказать, почему не срабатывает этот кусок скрипта. Также мне хотелось бы услышать от вас обоснованные догадки какая именно должна быть месть Ханны за то, что ГГ выдал ополчению логово гильдии воров.
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
666
Баллы
245
Dimus, если не работает, то меняй функцию KnowsInfo на сравнение с переменной, а переменную ставь в TRUE в том необходимом диалоге.
Вообще, эта функция не работает в одном случае, если необходимый диалог (который надо знать) является постоянным.
 

hell9999

Участник форума
Регистрация
12 Апр 2008
Сообщения
2.049
Благодарности
1.170
Баллы
340
Может просто в if(Npc_KnowsInfo(other,DIA_Hanna_AusKeller)) заменить other на hero?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.577
Благодарности
4.171
Баллы
915
Dimus, если не работает, то меняй функцию KnowsInfo на сравнение с переменной, а переменную ставь в TRUE в том необходимом диалоге.
Вообще, эта функция не работает в одном случае, если необходимый диалог (который надо знать) является постоянным.

Дело в том, что этот диалог является важным, но не постоянным:
Код:
instance DIA_Hanna_AusKeller(C_Info)
{
	npc = VLK_414_Hanna;
	nr = 11;
	condition = DIA_Hanna_AusKeller_Condition;
	information = DIA_Hanna_AusKeller_Info;
	permanent = [B]FALSE[/B];
	important = [B]TRUE[/B];
};


func int DIA_Hanna_AusKeller_Condition()
{
	if(Npc_HasItems(other,ItKe_ThiefGuildKey_Hotel_MIS) >= 1)
	{
		return TRUE;
	};
};

func void DIA_Hanna_AusKeller_Info()
{
	if((Cassia.aivar[AIV_KilledByPlayer] == TRUE) || (Jesper.aivar[AIV_KilledByPlayer] == TRUE) || (Ramirez.aivar[AIV_KilledByPlayer] == TRUE))
	{
		AI_Output(self,other,"DIA_Hanna_Add_17_27");	//Откуда... ты пришел?
		AI_Output(other,self,"DIA_Hanna_Add_15_28");	//Я нашел кое-что интересное в твоем подвале...
		AI_Output(self,other,"DIA_Hanna_Add_17_29");	//Что ты делал в моем подвале?!
		AI_Output(other,self,"DIA_Hanna_Add_15_30");	//Ты прекрасно знаешь это!
		AI_Output(self,other,"DIA_Hanna_Add_17_31");	//(холодно) Я не знаю, чем ты говоришь...
	}
	else
	{
		AI_Output(self,other,"DIA_Hanna_Add_17_19");	//(недоверчиво) Посмотри на себя! Ты откуда такой взялся? А?
		AI_Output(other,self,"DIA_Hanna_Add_15_20");	//(смущенно) Я...
		AI_Output(self,other,"DIA_Hanna_Add_17_21");	//(смеется) Я знаю!
		AI_Output(self,other,"DIA_Hanna_Add_17_22");	//(заговорщицки) Не говори мне. Я все знаю.
		AI_Output(self,other,"DIA_Hanna_Add_17_23");	//Даже и не думай украсть что-нибудь здесь, понял?
		AI_Output(self,other,"DIA_Hanna_Add_17_24");	//Мы не можем себе позволить привлекать внимание к отелю.
	};
	AI_StopProcessInfos(self);
};
Конечно, не хотелось бы вводить дополнительную переменную, но можно и попробовать.

Добавил в Story\Story_Globals.d:
var int Knows_Hanna;
в конце функции DIA_Hanna_AusKeller_Info() дописал:
Knows_Hanna = TRUE;
и изменил условие в DIA_Hanna_Blubb_Condition():
if(Knows_Hanna == TRUE)
Но в итоге это ничего не дало, т.к. этот диалог всё равно не появляется у ГГ.:-\
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Dimus,
Новую игру начинал?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Dimus,
Обязательно. Глобальные переменные типа Knows_Hanna, также инициализируются только при первом старте.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.577
Благодарности
4.171
Баллы
915
Спасибо за подсказку, Алексей - после начала новой игры диалог заработал. Теперь появилась проблема с реализацией мести Ханны - не могу заставить её скастовать заклинание со свитка (пробовал вызов демона):
Код:
func void DIA_Hanna_Blubb_Info()
{
	if(Andre_Diebesgilde_aufgeraeumt == FALSE)
	{
		if(Knows_SecretSign == TRUE)
		{
			AI_Output(other,self,"DIA_Hanna_Add_15_37");	//В логове все в порядке?
			AI_Output(self,other,"DIA_Hanna_Add_17_39");	//Я давно уже не видела их.
			AI_Output(self,other,"DIA_Hanna_Add_17_40");	//Я, пожалуй, схожу туда, когда у меня будет время и проверю, как у них дела.
			AI_Output(self,other,"DIA_Hanna_Add_17_38");	//Да. Но тебе лучше не говорить об этом...
		}
		else
		{
			AI_Output(other,self,"DIA_Hanna_Add_15_25");	//Ты знала о логове воров?
			AI_Output(self,other,"DIA_Hanna_Add_17_26");	//(глупо улыбается) Я не понимаю, о чем ты говоришь...
		};
	}
	else
	{
		AI_Output(self,other,"DIA_Hanna_Add_17_32");	//Здесь было ополчение... Кто-то предал наше убежище!
		AI_Output(self,other,"DIA_Hanna_Add_17_33");	//Мне они ничего не смогли предъявить, но Кассия и ее люди мертвы!
		AI_Output(self,other,"DIA_Hanna_Add_17_34");	//Я уверена, что это ТЫ...
		AI_Output(self,other,"DIA_Hanna_Add_17_35");	//Я купила это специально для тебя.
		AI_Output(self,other,"DIA_Hanna_Add_17_36");	//Это обошлось мне в кругленькую сумму. Но для тебя ничего не жалко, свинья...
		DIA_Hanna_Blubb.permanent = FALSE;
		AI_StopProcessInfos(self);
		CreateInvItem(self,ItSc_SumDemon);
		B_UseItem(self,ItSc_SumDemon); // не работает для ИИ???
		B_Attack(self,other,AR_NONE,1);
	};
};
С оружием ближнего боя всё работает как надо - Ханна достаёт полученный режик (я давал ей рапиру) и атакует ГГ. Превращать хозяйку отеля в магессу тоже не хочется - тогда она начнёт кастовать заклы с рун.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
Dimus,
AI\Magic\B_SelectSpell.d
Вот здесь описывается кто и какой закл юзает.

Часть функции:
if(Hlp_GetInstanceID(slf) == Hlp_GetInstanceID(DMT_1299_OberDementor_DI))
{
B_ReadySpell(slf,SPL_Skull,SPL_Cost_Skull);
return TRUE;
}

ОберИщущий юзает заклинание череп.

Можешь по аналогии вписать Ханну, написать условие, когда Ханна должна юзать магию, вместо руны прописать создание в инвентаре свитка.
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
666
Баллы
245
Кстати, товарищи модмейкеры, кто-то встречался с такой проблемой интересной. Такие записи в теле заклинания не равнозначны:
self.aivar[AIV_SelectSpell] += 1;
if(Npc_IsPlayer(self))
{
Wld_SpawnNpcRange(self,Summoned_Skeleton,6,800);
}
else
{
Wld_SpawnNpcRange(self,Skeleton,1,800);
};
и
if(Npc_IsPlayer(self))
{
Wld_SpawnNpcRange(self,Summoned_Skeleton,6,800);
}
else
{
Wld_SpawnNpcRange(self,Skeleton,1,800);
};
self.aivar[AIV_SelectSpell] += 1;
Во втором случае счетчик не увеличивается, типа функция Wld_SpawnNpcRange добавляет к себе return;
Причем, что интересно в скриптах оригинала суммон скелетов и пряничных воинов сделан "правильно".
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.577
Благодарности
4.171
Баллы
915
В закле вызова каменного часового всё сделано ещё кривее - двойной инкремент aivar:
func void Spell_Cast_SummonGuardian()
{
if(Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonGuardian;
};
self.aivar[AIV_SelectSpell] = self.aivar[AIV_SelectSpell] + 1;
if(Npc_IsPlayer(self))
{
Wld_SpawnNpcRange(self,Summoned_Guardian,1,500);
}
else
{
Wld_SpawnNpcRange(self,Stoneguardian,1,500);
};
self.aivar[AIV_SelectSpell] += 1;
};

Чёрт побери!!! Похоже, что придётся править все заклы вызовов.
 

maggi1221

Участник форума
Регистрация
7 Окт 2010
Сообщения
218
Благодарности
4
Баллы
165
redleha,
походу эта функция создает новый self: Wld_SpawnNpcRange. может быть в этом причина?
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
redleha,
не знаю, у меня по второму варианту нормально работает. А вот по первому - каменные стражи не вызывались, пришлось исправлять на "неправильную" :D
Может все зависит от того, как все остальное прописано в скрипте, и вообще где этот вызов прописан.
Вот пример рабочего варианта с волком из СнК (на sumtime не обращай внимания, это счетчики):
Код:
var int sumtime_w_1;
var int sumtime_w_2;

instance Spell_SummonWolf(C_Spell_Proto)
{
	time_per_mana = 0;
	targetCollectAlgo = TARGET_COLLECT_NONE;
};


func int Spell_Logic_SummonWolf(var int manaInvested)
{
	if(Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
	{
		return SPL_SENDCAST;
	}
	else if(self.attribute[ATR_MANA] >= SPL_Cost_SummonWolf)
	{
		return SPL_SENDCAST;
	}
	else
	{
		return SPL_SENDSTOP;
	};
	return SPL_SENDSTOP;
};

func void Spell_Cast_SummonWolf()
{
	if(Npc_IsPlayer(self) && (PLAYERISTRANSFER == TRUE) && (PLAYERISTRANSFERDONE == FALSE))
	{
		b_transferback(self);
	};
	if(Npc_GetActiveSpellIsScroll(self))
	{
		self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
	}
	else
	{
		self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonWolf;
	};
	if(Npc_IsPlayer(self))
	{
		if(sumtime_w_2 != Wld_GetDay())
		{
			sumtime_w_1 = 0;
			sumtime_w_2 = Wld_GetDay();
		};
		if(Npc_GetActiveSpellIsScroll(self) && (hero.level > Hlp_Random(15)))
		{
			Wld_SpawnNpcRange(self,Summoned_Wolf,1,500);
		}
		else if(Npc_GetActiveSpellIsScroll(self))
		{
			Wld_SpawnNpcRange(self,Wolf_noexp,1,500);
		}
		else if((Npc_GetTalentSkill(hero,NPC_TALENT_MAGE) * 10) > sumtime_w_1)
		{
			sumtime_choose = ATR_INTELLECT - BELIARPRAYCOUNT + INNOSPRAYCOUNT - INNOSCRIMECOUNT;
			if((sumtime_choose >= 45) && (Npc_GetTalentSkill(hero,NPC_TALENT_MAGE) >= 2) && (ATR_INTELLECT > 100))
			{
				Wld_SpawnNpcRange(self,Summoned_Wolf,2,500);
				sumtime_w_1 += 1;
			}
			else if(sumtime_choose >= 45)
			{
				Wld_SpawnNpcRange(self,Summoned_Wolf,1,500);
				sumtime_w_1 += 1;
			}
			else
			{
				Wld_SpawnNpcRange(self,Wolf_noexp,1,500);
			};
		}
		else
		{
			B_Say(self,self,"$DONTWORK");
			if(Npc_GetActiveSpellIsScroll(self))
			{
				self.attribute[ATR_MANA] = self.attribute[ATR_MANA] + SPL_Cost_Scroll;
			}
			else
			{
				self.attribute[ATR_MANA] = self.attribute[ATR_MANA] + SPL_Cost_SummonWolf;
			};
		};
	}
	else
	{
		Wld_SpawnNpcRange(self,Wolf,1,500);
	};
	if(Npc_IsPlayer(self) && (MIS_RUNEMAGICNOTWORK == LOG_Running) && (TESTRUNEME == FALSE) && !Npc_GetActiveSpellIsScroll(self))
	{
		if((FIREMAGERUNESNOT == TRUE) || (WATERMAGERUNESNOT == TRUE) || (GURUMAGERUNESNOT == TRUE) || (PALADINRUNESNOT == TRUE))
		{
			B_LogEntry(TOPIC_RUNEMAGICNOTWORK,"Как интересно! В отличие от Пирокара и других прочих магов, я могу использовать рунную магию. Что бы это значило?!");
		}
		else
		{
			B_LogEntry(TOPIC_RUNEMAGICNOTWORK,"Как интересно! В отличие от Пирокара, я могу использовать рунную магию. Что бы это значило?!");
		};
		TESTRUNEME = TRUE;
	};
	self.aivar[AIV_SelectSpell] += 1;
};
 
Сверху Снизу