Dynamic Trade Listings - Моды в разработке (ТЧ) - AMK Team
Перейти к контенту

Dynamic Trade Listings


Рекомендуемые сообщения

Идея вообще-то есть, но это для другого мода. Торговля между неписями и "челноки", сиречь, неписи, являющиеся/становящиеся бродячими трэйдерами по мере скопления барахла в пределах лагеря.

Но сюда оно просто мисконцепт.

А то, что есть - глядишь, кому и пригодится зачем-нибудь.

 

Но, да, коды с конфигами уже видеть было бы на много полезнее, чем картинки.

 

P.S. Картинок ниочемных на форуме вообще многовато развелось, на мой взгляд.

 

Что-бы ходили они и между собой торговали, это аи-схему нужно писать, я не умею пока. По кодам, таблицы сейчас сижу пишу, они очень большие, самая долгая часть разработки будет пожалуй. А блуждающих по зоне псевдоторговцев действительно не так трудно сделать, спасибо за идею, займусь на досуге. Карлан.

Изменено пользователем Карлан
  • Нравится 1

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

Было бы круто такое увидеть. Кстати караванчик как в ФО3 хорошо бы вписался + два охранника (follower-а).

Мой архив

Сталкером не занимаюсь.

А вот если ему продавать другие разные стволы, то он все их скупит?

Куда ему столько стволов? :)

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

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

 

"Логика торговли" - я имел ввиду сам скрипт, к балансу он абсолютно никакого отношения не имеет. Т.е. что-бы откровенной ахинеи не было в торговых условиях. Карлан.

Изменено пользователем Карлан

Ребят, может кто не понял, думаю еще раз стоит объяснить. Это не глобальный мод, это специализированный мод, поэтому прошу не задавать вопросов и не предлагать идей, которые не относятся к торговле в принципе (к ней конечно относится в принципе весь игровой процесс, но давайте тут все же только моментами, которые можно использовать без переделки чего-то кроме конфигов, обойдемся). Так же по поводу "вкуса и цвета" я согласен и никогда не буду кричать и спорить, что мои взгляды лучше ваших, считаете я сделал убого - переделайте под себя, я подробно описал как. Моя настройка дисконтов далеко не панацея. Да и сам этот мод не панацея. Всегда все можно переделать, ну или не трогать вообще.

Направленность идей понятна, вопрос снимается.

Вопрос, а обмен?

Если есть что-то хорошее, обменять на другое.

Патроны на аптечку и антирад или еду.

Хотя в игре - деньги нейтральный эквивалент всему. Но всё же...

 

Это есть в планах, но не в первоочередных. Так же есть идея добавить заказ товаров, как у торговцев, так и у сталкеров, даже реализация набросана кое-какая, но пока об этом рано что-либо говорить. Надо торговлю окончательно допилить. Как-то нужно расставлять приоритеты и делать последовательно я думаю, а то есть риск не сделать нифига нормально, либо нифига вообще :).

Изменено пользователем Карлан

Если убрать у нпс бесконечные патроны.. В совмещении с торговлей между собой и собирательством НПС будут более активно торговать и выживать.И это будет влиять на их поведение и логику.А патроны можно подспавнивать/пополнять  при спавне на локе.Тоже самое с едой сделать включив у них голод.Тогда часть инвентаря у них будет для себя , а часть на продажу в зависимости от физ состояния..И цена может варьироваться...Соответственно, скорость передвижения, усталость зависят от веса того, что у них есть в инвентаре....Если в экзо вес соответственно больше ....И.т.п.Тогда нпс будет "думать" воевать или торговать, или выживать...Торгуя не только с ГГ но ис торговцами и НПС.Думаю, одно отключение бесконечных патронов изменит многое..Конечно попахивает глобалкой, но всё ведь там связано...

 

Учитывая что НПС не воюют между собой в принципе, то да. Здесь все уже нужно менять, ты высказываешь идею расширения геймплея, а не торговли. Расширение торговли здесь вываливается как побочный продукт реализации расширения геймплея, не больше. Карлан.

Изменено пользователем Карлан
  • Нравится 1

Приоритеты в игре, например у меня в начале игры:

1.  Нож -разовое (ящики вскрывать).

2. Оружие (пистолет, лучше обрез).

3. Патроны к нему.

4. Бинты.

5. Аптечки,

6. Антирад.

7. Броня.

8. Еда - если голод наступает медленно.

Если от еды зависит сила и выносливость, то тогда на 2 место.

 

Бинокль, фонарь это разовые приобретения.

 

Ножом все пользуются что-бы патроны не тратить для разбиения ящика. Пистолетом после АТП никто не пользуется вообще. Поэтому подобное ставить в верхушку линейки приоритетов я бы не стал. Ну и это все же вопрос тараканов в голове, а не реализации. У меня все приоритеты по группам распределены, общей иерархии нет. Бинокль и фонарь опят же зависит от их реализации, в оригинале может и разовые, но можно сделать и фонари которые лучше светят, или бинокли которые врагов рамками выделяют/не выделяют, ну и расширять ассортимент, только это опять же уже не расширение торговли, а расширение ассортимента. Карлан.

