World of Warcraft ожил или как я добавил экосистему животного мира
Продолжаю делиться новостями по проекту Venom's RP Azeroth. Давно не было новых постов, я был занят большим блоком, и вот, есть что показать.
С NPC можно говорить, языки учить, магию комбинировать, а погода влияет на геймплей. Играя в такую версию, все равно не покидало ощущение, что я играю в ММО. Мы так же бесконечно били болванчиков по заданиям, мы так же проходили буквально перед носом врагов благодаря радиусу агро, мы так же убивали десятки медведей в поисках пяти сердец. И я понял, нужно менять сам подход к тому, как этот мир функционирует. Больше всего в игре встречаем мы зверей, поэтому первыми под модернизацию попали они.
Сенсорика
И начать предлагаю с главного.
Зрение
Как устроено классическое зрение в игре? А никак, его попросту нет. Все мобы имеют скан 360 градусов вокруг себя. Погода, время суток, рельеф и т. д. совершенно никак не влияет. Единственное, что меняет радиус агро, это разница уровней и наличие или отсутствие стелса у игрока.
Как можно понять, это совершенно точно рушит любой отыгрыш, да и просто мир ощущается картонным. Как это исправить? Всё уже придумано, добавить лучи, которые будут определять, что же видят NPC.
Что же было сделано.
Базовая дальность и острота зрения
Базовая дальность зрения игрока, а именно подгрузка мобов, в обычном варианте около 100-150 ярдов. Я поднял эту планку до максимально возможной для сервера — 250. Это теперь наш предел, на который можно смотреть как игрокам, так и NPC.
Но, думаю, очевидно, что дать всем такой радиус было б ошибкой, поэтому каждому виду была присвоена своя острота зрения. Опирался где-то на лор, где-то на живую природу нашего мира. Орел или лев куда более дальнозоркий, чем краб или кабан.
Игроков тоже не обошло стороной, для примера стандарт для человека в ясный день можно заметить стоящего в полный рост человека примерно на расстоянии 180–200 ярдов. Кровавый эльф — до 230-250 ярдов. Опираясь на лор, это самая зрячая раса в игре. По крайней мере, из играбельных.
Думаю, уже и так очевидно, но упомяну, всем выданы корректные конусы зрения, согласно их биологическим особенностям. Подкрадывание сзади теперь работает для всех, но не у всех это получится, но об этом позже.
Погодные эффекты и барьеры
Если заметили, что я упомянул ясный день, молодцы.
Да, в зависимости от освещенности, погоды, тумана, времени суток и размера цели расстояние меняется.
Ночью оно сокращается для рас без ночного зрения примерно на 35%. Ночным эльфам, естественно, выдано полное ночное зрение, нежити тоже, так как их глаза давно функционируют на некротической энергии, также оркам ночь порежет зрение лишь на 20–25%. Среди животных это, очевидно, все кошачьи и т. д.
Холмы, деревья, туман, непогода скрывают игрока от NPC, стелс стал доступен обычным классам, достаточно только быть внимательным и использовать окружение. Более того, для локаций с плохой освещённостью, типа того сумеречного леса, указаны свои параметры видимости, так что там, даже если в Элвинском лесу ясный день, видимость будет ограничена.
Ночью, в сильный ливень с туманом, удалось получить дальность видимости у человека около 65 ярдов. На фоне 200 днем это действительно заметно, а главное, выглядит естественно, за счет тумана и прокачанного рендера света.
Размер имеет значение
Помимо освещенности и непогоды, как уже догадались, размер объекта тоже учитывается.
Для игрока это работает нативно, т. е. сам игрок на обычном мониторе гнома за 200 ярдов увидит с трудом. И чтобы имитировать это и для NPC, у них видимость прямо привязана к размеру модельки. Гнома они увидят сильно позже, чем человека, орка или таурена. Но есть лайфхак: если тот же таурен ляжет, его станет хуже видно, примерно как гнома. Т. е. расчет идет именно от видимой части модельки. Соответственно, зелья уменьшения и увеличения тоже работают.
Видеть не значит заметить
Можно было решить, что теперь при появлении на локации все агрессивные NPC сразу вас заметят и побегут отрывать вам лицо, но нет. Вас видят, но замечать вас начнут сильно позже. Как это работает: на границе зрения шанс заметить у рядового NPC около 1%, т. е. практически нулевой, но чем ближе вы к нему, тем выше шанс, что на вас обратят внимание. Причем шансы для разных рас разные. Скажем, ночных эльфов или тауренов животные подпустят ближе, чем человека или орка. А друида в форме зверя вообще могут принять за своего. Кривая внимания динамически зависит от действий игрока или NPC, его расы и текущего состояния, об этом подробнее тоже ниже. Итак, зрение у них теперь есть, но чего-то не хватает... Ах да, слуха!
Слух
Звук — это уровень в децибелах (дБ) на расстоянии 1 ярда от источника + частота (Гц). Нет, это не справка из Википедии, звук в игре теперь считается в децибелах и имеет частоту. Звук летит без потолка/ограничений по дальности, пока полностью не затухнет от дистанции (закон затухания −6 дБ на каждое удвоение расстояния), впитывания воздухом (ISO 9613-1), стен, дверей, рельефа и углов зданий. Ухо слышит звук, только если он выше фонового шума («тишины» локации) с учётом остроты слуха существа. Да, NPC теперь выданы уши, у каждой расы разная чувствительность. Краб слышит хуже, чем лев. У гуманоидов пока все слышат одинаково, но в будущем и это поправлю. Как же это работает на практике? У всех появился порог слышимости:
Уравнение Arrival > (QuietAt(listener) - Acuity), где QuietAt — фоновый шум места, Acuity — острота слуха (у кошек/волков +4...+6 дБ, у раков −6 дБ, у спящих −4 дБ).
Звук в игре не рассекает стены по прямой, он ходит так же, как ходит всё остальное, по пути. Если зверь стоит за углом здания, слышит он то, что дошло вокруг угла, а не сквозь стену. На ослабление влияет всё, что звук встретил:
Двери и преграды на пути;
Комнаты и помещения: закрытое помещение гасит звук, открытое нет;
Ввода;
Повороты. Чем больше крутишь, тем меньше доходит.
Важна и частота. Низкий звук проходит преграды лучше высокого, поэтому шаги и шёпот ведут себя по-разному. Стоишь за стеной таверны и тихо говоришь с товарищем, и зверь снаружи тебя не услышит, а вот шаги ещё можно уловить.
На границе слуха слово доходит обрывками. Понять, что кто-то говорит, можно, а о чём именно, нет.
Что же создает звук?
Базовые типы
Шаги/бег (зависят от походки, типа доспехов, маунта, размера);
Шёпот (40 дБ), обычная речь (60 дБ), громкая речь (72 дБ), крик (85 дБ) (да, теперь волк услышит, если вы закричите или будете говорить с товарищем). Ах да, крики воина — тоже крики, а не безвредный бафф. Когда и где кричать, нужно учитывать;
Шум драки (растёт на +0.25 за каждого участника). Чем больше потасовка, тем больше внимания она привлечёт;
Реальные физические параметры выстрелов (~130 дБ) и взрывов (~150 дБ). Да, взрыв динамита, зов инфернала или выстрелы из ружья теперь имеют последствия;
Звуки заклинаний. Причем важен тип заклинания, фаерболл громче, чем фростболл. Для примера. Что разделено по логике, что-то по типу. Звук есть как и от каста, так и от точки попадания, NPC отлично слышат, что и где произошло.
Ну и, естественно, звуки самих животных. Рык, вой и т. д.
Фоновый шум
Для корректной работы звука в разных условиях разному окружению был добавлен разный фоновый шум.
Например:
Поле ночью: 25–30 дБ
Лес днем: 40 дБ
Деревня / Город: 45–50 дБ
Погода: дождь, снегопад, шторм не срезают дистанцию звука искусственно, а поднимают фоновый шум местности (например, сильный дождь = 55 дБ), из-за чего тихие звуки в нем естественным образом тонут.
Фоновый шум меняется динамически от местности, времени суток, погоды, как уже стало понятно из списка выше. Также внутри помещений на открытом пространстве он различается. Вы будете спокойно слышать в пещере спокойную речь (/s) товарища на куда большем расстоянии, чем в городе или в лесу. И да, теперь, если вы слышите речь на границе слуха, то это не есть текст в чате или нет, а именно обрывки фраз. Т. е. понять, что что-то говорят, можно, но сложно. Итак, звери нас слышат и видят, что же осталось? Верно, нюх!
Обоняние
Тут всё просто. Велосипед изобретать не стал, в игре нет понятия ветра, пока я отбитый, может и появится, но сейчас запах распространяется просто по кругу. Я думал, чтобы заставить пахнуть всех, но понял, что это, во-первых, перегрузит игру. А во-вторых, игроку будет крайне непонятно, почему его замечают звери, так как запах очень сложно объяснить интерфейсом. НО, может быть, в будущем... Сейчас же пахнут две вещи. Трупы и кровоточащие раны. Да, если у вас открытое кровотечение, то шанс, что на вас обратит внимание хищник, выше. А трупы... Чем дольше лежат, тем больше радиус, и тем выше шанс, что его заметит хищник... А зачем NPC замечать труп? И вот тут мы переходим к самому вкусному.
В мире животных
И так. У животных теперь есть зрение, слух и обоняние. И что им с ними делать? Гулять по заданному квадрату, нападать на всех, кого увидит? Нет, это поведение мобов с радиусом агро из какой-то ММО. Пора вдохнуть жизнь в этот мир.
Живой мир активен только в радиусе 300 ярдов вокруг живых игроков. Вне этой зоны звери ведут себя как в стандартной игре. Вынужденная мера из-за особенностей движка. Вдали от игрока мобы просто отключены для экономии ресурсов. Но если учесть, что максимальная дальность зрения 250 в идеальных условиях... Тесты показали, что 300 ярдов хватает с головой.
Все животные поделены на категории:
Хищники — питаются мясом. Приоритет по питанию: травоядные — хищники — прочее (гуманоиды, драконы, нежить);
Насекомые — тоже питаются мясом, от хищников отличаются отсутствием приоритетов. Ребята отбитые, готовы сожрать кого угодно.
Травоядные — жертвы природы и моей экосистемы;
Далее каждая категория уже дополнительно делится на:
Стайные — сбиваются в группы, вместе охотятся, заботятся друг о друге;
Одиночки — живут свою лучшую жизнь в гордом одиночестве;
Каннибалы — могут есть своих сородичей;
Ночные или дневные — когда идет максимальная активность вида;
Домашние или дикие - влияет на то, где обитает и кого боится;
Также каждому животному выданы параметры личной пугливости, травоядные более пугливые, и хищники менее, а также голода. И вот мы подобрались к основным механикам.
Охота
Хищники теперь умеют охотиться. И нет, они не просто нападают на мимо проходящих оленей и не грызут мышей. Как это было в оригинальной игре. Они могут гулять по огромной территории, обычно от половины до трети средней локации. Переходить в соседние локации, ориентируясь на новые органы чувств, они ищут, чем заняться. Сытые хищники будут отдыхать, спать, сидеть или просто гулять по округе. Но голодные будут искать жертву. Цель животных теперь — выжить.
При встрече с другими животными, NPC или игроком бросаются кубики действия.
Результат может быть один из трех. Агрессия, бегство или игнорирование. И в зависимости от состояния зверя шанс смещается в одну или другую сторону. Сытый зверь с большей вероятностью или проигнорирует, или убежит. Ему нет цели сражаться. Даже если игрок его атакует первым. Животное оценивает размеры цели, ее уровень, ее состояние, свое состояние. Скажем, раненный на 5% игрок или другой хищник, истекающий кровью, будут восприниматься как легкая добыча. Тогда как полностью здоровая цель, представляющая опасность, — нет. И все это вместе формирует новое поведение.
Звери заняты своим делом, если их не трогать и они не тронут
Система привязки к конкретной точке тоже убрана. Теперь, если зверь решит, что не прочь вами перекусить, будет гнаться за вами, несмотря на расстояние, пока не устанет. И даже потом не «улетит» на стартовую позицию, а останется там, куда добежал, и продолжит жить там или пойдет домой, оставаясь доступным для атаки.
Более того, звери запоминают, кто их обидел. И если, скажем, вы убили члена прайда львов, а потом вновь появились в поле зрения этого прайда, то с большой вероятностью они на вас нападут. И да, стаи, прайды и иные сборища социальных животных теперь действуют сообща. Они охраняют сородичей, сообща охотятся, защищают спящих и т. д.
Вот так, например, охотятся львы. Они предпочитают подкрадываться вне поля зрения жертвы. А что случилось во время второй демонстрации охоты, даже я не понял. Межвидовая конкуренция?
Помимо охоты, звери могут ходить на водопой или рыбачить, последнее могут не все. Скажем, медведи с этим отлично справляются.
Системы агрессии теперь тоже две, есть режим охоты, где они будут пытаться загнать и убить цель для трапезы, и режим защиты территории. Скажем, если подойти к занятому поеданием добычи зверю, он зарычит и кинется на вас, но стоит отойти, как он вернется к своей туше. Зверю, у которого есть еда, нет смысла тратить силы на убийство кого-то, кто ему не мешает.
Неосмотрительно было ему мешать их трапезе
И да, это всё работает не только NPC — игрок, а также NPC — NPC. Животные пытаются отбить друг у друга добычу, дерутся за территорию. Гоняют друг друга ради пропитания (так уж устроена экосистема мира, что хищников там в разы больше, чем травоядных) и т. д.
Питание
Как уже стало понятно, животные научились есть, но что это значит для игрока.
Первое, у трупов появилось четыре стадии:
Свежий — обычный нетронутый труп;
Растерзанный — труп, который изрядно потрепали, из него пропадает часть лута, который можно съесть, а предметы получают повреждения;
Обглоданный — животные съели почти все мягкие ткани, такой труп уже нельзя лутать.
Съеден — по сути, трупа уже нет, труп исчезает;
Второе, у животных есть чувство голода:
Сытый — зверь практически не реагирует на трупы и потенциальную еду, от опасности предпочитает убегать;
Голодный — зверь активно ищет пропитание, старается найти травоядных или свежие трупы, может решить, что игрок, который на него напал, неплохая еда;
Голодающий — зверь на грани смерти от голода. Страх почти полностью уступает чувству голода, может атаковать любого, кого посчитает съедобным;
У мёртвого тела есть запас прочности, и каждый укус зверя отнимает часть этого запаса. Величина укуса зверя рассчитывается исходя из его размера и размера тела.
Для примера, обычный голодный медведь за трапезу спокойно съест тело гнома, а вот трупом тауренка можно будет накормить несколько медведей или небольшой прайд львов.
Третье, у тел появился уровень свежести:
Свежий — только убитый, не успевший еще протухнуть;
Гниющий — над телом начинают роиться мухи, тело больше привлекает падальщиков, а также крыс или тараканов;
Скорость гниения зависит от климата. В жарком оно проходит быстрее, чем в умеренном. В зимних же локациях гниение отсутствует.
В итоге получается цельная система. Звери могут загнать и убить добычу или найти уже убитую, например, игроком, и в случае голода начать ее есть. Тем самым оставляя для игрока меньше лута. С другой стороны, животные естественным образом очищают территорию от мертвых тел.
*В серии роликов ниже, представлен таймлапс работы экосистемы. Для большей наглядности, игровые сутки были установлены на один реальный час. От чего голод у животных наступал гораздо быстрее, а трупы гнили за минуты, разнося аромат по округе. В штатной игре, данные процессы займут часы реального времени
Я всего лишь убил пару десятков жителей деревни, а потом стал наблюдать, что будет происходить. В какой-то момент трупы начали гнить и привлекать полчища крыс
После того, как все жители были убиты и съедены, звери по праву заняли новые территории и успокоились
Немного даже зловеще, ферма без жителей
Важный момент. Звери также могут есть и игрока. В случае если тело игрока было растерзано, он уже не сможет воскреснуть, а его одежда получает сильные повреждения, вплоть до полного разрушения прочности. Дополнительно, в зависимости от размера игрока и размера едока, он может проглотить предмет, как надетый на игрока, так и лежащий в сумке. Причем это может быть что угодно. Шанс минимальный, но он есть. Чтобы вернуть предмет, придется выследить и убить зверя, который его съел. Также звери при поедании игрока будут есть либо его, либо то, что у него в сумках, если оно подходит им для пищи.
Скажем, собирали вы сердца медведей по заданию или просто нажарили кучу вкусных стейков, а вас растерзали голодные львы. Но, вернувшись к телу, обнаружите, что оно не тронуто, скорее всего, львы нашли у вас в запасах более вкусное мясо и полакомились им, не тронув саму тушку. Зверь может совмещать как поедание содержимого сумок, так и самого игрока. Но он всегда прекратит, когда насытится.
При этом лев никогда не съест ничего крупнее кольца или ожерелья с тела человека, а вот с тела гнома вполне может слопать и перчатки, и шлем. А тот же T-Rex из Кратера Унгоро спокойно проглотит целиком и таурена, оставив его без меча, нагрудника или штанов. Но, повторюсь, цель зверей не в том, чтобы съесть одежду игрока. Но мизерный шанс есть.
Гном медведю на один укус
Раны, страхи и адреналин
Для всех живых существ, включая гуманоидов, добавлены новые состояния:
Выброс адреналина — ускорение атаки и скорости бега. Может активизироваться при атаке у хищников или побеге. Работает у всех, у кого бьётся сердце;
Критические ранения — падают скорость бега и атаки. Существо получило серьезные повреждения. Появляется после выброса адреналина, который случается при сильном падении здоровья;
Предсмертная агония — отключается пассивное восстановление здоровья, открывается кровотечение, которое можно остановить только лечением;
Эти эффекты накладываются как на игроков, так и на всех живых NPC. А что ж с мертвыми и конструктами? Адреналина у них нет, как и предсмертной агонии, зато они получают «критические ранения». При битве с нежитью в какой-то момент ее атаки становятся медленнее, как и скорость бега. Сама она от полученных ран не умрет, но и выброса адреналина для финального броска или побега у нее тоже не будет. То же касается механизмов. Над драконами и демонами пока думаю.
Смерть от полученных ран в бою, он пытался вернуться к стае, но не успел
Что это дает? Во-первых, добавляет иммерсивности, раненные существа теперь действительно раненные. Они больше не могут бегать и прыгать, как раньше. Во-вторых, животные получили реальный шанс спастись, если все пошло не по плану, или, напротив, догнать раненную добычу. А сильно раненные звери, если не найдут пропитание, просто умирают, становясь едой для других.
А теперь немного о страхе. Зверя можно испугать. Скажем, громким звуком. Падение метеорита того же Инфернала или взрыв динамита способен распугать зверей вокруг. Крик, в целом, тоже может испугать. Охотник с ружьем теперь рискует распугать всю округу. Это можно использовать в своих целях. Скажем, отогнать стаю от тела или, напротив, погнать животных в деревню, и пока жители ими заняты, проникнуть на территорию незамеченным. Также зверей пугает смерть их сородичей. Животные, получившие много урона или один, но очень болезненный удар, могут убежать. Смерть или побег сородичей при атаке стаи сигнализирует остальным, что враг силен, и, возможно, лучше его оставить в покое.
Стая попыталась отогнать меня со своей территории, и как только я вышел за пределы, оставила меня в покое, но атака по сородичу, заставила из передумать, а его смерть передумать второй раз
Взрывы или просто столб огня — вполне действенный способ прогнать зверей, но не гарантированный
А вот что действительно пугает, так это орущее дерево
Лут и мелкие правки баланса
Пару слов о переработанной системе лута. Может показаться, что теперь выполнять квесты станет значительно сложнее, ведь мало того, что нужно выбить какой-то крестовый предмет, еще и нужно зверя поймать и т.д. и вы будете и правы и нет. Теперь со зверей, и с гуманоидов, да и вообще со всех, шанс выпадения органов и частей тела 100%. Если нужно добыть три кабаних сердца, вам потребуется убить ровно трех кабанов. Клыки - тоже самое. Более того, все что может выпасть из зверя при убийстве и относится к его телу (кишки, глаза, клыки, перья, когти, мясо и т.д.) выпадает также со 100% вероятностью. Убив зверя вы получаете с него все, что возможно вообще выбить с этого животного.
Дополнительно, рассматриваю возможность увеличить количество выпадаемых предметов. Скажем, если выпадает глаз, то сразу два. Мяса, 5-10 или 15 шт с туши и т.д. Так как охота стала сложнее, и награда должна быть. Что бы обеспечить себя медвежатиной, должно быть достаточно загнать и убить одного медведя. Но это пока на тестировании.
Также исправлена логика массовой атаки. Так как у моделек NPC и игрока нет коллизии, они могут стоять друг в друге. Что приводит к некоторым условностям, когда игрока бьют 20 человек, они все могут стоять в одной модельке. Это сильно ломает погружение. Поэтому теперь бьющие рассредоточиваются вокруг цели. Причем один «танчит» ее, а остальные стараются держаться позади. Если же место вокруг цели закончено, то те, кому не хватило места, просто ожидают своей очереди, как только кто-то будет убит или убежит, его место сразу будет занято свежим бойцом. Это немного исправляет ситуацию с балансом, если сорвалась целая деревня, а также выглядит более корректно. Также дальнобойные ребята теперь стараются отходить, если к ним подходят.
Наглядная демонстрация, как разница в размерах влияет на количество одновременно атакующих и чем заняты остальные. Ну и бонусом, экосистема не спит, ворги пришли на запах крови и трупов
Экосистема вне зверей
Эта часть пока проработана очень поверхностно. Основные силы были брошены на проработку животных. Но вот что уже сделано:
Защита территории — гуманоиды и разумная нежить теперь охраняют свои границы от враждебных индивидов. Скажем, фермеры защищают свои поля и скот от хищников. Причем, если к ним приблизится игрок, они не бросятся в атаку, а вначале попросят уйти. Если же игрок их проигнорирует — атакуют;
Поддержка — в случае если кто-либо вступает в открытый конфликт с жителями поселения, на защиту выходят все, кто видит драку, в зависимости от своей смелости. Женщины чаще будут убегать и звать подмогу. Первыми в бой вступают стражники. Но и остальные мужики быстро присоединяются.
Распорядок дня — теперь в поселениях жители могут ходить спать, гулять в вечернее время. Собираться в тавернах и у костров и т. д. Это пока на очень ранней стадии, но частично работает. И да, если игрок потревожит тренера или торговца в момент отдыха, ему придется заплатить повышенную цену как компенсацию прерванного отдыха;
Запоминание обиды — если игрок или зверь напал на поселение, его отогнали, и он вернулся, то стража сразу бросится в атаку, и поднимется тревога. Так как враг, с которым уже был конфликт, вернулся. И чем больше убийств на счету, тем больше сил будет брошено;
Так как им также выданы слух и зрение, теперь можно это использовать в своих интересах. Выманивать NPC в уединенные места, где с ними расправляться без лишних глаз и ушей;
Настройка
Как и во всех предыдущих модулях. Этот так же можно полностью настроить под себя. Шансы охоты, страха, углы обзора, острота зрения, слуха и т.д. и т.п. Все константы и шансы задаются непосредственно в таблицах базы или в файле конфигурации.
Итоги
Если кто-то дошел до сюда, спасибо за внимание!
Я далеко не всё упомянул, планы по развитию той же экосистемы зверей также есть, как и экосистем других видов. Как минимум обязательно нужно закончить блок гуманоидов и нежити.
Сейчас мир игры ощущается уже куда живее. Периодически случаются разные события, вне зависимости от действий игрока. Банально, частенько можно увидеть, как те же мурлоки кошмарят местных воргов или две стаи грызутся за чью-то тушу. Этот блок отнял у меня порядочно времени, думаю, ближайшее время сосредоточусь на мелких задачах, чтобы немного передохнуть. Спойлер, появились мысли, как улучшить систему погоды, возможно, этим и займусь =)


















































