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

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

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

Не стесняюсь спросить....

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Здесь,собственно,и нечего повторять дословно.
Я просто перенес твой скрипт к себе(в зацикленную функцию,вызываемую Trigger-Scriptом):

Все работает как часы.
Единственное,пришлось поменять местами строки Npc_ExchangeRoutine(бла бла) и AI_EquipBestArmor(бла),иначе непись переодевался но отказывался менять рутину.

Грубые ошибки проверки:
1. Нет новой брони - использована старая
2. Нет у тебя проверки PRIZO28 == 1
3. Нет запирающего замка в виде значения PRIZO28 = 2 - если все условия выполнены

Если замок не поставить, при активном квесте каждый день с 6 утра до 7 утра будет срабатывать триггер - ошибка т.е. т.к. он должен сработать только 1 раз и более не включаться даже если задание активное.

Код:
  if((MIS_KILL9 == LOG_Running) && (t >= 6) && (PRIZO28 == 1))
   {
   CreateInvItems(a_kil_9027,ITAR_ELITE_KILLER,1);
   Npc_ExchangeRoutine(a_kil_9027,"SEARCH");
   AI_EquipBestArmor(a_kil_9027);
   stopor1 = stopor1 + 1;
   if(stopor1 >= 4)
   {
   PRIZO28 = 2;
   stopor1 = 0;
   };
   };

Из кода следует минимум 4 прохода нужно.

Итог твой вариант работает, если срабатывает 16 раз (указано примерно т.к. каждый раз измерения разное число, но не выше 16) проверка всех условий без стопора. А должно за 1 проход работать (какой-то странный ответ движка).

Итог твоя проверка поверхностная (без деталей).
За старание спасибо.
 
Последнее редактирование:

Vlad_Torop

Участник форума
Регистрация
2 Май 2014
Сообщения
873
Благодарности
501
Баллы
245
Грубые ошибки проверки:
1. Нет новой брони - использована старая
2. Нет у тебя проверки PRIZO28 == 1
3. Нет запирающего замка в виде значения PRIZO28 = 2 - если все условия выполнены
Твой пост лишь в очередной раз подтверждает,что человек ты крайне неблагодарный,пытающийся других натыкать носом в свои собственные какашки.
Объясняю :
1. Ясен пень,что для теста я не мог использовать названия твоих нпс,и чудо-бронь,тк у меня нет их инстанций.Бери свои,и подставляй на их место.Или ты думал,что я распишу пример кода строго для твоих нужд,что бы тебе осталось лишь скопипастить? Извини,но я на тебя не работаю.
2 и 3. На кой МНЕ сдались ТВОИ PRIZO,замки и прочий хлам,не относящийся к делу? У тебя была проблема с переодеванием непися,а не с замками и прочей хренотенью! Я привел тебе пример кода,в котором функция AI_EquipBestArmor() успешно работает не только из диалога(как тобой утверждалось),но и через Trigger-Script,дабы ты на голом примере мог понять,в чем у тебя ошибка.Адекватный человек взял бы любезно предоставленный ему пример рабочего кода,заменил бы названия нпс и брони соответствующих своему моду,и тестил до усеру,пока код не сработает.А потом уже грел голову о всяческих дополнительных условиях и прочей мишуре.
За сим откланиваюсь.
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Код:
  name = "Броня элитного убийцы";
   mainflag = ITEM_KAT_ARMOR;
   flags = 0;
   protection[PROT_EDGE] = 90;
   protection[PROT_BLUNT] = 90;
   protection[PROT_POINT] = 90;
   protection[PROT_FIRE] = 90;
   protection[PROT_MAGIC] = 90;
   value = VALUE_ITAR_XARDAS;
   wear = WEAR_TORSO;
   visual = "TPLL.3ds";
   visual_change = "HUM_TPLL_ARMOR.asc";
   visual_skin = 0;
   material = MAT_LEATHER;
   description = name;
   text[1] = NAME_Prot_Edge;
   count[1] = protection[PROT_EDGE];
   text[2] = NAME_Prot_Point;
   count[2] = protection[PROT_POINT];
   text[3] = NAME_Prot_Fire;
   count[3] = protection[PROT_FIRE];
   text[4] = NAME_Prot_Magic;
   count[4] = protection[PROT_MAGIC];
   text[5] = NAME_Value;
   count[5] = value;
