Семь Футов под Килем
Форма входа
 
Приветствуем тебя, корсар Юнга!

Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!
Логин:
Пароль:


Купить игры
 



Чат
 
500


Статистика
 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Модератор форума: NikK  
Форум » Ад-доны для игр серии Корсары » FAQ по модам - "Сделай мод сам" » Урок № 3. Пишем диалоги персонажам
Урок № 3. Пишем диалоги персонажам
korsary4Дата: Вторник, 11.07.2017, 13:41 | Сообщение # 281
Адмирал
Группа: Администратор
Сообщений: 5200
Награды: 485
Репутация: 1844
Статус: В открытом море
Цитата Alister18 ()
Не подскажешь за что отвечает эта строчка?

Задание текущей ветки диалога нпс.

Цитата Nathaniel ()
Хм... Я обычно пишу эти строки после "exit", уже перед закрытием кейса.

Да разницы никакой, там же не к текущему нпс обращаемся. А если и к текущему то что ниже exit, все равно обработается сразу же, и надо вот как выше сообщение, через новый кейс с завершением диалога DialogExit();.

Цитата Alister18 ()
но разговаривать с ним по-прежнему нельзя!

Вероятно, тип нпс с "актера" не сменили.

Alister18, приводите свой код, в котором непосредственно проблема. Пример с пиратской линейки рабочий же, раз он из игры)



Единственное, что можно сказать об удаче с уверенностью — она изменит.
--------
Alister18Дата: Вторник, 11.07.2017, 17:13 | Сообщение # 282
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
korsary4, подскажите как 'посадить' полноценного (с оружием, предметами и т.д) нпц на какую либо локацию через диалог?
Пробую : то диалог не открывается, то не появляется. посадить хочу на пляж Капстер (Гваделупа). shore29 goto_goto2


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг
korsary4Дата: Вторник, 11.07.2017, 17:39 | Сообщение # 283
Адмирал
Группа: Администратор
Сообщений: 5200
Награды: 485
Репутация: 1844
Статус: В открытом море
Цитата Alister18 ()
как 'посадить'

Код
  sld =  CharacterFromID("QuestFortFrance_BB4");    
  ChangeCharacterAddressGroup(sld,"shore29", "goto", "goto2");


А оружие это уже смотря как нпс у вас задан. Если в Program\characters\init прописан, то там, например вот так:
Код
    GiveItem2Character(ch, BLADE_SABER);
    ch.equip.blade = BLADE_SABER;



Единственное, что можно сказать об удаче с уверенностью — она изменит.
--------
Alister18Дата: Вторник, 11.07.2017, 17:42 | Сообщение # 284
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
korsary4, а без прописки в Program\characters\init нельзя оружие дать нпц?
Можно ли прописать персонажа через init, но чтобы появился только после диалога какого-либо?


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг


Сообщение отредактировал Alister18 - Вторник, 11.07.2017, 17:54
NathanielДата: Вторник, 11.07.2017, 18:21 | Сообщение # 285
Контр-адмирал
Группа: Капитан
Сообщений: 7656
Награды: 334
Репутация: 1742
Статус: В открытом море
Цитата Alister18 ()
а без прописки в Program\characters\init нельзя оружие дать нпц?

Стандартной функцией GiveItem2Character(ref character, string itemID).

В качестве character можно указывать ГГ (pchar) или любого персонажа, ссылаясь на него:

Например:

Код
GiveItem2Character(pchar, "potion15");

Код
ref sld = CharacterFromID("Jessica");
TakeItemFromCharacter(sld, "pistol7");

Можно выдать или забрать абсолютно любой предмет, записанный в InitItems, любому персонажу, у которого есть свой ID. И неважно, где он прописан.

Alister18, я бы посоветовал обратить внимание на небольшой архивчик, который находится у многих в папке со скриптами и называется _doc_script.
Если такого архива у Вас нет - очень рекомендую найти. Там собрано много полезных функций с подробными описаниями.

Цитата Alister18 ()
Можно ли прописать персонажа через init, но чтобы появился только после диалога какого-либо?

