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

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


Купить игры
 



Чат
 
500


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

Модератор форума: NikK  
Форум » Ад-доны для игр серии Корсары » FAQ по модам - "Сделай мод сам" » Кодинг квестов (Рассмотрим написание квестов)
Кодинг квестов
SalkynДата: Пятница, 10.07.2015, 19:03 | Сообщение # 401
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
Печатаю сюда, ибо хочу обойти именно генератор квеста God_hit_us. Суть какая: есть у меня дом (4 локации) с приватными сундуками, но не смотря на приватность срабатывают в них ловушки ((



Как бы их отключить? Пробовал похимичить что-то типа "return false" при условии что id локации соответствует моим 4-м - игра вообще не запускалась! Думаю надо поправить условие квеста, вижу три варианта:
1. сделать таки проверку на локации - но правильно
2. запретить запуск генератора в самих локациях
3. изуверский - в этих локациях принудительно завышать скилл фортуны

Что посоветуете?
NathanielДата: Пятница, 10.07.2015, 19:05 | Сообщение # 402
Контр-адмирал
Группа: Капитан
Сообщений: 7830
Награды: 336
Репутация: 1750
Статус: В открытом море
Цитата Salkyn ()
в этих локациях принудительно завышать скилл фортуны

Зачем так сложно? Поставьте там условие, которое никогда не будет истинным! Всё!


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
SalkynДата: Воскресенье, 12.07.2015, 22:50 | Сообщение # 403
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
Цитата Nathaniel ()
Поставьте там

Прошу прощения, там где?

Может кто мне, недалекому, расшифровать вот эту строку?
Код
sti(chr.GenQuest.God_hit_us) == 1


Сообщение отредактировал Salkyn - Воскресенье, 12.07.2015, 22:51
NathanielДата: Понедельник, 13.07.2015, 08:21 | Сообщение # 404
Контр-адмирал
Группа: Капитан
Сообщений: 7830
Награды: 336
Репутация: 1750
Статус: В открытом море
Цитата Salkyn ()
там где?

Вместо rand(100) >= (85 + GetCharacterSkillToOld(chr, SKILL_FORTUNE)). У Вас там, как видите, выбирается произвольное число от 0 до 100, а затем сравнивается со значением умения "Везение". Напишите любое другое или измените текущее таким образом, чтобы это второе условие никогда не было истинным. Ну, например, вот такое: "если дважды два не равно четыре".

Цитата Salkyn ()
Может кто мне, недалекому, расшифровать вот эту строку?

В коде есть две функции - sti и stf. Первая возвращает целочисленное (integer) значение атрибута, указанного в скобках. Вторая - вещественное (float) значение.


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
SalkynДата: Понедельник, 13.07.2015, 21:14 | Сообщение # 405
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
Цитата Nathaniel ()
Вместо rand(100) >=

Понял. Однако, это отменит ловушку во всех локациях, мне же необходимо только в конкретных. Как упоминал уже, добавление строки типа [if(loction.id == "*****") return false] приводит к вылету при загрузке игры. Попробовал такой вариант:

Код
if (sti(chr.GenQuest.God_hit_us) == 1 && rand(100) >= (85 + GetCharacterSkillToOld(chr, SKILL_FORTUNE)) && location.id != "*****")

результат тот же:


Поэтому и задаюсь вопросами:
1. Что же вписать для верной/рабочей проверки на четыре локации в условии
или
2. Как отключить исполнение God_hit_us в самих локациях



Сообщение отредактировал Salkyn - Понедельник, 13.07.2015, 21:16
NathanielДата: Понедельник, 13.07.2015, 22:32 | Сообщение # 406
Контр-адмирал
Группа: Капитан
Сообщений: 7830
Награды: 336
Репутация: 1750
Статус: В открытом море
Цитата Salkyn ()
мне же необходимо только в конкретных...

Ну так и добавьте идентификаторы этих локаций в проверку, расставив между ними логическое "или":

Код
if (pchar.location == "локация_1" || pchar.location == "локация_2" || pchar.location == "локация_3" || pchar.location == "локация_4")
{
      // ловушка не работает
      // основной код
}
else
{
     // ловушка работает
     // основной код
}


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
SalkynДата: Среда, 15.07.2015, 00:00 | Сообщение # 407
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
То что и искал, спасибо, но - неа, не работать способ. Ловушки продолжают ловить. М-да, становится все интереснее. Вот что написал:


Но логика ведь верная? Или что-то напутал.

Если ошибок нет, то такая мысль: в первой половине кода проверяется нахождение в зоне "boxname" и определяется загружена ли локация (вторая и третья строки соответственно)


т.е. для обхода условия надо проверять не на "большую" локацию, а на локацию "boxname"? Прав ли я?



Сообщение отредактировал Salkyn - Среда, 15.07.2015, 00:05
korsar01Дата: Среда, 15.07.2015, 16:26 | Сообщение # 408
Мичман
Группа: Корсар
Сообщений: 181
Награды: 6
Репутация: 46
Статус: В открытом море
Salkyn, оставь вот этот код:
Цитата Salkyn ()
if (sti(chr.GenQuest.God_hit_us) == 1 && rand(100) >= (85 + GetCharacterSkillToOld(chr, SKILL_FORTUNE)))
{
Log_Info("Ловушка!");
PlaySound("people\clothes1.wav");
DoQuestCheckDelay("God_hit_us", 0.2);
}
else
{
LaunchItemsBox(&ar);
}
и в условие допиши нужные локации ... and (pchar.location.id != "л1") and (pchar.location.id != "л2") и т.д


Сообщение отредактировал korsar01 - Среда, 15.07.2015, 16:27
SalkynДата: Среда, 15.07.2015, 19:21 | Сообщение # 409
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
Цитата korsar01 ()

Пробовал уже - неработать
MettДата: Среда, 15.07.2015, 19:38 | Сообщение # 410
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 90
Репутация: 555
Статус: В открытом море
может проще сделать блокировку ловушки в самом ее кейсе в квест_реаншн?

Что толку, если не можешь сделать мир лучше.
SalkynДата: Пятница, 17.07.2015, 00:55 | Сообщение # 411
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
Цитата Mett ()
блокировку ловушки в самом ее кейсе

Попробовал по разному - не помогло. Что нужно прописать для выхода из кейса вместо выделенного?


И еще: не могу найти строку (файл), где задается значение chr.GenQuest.God_hit_us == 1. Где она может быть?

P.S. "// это такой прикол - задействовать в ловушки для сундуков(boal)" - да уж, прикол jokingly


Сообщение отредактировал Salkyn - Пятница, 17.07.2015, 00:58
MettДата: Пятница, 17.07.2015, 01:56 | Сообщение # 412
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 90
Репутация: 555
Статус: В открытом море
Код
case "God_hit_us": // это такой прикол - задействовать в ловушки для сундуков(boal)   
if(pchar.location.id == "л1" || pchar.location.id == "л2" || pchar.location.id == "л3" || pchar.location.id == "л4") break;
iTemp = 10+rand(15);   
if ((MakeInt(pchar.chr_ai.hp)-iTemp) > 0)   
{   
LAi_SetActorType(PChar);   
LAi_ActorAnimation(PChar, "hit_attack_2", "pchar_back_to_player", 1.0);   
}   
LAi_ApplyCharacterDamage(pchar, iTemp);   
SendMessage(pchar, "lfff", MSG_CHARACTER_VIEWDAMAGE, iTemp, MakeFloat(MakeInt(pchar.chr_ai.hp)), MakeFloat(MakeInt(pchar.chr_ai.hp_max)));   
LAi_CheckKillCharacter(pchar);   
break;


Что толку, если не можешь сделать мир лучше.
SalkynДата: Вторник, 21.07.2015, 20:25 | Сообщение # 413
Матрос
Группа: Корсар
Сообщений: 31
Награды: 0
Репутация: 10
Статус: В открытом море
Спешу, посыпая пеплом свою голову, сообщить о завершении баталии "God_hit_us"! Ловушки успешно обойдены! Решив обобщить результаты работ, обнаружил, что не точно проследовал подсказке уважаемого Nathaniel, а именно:
Код
if (pchar.location == "локация_1" || pchar.location == "локация_2" || pchar.location == "локация_3" || pchar.location == "локация_4") ...

А в моем случае ... pchar.location.id == ...

Искренне благодарю всех участвовавших словом и делом в данном квесте -give_rose-

P.S. Повторю совет, уже звучавший где-то тут: если что-то не работает - тысячу раз внимательно проверьте, все ли сделали как надо - вплоть до последней запятой!

P.P.S.
Цитата Mett ()
if(pchar.location.id == "л1" || pchar.location.id == "л2" || pchar.location.id == "л3" || pchar.location.id == "л4") break;

Крайний совет тоже не сработал, код явно игнорировал id локации. Почему - не знаю.


Сообщение отредактировал Salkyn - Вторник, 21.07.2015, 20:32
NathanielДата: Вторник, 21.07.2015, 21:30 | Сообщение # 414
Контр-адмирал
Группа: Капитан
Сообщений: 7830
Награды: 336
Репутация: 1750
Статус: В открытом море
Цитата Salkyn ()
в моем случае ... pchar.location

Помнится, когда-то я писал вот такую интересную проверку с целью немного разнообразить диалоги в игре. Речь идёт о квесте Аскольда!


Такой пример можно прописать в файле Common_rumours.c в кейсе "AscoldTrader_2". Собственно, этот опыт и позволил мне припомнить, как проверяется подобное условие. Что и навело на мысль подсказать именно это. А в каких конкретно случаях используется pchar.location.id - я и сам не помню, честно говоря.


Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор.
Но я не нашёл там никого, кто не был бы моим другом!
MettДата: Среда, 22.07.2015, 03:03 | Сообщение # 415
Капитан I ранга
Группа: Корсар
Сообщений: 586
Награды: 90
Репутация: 555
Статус: В открытом море
Цитата Salkyn ()
Крайний совет тоже не сработал, код явно игнорировал id локации. Почему - не знаю.

а я сразу и не заметил, что в твоем коде pchar.location.id


Что толку, если не можешь сделать мир лучше.
ЗамбезияДата: Вторник, 31.05.2016, 16:10 | Сообщение # 416
Пороховая обезьяна
Группа: Пират
Сообщений: 2
Награды: 0
Репутация: 0
Статус: В открытом море
Приветствую! Такой вопрос: как сделать определенное условие на взятие квеста? Ну то бишь, хочу реализовать фичу с генерацией специального НПС в одном из случайных городов при достижении ГГ n-го лвла.
И еще не помешало бы тыкнуть носом в функцию аля "нпс подбегает и сам начинает диалог"
Благодарю заранее
korsary4Дата: Вторник, 31.05.2016, 17:31 | Сообщение # 417
Адмирал
Группа: Администратор
Сообщений: 5200
Награды: 487
Репутация: 1878
Статус: В открытом море
Цитата Замбезия ()
в функцию аля "нпс подбегает и сам начинает диалог"


Если просто для нпс типа Citizen, будут как в генераторах приставать.
Код
ch.talker = int Variable; // нпс типа citizen при сближении с ГГ на 3м сам начнет диалог с вероятностью, заложенной в Variable - от 1 до 10 (чем больше цифра, тем выше вероятность). Попытка диалога при сближении будет продолжаться до тех пор, пока не удастся.


Или делать актером и пусть подходит к ГГ:
Код
    sld =  CharacterFromID("TortugaGirl_Matilda");
    LAi_SetActorType(sld);
    sld.dialog.currentnode = "dialog3_1";    
    LAi_ActorDialog(sld, pchar, "", 0.2, 0);



Единственное, что можно сказать об удаче с уверенностью — она изменит.
--------
ЗамбезияДата: Вторник, 31.05.2016, 23:05 | Сообщение # 418
Пороховая обезьяна
Группа: Пират
Сообщений: 2
Награды: 0
Репутация: 0
Статус: В открытом море
Цитата korsary4 ()
Или делать актером и пусть подходит к ГГ:

Предварительно для этого прописать его как отдельного НПС?
И куда прописывать этот код, вроде в characters_init не пропишешь, или ошибаюсь?
Но вот вопрос с условием получения квеста / генерации этого НПС остается открытым)


Сообщение отредактировал Замбезия - Вторник, 31.05.2016, 23:10
NathanielДата: Среда, 01.06.2016, 13:35 | Сообщение # 419
Контр-адмирал
Группа: Капитан
Сообщений: 7830
Награды: 336
Репутация: 1750
Статус: В открытом море
Цитата Замбезия ()
Предварительно для этого прописать его как отдельного НПС?
И куда прописывать этот код...

Я прописываю в LSC_Q2Utilite.c в инишник самого персонажа. Мне там удобнее держать все инишники всех офицеров, а в ForAll_dialog.c - их же диалоги.

Цитата Замбезия ()
генерации этого НПС...

Об этом подробно написано в теме создания нового NPC. Создайте в указанном выше файле персонажа, пропишите ему конкретный или генерируемый адрес и время залогинивания. И он будет появляться в назначенном месте. А уж при разговоре с ним будет запускаться нужный квест, старт которого нужно будет объявить в диалоге этого персонажа. За основу можно взять любой уже написанный квест. Например, про Хемфри Дугласа и его мушкет.

Цитата

case "OffM_12":
dialog.text = "Спасибо вам. Буду ждать с нетерпением!";
link.l1 = "Хорошо.";
link.l1.go = "exit";

/* дальше начинается запуск квеста */
SetMushketCapitainInWorld(); // запускаем энкаунтер на глобальной карте
pchar.questTemp.mushket2x2 = true; // объявляем начало квеста
AddQuestRecord("SeekDoubleMushket", "1"); // добавляем первую запись по новому квесту в СЖ (текстовый файл в корневой папке игры)
NextDiag.TempNode = "OffM_result"; // объявляем следующую ветку диалога

break;

Сам квест описываете в quests_reactions.c и reaction_functions.c, например...


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


Сообщение отредактировал Nathaniel - Среда, 01.06.2016, 13:50
Blad45Дата: Четверг, 08.09.2016, 13:42 | Сообщение # 420
Группа: Удаленные





А как сделать чтобы Блад после ролика оказывался не на плантациях, а в Бриджтауне?
Форум » Ад-доны для игр серии Корсары » FAQ по модам - "Сделай мод сам" » Кодинг квестов (Рассмотрим написание квестов)
Поиск:

Copyright Pirates-Life.Ru © 2008-2018


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