Твой пост лишь в очередной раз подтверждает,что человек ты крайне неблагодарный,пытающийся других натыкать носом в свои собственные какашки.
Объясняю :
1. Ясен пень,что для теста я не мог использовать названия твоих нпс,и чудо-бронь,тк у меня нет их инстанций.Бери свои,и подставляй на их место.Или ты думал,что я распишу пример кода строго для твоих нужд,что бы тебе осталось лишь скопипастить? Извини,но я на тебя не работаю.
2 и 3. На кой МНЕ сдались ТВОИ PRIZO,замки и прочий хлам,не относящийся к делу? У тебя была проблема с переодеванием непися,а не с замками и прочей хренотенью! Я привел тебе пример кода,в котором функция AI_EquipBestArmor() успешно работает не только из диалога(как тобой утверждалось),но и через Trigger-Script,дабы ты на голом примере мог понять,в чем у тебя ошибка.Адекватный человек взял бы любезно предоставленный ему пример рабочего кода,заменил бы названия нпс и брони соответствующих своему моду,и тестил до усеру,пока код не сработает.А потом уже грел голову о всяческих дополнительных условиях и прочей мишуре.
За сим откланиваюсь.

Доброе утро

1. instance мною предоставлено было, код instance также и твои слова "тк у меня нет их инстанций" - говорит о твоей лени.
2. Адекватные люди не будут сваливать какахи работы движка на других людей (мною движок писался Gothic 2 ZenGin?)

Мною было обнаружено после проверки твоей, что движок ZenGin вместо срабатывания в 0,5 секунды на переодевание NPC, тратит на это 2,7 секунды. (Снова мною были предоставлены доказательства моих слов 07.10.2015 21:49 и ты их не оспорил (сделал вид, что не заметил))(Тобою было заявлено,
Все работает как часы.
что всё работает в пределах нормы. На деле не работает.)

Мною было проверено всё возможное и фантастичное из расчёта, что движок работает в нормальных временных рамках. (Аналогично считал и alex_draven, когда мне подсказывал) Ах это моя вина, что движок ZenGin страшно тормозит во время переодевания NPC (судя по твоему нападению).

Перед тем на других сваливать чужую вину, сам проведи полный тест (А не по вершинам попрыгать и сказать, тут безопасно (не посмотрев как на самом деле всё обстоит)).

Всем спасибо за внимание.
 
Последнее редактирование:

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Народ, подскажите как можно изменить размер вывода на экран баров хп, маны, выносливости при помощи икаруса, где и какие функции прописать? (Мне нужно лишь ровно в 2 раза увеличить размер текстуры выведенной на экран, без смещений по координатам). 2 вопрос может и не в тему , но как можно текстуру сделать полупрозрачной? И 3 вопрос - как откомпилить скрипты движком? (В сурсере куча ошибок при компиле икаруса, эту хрень надо обойти таким способом) ps: заранее спасибо
Как компилировать скрипты игрой описано тут.
Сами полоски доступны через глобальную переменную MEM_Game, класс oCGame:
Код:
  var int hpBar;  //oCViewStatusBar*
  var int swimBar;  //oCViewStatusBar*
  var int manaBar;  //oCViewStatusBar*
  var int focusBar;  //oCViewStatusBar*
Настройка длины должна работать примерно так (в игре не проверялось, не гарантирую):
Код:
MEM_InitGlobalInst(); //инициализация переменных, для доступа к MEM_Game
var zCView bar; //сама полоска как zCView
bar = MEM_PtrToInst(MEM_Game.manaBar); //для примера - мана
bar.pposx -= bar.psizex ; //сдвигаем влево, чтобы не вылезало за край экрана
bar.psizex = bar.psizex * 2; //удваиваем ширину в пикселях

По текстуре - просто сохранить ее с полупрозрачным альфа-каналом?
 

Phantom95