Можно. Я, например, вписываю всех новых персонажей игры в LSC_Q2Utilite, а в нужный момент просто выгружаю NPC по заданному адресу.


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!


Сообщение отредактировал Nathaniel - Вторник, 11.07.2017, 18:29
Alister18Дата: Вторник, 11.07.2017, 18:29 | Сообщение # 286
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
Цитата Nathaniel ()
я бы настоятельно порекомендовал Вам для начала хоть немного изучить базовые функции. Большинство из них перечислено в небольшом архивчике, который находится у многих в папке со скриптами и называется _doc_script.

Если же такого архива у Вас нет - очень рекомендую найти...


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


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг
NathanielДата: Вторник, 11.07.2017, 18:30 | Сообщение # 287
Контр-адмирал
Группа: Капитан
Сообщений: 7656
Награды: 334
Репутация: 1742
Статус: В открытом море
Цитата Alister18 ()
Можете ссылочкой поделиться на архив этот, буду очень благодарен...

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


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
Alister18Дата: Вторник, 11.07.2017, 19:00 | Сообщение # 288
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
Цитата Nathaniel ()
Можно. Я, например, вписываю всех новых персонажей игры в LSC_Q2Utilite, а в нужный момент просто выгружаю NPC по заданному адресу.
а где этот файл находится, не подскажите?

Добавлено (11.07.2017, 19:00)
---------------------------------------------

Цитата korsary4 ()
Вероятно, тип нпс с "актера" не сменили.

Alister18, приводите свой код


Код

     case "goFrancisk":
     dialog.text = "Давай пройдем к дом моего друга, там спокойно поговорим. Не против?";
     link.l1 = "Нет, не против. Пошли.";
  link.l1.go = "goFrancisk1";
  break;
  
  case "goFrancisk1":
   DialogExit();
   NextDiag.CurrentNode = "dialog2";
   chrDisableReloadToLocation = false;
   bDisableFastReload = true;
   FreeSitLocator("PortRoyal_PortOffice", "goto2");
   LAi_SetActorType(ref character);
   LAi_ActorRunToLocation(ref character, "reload", "reload10_back", "PortRoyal_PortOffice", "goto", "goto2", "PortRoyal_PortOffice", -1);
  break;

    case "dialog2":
     dialog.text = "Понимаешь, тут такое дело\nЯ весь в работе. Кручусь как только могу, из острова на остров, туда-суда, понимаешь, не помню когда последний раз в таверне был. Времени нет катастрофически! И знаешь, самое печальное то, что я даже не могу навестить сестру.";     
     link.l1 = "Ближе к делу, сударь.";
     link.l1.go = "dialog3";
    break;

Не работает. Где ошибка?
Прописал так, чтобы бежал в Портовое управление Порт-Рояля. А как сделать так, чтобы когда уже диалог продолжится в порт. управлении, нпц первый начал диалог? (как горожане, которые квесты дают)?????


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг
NathanielДата: Вторник, 11.07.2017, 19:25 | Сообщение # 289
Контр-адмирал
Группа: Капитан
Сообщений: 7656
Награды: 334
Репутация: 1742
Статус: В открытом море
Цитата Alister18 ()
а где этот файл находится?

В \program\characters\

Цитата
LAi_SetActorType(ref character);
LAi_ActorRunToLocation(ref character...);

Там не нужно писать ref character! Там нужно писать ID конкретного NPC.

Например:
Код
sld = CharacterFromID("New_NPC");
LAi_SetActorType(sld);
LAi_ActorRunToLocation(sld, "reload", "reload10_back", "PortRoyal_PortOffice", "goto", "goto2", "PortRoyal_PortOffice", -1);


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
Alister18Дата: Вторник, 11.07.2017, 19:39 | Сообщение # 290
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
Прописал так.
Код
break;
  
  case "goFrancisk1":
   DialogExit();
   NextDiag.CurrentNode = "dialog2";
   chrDisableReloadToLocation = false;
   bDisableFastReload = true;
   sld = CharacterFromID("Francisk_Fushe");
            LAi_SetActorType(sld);
            LAi_ActorRunToLocation(sld, "reload", "reload10_back", "PortRoyal_PortOffice", "goto", "goto2", "PortRoyal_PortOffice", -1);
  break;

    case "dialog2":

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


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг
NathanielДата: Вторник, 11.07.2017, 20:16 | Сообщение # 291
Контр-адмирал
Группа: Капитан
Сообщений: 7656
Награды: 334
Репутация: 1742
Статус: В открытом море
Цитата Alister18 ()
Я подхожу, хочу начать диалог - ноль реакции...

