Перейти к содержанию

Лидеры


Популярный контент

Показан контент с высокой репутацией 20.03.2022 в Записи блога

  1. 1 балл
    Для тестов 1865 билда я использую локацию свалка. Прямо на входе, чуть слева, в моей версии пасутся три собаки. Дальше справа за поворотом пасется плоть, а слева сталкер Жора (tradeseller_gora_0_011). И для них имеет смысл сделать некоторые приготовления. Во-первых, параметру satiety_v присвоить значение 1000 для всех ботов кроме сталкеров. Можно и им, но они прекрасно бродят по локации и без этого. А вот все остальные имеют одну особенность. Если бот не голоден, то он никуда не ходит. Но если голоден, то начинается движение. Собаки, сидевшие слева, идут вглубь локации. Плоть справа тоже начинает бродить. Впереди их ждет радиация. Во-вторых, satiety_health_v = 0.000. Иначе боты будут умирать от голода и пропустят самое интересное. И да, в текущей версии Теней можно выставить это значение каким угодно, ботам будет на него наплевать. Делается это просто, в геймдате есть креатуры, в них сталкер.лтх, а там пачка нужных параметров. Можно там и со значениями satiety_v побаловаться, толку все равно никакого. «Проработан» этот вопрос не на рубеже 2004 года, а в период с августа по октябрь 2004 года. И «проработан» окончательно. К слову, у Жоры по карманам лежит несколько пачек дроби и пара аптек. И дробь, и аптеки, всегда в единственном экземпляре, и даже будучи надкусанными в какой-то общий стек они не собираются. Потому что у каждой пачки или аптеки есть свой уникальный ID. Еще это значит, что патроны у бота могут кончиться. А еще это может привести к забавному багу, если количество патронов в пачке равно нулю, а вот функции снести эту пачку из памяти нет. Тогда появятся пачки патронов с нулевым количеством этих патронов. А еще боты могут подбирать игровые предметы, те могут лежать у них в рюкзаке, и если обыскать труп, то там будет честно лежать игровой предмет. Запомним эти факты. В конфигурации у всех без исключения ботов есть такой интересный параметр radiation_v = 0.001 Заявлен он как скорость уменьшения радиации. В конфигах нет величины, на которую уменьшается радиация, но можно предположить, что на единицу. А этот параметр определяет, с какой скоростью будет уменьшаться доза. Нет в конфигах и самой дозы. Потому что здесь все индивидуально. Чем ближе бот к эпицентру радиации, тем большую дозу он схватит. Накопление радиации совершается порциями в единицу времени. Но нигде нет скорости накопления радиации. От чего можно предположить, что скорость уменьшения радиации и скорость накопления радиации — это одно и тоже. А порция привязана к геометрии. Соответственно, боты в любой точке локации получают порцию радиации. Но в некоторых местах порция равна нулю, а в некоторых (радиоактивные зоны) порция выставляется еще при компиляции, и убывает от максимальной величины в эпицентре до нуля в безопасных зонах. radiation_health_v = 1000 Этот параметр — на какую величину уменьшится здоровье при облучении. Но и здесь все лукаво. Бот для радиации представляет собой своеобразный стакан, который может быть пуст, может быть наполнен до краев, а может там только на дне что-то плещется. Соответственно, есть (но не в конфигурации) текущее количество радиации, и максимальное, сколько в себя может впитать бот. Если текущее значение равно максимально возможному, то у бота отнимется столько, сколько заявлено в этом параметре. Если текущее значение меньше, то и здоровья отнимется меньше. Впрочем, это в Тенях и для персонажа. А вот в билде и для бота все может быть и иначе. И может быть, что у бота отнимается полное значение radiation_health_v, не зависимо от уровня накопившейся дозы. Правды мы уже никогда не узнаем. Поэтому я поставил сразу тысячу, чтобы уж наверняка (у ботов здоровья не более 100 единиц, так что им и десятой части от максимума хватит). radiation_immunity = 1.0 Так как мы играем в РПГ, то какое же РПГ без резиста? Этот параметр — сопротивление радиации у бота. Единица означает полное отсутствие сопротивления, бот получает полную дозу без резиста. Ноль — это полный резист к радиации, в любой точке карты бот получает одинаковую дозу, равную нулю. Пришло время залезть в сборку 1865, занять место на вышке, и ждать, когда Жора зайдет на кучу мусора (потому что там граф), или туда зайдет плоть, или собака прибежит по дороге до ямы. Везде в указанных местах зоны радиоактивности. Финал будет предсказуем — ваншот для ботов. Если хоть кому-то поставить стопроцентный резист (radiation_immunity = 0.0), то все будут ходить как ни в чем не бывало. Поэтому для впечатлений лучше оставить величину этого параметра как есть. Жору, кстати, в этом случае даже костюм не спасет, здоровья не хватит. В билд 1935 мы уже не полезем, с ним и так все понятно. Не полезем мы и в оригинальные Тени, потому что они у меня на диске, надо устанавливать и вводить ключ. Мы полезем в ОЛР, которое сделано на версии Теней. Ну не можем же мы предположить, что те, кто восстанавливают тот самый сталкер, снесут из кода тот самый сталкер? Следовательно, уж в ОЛР все должно быть как надо. Поэтому ищем креатуры (геймдата — конфиг — креатура — любой.лтх), и всем шлепаем radiation_health_v = 1000, а radiation_immunity = 1.0. Затем заходим в игру на свалку, заманиваем все подряд в радиацию, и выясняем, что в радиации подохнет только наш персонаж. И можно хоть как менять параметры, хоть radiation_immunity = 0.0, хоть radiation_health_v = -1000, хоть вообще снести эти параметры, движок этого даже не заметит. Как он, собственно, не замечал их и до этого. Вывод? В период с августа по октябрь 2004 года боты перестали умирать как мухи от радиации. Так же, как и перестали умирать от голодовок. В чем можно убедиться, убрав нулевые коэффициенты. Делается это там же (геймдата — конфиг — креатура — любой.лтх), satiety_health_v = -1000, satiety_v = 1000. Дальше запускам Тени. Но одно дело обнулить параметры (satiety_health_v = 0), после чего бот даже голодным ласты не склеит. Совсем другое, если удалить из движка объявленный оператор satiety_health_v = integer. И третье, если удалить некоторые функции и методы, где он был задействован. Это разные вещи. - Почему нельзя было поставить ботам стопроцентный резист? Эффект был бы тот же самый. Это очень интересный вопрос. Но сначала вернемся в сборку, где и плоть, и Жора постоянно идут на радиоактивную кучу мусора. Они довольно часто тупят, напоровшись на какое-то препятствие, и все равно идут вперед, вместо того, чтобы его обойти. Потому что в спокойном состоянии они ходят от одного графа к другому (А-life), и только в возбужденном начинают ходить по клеточкам (AI). Мы можем поставить граф прямо в эпицентр радиоактивного участка, и тогда рано или поздно туда кто-то зайдет. В развлекательных целях мы поставили radiation_health_v = 1000, что гарантированный ваншот. Но значение может быть и поменьше, тогда у Жоры/плоти просто отнимется немного здоровья. А еще у Жоры в кармане есть пара аптек, одну из которых он может зажевать для здоровья. Если добавить Жоре умение найти торгаша и купить у него антирад, то жизнь и вовсе наладится. Правда Жоре нужно добавить умение искать артефакты, потому что торгаши занимаются коммерцией, а не благотворительностью. Но с этим у Жоры в 1865 все в порядке. И тогда становится понятно, почему патроны обязательно в пачках (а не из рюкзака и общего стека), аптеки, антирады и даже жратва не собираются в стеки, и так далее. Потому что каждый игровой предмет (даже пачка патрон) — это отдельный игровой предмет со своим ID. Последний нужен, чтобы отследить движение вещи от одного бота к другому. Но не только. Еще это нужно, чтобы скатать функцию, возвращающую всего два значения (истинно или ложно) — а есть у меня в рюкзаке предмет такого класса? И если она вернет истинно, тогда надо активировать функцию «использовать», внутри которой будет обращение к уникальному ID (использовать именно этот предмет), а так же функция «выгрузить из памяти» по этому уникальному ID и именно с этим уникальным ID как использованный. Все, пачки патронов есть самые разные, но вот той самой надкусанной больше нет, мы ее в автомат зарядили. Граф можно поставить и не в эпицентр, а куда-нибудь рядом. Можно очаг радиации поставить между графами, все равно же бот будет идти от одного к другому, а значит пройдет через очаг без возможности свернуть. Или с возможностью, когда движение на один граф сменится движением на другой, потому что здесь что-то со здоровьем не так. Варианты могут быть разные. Но где-то в конце 2003 / начале 2004 года (зима-весна) у нас вылезла проблема. Мы запилили патрулирование территории, сделали скриптовые сцены, анимацию, хорошо поработали. Но движок начал крошиться. Потому что непонятно, кто управляет ботом, скрипт или симуляция (a-life). Скрипт предписывает боту патрулировать территорию и играть соответствующую анимацию, а симуляция предписывает идти за аптекой с соответствующей анимацией, потому что бот во время патрулирования в очаг радиации наступил. А еще бот может умирать от голода, а мы его на патруль поставили. В общем, мы соберем 1865, ужаснемся, и примем решение — симуляцию лесом. - Еще раз, можно поставить стопроцентный резист к радиации. Можно и по жратве придумать, что голодные, но не умирают. Дело не в этом. При каждой ситуации симуляция будет предписывать какие-то действия, которые будут противоречить действиям, предписываемым скриптом. А значит игра будет крошиться постоянно. Да, можно попытаться отделаться малой кровью, пусть у нас будут боты, которые под симуляцией, а другие боты под скриптом. Но потом те, кто под симуляцией, придут к тем, кто под скриптом. И тех, кто под симуляцией, все равно придется сажать на скрипт. Это будет потом, а в августе/октябре 2004 пока просто снесли сердцевину симуляции — голод (радиация за компанию улетела). И тот самый сталкер начал облазить. Зачем нужны радиоактивные зоны, если в них бот не облучается? А мы не можем позволить ему облучиться, потому что иначе он попрется за аптекой, кто патрулировать будет? А если не попрется, то умрет от радиации, а ему еще патрулировать (ну или в смарте сидеть возле костра). Нафиг … Если бот не облучается, за аптекой не ходит, зачем тогда нужны внутриигровые предметы со своими уникальными ID? Их кроме игрока все равно никто не использует. Пусть тогда все аптеки в стеке лежат, раз у них больше уникального ID нет. Перепишем движок, не первый раз. А зачем нужны пачки патрон? Пусть тоже в стеке лежат, бот их все равно больше не покупает. И вообще, мы ему сделаем бесконечный запас патрон, потому что к торговцу он больше не ходит, да и покупать разучился. А пояс зачем, если пачек патрон больше нет? Что туда вешать, если все патроны в рюкзаке в одном стеке? Пусть из рюкзака перезарядка будет. И прямо из общего стека (для бота бесконечного), не надо больше пачек. А если что, то в 2008 xStream еще раз научит их аптечки использовать, но уже скриптом, и мы назовем это новым словом. В чем был замысел? Боты ходят по картам, что-то собирают, у этого чего-то есть свои уникальные ID. Не обязательно покупать у торговцев или других сталкеров, можно найти, снять с трупа, но любые действия с предметом осуществлялись по однотипному сценарию как смена владельца вещи, имеющей уникальный ID. И если бот где-то нашел пачку патрон с 23 патронами в пачке, и вы его встретили на другом уровне, завалили и обыскали, то в его рюкзаке вы найдете именно эту пачку, в которой именно 23 патрона. Или отнес и продал ее торговцу, а вы позже пришли и купили именно ее (надкусанная дешевле). Такой подход требует отдельно подумать, как предметы будут выгружаться из памяти, потому что в норме они не должны выгружаться никогда, но аптеку можно использовать, патроны в пачке могут закончиться, ну и так далее. В норме в рюкзаке сталкера будет только то, с чем он заспаунился (и что еще не успел использовать, в 1865 боты могут отстрелять патроны, и в рюкзаке не будет ничего), и что он успел насобирать/намародерить/накупить. Это не значит, что в Тенях от того самого сталкера не останется вообще ничего. Что-то останется, и если вы сбросите ствол, а бот его подберет, и вы бота за это завалите, то в рюкзаке будет ваш ствол. Но еще бот заспаунится с каким-то количеством предметов, которые уже не имеют ID. Эти предметы еще будут в окне торговли, благо они ботом не используются. Но если завалить бота, то в его рюкзаке окажутся совсем другие рандомные вещи из death_items_by_communities, а не рюкзака как такового. Потому что зачем боту вещи с уникальным ID, если он их не собирает, не покупает и не использует? Как он будет собирать, покупать и использовать, если он в смарте на скрипте сидит? И зачем ему собирать, покупать и использовать, если он не облучается, не голодает и не теряет здоровье со временем? Так что можете смело стрелять боту в голову, и если death_items_by_communities выплюнет антирад для вас, то забирайте. Боту он уже не нужен …