Участник форума
Регистрация
31 Июл 2014
Сообщения
2.227
Благодарности
1.911
Баллы
370
Как компилировать скрипты игрой описано тут.
Сами полоски доступны через глобальную переменную полупрозрачными класс oCGame:
Код:
  var int hpBar;  //oCViewStatusBar*
  var int swimBar;  //oCViewStatusBar*
  var int manaBar;  //oCViewStatusBar*
  var int focusBar;  //oCViewStatusBar*
Настройка длины должна работать примерно так (в игре не проверялось, не гарантирую):
Код:
MEM_InitGlobalInst(); //инициализация переменных, для доступа к MEM_Game
var zCView bar; //сама полоска как zCView
bar = MEM_PtrToInst(MEM_Game.manaBar); //для примера - мана
bar.pposx -= bar.psizex ; //сдвигаем влево, чтобы не вылезало за край экрана
bar.psizex = bar.psizex * 2; //удваиваем ширину в пикселях

По текстуре - просто сохранить ее с полупрозрачным альфа-каналом?
Спасибо, насчёт текстур я мало чего знаю , нужно лишь одну текстуру Bar_Back сделать полупрозрачной, бары хп и маны уже изначально являются полупрозрачными
Насчет Икаруса теперь понятно, я то думал что неправильно распаковал его , поэтому и GS жаловался на ошибки , оказалось что его вообще невозможно скомпилировать GS
 
Последнее редактирование:

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Хотела с текстурами отправить к урокам по Photoshop/GIMP, но оказалось, что прозрачность можно настроить и через GoMan, чтобы далеко не ходить.

1. Открываем нужную текстуру (хоть в TGA, хоть в TEX).
2. Переходим в режим просмотра альфа-канала (кнопка 1). Белым закрашены непрозрачные области, черным прозрачные, серым - полупрозрачные (чем темнее, тем прозрачнее).
Если эта кнопка неактивна, альфа-канал не создан. Создаем кнопкой 2.
3. Нажимаем кнопку настройки яркости (3). Откроется окошко, в нем должен быть выбран вариант "Альфа". Уменьшаем яркость, чтобы сделать белые области серыми. Прозрачность 50% = -128, но тогда будет плохо видно, лучше в районе 50-100.
4. Чтобы оценить насколько получилось прозрачно, нажимаем кнопку (4). Можно сразу в этом режиме работать.
5. Не забываем сохранить результат:)
GoManAlpha.jpg
 

Toshbam

Участник форума
Регистрация
18 Мар 2014
Сообщения
130
Благодарности
31
Баллы
190
Как декомпилировать темную сагу.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.576
Благодарности
4.171
Баллы
915

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
Пока - никак, потому что в ней используется скриптпакет Ikarus. Можно только попросить исходники скриптов у её создателей.
а 1.15 не справляется что-ль. Вроде стока криков было по этому поводу... ?!
сам не проверял ибо троллейбусами и прочими костылями не интересуюсь... :confused:
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Добрый день. Вот минус готики:

Код:
func void rich1()
{
if((Npc_HasItems(hero,ItMi_Gold) >= 200) && (cash1 == 0))
{
   money1 = FALSE;
   cash1 = 1;
};
if((Npc_HasItems(hero,ItMi_Gold) < 200) && (cash1 == 0))
{
   money1 = TRUE;
   cash1 = 0;
};
};
Код:
instance DIA_511_SHIP(C_Info)
{
   npc = KDF_511_Daron;
   nr = 800;
   condition = dia_511_SHIP_condition;
   information = dia_511_SHIP_info;
   rich1();
   permanent = money1;
   description = "Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.";
};


func int dia_511_SHIP_condition()
{
   if((Npc_KnowsInfo(other,DIA_KIL_SHIP)) && (PRIZO25 == 1))
   {
     return TRUE;
   };
};