Так реакцию нужно описать, например, в quests_reaction.c в указанном в функции выше кейсе. У Вас это "PortRoyal_PortOffice". Он у Вас описан?


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
Alister18Дата: Вторник, 11.07.2017, 20:26 | Сообщение # 292
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
Цитата Nathaniel ()
Он у Вас описан?

Нет. Подскажите что и как описать, пожалуйста.


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг
NathanielДата: Вторник, 11.07.2017, 20:40 | Сообщение # 293
Контр-адмирал
Группа: Капитан
Сообщений: 7656
Награды: 334
Репутация: 1742
Статус: В открытом море
Цитата Alister18 ()
Подскажите что и как описать...

Для чего и зачем?


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
Alister18Дата: Вторник, 11.07.2017, 20:43 | Сообщение # 294
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
Цитата Nathaniel ()
Для чего и зачем?

Я бы хотел, чтобы при входе меня в Портовое управление нпц подошёл ко мне сам и начал диалог.
Как это мне лучше сделать?)))


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг
NathanielДата: Вторник, 11.07.2017, 20:56 | Сообщение # 295
Контр-адмирал
Группа: Капитан
Сообщений: 7656
Награды: 334
Репутация: 1742
Статус: В открытом море
Цитата Alister18 ()
Как это мне лучше сделать?

Поищите в квестах К:ГПК фрагменты кода типа вот таких... Они как раз инициируют встречу NPC с ГГ и начало диалога...

Код
ChangeCharacterAddressGroup(sld, pchar.location, "goto", "goto1");
LAi_SetActorType(sld);
LAi_ActorDialog(sld, pchar, "", -1, 0);


Например, вот фрагмент встречи на жемчужных промыслах...

Код
chrDisableReloadToLocation = true;
sld.dialog.Filename = "Pearl_dialog.c";
sld.dialog.currentnode = "GuardMan";
LAi_ActorDialog(sld, pchar, "", -1, 0);


или

Код
//==> Посыльный
chrDisableReloadToLocation = true;
sld = GetCharacter(NPC_GenerateCharacter("PortMansBoy", "shipowner_10", "man", "man", 10, FRANCE, 0, false));
sld.Dialog.Filename = "Quest\SpaLineNpc_2.c";
ChangeCharacterAddressGroup(sld, "Tortuga_tavern", "goto", "goto2");
LAi_SetActorType(sld);
LAi_ActorDialog(sld, pchar, "", -1, 0);


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
korsary4Дата: Вторник, 11.07.2017, 23:19 | Сообщение # 296
Адмирал
Группа: Администратор
Сообщений: 5200
Награды: 485
Репутация: 1844
Статус: В открытом море
Ну и условие на вход ГГ в локацию, дополнение к выше сказанному Nathaniel.

Код
//////Условие location
pchar.quest.MoralValues_2.win_condition.l1 = "location";
pchar.quest.MoralValues_2.win_condition.l1.location = "Dama_houseS2_House";
pchar.quest.MoralValues_2.win_condition = "MoralValues_2";



Единственное, что можно сказать об удаче с уверенностью — она изменит.
--------
Alister18Дата: Воскресенье, 16.07.2017, 16:32 | Сообщение # 297
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
Цитата Nathaniel ()
Можно. Я, например, вписываю всех новых персонажей игры в LSC_Q2Utilite, а в нужный момент просто выгружаю NPC по заданному адресу.


