Это популярное сообщение. Карлан 1 049 Опубликовано 17 Октября 2014 Это популярное сообщение. Поделиться Опубликовано 17 Октября 2014 (изменено) Данная разработка направлена на доработку торговли между ГГ и сталкерами. Проделана большая работа, существенно расширен стандартный функционал и убраны баги оригинальной игры. Основные особенности:- Весь ассортимент доступен сразу, а не по мере прохождения- Ассортимент торговцев время от времени меняется (некоторые вещи можно получить только по заказу)- Индивидуальные торговые условия у каждого сталкера, которые зависят от многих параметров (см. подробное описание)- Сталкеры торгуют между собойТехнические: полностью переписан менеджер, торговля полностью переведена на скрипты.ТорговцыТеперь ассортимент всех торговцев Зоны меняется время от времени (читай - "динамически", примерно раз в игровой день). Подробнее о новой системе торговли Вы сможете узнать из первого диалога с Сидоровичем. Убран баг (оригинальной игры), когда при перезагрузке игры ассортимент торговца "обнулялся", сейчас вы такого не увидите. Будет много аптечек, но если Вы их все скупите, то они больше не появятся в ассортименте до следующего обновления запасов торговца. Так же обновление ассортимента подкреплено выдачей новости в сталкерский канал (см. скрин). Цена формируется по многим показателям, а именно: Репутация и ранг игрока (если Вы будете опытный и уважаемый сталкер, то торговцы будут активнее с Вами торговать, коррелировать цены в Вашу пользу, скупать больше видов товаров, и т.д.) На каждый предмет для каждой локации есть базовая накрутка (различного рода издержки барыги), так же плюсуется личная жадность каждого торговца Группировка игрока (если вы будете одной группировки с торговцем, то он скинет для вас цены) Реализован функционал удобного изменения цены после выполнения каких-либо заданий СталкерыОтныне у каждого ходока будет индивидуальный подход к торговле, он будет избирательно покупать и продавать Вам вещи. Если Вы новичок, и торгуете с мастером, то не ждите лояльной ценовой политики, но лучше быть новичком, чем плохим парнем, сталкеры к репутации относятся щепетильнее торговцев. Каждая группировка будет торговать с Вами по своим правилам. Если сталкер Вам друг, то он будет с Вами охотнее торговать, устанавливать меньшие цены, а так же сможет продать Вам лучшее, что у него есть. Список предметов формируется на данный момент по следующим критериям: Индивидуальный торговый лист для каждого персонажа (список предметов формируется в зависимости от того, что есть у сталкера в рюкзаке) Индивидуальный торговый лист для дружественного персонажа Различные торговые листы у всех группировок Покупают только то оружие, которое лучше чем у них Аддоны покупаются только для того оружия, которое они используют Артефакты покупаются все, продаются только те, которые дают меньший эффект чем другие из категории Медикаменты и еда продаются/покупаются только если их больше/меньше установленного количества, при этом продаются худшие из того, что есть, покупают все Части монстров продаются и покупаются без ограничений (разумные рамки все-же выставлены) Патроны покупаются только в том случае, если у сталкера есть оружие для них Изменение торговых условий у различных группировок после выполнения заданий Изменение торговых условий у различных группировок в зависимости от локации По оружию алгоритм следующий, у оружия, как и у любого предмета есть некий условный ранг (уровень - если хотите), и есть число, которое определяет сколько единиц может иметь НПС (разумеется это распространяется только на торговлю), т.о. мы получаем, если такой-же ствол сталкер имеет, то он может купить себе второй "про запас", ну типа я посчитал, что исходим из того что "пристрелялся" ну или "запчасти", как-раз вроде как уходим в сторону фейковых оффлайн событий. Но все же это контролируется тем самым числом, которое контролирует максимальное количество переносимых единиц оружия. Теперь опишу логику торговли оружием со сталкерами по пунктам:- Если ранг стволов совпадает, то если у НПС меньше или равно стволов относительно тому самого порога, то он будет готов докупить себе стволов "про запас". Ровно столько, сколько ему позволит пороговое число. Обычно я ставлю единицу. Но при некоторых условиях число может меняться. Например у актора херовая репутация, и он продает НПС стволы за копейки, и если ствол хороший, то почему бы ради своей наживы на закупить побольше?- Если ранг продаваемого актором ствола меньше, чем есть у НПС он его никогда не купит. Вообще. Так же стволы хуже по рангу у себя он выставляет на продажу, опять же продает оставляя минимальное количество, чаще распродает все.- Если ранг продаваемого актором ствола больше, чем есть у НПС, то он его с радостью купит. Но если у него таких стволов у самого много, то он не будет их покупать а тоже постарается слить.- Так же учитывается состояние предмета. В видео я это отключил, т.к. хотел показать несколько другой момент. Стволы классифицируются по группам (пистолеты, автоматы, дробовики, гранатометы), для каждой группы действует свое число ограничения, и каждая группа предметов торгуется в отдельности, так что не стоит боятся того, что НПС сможет продать вам, к примеру, все пистолеты что у него есть. Далее...Я отказался от реализации "блуждающих" торговцев, идею о которых я ранее поддерживал. Объясню почему на примере: по каким критериям сталкер становиться торговцем? Вестимо по тому, сколько он уже барахла себе подобрал. Допустим если их делать статичными это еще можно как-то проглотить, т.е. на лагере родился барыга (хотя опять же неясно почему награбленное в общак не кинуть), ну а "блуждание" тут выливается в весьма комичную картину. Допустим что идет перестрелка долговцев и свободовцев на абстрактной локации, допустим свобода побеждает (если хотите - долг, не принципиально ), один ушлый боец умудряется набрать хабара и перешагнуть тот порог, при котором мы переквалифицируем сталкера в торговца, и свободовец переводится в торгаши и начинает "блуждать", и тут внезапно он приходит на базу долга и, если с технической стороны рассматривать этот вопрос, с успехом продает "награбленное" всему лагерю. С точки зрения здравой логики - этого "торговца" еще на подходе к базе должны будут застрелить (но по факту же вроде как нельзя, с торгашами нейтралитет). В общем иными логическими умозаключениями я себе эту возможность обложить не смог, поэтому denied. Технический моментВ главном скрипте написал на мой взгляд подробный туториал по настройке таблицы и дополнительному массиву характеристик. Методы:1. Запрет покупки/продажи (в т.ч. и по отдельности) итема по айди.2. Запрет покупки/продажи итема по секции.3. Запрет покупки итема по кондиции (аналог ЗП).4. Запрет покупки итема определенной секции по кондиции.5. Универсальный хак для удобной работы с листом.Коллбеки:1. Старт диалога2. Перемещение итема в/из лист(а) продажи актора3. Перемещение итема в/из лист(а) покупки актора4. В trade_sell_buy_item теперь вкидываются продавец и покупатель Еще прошу заметить, это важно(!), что в оригинальной игре сталкеры имеют весьма скудное наполнение инвентаря, а мой скрипт высчитывает конфиг именно исходя из наполнения инвентаря, т.е. хочу сказать, что в оригинальной игре вам будут редко попадаться товары на продажу. Так что либо в ручную доспавнивать каким-либо способом, либо заюзать схему собирательства или другие варианты обогащения сталкеров. Немного наглядности:1. Сталкер готов купить обрез, но ему нафиг не нужна дробь.2. Давайте продадим ему обрез.3. Теперь наш сталкер готов купить патроны к обрезу, но сам обрез продавать нам разумеется не собирается, так как это лучшее, что у него есть.Обратите внимание на цены у друга и нейтрала, я еще их не до конца настроил, но тем не менее уже что-то можно увидеть.Нейтрал:Друг:И демонстрация зачатков баланса, здесь можно узреть основной вектор в направлении которого я работаю. В общем даже в оригинале будет тяжелее заработать миллионы на перепродаже вещей, которые торговцы могут сами раздобыть, но на артефактах и частях монстров можно будет неплохо заработать.Оповещение:Еще немного "баланса":Сообщения причины неликвидности товара:1. Поломанные итемы не покупаются (как в ЗП) 2. Ничего особенного, "скрины в движении" Решил написать подробную инструкцию по использованию, так как добавлено всего много, и те, кто скачал часто пишут в стиле «вы там поссать ушли или че, мы тут в непонятках», версию до того, что было поставлено не дотянула, сейчас уже нет возможности. Поэтому функции все есть, протестированы и работают, но функционал немного староват, но плюс в том, что адаптируется легко под 6 патч, в целом под него и написан, поэтому довольно много эзотерики. Да ладно, это все лирика, перейдем к делу.Большая популярность мода мне ясно дала понять, что дальнейшей разработкой, доработкой и развитием заниматься смысла нет никакого, мое последнее прощай.Что это и зачем объяснено в шапке, если кому-то что-то неясно можете задавать вопросы, я отвечу.Из движка мне было лень выкидывать все что я там делал, поэтому пользуйтесь на здоровье, но опишу только функции с торговлей.Итак, ключевые лица:karlan_trade_extensions.script – универсальный хак торговлиm_trade.script – сам модуль торовлиmanager_trade.script – переработанный менеджер торговли1. karlan_trade_extensions.scriptИмеет вид: // !!!don't del me!!! // trade universal hack by Karlan function can_item_trade(first_trader,second_trader,item) return true end Удалять его низя, функция вызывается на каждый добавляемый итем в торговый лист с возможностью запрета, так же добавляются оба агента торговли. Если функция возвращает тру – итем добавляется, фолс – не добавляется. Как использовать – очевидно.2. m_trade.scriptТут самое интересное, весит много, но пугаться не стоит. Принцип работы описывать долго и бесполезно, поэтому опишу только использование. --// для теста заполним первую таблицу всеми воможными ключами --// торговать могут все чем только можно, но с заданной вероятностью --// если переводить таблицу на скриптовый рандом то нужно учитывать единицу у первого ключа, если рандом будет максимальным, то итема добавится (max random + 1) { --// имя секции [required] name = "bandage", --// таблицы формирования списков и цен для торговцев и группировок [optional]:[base = tutor] -- 1 сколько товара минимум -- 2 сколько товара максимум -- 3 макстмальная цена покупки у актора -- 4 минимальная цена покупки у актора -- 5 максимальная цена продажи актору -- 6 минимальная цена продажи актору -- 7 минимальное значения счетчика увеличения товара -- 8 максимальное значение счетчика увеличения товара -- 9 вероятность появления типа товара в продаже ["3"] = {20,(math.random(40,60)/100), 0.1,0.05, 4,2, 2,3, 80}, ["3_esc_kill_bandits_quest_done"] = {30,(math.random(40,60)/100), 0.2,0.1, 3.7,1.5, 3,4, 90}, ["500"] = {50,(math.random(40,60)/100), 0.16,0.04,4,2, 2,3, 80}, ["500_yan_labx16_switcher_primary_off"] = {60,(math.random(35,55)/100), 0.2,0.08, 4,2, 3,4, 90}, ["500_bar_darklab_document_done"] = {70,(math.random(30,50)/100), 0.4,0.15, 4,2, 4,5, 100}, ["506"] = {40,(math.random(40,60)/100), nil,nil, 3,1.5, 1,3, 90}, ["506_bar_svoboda_rg6_done"] = {50,(math.random(35,55)/100), nil,nil, 2,1, 2,3, 100}, ["734"] = {30,(math.random(40,60)/100), nil,nil, 3,1.5, 1,3, 80}, ["734_mil_leader_quest2_complete"] = {40,(math.random(40,60)/100), nil,nil, 2.8,1.2, 2,3, 90}, ["734_mil_lukash_dolg_task_complete"] = {50,(math.random(35,55)/100), nil,nil, 2,1, 3,4, 100}, ["902"] = {60,(math.random(35,55)/100), nil,nil, 2,1, 4,5, 100}, ["902_yan_kill_brain_done"] = {70,(math.random(35,55)/100), nil,nil, 2,1, 5,6, 100}, --// вот так например можно менять цены и ассортимент у группировки после получения какого-то инфопоршня [optional]:[base = tutor] ["stalker_esc_kill_bandits_quest_done"] = {4,0.4,0.18,0.07,4,2,1,1, 100}, ["stalker"] = {3,0.4,0.18,0.07,4,2,1,1, 100}, ["ecolog"] = {30,0.4,0.18,0.07,4,2,1,1, 100}, ["dolg"] = {30,0.4,0.18,0.07,4,2,1,1, 100}, ["freedom"] = {30,0.4,0.18,0.07,4,2,1,1, 100}, --// эту таблицу будут юзать все, в случае отсутствия спецзаданной [optional]:[base = tutor] all = {30,0.4,0.18,0.07,4,2,1,1, 100}, --// ТОДО: выяснить очереедность выдачи инфопоршней, пока как в оригинальном конфиге (на авось), но все вроде как надо работает [optional]:[base = tutor] info = {"esc_kill_bandits_quest_done", "yan_labx16_switcher_primary_off", "bar_darklab_document_done", "yan_kill_brain_done", "bar_svoboda_rg6_done", "mil_leader_quest2_complete", "mil_lukash_dolg_task_complete"}, --// у этих приоритет выше [required] traders = {3, 500, 506, 734, 902}, buyer = {3, 500}, --// чем у этих [required] sell_stalkers = {"stalker", "ecolog", "dolg", "freedom"}, --// товары которые они продают sell_stalkers_friend = {"stalker", "ecolog", "dolg", "freedom", "frien"}, buy_stalkers = {"stalker", "ecolog", "dolg", "freedom"}, --// товары которые покупают buy_stalkers_friend = {"stalker", "ecolog", "dolg", "freedom", "frien"}, --// предикат по количеству для торговли со сталкерами [optional]:[base = 1] max_cnt = 3, --// предикат по рангу(фейковому) итема для торговли со сталкерам [optional]:[base = 1] item_rank = 1, --// предикат по левелу (как вариант совместить с ранговыми таблицами, но тогда полтоно нереально увеличится, а выхлоп небольшой, пока пусть так будет) [optional]:[base = tutor] levels = { --| торгуемость | актор продает (коэфф.)| актор покупает (коэфф.)| -- ["l01_escape"] = {trade = true, 1, 1}, ["l02_garbage"] = {trade = true, 1, 1}, ["l03_agroprom"] = {trade = true, 1, 1}, ["l03u_agr_underground"] = {trade = true, 1, 1}, ["l04_darkvalley"] = {trade = true, 1, 1}, ["l04u_LabX18"] = {trade = true, 1, 1}, ["l05_bar"] = {trade = true, 1, 1}, ["l06_rostok"] = {trade = true, 1, 1}, ["l07_military"] = {trade = true, 1, 1}, ["l08_yantar"] = {trade = true, 1, 1}, ["l08u_brainlab"] = {trade = true, 1, 1}, ["l09_deadcity"] = {trade = true, 1, 1}, ["l10_radar"] = {trade = true, 1, 1}, ["l10u_bunker"] = {trade = true, 1, 1}, ["l11_pripyat"] = {trade = true, 1, 1}, ["l12_stancia"] = {trade = true, 1, 1}, ["l12u_sarcofag"] = {trade = true, 1, 1}, ["l12u_control_monolith"] = {trade = true, 1, 1}, ["l12_stancia_2"] = {trade = true, 1, 1}, }, }, Описывать досконально все довольно долго, я лучше буду пояснять конкретные непонятные моменты.Менеджер торговли описывать не вижу смысла, это практически полный обезглюченный менеджер который написан с нуля под нужды динамического обновления и прочих ништяков.Теперь описание движковых функций и коллбеков.У меня не осталось никаких хвостов по материалам, что сообразить и вспомнить смогу то и напишу, последний раз этим в апреле занимался.Добавлены ключи дисконтов такие же как в ЗП. Добавлен порог убитости итема ниже которого НПС не купит предмет у ГГ. Еще хотел конфиг доапдейтить, но забил, так что больше ничего нет. В общем ключи также называются чтобы народ не путать.Коллбеки: on_start_dialog to_our_trade to_others_trade to_our_bag to_others_bag Думаю, что какой означает – ясно из названия. В первый падают агенты, в остальные четыре юзердата итема.Методы: set_tradable_item_id(u16, bool, bool) - торгуемость по айди get_tradable_item_id(u16, string) set_tradable_item_section(string, bool, bool) - торгуемость по секции get_tradable_item_section(string, string) buy_item_condition_factor(float) – аналог ЗП set_section_condition_factor(section, float, float) - установка по какой кондиции купит/продаст get_section_condition_factor(string, string) Все методы для inventoryowner. Почему нет метода для изменения цены итема ингейм? А черт его знает, мне это было не нужно, не помню даже было это в планах или нет. Так или иначе это все довольно просто делается, можно написать хак напрямую, можно сделать элегантный метод, кому как удобнее. Если острая необходимость возникнет - добавлю, дело нескольких минут. Чтобы небыло косяков необходимо менять флаги группировки итемов через flags16() и метод set_inventory_item_flags, функции крайне замудренные, спрашивал многих как с ними работать, в результате так никто и не помог, разобрался сам. В общем сделал две вменяемых обертки set_groupable, set_ungroupable, как они работают я не буду объяснять это муторно и все равно мало кто въедет. Добавлены статики: <string id="st_not_interested_item_other"> <text>Торговец не заинтересован в этом предмете.</text> </string> <string id="st_not_interested_section_other"> <text>Торговец не интересуется подобными предметами.</text> </string> <string id="st_not_interested_broken_item_other"> <text>Предмет в слишком плохом состоянии для продажи.</text> </string> Так же karlan_trade_ext_static статик который можно к примеру динамически менять, этот статик выскакивает если итем не может продаться по скрипту karlan_trade_extensions.script. С ним можно на любых условиях сделать любую причину отказа покупки товара, это на тот случай если тех что я добавил для вас будет недостаточно . Пока все, все что хотел – освятил. Если что-то непонятно пишите. Ссылки: в блоге.Версия: 1.4 RCБлагодарности: @Artos, @CharsiПлатформа: 1.0007 [r188] (качать отсюда)Установка: переместите папки gamedata и bin в корневой каталог игры с заменой файлов (предварительно нужно удалить текущую папку gamedata, и, желательно, забекапить текущую папку bin). Я всегда открыт для обсуждения текущих технических и идеологических аспектов мода. Enjoy! Изменено 15 Октября 2015 пользователем Карлан 2 23 1 2 Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 19 Октября 2014 Поделиться Опубликовано 19 Октября 2014 (изменено) Идея вообще-то есть, но это для другого мода. Торговля между неписями и "челноки", сиречь, неписи, являющиеся/становящиеся бродячими трэйдерами по мере скопления барахла в пределах лагеря. Но сюда оно просто мисконцепт. А то, что есть - глядишь, кому и пригодится зачем-нибудь. Но, да, коды с конфигами уже видеть было бы на много полезнее, чем картинки. P.S. Картинок ниочемных на форуме вообще многовато развелось, на мой взгляд. Что-бы ходили они и между собой торговали, это аи-схему нужно писать, я не умею пока. По кодам, таблицы сейчас сижу пишу, они очень большие, самая долгая часть разработки будет пожалуй. А блуждающих по зоне псевдоторговцев действительно не так трудно сделать, спасибо за идею, займусь на досуге. Карлан. Изменено 19 Октября 2014 пользователем Карлан 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
amik 253 Опубликовано 19 Октября 2014 Поделиться Опубликовано 19 Октября 2014 Dennis_Chikin я тоже над этим думал, хотел гопников сделать и торговцев бродячих... чтобы ходили по лагерям разных локаций. Но в меру своих знаний закинул эту идею(( Было бы круто такое увидеть. Кстати караванчик как в ФО3 хорошо бы вписался + два охранника (follower-а). Мой архив Сталкером не занимаюсь. Ссылка на комментарий
alex5773 1 330 Опубликовано 7 Февраля 2015 Поделиться Опубликовано 7 Февраля 2015 А вот если ему продавать другие разные стволы, то он все их скупит? Куда ему столько стволов? По моему надо как-то сделать чтоб они покупали оружие только которое лучше чем у их имеется, и покупали чтоб всего один раз, заменяя своё как-бы. Сможешь так сделать? Так-бы реалистичней было, зачем ему стволы хуже чем у него есть, или зачем ему такие-же стволы. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 7 Февраля 2015 Поделиться Опубликовано 7 Февраля 2015 (изменено) "как-то сделать чтоб они покупали оружие только которое лучше чем у их имеется," - делов-то...Все банально зависит собственно от того, что дальше планируется делать со скупленным.Как бы, "логика торговли" - вообще совершенно отдельный вопрос, "на вкус и цвет". "Логика торговли" - я имел ввиду сам скрипт, к балансу он абсолютно никакого отношения не имеет. Т.е. что-бы откровенной ахинеи не было в торговых условиях. Карлан. Изменено 16 Марта 2015 пользователем Карлан Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Карлан 1 049 Опубликовано 7 Февраля 2015 Автор Поделиться Опубликовано 7 Февраля 2015 Ребят, может кто не понял, думаю еще раз стоит объяснить. Это не глобальный мод, это специализированный мод, поэтому прошу не задавать вопросов и не предлагать идей, которые не относятся к торговле в принципе (к ней конечно относится в принципе весь игровой процесс, но давайте тут все же только моментами, которые можно использовать без переделки чего-то кроме конфигов, обойдемся). Так же по поводу "вкуса и цвета" я согласен и никогда не буду кричать и спорить, что мои взгляды лучше ваших, считаете я сделал убого - переделайте под себя, я подробно описал как. Моя настройка дисконтов далеко не панацея. Да и сам этот мод не панацея. Всегда все можно переделать, ну или не трогать вообще. Ссылка на комментарий
Panda19 119 Опубликовано 8 Февраля 2015 Поделиться Опубликовано 8 Февраля 2015 (изменено) Направленность идей понятна, вопрос снимается. Вопрос, а обмен? Если есть что-то хорошее, обменять на другое. Патроны на аптечку и антирад или еду. Хотя в игре - деньги нейтральный эквивалент всему. Но всё же... Это есть в планах, но не в первоочередных. Так же есть идея добавить заказ товаров, как у торговцев, так и у сталкеров, даже реализация набросана кое-какая, но пока об этом рано что-либо говорить. Надо торговлю окончательно допилить. Как-то нужно расставлять приоритеты и делать последовательно я думаю, а то есть риск не сделать нифига нормально, либо нифига вообще . Изменено 8 Февраля 2015 пользователем Карлан Ссылка на комментарий
dromundus 90 Опубликовано 9 Февраля 2015 Поделиться Опубликовано 9 Февраля 2015 (изменено) Если убрать у нпс бесконечные патроны.. В совмещении с торговлей между собой и собирательством НПС будут более активно торговать и выживать.И это будет влиять на их поведение и логику.А патроны можно подспавнивать/пополнять при спавне на локе.Тоже самое с едой сделать включив у них голод.Тогда часть инвентаря у них будет для себя , а часть на продажу в зависимости от физ состояния..И цена может варьироваться...Соответственно, скорость передвижения, усталость зависят от веса того, что у них есть в инвентаре....Если в экзо вес соответственно больше ....И.т.п.Тогда нпс будет "думать" воевать или торговать, или выживать...Торгуя не только с ГГ но ис торговцами и НПС.Думаю, одно отключение бесконечных патронов изменит многое..Конечно попахивает глобалкой, но всё ведь там связано... Учитывая что НПС не воюют между собой в принципе, то да. Здесь все уже нужно менять, ты высказываешь идею расширения геймплея, а не торговли. Расширение торговли здесь вываливается как побочный продукт реализации расширения геймплея, не больше. Карлан. Изменено 9 Февраля 2015 пользователем Карлан 1 Ссылка на комментарий
Panda19 119 Опубликовано 9 Февраля 2015 Поделиться Опубликовано 9 Февраля 2015 (изменено) Приоритеты в игре, например у меня в начале игры: 1. Нож -разовое (ящики вскрывать). 2. Оружие (пистолет, лучше обрез). 3. Патроны к нему. 4. Бинты. 5. Аптечки, 6. Антирад. 7. Броня. 8. Еда - если голод наступает медленно. Если от еды зависит сила и выносливость, то тогда на 2 место. Бинокль, фонарь это разовые приобретения. Ножом все пользуются что-бы патроны не тратить для разбиения ящика. Пистолетом после АТП никто не пользуется вообще. Поэтому подобное ставить в верхушку линейки приоритетов я бы не стал. Ну и это все же вопрос тараканов в голове, а не реализации. У меня все приоритеты по группам распределены, общей иерархии нет. Бинокль и фонарь опят же зависит от их реализации, в оригинале может и разовые, но можно сделать и фонари которые лучше светят, или бинокли которые врагов рамками выделяют/не выделяют, ну и расширять ассортимент, только это опять же уже не расширение торговли, а расширение ассортимента. Карлан. Изменено 9 Февраля 2015 пользователем Карлан Ссылка на комментарий
Panda19 119 Опубликовано 11 Февраля 2015 Поделиться Опубликовано 11 Февраля 2015 Причина не использования пистолетов: 1. Убойность и точность пистолетов (убойность на большое расстояние не нужна). 2.Изобилие и дешевизна автоматных и винтовочных патронов. 3. Лёгкость зарабатывания денег. Если сделать обмен винтовочных и автоматных патронов с НПС на аптечки, антирад, артефакты. У торговцев только на артефакты, а пистолетные в свободной продаже. Тогда и пистолеты будут ходовым товаром. Ссылка на комментарий
Panda19 119 Опубликовано 12 Февраля 2015 Поделиться Опубликовано 12 Февраля 2015 (изменено) Например - Desert Eagle Mark XIX -получаем у Макса, вроде вещь хорошая а пользы ни какой. Ни убойности не точности - за такой "подарок" квест выполнять смысла нет, вот если бы его на что-то у какого-нибудь "коллекционера" можно было бы обменять, тогда да. Аналогично и с другими "униками" (оружие, броня). На то, что нельзя купить в игре. Вообще не тот путь для решения подобных проблем. Карлан. Изменено 13 Февраля 2015 пользователем Карлан Ссылка на комментарий
HellRatz 2 887 Опубликовано 12 Марта 2015 Поделиться Опубликовано 12 Марта 2015 (изменено) по каким принципам и правилам должны торговать между собой сталкеры?... так и с торговцами Тут я думаю ничего особо нового. Сталкеры пускай торгуют между собой мелочевкой: еда там, патроны может, медикаменты, мелкое оружие, свои старые костюмы новичкам всяким, допустим. Единственное что, артефакты я бы заставил НПС обменивать на снаряжение, а не продавать сталкеру, ибо торговцу продать его всяко дороже, а вот выменять на что-то вполне может быть выгодно для НПС-а на тот момент (Например, у него обрез, а за артефакт ему предлагают "спас"). Ну, а предметы крупнее уже пускай торговцам сливают. Лично я вижу такую систему. Мне никогда не было понятно, почему "новичков" всегда держат за полных идиотов. В остальном ничего интересного. Карлан. Изменено 16 Марта 2015 пользователем Карлан GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
Panda19 119 Опубликовано 13 Марта 2015 Поделиться Опубликовано 13 Марта 2015 (изменено) Принцип простой для НПС: 1. Ввести ограничение по весу носимого груза. 2. Продавать излишки. Чем меньше остаётся тем дороже продаёт. 3. Оставлять себе лучшее. 4. Не собирать оружие убитое более 50%. Пусть ГГ "хомячит" и несёт Старьёвщикам. 5. Продавать артефакты дороже, чем купит торговец. 6. НПС рангом выше продают дороже, покупают дешевле. (типа "салага" ещё). 7. При хорошей репутации и оказании помощи цена снижается. Вы шапку читаете? Старьевщики не покупают хлам, они покупают ценное старье, от ваших изломанных ПМов ему никакой выгоды. В остальном все давно реализовано, читайте шапку. Карлан. Изменено 16 Марта 2015 пользователем Карлан Ссылка на комментарий
LoNer1 26 Опубликовано 31 Марта 2015 Поделиться Опубликовано 31 Марта 2015 I'm sorry if I come of as stupid, but where can I download this? It looks really good. Добавлено Dennis_Chikin, 31 Марта 2015 It's not ready yet. Добавлено Карлан, 1 Апреля 2015 Please, read the top message. Download link you are find in my blog. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 5 Апреля 2015 Поделиться Опубликовано 5 Апреля 2015 (изменено) Почитал шапку обновленную... По поводу идеи "блуждающих торговцев" - оно нормально реализуется, но это просто совсем другая тема. Ни каких живописуемых ужасов с выбором "барыги"/"общака" и гонцов, бегающих под обстрелом, там нет, но с DTL этот вопрос не пересекается просто вообще ни как.Это, на самом деле, вопрос управления смартеррейнами. Изменено 10 Апреля 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Panda19 119 Опубликовано 17 Апреля 2015 Поделиться Опубликовано 17 Апреля 2015 (изменено) Вопрос... Как я могу это использовать? На какой версии могу попробовать? Чтоб написать отзыв нужно попробовать. Простая установка не катит. Помимо архива с движком есть архив с другим кодом (скрипты/конфиги), тут я его не выкладываю по ранее описанным причинам, ссылки на него находятся там, где указано в шапке. Никаких геймплейных изменений движок не несет . Карлан. Изменено 17 Апреля 2015 пользователем Карлан Ссылка на комментарий
Карлан 1 049 Опубликовано 10 Июля 2015 Автор Поделиться Опубликовано 10 Июля 2015 Решил написать подробную инструкцию по использованию, так как добавлено всего много, и те, кто скачал часто пишут в стиле «вы там ушли или че, мы тут в непонятках», версию до того, что было поставлено не дотянула, сейчас уже нет возможности. Поэтому функции все есть, протестированы и работают, но функционал немного староват, но плюс в том, что адаптируется легко под 6 патч, в целом под него и написан, поэтому довольно много эзотерики. Да ладно, это все лирика, перейдем к делу.Большая популярность мода мне ясно дала понять, что дальнейшей разработкой, доработкой и развитием заниматься смысла нет никакого, мое последнее прощай.Что это и зачем объяснено в шапке, если кому-то что-то неясно можете задавать вопросы, я отвечу.Из движка мне было лень выкидывать все что я там делал, поэтому пользуйтесь на здоровье, но опишу только функции с торговлей.Итак, ключевые лица:karlan_trade_extensions.script – универсальный хак торговлиm_trade.script – сам модуль торовлиmanager_trade.script – переработанный менеджер торговли1. karlan_trade_extensions.script Имеет вид: // !!!don't del me!!! // trade universal hack by Karlan function can_item_trade(first_trader,second_trader,item) return true end Удалять его низя, функция вызывается на каждый добавляемый итем в торговый лист с возможностью запрета, так же добавляются оба агента торговли. Если функция возвращает тру – итем добавляется, фолс – не добавляется. Как использовать – очевидно. 2. m_trade.script Тут самое интересное, весит много, но пугаться не стоит. Принцип работы описывать долго и бесполезно, поэтому опишу только использование. --// для теста заполним первую таблицу всеми воможными ключами --// торговать могут все чем только можно, но с заданной вероятностью --// если переводить таблицу на скриптовый рандом то нужно учитывать единицу у первого ключа, если рандом будет максимальным, то итема добавится (max random + 1) { --// имя секции [required] name = "bandage", --// таблицы формирования списков и цен для торговцев и группировок [optional]:[base = tutor] -- 1 сколько товара минимум -- 2 сколько товара максимум -- 3 макстмальная цена покупки у актора -- 4 минимальная цена покупки у актора -- 5 максимальная цена продажи актору -- 6 минимальная цена продажи актору -- 7 минимальное значения счетчика увеличения товара -- 8 максимальное значение счетчика увеличения товара -- 9 вероятность появления типа товара в продаже ["3"] = {20,(math.random(40,60)/100), 0.1,0.05, 4,2, 2,3, 80}, ["3_esc_kill_bandits_quest_done"] = {30,(math.random(40,60)/100), 0.2,0.1, 3.7,1.5, 3,4, 90}, ["500"] = {50,(math.random(40,60)/100), 0.16,0.04,4,2, 2,3, 80}, ["500_yan_labx16_switcher_primary_off"] = {60,(math.random(35,55)/100), 0.2,0.08, 4,2, 3,4, 90}, ["500_bar_darklab_document_done"] = {70,(math.random(30,50)/100), 0.4,0.15, 4,2, 4,5, 100}, ["506"] = {40,(math.random(40,60)/100), nil,nil, 3,1.5, 1,3, 90}, ["506_bar_svoboda_rg6_done"] = {50,(math.random(35,55)/100), nil,nil, 2,1, 2,3, 100}, ["734"] = {30,(math.random(40,60)/100), nil,nil, 3,1.5, 1,3, 80}, ["734_mil_leader_quest2_complete"] = {40,(math.random(40,60)/100), nil,nil, 2.8,1.2, 2,3, 90}, ["734_mil_lukash_dolg_task_complete"] = {50,(math.random(35,55)/100), nil,nil, 2,1, 3,4, 100}, ["902"] = {60,(math.random(35,55)/100), nil,nil, 2,1, 4,5, 100}, ["902_yan_kill_brain_done"] = {70,(math.random(35,55)/100), nil,nil, 2,1, 5,6, 100}, --// вот так например можно менять цены и ассортимент у группировки после получения какого-то инфопоршня [optional]:[base = tutor] ["stalker_esc_kill_bandits_quest_done"] = {4,0.4,0.18,0.07,4,2,1,1, 100}, ["stalker"] = {3,0.4,0.18,0.07,4,2,1,1, 100}, ["ecolog"] = {30,0.4,0.18,0.07,4,2,1,1, 100}, ["dolg"] = {30,0.4,0.18,0.07,4,2,1,1, 100}, ["freedom"] = {30,0.4,0.18,0.07,4,2,1,1, 100}, --// эту таблицу будут юзать все, в случае отсутствия спецзаданной [optional]:[base = tutor] all = {30,0.4,0.18,0.07,4,2,1,1, 100}, --// ТОДО: выяснить очереедность выдачи инфопоршней, пока как в оригинальном конфиге (на авось), но все вроде как надо работает [optional]:[base = tutor] info = {"esc_kill_bandits_quest_done", "yan_labx16_switcher_primary_off", "bar_darklab_document_done", "yan_kill_brain_done", "bar_svoboda_rg6_done", "mil_leader_quest2_complete", "mil_lukash_dolg_task_complete"}, --// у этих приоритет выше [required] traders = {3, 500, 506, 734, 902}, buyer = {3, 500}, --// чем у этих [required] sell_stalkers = {"stalker", "ecolog", "dolg", "freedom"}, --// товары которые они продают sell_stalkers_friend = {"stalker", "ecolog", "dolg", "freedom", "frien"}, buy_stalkers = {"stalker", "ecolog", "dolg", "freedom"}, --// товары которые покупают buy_stalkers_friend = {"stalker", "ecolog", "dolg", "freedom", "frien"}, --// предикат по количеству для торговли со сталкерами [optional]:[base = 1] max_cnt = 3, --// предикат по рангу(фейковому) итема для торговли со сталкерам [optional]:[base = 1] item_rank = 1, --// предикат по левелу (как вариант совместить с ранговыми таблицами, но тогда полтоно нереально увеличится, а выхлоп небольшой, пока пусть так будет) [optional]:[base = tutor] levels = { --| торгуемость | актор продает (коэфф.)| актор покупает (коэфф.)| -- ["l01_escape"] = {trade = true, 1, 1}, ["l02_garbage"] = {trade = true, 1, 1}, ["l03_agroprom"] = {trade = true, 1, 1}, ["l03u_agr_underground"] = {trade = true, 1, 1}, ["l04_darkvalley"] = {trade = true, 1, 1}, ["l04u_LabX18"] = {trade = true, 1, 1}, ["l05_bar"] = {trade = true, 1, 1}, ["l06_rostok"] = {trade = true, 1, 1}, ["l07_military"] = {trade = true, 1, 1}, ["l08_yantar"] = {trade = true, 1, 1}, ["l08u_brainlab"] = {trade = true, 1, 1}, ["l09_deadcity"] = {trade = true, 1, 1}, ["l10_radar"] = {trade = true, 1, 1}, ["l10u_bunker"] = {trade = true, 1, 1}, ["l11_pripyat"] = {trade = true, 1, 1}, ["l12_stancia"] = {trade = true, 1, 1}, ["l12u_sarcofag"] = {trade = true, 1, 1}, ["l12u_control_monolith"] = {trade = true, 1, 1}, ["l12_stancia_2"] = {trade = true, 1, 1}, }, }, Описывать досконально все довольно долго, я лучше буду пояснять конкретные непонятные моменты. Менеджер торговли описывать не вижу смысла, это практически полный обезглюченный менеджер который написан с нуля под нужды динамического обновления и прочих ништяков.Теперь описание движковых функций и коллбеков. У меня не осталось никаких хвостов по материалам, что сообразить и вспомнить смогу то и напишу, последний раз этим в апреле занимался.Добавлены ключи дисконтов такие же как в ЗП. Добавлен порог убитости итема ниже которого НПС не купит предмет у ГГ. Еще хотел конфиг доапдейтить, но забил, так что больше ничего нет. В общем ключи также называются чтобы народ не путать.Коллбеки: on_start_dialog to_our_trade to_others_trade to_our_bag to_others_bag Думаю, что какой означает – ясно из названия. В первый падают агенты, в остальные четыре юзердата итема.Методы: set_tradable_item_id(u16, bool, bool) - торгуемость по айди get_tradable_item_id(u16, string) set_tradable_item_section(string, bool, bool) - торгуемость по секции get_tradable_item_section(string, string) buy_item_condition_factor(float) – аналог ЗП set_section_condition_factor(section, float, float) - установка по какой кондиции купит/продаст get_section_condition_factor(string, string) Все методы для inventoryowner. Почему нет метода для изменения цены итема ингейм? А черт его знает, мне это было не нужно, не помню даже было это в планах или нет. Так или иначе это все довольно просто делается, можно написать хак напрямую, можно сделать элегантный метод, кому как удобнее. Если острая необходимость возникнет - добавлю, дело нескольких минут. Чтобы небыло косяков необходимо менять флаги группировки итемов через flags16() и метод set_inventory_item_flags, функции крайне замудренные, спрашивал многих как с ними работать, в результате так никто и не помог, разобрался сам. В общем сделал две вменяемых обертки set_groupable, set_ungroupable, как они работают я не буду объяснять это муторно и все равно мало кто въедет. Добавлены статики: <string id="st_not_interested_item_other"> <text>Торговец не заинтересован в этом предмете.</text> </string> <string id="st_not_interested_section_other"> <text>Торговец не интересуется подобными предметами.</text> </string> <string id="st_not_interested_broken_item_other"> <text>Предмет в слишком плохом состоянии для продажи.</text> </string> Так же karlan_trade_ext_static статик который можно к примеру динамически менять, этот статик выскакивает если итем не может продаться по скрипту karlan_trade_extensions.script. С ним можно на любых условиях сделать любую причину отказа покупки товара, это на тот случай если тех что я добавил для вас будет недостаточно . Пока все, все что хотел – освятил. Если что-то непонятно пишите. 3 1 Ссылка на комментарий
Карлан 1 049 Опубликовано 20 Июля 2015 Автор Поделиться Опубликовано 20 Июля 2015 Немного дополнил функции, теперь можно устанавливать цену конкретного предмета у конкретного торговца. Каким путем: В функции get_buy_discount и get_sell_discount теперь первым аргументом вместо айди идет юзердата собеседника (для работы с конкретным агентом), далее идет результирующая цена (та по которой он купит/продаст, для собственного анализа цены), и последним идет непосредственно юзердата итема для которого высчитывается цена. То есть, говоря на луа: get_buy_discount(userdata, int, userdata) get_sell_discount (userdata, int, userdata) Эти функции, как вы знаете, возвращают параметр типа float (WTF?!), далее (в движке) он умножается на результирующую, округляется до целого, и возвращает значение от единицы до миллиона (т.е. еще раз округляется). Это следует учитывать, повторюсь, наценка не суммируется, а умножается. Самое главное, например: Пример тупой, но какой сразу в голову пришел. У нас с вами есть какая-то аптечка, она нам по особенному дорога и мы ее хотим впарить в два раза дороже цены сбыта любому торговцу. Соответственно нам надо в тело get_buy_discount вставить какой-то такой код: function get_buy_discount(npc, cost, obj) // some code return (obj and obj.is_my_medkit) and 2 or 1 //some code return 1 // необязательное универсальное условие, для подстраховки end Можно сделать и суммирование, и суммирование/умножение по условию, но пока не вижу веских причин это делать. Есть вообще такое предложение, сделать эти функции последней инстанцией формирования цены, а в движке лишь следить за пределами разумного, сейчас потестирую, скорее всего так и сделаю, и чуть в божеский вид все приведу, отпишу в итоге, обновлю. А далее я засаживаюсь пиликать торговлю и превращать это все в "симулятор трейдера"™. 1 Ссылка на комментарий
Panda19 119 Опубликовано 21 Июля 2015 Поделиться Опубликовано 21 Июля 2015 Интересно конечно, но... я в этом... как установить... ни "бум, бум...". Для меня доступно... скопировать в игру и всё....Эээээхххх.... Ссылка на комментарий
Карлан 1 049 Опубликовано 24 Июля 2015 Автор Поделиться Опубликовано 24 Июля 2015 Всем привет! Version 1.3 RC Новости и "что было сделано": - Исправлена 'неправильно' работающая логика движковых функций (возвращала единицу вместо ноля, в результате чего надо было обязательно проводить настройку всех итемов в игре как минимум для одного торговца) - Переписаны функции формирования цены для еще более тонкой настройки - Начата работа по созданию подобия денежной системы - Введено понятие (локального) дефицита товара, но еще не внедрено, делается так как задумывалось GSC, также еще один вид дефицита (глобальный), который "придумал" я, на стадии продумывания идеи - Вернулось повышение цен на аптечки если ГГ в плохом состоянии и у него мало медикаментов (не у всех торговцев, некоторые по прежнему благосклонны) - Начата разработка системы учета катаклизмов - Начата (в который раз) переработка всех торговцев, мне теперь хочется больше ударить по геймплею, чтобы каждая локация "торговала" чем-либо для ГГ выгоднее, чем другая - Обдумывается уместность конкуренции Технического плана мануал: Функции с дисконтами переименованы и переделаны так, как я писал выше, теперь они выглядят таким образом: get_buy_cost(userdata, userdata, u32, u32) get_sell_cost(userdata, userdata, u32, u32) Дабы никого не запутать, и не запутаться самому, get_buy_cost вызывается когда мы кликаем по итему из списка товаров ГГ, а get_sell_cost вызывается когда кликаем по итему из списка нашего второго экономического агента. Теперь о параметрах, первым передается экономический агент, вторым предмет, третьим цена-нетто, четвертым цена-брутто (в самом файле оформлены как '(npc, obj, net_price, gross_price)'). Функционал дисконтов никуда не потерялся, он по прежнему прямо также работает. И, самое главное, теперь эта функция занимает роль последней инстанции в формировании цены на предмет, таким образом Вы полностью, опираясь на входные данные, можете смотреть по каким ценам торгуются в данный момент эти предметы, и если вас что-то не устраивает то менять цену либо на конкретный предмет, либо на секцию, либо на какую-то группу которую Вы сами пожелаете сформировать. Те функции которые написаны в туторе, сделаны для управления списками торговли, а вот эти функции сделаны больше для управления ценами товаров из уже готового списка. Все делается ингейм, все очень удобно. Также напомню, для управления списком есть скрипт karlan_trade_extensions, там возможно управлять текущим списком, и, если потребуется, выводить динамический статик с текстом причины отказа в покупке предметов. Итого: технические работы считаю оконечными, остались приятные душе расширения, над которыми даже мозги напрягать не нужно . Поэтому когда ими займусь, тогда и займусь. Ссылка на комментарий
Рекомендуемые сообщения