func void dia_511_SHIP_info()
{
   AI_Output(other,self,"DIA_511_SHIP_15_00");   //Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.
   AI_Output(self,other,"DIA_511_SHIP_15_01");   //Для этого потребуется большой запас магической энергии, на покупку магических микстур мне необходимо 200 золотых.
if(Npc_HasItems(hero,ItMi_Gold) >= 200)
{
   AI_Output(other,self,"DIA_511_SHIP_15_02");   //Вот деньги.
   AI_Output(self,other,"DIA_511_SHIP_15_03");   //Не будем терять времени.
   Npc_RemoveInvItems(hero,ItMi_Gold,200);
   self.aivar[AIV_PARTYMEMBER] = TRUE;
   Npc_ExchangeRoutine(self,"ship");
   B_LogEntry(TOPIC_KILL7,"Надо сопровождать Дарона пока он не прочтет заклинание.");
   AI_StopProcessInfos(self);
};
if(Npc_HasItems(hero,ItMi_Gold) < 200)
{
   AI_Output(other,self,"DIA_511_SHIP_15_04");   //У меня сейчас нет необходимой суммы денег.
   AI_StopProcessInfos(self);
};
};

Готика тупит после срабатывания данного варианта, диалоги NPC прекращают выполнять (когда они первыми должны говорить) и диалог продолжает срабатывать - хотя он должен при наличии 200 денег срабатывать только 1 раз, если денег меньше 200 - бесконечно раз.

Т.е. permanent может только 1 раз получить значение, в современных играх число раз не ограниченно.
 
Последнее редактирование:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Не вижу никаких минусов Готики..
Но вижу какую-то бредятину в инстанции диалога Готики:


Откуда это там ?! ::)

В готике (Npc_HasItems(hero,ItMi_Gold) >= 200) т.е. деньги есть диалог срабатывает, денег нет диалога нет. (А если диалог рассчитан на передачу денег в середине разговора то мой вариант нужен (диалог в виде 3 частей состоит)).

1. Если ГГ не имеет денег - диалог проходит до 1 части диалога и закрывается фразой - денег нет. Повторяется бесконечно.
2. Если ГГ имеет деньги - диалог полностью походит и повторяется только 1 раз.
Иначе диалог странно выглядит.
 

Myxomop

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

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Ну почему же, наоборот плюс! Игра не может работать адекватно, если модостроитель неадекватно обращается со скриптами игры.


Хитрый план :D

В чём плюс? В том, что много диалогов писать надо, вместо одного составного диалога?

1. Диалог - если денег нет
AI_Output(other,self,"DIA_511_SHIP_15_00"); //Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.
AI_Output(self,other,"DIA_511_SHIP_15_01"); //Для этого потребуется большой запас магической энергии, на покупку магических микстур мне необходимо 200 золотых.
AI_Output(other,self,"DIA_511_SHIP_15_04"); //У меня сейчас нет необходимой суммы денег.

2. диалог - если деньги есть
AI_Output(other,self,"DIA_511_SHIP_15_02"); //Вот деньги.
AI_Output(self,other,"DIA_511_SHIP_15_03"); //Не будем терять времени.
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
В готике (Npc_HasItems(hero,ItMi_Gold) >= 200) т.е. деньги есть диалог срабатывает, денег нет диалога нет. (А если диалог рассчитан на передачу денег в середине разговора то мой вариант нужен (диалог в виде 3 частей состоит)).

Иначе диалог странно выглядит.
Мде...
Есть такая штука синтаксис языка или правила по котором данный язык работает, в нашем случае язык Дедал..
Не надо в тело инстанции пихать то чего там быть не должно, и если я правильно помню то туда добавлять ничего своего нельзя...
Если тебе надо вызывать отдельную функцию в диалогах, то и делай это в соответствии с правилами языка.
1. Объяви функцию
2. Напиши функция
3. И вызывай ее из какого либо события по игре..
а на основе ее аргументов/переменных строй свои условия в диалогах, тогда должно будет все заработать..

Ну и немного из вечного: ЧИТАЙ ТУТОР ВАМА!
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
В чём плюс? В том, что много диалогов писать надо, вместо одного составного диалога?
Да ради бога, выстави правильно условия там где их обычно выставляют в _condition(), примеров в игре предостаточно. Зачем писать ахинею с условиями в инстанции диалога?
З.Ы. А Дарон оказывается та еще меркантильная сволочь :D
 

Лебедев