А как именно прописывать персов в этот файл? Не просто же прописать в файле:
Код
   makeref(ch,Characters[n]);  // Фергус Болтер
      ch.name  = "Фергус";
      ch.lastname = "Болтер";
      ch.id  = "Fergus_Bolter";
      ch.model    = "Resc_9";
      ch.model.animation = "man";
      ch.sex = "man";
      ch.location    = "none";
      ch.location.group = "none";
      ch.location.locator = "none";
      ch.Dialog.Filename = "Quest\MainLine\Fergus_Bolter.c";
      GiveItem2Character(ch, GUN_COMMON);
      ch.equip.gun = GUN_COMMON;
      GiveItem2Character(ch, "blade2");
      ch.equip.blade = "blade2";
      ch.nation = ENGLAND;
          ch.rank  = 45;
      ch.reputation = "15";
          SetSelfSkill(ch, 10, 10, 10, 20, 20);
          SetShipSkill(ch, 20, 90, 10, 10, 10, 20, 10, 10, 50);
          LAi_NoRebirthDisable(ch);  // воскресть при убиении
      LAi_SetCitizenType(ch);
      LAi_SetLoginTime(ch, 0.0, 24.0);
      LAi_SetHP(ch, 200.0, 200.0);
      LAi_SetImmortal(ch, true);
      ch.greeting = "GrFisherman";
      LAi_group_MoveCharacter(ch, "ENGLAND_CITIZENS");      
           
      n = n+1;

Попробовал так написать - игра даже не запустилась.

Добавлено (16.07.2017, 16:32)
---------------------------------------------
Цитата korsary4 ()
 sld =  CharacterFromID("QuestFortFrance_BB4");
ChangeCharacterAddressGroup(sld,"shore29", "goto", "goto2");

Не получается. При диалоге и вкл. Beta Test Mod'oм сверху пишет мол "НПЦ не найден".


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг


Сообщение отредактировал Alister18 - Воскресенье, 16.07.2017, 20:38
NathanielДата: Понедельник, 17.07.2017, 15:02 | Сообщение # 298
Контр-адмирал
Группа: Капитан
Сообщений: 7656
Награды: 334
Репутация: 1742
Статус: В открытом море
Цитата Alister18 ()
НПЦ не найден...

А должен был быть найден?! Вы же инициализировали выше совсем другого NPC. Или я что-то не понял?
Что ж Вы тупо копируете код примеров-то?

Код
ch.id  = "Fergus_Bolter";

Вот и обращайтесь к нему...

Код
sld =  CharacterFromID("Fergus_Bolter");
ChangeCharacterAddressGroup(sld,"shore29", "goto", "goto2");


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
Alister18Дата: Понедельник, 17.07.2017, 18:42 | Сообщение # 299
Матрос
Группа: Корсар
Сообщений: 23
Награды: 0
Репутация: 0
Статус: В открытом море
Цитата Nathaniel ()
Что ж Вы тупо копируете код примеров-то?
Нет, я просто привел пример, мой нпц имеет другой ID. Но не суть.


Пусть час не пробил, жди, не уставая,
Пусть лгут лжецы, не снисходи до них;
Умей прощать и не кажись, прощая,
Великодушней и мудрей других.

Киплинг
korsary4Дата: Понедельник, 17.07.2017, 22:15 | Сообщение # 300
Адмирал
Группа: Администратор
Сообщений: 5200
Награды: 485
Репутация: 1844
Статус: В открытом море
Цитата Alister18 ()
Но не суть.

Суть в том, что значит у нас не объявлен такой нпс с этим id, вот и все.

Цитата Alister18 ()

А как именно прописывать персов в этот файл? Не просто же прописать в файле:

приведенный вами код, это для файлов из папки Program\characters\init.



Единственное, что можно сказать об удаче с уверенностью — она изменит.
--------
Форум » Ад-доны для игр серии Корсары » FAQ по модам - "Сделай мод сам" » Урок № 3. Пишем диалоги персонажам
Поиск:

Copyright Pirates-Life.Ru © 2008-2018


Семь Футов под Килем - Бухта Корсаров и Пиратов!