Изменено пользователем Карлан

Причина не использования пистолетов:

1. Убойность и точность пистолетов (убойность на большое расстояние не нужна).

2.Изобилие и дешевизна автоматных и винтовочных патронов.

3. Лёгкость зарабатывания денег. 

Если сделать обмен винтовочных и автоматных патронов с НПС на аптечки,  антирад, артефакты.

У торговцев только на артефакты, а пистолетные в свободной продаже.

Тогда и пистолеты будут ходовым товаром.

 Например - Desert Eagle Mark XIX -получаем у Макса, вроде вещь хорошая а пользы ни какой.

Ни убойности не точности - за такой "подарок" квест выполнять смысла нет,

вот если бы его на что-то у какого-нибудь "коллекционера" 

можно было бы обменять, тогда да. 

Аналогично и с другими "униками" (оружие, броня). На то, что нельзя купить в игре.

 

Вообще не тот путь для решения подобных проблем. Карлан.

Изменено пользователем Карлан
по каким принципам и правилам должны торговать между собой сталкеры?... так и с торговцами

 

Тут я думаю ничего особо нового. Сталкеры пускай торгуют между собой мелочевкой: еда там, патроны может, медикаменты, мелкое оружие, свои старые костюмы новичкам всяким, допустим. Единственное что, артефакты я бы заставил НПС обменивать на снаряжение, а не продавать сталкеру, ибо торговцу продать его всяко дороже, а вот выменять на что-то вполне может быть выгодно для НПС-а на тот момент (Например, у него обрез, а за артефакт ему предлагают "спас"). Ну, а предметы крупнее уже пускай торговцам сливают. Лично я вижу такую систему.

 

Мне никогда не было понятно, почему "новичков" всегда держат за полных идиотов. В остальном ничего интересного. Карлан.

Изменено пользователем Карлан

 Принцип простой для НПС:

1. Ввести ограничение по весу  носимого груза.

2. Продавать излишки. Чем меньше остаётся тем дороже продаёт.

3. Оставлять себе лучшее.

4. Не собирать оружие убитое более 50%. Пусть ГГ "хомячит" и несёт Старьёвщикам.

5. Продавать артефакты дороже, чем купит торговец.

6. НПС рангом выше продают дороже, покупают дешевле. (типа "салага" ещё). 

7. При хорошей репутации и оказании помощи цена снижается.

 

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

Изменено пользователем Карлан

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

Изменено пользователем Dennis_Chikin

Вопрос... 

Как я могу это использовать?

На какой версии могу попробовать?

Чтоб написать отзыв нужно попробовать.

Простая установка не катит.

 

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

Изменено пользователем Карлан

Решил написать подробную инструкцию по использованию, так как добавлено всего много, и те, кто скачал часто пишут в стиле «вы там ушли или че, мы тут в непонятках», версию до того, что было поставлено не дотянула, сейчас уже нет возможности. Поэтому функции все есть, протестированы и работают, но функционал немного староват, но плюс в том, что адаптируется легко под 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

Немного дополнил функции, теперь можно устанавливать цену конкретного предмета у конкретного торговца.

 

Каким путем:

В функции 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

Интересно конечно, но... я в этом... как установить... ни "бум, бум...".

 

Для меня доступно... :blink:  скопировать в игру и всё....Эээээхххх....

Всем привет! :)

 

Version 1.3 RC

 

Новости и "что было сделано":

- Исправлена 'неправильно' работающая логика движковых функций (возвращала единицу вместо ноля, в результате чего надо было обязательно проводить настройку всех итемов в игре как минимум для одного торговца)

- Переписаны функции формирования цены для еще более тонкой настройки

- Начата работа по созданию подобия денежной системы

- Введено понятие (локального) дефицита товара, но еще не внедрено, делается так как задумывалось компания-разработчик (признана нежелательной)*, также еще один вид дефицита (глобальный), который "придумал" я, на стадии продумывания идеи

- Вернулось повышение цен на аптечки если ГГ в плохом состоянии и у него мало медикаментов (не у всех торговцев, некоторые по прежнему благосклонны)

- Начата разработка системы учета катаклизмов

- Начата (в который раз) переработка всех торговцев, мне теперь хочется больше ударить по геймплею, чтобы каждая локация "торговала" чем-либо для ГГ выгоднее, чем другая

- Обдумывается уместность конкуренции

 


 

Технического плана мануал:

Функции с дисконтами переименованы и переделаны так, как я писал выше, теперь они выглядят таким образом:

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, там возможно управлять текущим списком, и, если потребуется, выводить динамический статик с текстом причины отказа в покупке предметов.

 


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

Гость
Эта тема закрыта для публикации сообщений.
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...
{advertisement="yandex_floor_dark_theme"}