Печатаю сюда, ибо хочу обойти именно генератор квеста God_hit_us. Суть какая: есть у меня дом (4 локации) с приватными сундуками, но не смотря на приватность срабатывают в них ловушки ((
Код
void OpenBoxProcedure() { ref chr = GetMainCharacter(); if( !CheckAttribute(chr,"boxname") ) return; int locidx = FindLoadedLocation(); if(locidx<0) return; string atrName = chr.boxname; aref ar; makearef(ar,Locations[locidx].(atrName)); if(GetAttributesNum(ar)==0) { Locations[locidx].(atrName).Money = 0; makearef(ar,Locations[locidx].(atrName)); } // God_hit_us это такой прикол - задействовать в ловушки для сундуков(boal) // токо сундуки и дома 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); } }
Как бы их отключить? Пробовал похимичить что-то типа "return false" при условии что id локации соответствует моим 4-м - игра вообще не запускалась! Думаю надо поправить условие квеста, вижу три варианта: 1. сделать таки проверку на локации - но правильно 2. запретить запуск генератора в самих локациях 3. изуверский - в этих локациях принудительно завышать скилл фортуны
в этих локациях принудительно завышать скилл фортуны
Зачем так сложно? Поставьте там условие, которое никогда не будет истинным! Всё! Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
Вместо rand(100) >= (85 + GetCharacterSkillToOld(chr, SKILL_FORTUNE)). У Вас там, как видите, выбирается произвольное число от 0 до 100, а затем сравнивается со значением умения "Везение". Напишите любое другое или измените текущее таким образом, чтобы это второе условие никогда не было истинным. Ну, например, вот такое: "если дважды два не равно четыре".
ЦитатаSalkyn ()
Может кто мне, недалекому, расшифровать вот эту строку?
В коде есть две функции - sti и stf. Первая возвращает целочисленное (integer) значение атрибута, указанного в скобках. Вторая - вещественное (float) значение. Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
Понял. Однако, это отменит ловушку во всех локациях, мне же необходимо только в конкретных. Как упоминал уже, добавление строки типа [if(loction.id == "*****") return false] приводит к вылету при загрузке игры. Попробовал такой вариант:
Поэтому и задаюсь вопросами: 1. Что же вписать для верной/рабочей проверки на четыре локации в условии или 2. Как отключить исполнение God_hit_us в самих локациях
причем сам God_hit_us встречается только в трех местах: тут, в quests_reaction.c (уже результат выполнения) и в sound.c
Сообщение отредактировал Salkyn - Понедельник, 13.07.2015, 21:16
Ну так и добавьте идентификаторы этих локаций в проверку, расставив между ними логическое "или":
Код
if (pchar.location == "локация_1" || pchar.location == "локация_2" || pchar.location == "локация_3" || pchar.location == "локация_4") { // ловушка не работает // основной код } else { // ловушка работает // основной код }
Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
Если ошибок нет, то такая мысль: в первой половине кода проверяется нахождение в зоне "boxname" и определяется загружена ли локация (вторая и третья строки соответственно)
т.е. для обхода условия надо проверять не на "большую" локацию, а на локацию "boxname"? Прав ли я?
Тут же вопрос. У всех рассматриваемых сундуков name locator - "private№", group locator - "box". Что именно код имеет ввиду под "boxname" и "..LoadedLocation"? Получается надо сделать name locator "private300, 301, 302..." - чтобы точно их выделить; а проверка будет какой-то такой: if (pchar.location.boxname == "private300" || ...)?
Сообщение отредактировал Salkyn - Среда, 15.07.2015, 00:05
Спешу, посыпая пеплом свою голову, сообщить о завершении баталии "God_hit_us"! Ловушки успешно обойдены! Решив обобщить результаты работ, обнаружил, что не точно проследовал подсказке уважаемого Nathaniel, а именно:
Искренне благодарю всех участвовавших словом и делом в данном квесте
P.S. Повторю совет, уже звучавший где-то тут: если что-то не работает - тысячу раз внимательно проверьте, все ли сделали как надо - вплоть до последней запятой!
Помнится, когда-то я писал вот такую интересную проверку с целью немного разнообразить диалоги в игре. Речь идёт о квесте Аскольда!
Код
if (pchar.location == "BasTer_store") { dialog.text = "Ради бога, " + GetAddress_Form(pchar) + ", не переживайте! Вы не останетесь без вознаграждения. Итак, слушайте внимательно\n"+ "В нашем городе проживает один странный человек по имени Аскольд."; } else { dialog.text = "Ради бога, " + GetAddress_Form(pchar) + ", не переживайте! Вы не останетесь без вознаграждения. Итак, слушайте внимательно\n"+ "В городе Бас-Тер живет один весьма странный человек по имени Аскольд."; }
Такой пример можно прописать в файле Common_rumours.c в кейсе "AscoldTrader_2". Собственно, этот опыт и позволил мне припомнить, как проверяется подобное условие. Что и навело на мысль подсказать именно это. А в каких конкретно случаях используется pchar.location.id - я и сам не помню, честно говоря. Я был на краю земли, на краю бескрайних озёр, за горизонтом и на вершинах самых высоких гор. Но я не нашёл там никого, кто не был бы моим другом!
Приветствую! Такой вопрос: как сделать определенное условие на взятие квеста? Ну то бишь, хочу реализовать фичу с генерацией специального НПС в одном из случайных городов при достижении ГГ n-го лвла. И еще не помешало бы тыкнуть носом в функцию аля "нпс подбегает и сам начинает диалог" Благодарю заранее
в функцию аля "нпс подбегает и сам начинает диалог"
Если просто для нпс типа Citizen, будут как в генераторах приставать.
Код
ch.talker = int Variable; // нпс типа citizen при сближении с ГГ на 3м сам начнет диалог с вероятностью, заложенной в Variable - от 1 до 10 (чем больше цифра, тем выше вероятность). Попытка диалога при сближении будет продолжаться до тех пор, пока не удастся.
Предварительно для этого прописать его как отдельного НПС? И куда прописывать этот код, вроде в characters_init не пропишешь, или ошибаюсь? Но вот вопрос с условием получения квеста / генерации этого НПС остается открытым)
Сообщение отредактировал Замбезия - Вторник, 31.05.2016, 23:10
Предварительно для этого прописать его как отдельного НПС? И куда прописывать этот код...
Я прописываю в 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