Участник форума
Регистрация
3 Сен 2005
Сообщения
595
Благодарности
77
Баллы
225
Да ради бога, выстави правильно условия там где их обычно выставляют в _condition(), примеров в игре предостаточно. Зачем писать ахинею с условиями в инстанции диалога?

Ошибочка диалогов таких нет.
1. Диалог 1 должен срабатывать бесконечно
2. Диалог 2 должен сработать 1 раз
3. 2 диалог если сработал 1 диалог должен прекратить работать.

Можно реализовать через новые переменные в Constants.d - но где описано сколько я их могу добавить новых переменных?

Скажите точное число, 1000, 10000, 100000 новых могу добавить? Сколько?

Ну и немного из вечного: ЧИТАЙ ТУТОР ВАМА!

Точно Vam - описывал игру 2002 года, хотя мой пример диалога стал применяться в играх с 2007 года.
Vam гений он описал будущее (Ванга вторая только компьютерная)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.239
Благодарности
2.581
Баллы
455
1. Диалог 1 должен срабатывать бесконечно
2. Диалог 2 должен сработать 1 раз
3. 1 диалог если сработал 2 диалог должен прекратить работать.
Да легко:

Можно реализовать через новые переменные в Constants.d - но где описано сколько я их могу добавить новых переменных?
Скажите точное число, 1000, 10000, 100000 новых могу добавить? Сколько?
Элементарную вещь сделать через жопу? Мож сразу Икарус?

Точно Vam - описывал игру 2002 года, хотя мой пример диалога стал применяться в играх с 2007 года.
Vam гений он описал будущее (Ванга вторая только компьютерная)
Ваш пример диалога встречается в любой Готике чуть менее чем через раз.

instance DIA_511_SHIP(C_Info)
{
npc = KDF_511_Daron;
nr = 800;
condition = dia_511_SHIP_condition;
information = dia_511_SHIP_info;
permanent = 1; //Ставим выполнение диалога постоянным.
description = "Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.";
};


func int dia_511_SHIP_condition()
{
if((Npc_KnowsInfo(other,DIA_KIL_SHIP)) && (PRIZO25 == 1))
{
return TRUE;
};
};

func void dia_511_SHIP_info()
{
AI_Output(other,self,"DIA_511_SHIP_15_00"); //Уважаемый Дарон, недалеко от острова на якоре стоит пиратский корабль, думаю они планируют напасть на город, нужна ваша помощь, чтоб защитить жителей.
AI_Output(self,other,"DIA_511_SHIP_15_01"); //Для этого потребуется большой запас магической энергии, на покупку магических микстур мне необходимо 200 золотых.
if(Npc_HasItems(hero,ItMi_Gold) >= 200)
{
AI_Output(other,self,"DIA_511_SHIP_15_02"); //Вот деньги.
AI_Output(self,other,"DIA_511_SHIP_15_03"); //Не будем терять времени.
Npc_RemoveInvItems(hero,ItMi_Gold,200);
self.aivar[AIV_PARTYMEMBER] = TRUE;
Npc_ExchangeRoutine(self,"ship");
B_LogEntry(TOPIC_KILL7,"Надо сопровождать Дарона пока он не прочтет заклинание.");
DIA_511_SHIP.permanent = 0; //После выполнения этой ветки, диалог больше появляться не будет.
AI_StopProcessInfos(self);
};
if(Npc_HasItems(hero,ItMi_Gold) < 200)
{
AI_Output(other,self,"DIA_511_SHIP_15_04"); //У меня сейчас нет необходимой суммы денег.
AI_StopProcessInfos(self);
};
};
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.816
Баллы
995
B_LogEntry(TOPIC_KILL7,"Надо сопровождать Дарона пока он не прочтет заклинание.");
DIA_511_SHIP.permanent = 0; //После выполнения этой ветки, диалог больше появляться не будет.
Я бы это перекинул в скрипт прочтения заклинания, тогда бы точно выполнялось условия что ветка выполнена и диалог более не требуется, ибо гг может вернуться без прочтения Дароном.. а диалога уже не будет. А так по факту события как говорится.. Но это так мысли.. ::)
 
Сверху Снизу