До версии 4.0 включительно приписанные к станциям игрока торговцы, пусть и не совсем идеально, но более-менее справлялись со снабжением своей станции ресурсами и продажей произведенных ею товаров. Начиная с версии 4.10 начались проблемы. Почему это происходит?
Начнем с того, что вплоть до версии 4.0 приписанные к нашим станциям торговцы при поиске сделок ориентировались на среднюю цену товара. То есть они не покупали товар, отпускная цена на который выше средней, и не продавали продукцию своей станции, если цена на нее у покупателя ниже средней. Пусть и не очень эффективно, но для фабрик и заводов это работало. Хотя недостатки такой схемы видны сразу: даже когда у нас товара как у дурака махорки, и мы готовы продавать его аж по минималке, торгаш НЕ БУДЕТ продавать его, пока закупочная цена у покупателей не поднимется, как минимум, до средней. А при абсолютно пустом складе ресурсов, когда мы готовы брать его хоть по максималке, торгаш будет ждать, пока ценник у продавца не снизится до средней цены.
Плюс к этому, такая схема совершенно не подходила для складов игрока, которые как раз в версии 4.0 и появились. Ведь на складе цена на товар практически всегда (за исключением очень мудреных торговых схем) выставляется вручную. Иначе - вылетим в трубу. Ведь как только у нас что-то купили, товара на складе стало меньше, а следовательно, автоматически выставляемая закупочная цена сразу возросла. И нам могут тут же продать наш же товар по более высокой цене, чем та, за которую у нас же только что и купили.
В общем, разработчики поняли, что от привязки к средней цене пора срочно отказываться (хотя на самом деле следовало это сделать намного раньше), а торговцев игрока приучить наконец смотреть на ценники.
Что и было сделано в версии 4.10. Только вот сделали это, мягко говоря, неважно... Одно выкинули, другое вставили. А нюансов - не учли.
Итак, как работает поиск сделок торговцем, начиная с 4.10 (вкратце):
Торговец инициирует переменные, а потом проверяет свой текущий груз, не надо ли от него избавиться. Первым делом проверяется станция приписки. Если она готова купить что-то из содержимого его трюма, торговец заканчивает поиск и управление передается другому скрипту для выполнения сделки.
Если п.1 обломился, торговец ищет покупателей "на стороне". При этом если проверяемый товар является ресурсом для его станции, он этот товар пропускает, мол, выгрузим ей его позже. Поиск идет в два прохода. Первым проходом "обзваниваются" застройщики. Вторым - станции. Ограничение на торговлю с неписями - учитывается, если проверяемый груз имеется в списке товаров нашей станции. Ценник на товар - аналогично. Как только нашелся покупатель - торговец заканчивает поиск и управление передается другому скрипту для выполнения сделки.
Если первые два пункта обломились или в трюме вообще нет "левого" груза, торговец обновляет данные по своей станции (мало ли, достроился новый модуль и у станции расширился список ресурсов и/или продукции, или менеджеру поменяли радиус торговли, или запас ракет снизился - их ведь торгаш тоже закупает).
Дальше торговец запрашивает у своей станции селлофферы (т.е. что она предлагает на продажу). Если таковые есть, они сортируются по релэйтивпрайсу (отношение цены товара к средней), что косвенно информирует о кол-ве товара на складе. Чем выше релэйтивпрайс - тем меньше товара имеется в наличии.
Данный пункт крайне плох для Складов игрока (имеются в виду, конечно станции "Склад", а не хранилища станций). На Складах цены выставляются вручную, поэтому торговец при выборе сделок теряет привязку к наполненности хранилища.
По каждому селлофферу ищется покупатель. Первым проходом опять "обзваниваются" застройщики. Принимается во внимание ограничение на торговлю с неписями, если оно установлено. Цены игнорируются (если мы вспомним, что неписи практически ничего не строят, за малым исключением сюжетных строек в ДФ, то и пес-то с ними, с ценами). Вторым проходом - станции. Принимается во внимание ограничение на торговлю с неписями, если оно установлено, а также отпускная цена, т.е. ищется покупатель, который купит товар по цене не ниже нашей отпускной. Как только нашелся покупатель - торговец заканчивает поиск и управление передается другому скрипту для выполнения сделки.
Теперь торговец запрашивает у своей станции байофферы (т.е. что она хочет купить). Если таковые имеются, составляется таблица для сортировки байофферов по стоклевелу (отношение запрашиваемого кол-ва к полной емкости хранилища данного конкретного товара). При этом первичные ресурсы получают добавочный бонусный коэффициент 0,8. Т.е. до вторичных очередь доходит практически тогда, когда первичных навезли по 80% емкости хранилища.
По каждому байофферу ищется продавец. Принимается во внимание ограничение на торговлю с неписями, если оно установлено, а также закупочная цена, т.е. ищется продавец, который продаст нам товар по цене не выше нашей закупочной. Как только нашелся продавец - торговец заканчивает поиск и управление передается другому скрипту для выполнения сделки.
Если ни одной сделки не нашлось - торговец пинает гайки случайное время от 30 до 90 секунд, а потом возвращается к началу данного алгоритма.
Какой недостаток сразу бросается в глаза? Да то, что торговец, найдя клиента, прерывает поиск и выполняет сделку. А поскольку закупка ресурсов в очереди стоит на последнем месте, до нее эта самая очередь частенько не доходит. Мало того, когда какого-то товара производится в некотором избытке, со временем склад производящей этот товар станции наполняется этим товаром, что называется, под завязку. Цена становится минимальной. А поскольку потребители данного товара потреблять его не прекращают, то спрос не отсутствует совсем, а лишь крайне мал. И вот тогда торговец прекращает закупать ресурсы и зацикливается на продаже такого товара. Приоритет-то у него самый высокий, ведь селлофферы сортируются по релэйтивпрайсу (см. п.4), а у нас полная кубышка и отпускная цена поэтому минимальная.
Вот и начинает такой торгаш продавать этот товар по чайной ложке. Продал ложечку, а пока возил - покупатель успел еще чайную ложечку съесть. И оффер на нее выставить. Торгаш снова сделки поискал, этот новый оффер нашел - полетел еще чайную ложечку ему продавать.
Остальные товары больше не продаются, ресурсы больше не закупаются, процветает бардак и анархия. Пока производство не остановится совсем. Тогда избыточный товар в конце концов израсходуется до такой степени, что отпускная цена на него возрастет настолько, что торгаш заметит наконец другие сделки. Подвезет ресурсов, производство возобновится, ценник на избыточный товар опять свалится до минимальной, опять бардак и анархия, пока снова не кончатся ресурсы.
Вы хотели станцию-мигалку, так вот вы ее получили. Работает, не работает. Работает, не работает...
Т.е. становится понятно, что сделки надо не просто искать, но и сравнивать их между собой, выбирая ту, которая наиболее эффективна. Ведь каков признак саморегулирующейся системы? Саморегулирующаяся система при наличии сигнала тревоги предпринимает действие, снижающее этот сигнал. Егософт сделал почти все правильно в этом отношении, но забыл важную деталь: у нас в системе не один сигнал. А когда он не один - выбирать следует не самый сильный, а тот, который мы можем сильнее всего понизить. Тогда мы перестанем циклиться на одном сигнале тревоги, а сначала уберем те, которые быстрее убираются, а уж только потом придет очередь того, который самый сильный, но такой, что хрен погасишь. Ну так на то оно и "хрен погасишь", что когда товара в избытке, с этим надо смириться, а не пытаться выпить море, аки Ксанф.
Следующее слабое место ванильного скрипта уже описано выше, в п.4. Для Складов игрока селлофферы следует сортировать не по релэйтивпрайсу, а по стоклевелу. Только так торговец будет выбирать приоритет в соответствии с реальным состоянием хранилища, а не с один раз вручную установленным ценником.
Еще одно слабое место: при поиске продаж торгаш первым проходом "обзванивает" корабли-застройщики. На это уходит время, порой достаточно продолжительное, ведь между проверками сделок в алгоритме вставлены паузы. Предположим, у вас есть свой собственный Сборочный цех БЛА. Он производит 12 видов дронов. При поиске продаж по каждому из этих дронов торгаш будет проверять застройщики, делая между проверками паузу 3-5 сек. В среднем - 48 секунд коту под хвост, ибо застройщикам дроны не могут быть нужны по определению. Они выставляют офферы исключительно на стройматериалы и пушки/ПСП на обвес. Поэтому стоит добавить один список, содержащий все товары, которые могут быть куплены застройщиками. И если проверяемого товара в списке нет - банально пропускать застройщиков вместе с этой паузой.
Следующая фишка: в свое время Егософт столкнулся с тем, что торгашей иногда клинит на торговле со Складами игрока и торговыми станциями неписей. Покупают товар и тут же продают его обратно. Клинило так не только торговцев игрока, а и фритрейдеров тоже. Поэтому была введена специальная переменная $lasttrade, хранящая информацию о последней выполненной сделке. Переменная эта передается скрипту поиска сделок из родительского, а родителю - скриптом, выполняющим сделку. Суть не в этом, а в том, что специальная проверка не дает торговцу продавать станции то, что у нее было в прошлый раз куплено, а покупать - то, что ей в прошлый раз было продано.
Решение, на мой взгляд, весьма странное. Ведь достаточно при поиске покупателя или продавца просто отсекать нашу собственную станцию. Тогда вышеописанного казуса продажи себе собственного же товара не случится. Но сделали как сделали. А это породило интересное следствие. Допустим, у меня имеется Склад в Альбионе. К нему приписана Секвана, собирающая руду. А еще приписан Титурель, который эту руду распродает неписям и моим собственным станциям. И вдруг этот Титурель угораздило не продать руду кому-нибудь, а наоборот - закупить ее у колонии "Бесплодные земли", где ценник периодически падает до минимального. И вот этот Титурель руду привез, руду на Склад выгрузил, а потом ищет сделки без конца, да ничего больше не делает. Как думаете, почему?
А потому что скрипт ему не разрешает теперь забрать руду со своего Склада. Он же последний раз, согласно информации в переменной $lasttrade, ее туда привозил, так что низзззя! Можете попрощаться со своим торгашом. Он теперь для вас как торговец - потерян.
Думаете, так может случиться только с рудой? Нет. Вспомните, что есть еще Биржа Плутарха. Только с сыпучими ресурсами? Ну, есть еще "Одинокий Гигант". Только в Альбионе? А "Разрытое Ядро", а Фабрика трития? Только с тем, что продается у неписей? Тоже мимо. Титурель повез лед на водокачку, да обломился - сделку перехватили. Тогда он выгрузил лед обратно (наш Склад ведь лед и покупает тоже, раз добывает). И тоже умер как торговец...
Исходя из вышенаписанного, что со всем этим делать? Выходов несколько.
1. Можно ждать, когда разработчики это починят. Учитывая возраст игры и наличие Х4 в разработке, примерно эквивалентно ожиданию второго пришествия. 2. Можно попробовать починить самому. Лично я так и поступил. 3. Можно плюнуть на это и играть так как есть. Ну, а КАК ИМЕННО оно есть, я чуть выше описал. 4. Можно плюнуть на это и НЕ играть. Вообще.
Как поступите вы - решать вам и только вам. Починенный мной вариант скрипта поиска сделок вы можете получить вот здесь.
BBCode: [url=https://x-rebirth.x3tc.net/nedostatki-vanilnogo-koda-poiska-sdelok-torgovcami-stancij-igroka_26000]Недостатки ванильного кода поиска сделок торговцами станций игрока[/url]
При полном или частичном использовании материалов сайта активная (прямая) ссылка на x-rebirth.x3tc.net обязательна.
Внимание!
На сайте строго запрещается затрагивать/обсуждать/ссылаться на всевозможные незаконные программы и способы, позволяющие обойти/взломать (и т.п.) защиту игры X Rebirth - т.н. крэки (crack, а также: nocd, nodvd и другие).Attention! On this site forbidden any discussions of crack programs for X Rebirth (any cracks, nocd, nodvd etc).