Бессонный кодер
5.17K subscribers
262 photos
47 videos
4 files
101 links
Канал разработчика и поисковика ДПСО LizaAlert

Связь: @sleeplessfeedbackbot или Direct канала (они бесплатные)
По рекламе: @dpp_ads
Купить рекламу: https://telega.in/c/sleeplesscode
Download Telegram
🧠 Где укрыться?

Один из самых базовых — и самых сложных — вопросов, который встаёт перед ИИ в The Last of Us. Потому что это не «сесть за ящик». Это — решение о выживании. А выживание, как и смерть — вещь нерациональная.

🔹 Сначала — сбор кандидатов:
ИИ ищет cover posts — это точки укрытия, заранее просчитанные в редакторе, с ориентацией против угрозы. Берутся ближайшие 20 штук на NPC. Каждая из них проверяется четырьмя лучами: можно ли стрелять из неё по игроку. Если хотя бы один луч блокирован — точка отбраковывается.

Параллельно находятся open posts — это точки для разведки: из них тоже стреляют лучи, но не по игроку напрямую, а в последнее известное его местоположение.

🎯 Всего за кадр может быть запущено до 160 raycast’ов — они же формируют исходный список точек, куда NPC в теории может пойти. Затем на оставшиеся точки запускается pathfinding, но не сразу — в порядке очереди, максимум 20 на кадр.

🔹 Потом — пост-селекторы (post selectors):
ИИ не выбирает точку сразу. Он передаёт весь массив данных в скриптовую систему. Всего в игре было 17 различных селекторов, каждый из которых подбирает точку под текущее состояние NPC: атака, уклонение, оборона, паника и т.д.

Каждый пост проходит через набор критериев — и каждый критерий выдаёт значение от 0 до 1. Эти значения перемножаются: итоговая точка — это та, у которой наивысший результат. Причём:

– Критерий ai-criterion-static-pathfind-not-near-player отбраковывает укрытия, путь к которым идёт сначала к игроку, а потом от него. Это частый баг в шутерах — когда NPC «хочет» пойти в дальнее укрытие, но для этого пробегает мимо тебя.
– Критерии можно обновлять на лету — всё написано на LISP и перезагружается без перезапуска.
– Все оценки точек идут асинхронно, заранее, поэтому ИИ мгновенно реагирует на смену ситуации — он всегда знает, куда ему двигаться, не тратя кадры на панику.

📌 И именно поэтому люди в The Last of Us кажутся живыми. Потому что они не бегают по скриптам, а взвешивают варианты, анализируют, не слишком ли они сблизятся с тобой при беге к укрытию.
В отличие от заражённых, человек в бою не инстинкт — он расчёт, страх, уклонение и агрессия. А у тебя на него — всего пара патронов.
293🔥2🍓2💋2👍1
«Ты слышал это?» — основа стелса в The Last of Us. Но за этой репликой стоит не скрипт, а слоистая система ролей, пост-селекторов и поведенческой логики, где ИИ сам решает, кто идёт проверять, и как именно он будет это делать.

Всё начинается с отвлекающего события — шум, камень, бутылка, патрон не попавший в цель. NPC слышит звук и… запрашивает роль "Исследователя". Получает её один из доступных — и только тогда начинается реакция.

Он выбирает позицию с помощью кастомного пост-селектора, идёт к ней, проигрывает анимацию осмотра.
Ничего не нашёл? Возвращается к предыдущему состоянию и продолжает движение по скриптовому маршруту.

Но всё это — только если игрок не обнаружен.
Если обнаружен — начинается поиск. И тут в дело вступает поисковая карта.

Поисковая карта — это сетка клеток, где каждая клетка отображает вероятность нахождения игрока.
Когда игрок был виден — отмечена только одна клетка. Как только игрок исчез — вероятность начинает растекаться по соседним клеткам, как чернила в воде.

Каждый кадр:
– NPC проверяют клетки в зоне видимости — и обнуляют вероятность в них.
– Остальные клетки продолжают "вспухать" по соседям, распространяя тень игрока по карте.
– NPC разбиваются по зонам, каждый обрабатывает свою часть сетки.

Результат: у каждого есть представление, где игрок может быть. И он действует не по скрипту, а по вероятности, основанной на недавнем контакте, топологии и текущей видимости.
❤‍🔥37🕊4👀31👍1🔥1👻1💘1
🧠 Как сделать врагов в игре не просто опасными, а страшными?

Секрет — не в уроне, не в численности и даже не в хитром ИИ.
Секрет в координации и потере контроля.

Каждый выстрел по игроку сопровождается полной телесной реакцией:
анимация боли, отнятие управления, короткий момент уязвимости.
Это не просто попадание — это пауза, наказание, ошибка, превращённая в событие.

Но чтобы игрок это чувствовал, кто-то должен гарантированно стрелять.
Каждый бой. Каждую секунду. Без суеты.
И тут в игру вступает Combat Coordinator — сердце тактического ИИ.

Combat Coordinator — это глобальный диспетчер ролей.
Он следит за всеми NPC на арене и раздаёт им поведенческие функции:
– Flanker — обходит фланг
– Approacher — продвигается вперёд
– Investigator — проверяет след
– StayUpAndAimer — держит позицию
– OpportunisticShooter — тот, кто стреляет прямо сейчас

Вот он — ключ.
Игра гарантирует, что всегда есть хотя бы один враг, ведущий огонь.
И не просто стреляющий — а срывающийся в огонь мгновенно.
Даже если NPC в анимации, он немедленно прерывает её и стреляет.
Это решение сделало ИИ смертельно опасным.

Зачем оно так сделано? В предыдущих тестах NPC начинали стрелять слишком поздно, игроки легко выносили всех в лоб.
Теперь — один отвлекает, другие окружают.
Ты получил пулю — остановился. Враги — не останавливаются.
👀30👍97🔥4🍌1🎃1
А у нас закончилась рубрика внутри рубрики (да, вчера был последний пост про ИИ в тлоу)

Так что давайте отвлечёмся, причём отвлечёмся прям максимально. Как некоторые из вас знают, я стараюсь по мере наличия времени участвовать в поисках в составе отряда LizaAlert, но ещё больше людей у меня часто спрашивают — зачем это мне?

Предлагаю вам посмотреть целых 8 причин зачем!
❤‍🔥21432👀2🔥1🌭1
Media is too big
VIEW IN TELEGRAM
После изматывающего боя с заражёнными Элли и Дэвид отступают в заброшенный склад. Постановка этой сцены явно вдохновлена «Ночью живых мертвецов»: герои в осаде, последние патроны, клацающие челюсти снаружи — и чувство, что выжить получится лишь чудом. И чудо происходит: Элли и Дэвид остаются в живых и садятся у костра. Тишина. Напряжение спадает — но лишь на поверхности. Потому что сейчас начинается самая напряжённая часть.

Дэвид заводит свой знаменитый монолог: «Я считаю, никаких случайностей не бывает. Недавно мои люди пошли в город за едой. Вернулись не все. Те, кто выжил, сказали, что на них напал один психопат. И, представь себе... с ним была девочка». Дальше — пауза. Дэвид улыбается. Элли замирает. А игрок вдруг осознаёт: он не просто присутствует при сцене — он в ней участвует. Это не просто разговор — это суд.

В этот момент The Last of Us впервые не просто намекает, а прямо вспарывает моральный слой происходящего. До этого игрок убивал десятки людей. Без имён. Без лиц. Без последствий. Но теперь перед ним — не просто очередной враг, а Дэвид: спокойный, разумный, харизматичный. Его люди тоже потеряли близких. Они тоже выживали. Возможно, они даже добросовестно искали еду. И вот теперь ты смотришь на Элли, которая вот-вот побежит за лекарством для умирающего Джоэла — и не можешь не задать себе вопрос: а правда ли ты герой этой истории?

Именно в этой сцене Naughty Dog делают то, над чем бились ещё с первой части Uncharted — пытаются преодолеть конфликт между игровыми действиями и нарративом. И персонаж Дэвида становится инструментом этого сомнения: он не просто антагонист, он зеркало. Он не угрожает Элли — он стыдит её. И игрока. И если тебе вдруг стало не по себе — значит, всё работает как надо.
👍216🎉4💅4❤‍🔥2🔥1😍1
Media is too big
VIEW IN TELEGRAM
(Внимание, сцена крайне не рекомендуется к просмотру лицам младше 18 лет, а также особо чувствительным людям, берегите себя)

Для многих игроков чудесное выздоровление Джоэла — один из самых спорных моментов всей The Last of Us. Он был при смерти, потерял сознание от лихорадки, но спустя несколько часов после укола пенициллина уже бегает по снегу и душит людей голыми руками. Даже в мире, где гриб превращает людей в чудовищ, эта сцена кажется натяжкой. Что особенно парадоксально — ведь в остальном игра болезненно стремится к правдоподобию. И всё же именно эта неправдоподобность становится необходимой: без неё не было бы того Джоэла, которого мы увидим дальше.

Но что самое важное, он очнулся не просто выжившим — он очнулся отцом. Элли спасла его, заботилась, рисковала — не имеет права её потерять. С этого момента Джоэл движим не просто целью, не просто инстинктом, а чем-то гораздо сильнее — страхом снова остаться одним. И потому, когда он находит людей из банды Дэвида, в нём нет ни капли сомнения. Он хватает двоих. Один — привязанный к батарее, другой — на коленях. И тут начинается сцена, которая ломает остатки иллюзий о героизме.

Это не всплеск ярости. Это не аффект. Джоэл хладнокровен, точен, привычен в каждом движении. Он не просто допрашивает — он пытает. А когда получает ответ — убивает обоих. Без эмоций. Почти буднично. Даже с язвительной репликой, как будто это сцена из другого жанра. Но никакого облегчения или катарсиса не наступает. Только холод. И вот тогда игроку становится ясно: этот человек — не герой. Он человек, для которого любовь неотделима от насилия. Он будет убивать, если того требует забота. Он будет лгать, если того требует привязанность. Он — отец, в мире, где доброта не выживает.

Без этой сцены финал игры не работал бы. Она — первый удар по щиту морали, за которым прятался игрок. Джоэл больше не тот, кого нужно спасать. Теперь он сам — угроза. Но угроза во имя любви. И в этом, как ни страшно это признавать, он становится самым человечным персонажем во всей игре. И что самое главное — эта сцена нам напрямую предвещает и помогает понять пролог The Last of Us 2, поэтому мы ещё вернёмся к ней.
32👀6🔥4💅3❤‍🔥1👎1🤔1
Media is too big
VIEW IN TELEGRAM
(Внимание, сцена содержит кадры насилия, не рекомендуется к просмотру чувствительным людям, берегите себя)

Финал зимней главы — это не просто кульминация арки Дэвида, а кульминация взросления Элли. Она пробирается в заброшенный ресторан, где, среди сломанных стульев и затопленных огненном светом столов, начинается поединок — не на выносливость, а на человечность. Дэвид — не очередной враг. Он персонаж, зеркальное отражение Джоэла, только лишённый любви. Он говорит с Элли как взрослый с взрослой, но за его голосом — угроза. И Элли отвечает. Удары ножом, прятки, сближение, сцепление, крик — и тьма.

Оба теряют сознание. И вот игрока переносят к Джоэлу. Он бредёт сквозь метель, приближается, медленно, но неотвратимо. Эта смена перспектив — идеальное решение. Эмоциональное напряжение растёт, и пока игрок продвигается через белую пелену, он знает, что что-то должно случиться, он знает, что Элли сейчас сражается один на один c канибаллом и гебефилом. Эта сцена закладывает фундамент для чередования точек зрения в The Last of Us Part II.

Но до второй части ещё далеко. Сейчас — Элли. И она не убивает — она уничтожает Дэвида. Раз за разом. Без счета. Без остатка. До тех пор, пока Джоэл не находит её, не хватает, не останавливает — и только его объятия могут вернуть её обратно. Это не сцена победы. Это сцена потери. Смерть Дэвида — это не наказание. Это цена. За выживание. За силу. За то, что ты больше никогда не сможешь быть прежним.

Джоэл обнимает её и повторяет слова, которые когда-то говорил умирающей Саре:
«Это я... Смотри. Это я. Солнышко. Ничего, ничего».
Он называет её baby girl. Так же, как называл дочь.

Игра замирает. Музыка поднимается. Звучит All Gone. Та самая тема, что играла в ночь смерти Сары. Та, что вернётся в финале, когда Джоэл вынесет Элли из операционной. Этот мотив — не просто мелодия. Это связующая нить. Печать на эмоциях. И когда она звучит, игрок чувствует: всё прошло. Круг замкнулся. Детство кончилось. Путь, начатый с потери дочери, продолжается — теперь уже с новой.
❤‍🔥174🔥1
Что тревожит Элли в финале? Она молчит. Неизвестно, осознаёт ли она, что «Цикады» покинули госпиталь Девы Марии. Возможно, боится, что её иммунитет окажется бесполезным. А может, страшится главного — разлуки с Джоэлом. Naughty Dog устраивает эту главу как медленное выдохновение. Это прощание с эмоциями, с надеждой, с детством. И кульминацией этого прощания становится сцена, которая навсегда вписалась в игровую историю — жирафы.

Всё начинается с малого, почти невидимого сдвига. Джоэл, по привычке, подставляет руку, чтобы подсадить Элли, но она не двигается. Сидит на скамейке, потерянная в себе. Это тихий надлом — момент, когда геймплей ломается о внутреннее состояние персонажа. Элли молчит. А потом всё-таки забирается наверх. Игрок ждёт: сейчас скинет лестницу. Но вместо этого — шум. Элли кричит: «Господи!» и убегает. Джоэл в тревоге: «Ты куда? Элли?!» Это мгновение окрашено в рефлекс — игрок готовится к опасности.

Но вместо заражённых — жираф. Настоящий, живой, тёплый. Он наклоняется к Элли, и она протягивает руку. Камера отъезжает, и перед глазами — покинутый Солт-Лейк-Сити, в котором, как по саванне, бродят животные. Природа победила. Она забрала то, что принадлежало ей. И в этой победе — красота, которую игра до того момента почти никогда не позволяла себе показать.

Это первая по-настоящему светлая сцена во всей игре. В ней нет угрозы, боли, выживания. И в этом — её глубина. Люди здесь отсутствуют. Идеальная картинка, свободная от цивилизации. Жирафы в мире The Last of Us — не просто биология, они — символ. Их изображения были с нами весь путь: на рисунке в комнате Сары, в плюшевых игрушках девочек в Бостоне, на стенах приютов и детских уголков. Жираф — это символ детства. Того, что потеряно. Того, за что Элли борется — и чего уже не вернёт.

Возможно, Дракманн специально выбрал этот момент, чтобы заронить сомнение: а стоит ли человечество спасать? Не является ли эпидемия — естественной коррекцией? Как бы ни было, жираф остаётся немым, но выразительным воплощением справедливости. В мире, где она невозможна — он просто стоит, ест листву и позволяет Элли на миг снова стать ребёнком.
16❤‍🔥3🤔2🔥1
В операционной — девочка на столе, окружённая врачами. Элли как жертва на алтаре. Джоэл врывается, ослеплённый яростью, и камера дрожит вместе с его внутренним миром. Врач хватается за скальпель, но игрока подталкивают к единственному решению: убить. Нет выбора. И если не стрелять — Джоэл погибнет. Игра не даёт вам уклониться.

Это — ключевой момент. Сценаристы намеренно делают сцену играбельной, а не кат-сценой. Это значит: ответственность ложится не только на Джоэла, но и на игрока. Мы — не просто свидетели. Мы — соучастники. Мы нажали на спуск. И именно здесь игра окончательно перестаёт быть историей о герое. Джоэл не благородный отец. Он — человек, способный на жестокость ради близкого. Даже если это значит уничтожить, то немногое, что осталось от человечности в этом мире.

Он убивает не врагов. Не мародёров. Не чудовищ. Он убивает врачей, учёных, охранников — обычных людей, которые просто верят в шанс на спасение. И делает это так же методично, как и раньше. С ножом, бомбами, ружьём. Без пощады. Мы — вместе с ним.

И именно этот момент упускают многие игроки, проходя игру, воспринимая его как очередной уровень, очередное убийство NPC которых за всю игру было сотни и тысячи. Это предпоследняя деталька пазла готовящая нас к TLoU Part II. Насилие, которое с нашей точки зрения нацелено на добро и защиту близкого, не может быть однобоким. Конечно, можно возложить вину на «Цикад». Они приняли чудовищное решение — пожертвовать девочкой ради общего блага. Но именно в этом — вся суть финала. Здесь нет правильного выбора. Нет моральной чистоты. Есть только действия и последствия. И мы за них отвечаем. И мы очень подробно раскроем эту тему во второй части игры.

Многие ждали бы, что игра предложит выбор. Как в проектах Quantic Dream или Telltale, да даже мы бы в Storytelling сделали тут диалог с выбором: спасти или не спасать, убить или отпустить. Но The Last of Us делает противоположное. Оно забирает выбор, и этим заставляет задуматься. Потому что, когда тебя лишают альтернативы — ты начинаешь чувствовать последствия как свои.

Финал становится зеркалом. Ты был с Джоэлом весь путь, сроднился с ним, понимал и прощал. Но теперь он совершает поступок, с которым ты, возможно, не согласен. И между вами появляется дистанция. Он — другой. Он — не ты. И это делает историю настоящей. Потому что в настоящей жизни мы не всегда можем остановить тех, кого любим, от ошибок. Мы просто остаёмся рядом — и пытаемся с этим жить.
25🔥4❤‍🔥3🍓1
В нашем пазле, который готовит нас ко второй части, осталась последняя деталька, настало время обсудить и её. Джоэл расправился с врачами и подходит к спящей Элли, берёт её на руки и пытается отнести беспомощное тело в безопасность. Тут сценаристы используют приём «Конец и вновь начало» aka «Bookends», повторяя действия Джоэла и игрока из начала игры, как тогда, с Сарой. Это ещё раз подчёркивает нам что тут Элли уже окончательно прошла барьер между напарником и приёмной дочерью.

Можно сказать, что вся первая половина игры — траур Джоэла в котором он всё-ещё переживает утерю дочери, когда как вторая часть игры — его перерождение.

Есть ещё одна интересная цель, которая достигается подобным эффектом — дежавю у игрока, когда, выходя из лифа Марлин направляет на нас пистолет, ведь мы уже видели подобную сцену 15 (в идеале, но можно, как и я 100+ часов назад). Специально подкрепил для вас видео, просто посмотрите, как похожи эти сцены. Да ладно похожи визуально, если если вы синхронизируете начало этих сцен, то вы обнаружите невероятно интересную вещь, конец экшн части и начало более спокойной части (лесок/лифт) идут ПОЛНОСТЬЮ СИНХРОННО.

Марлин, несмотря на свою любовь к Элли, а как мы узнаем позже, она заботилась о ней с рождения, уже сделала свой выбор, согласившись на жертвоприношение на благо человечества. И тут идёт довольно важный для нас диалог.

Марлин: «Её не спасешь. Допустим, ты выберешься. Рано или поздно её разорвут щелкуны. Или бандиты изнасилуют и убьют»
Джоэл: «Это… Это не тебе решать»
Марлин: «Это её выбор. Ты ведь знаешь… Слушай, ты можешь поступить правильно. Ей не будет больно»

Марлин намекает Джоэлу очень важную мысль, которая станет основополагающей во второй части игры, принимает ли Джоэл решение позарез с желанием Элли? Хотела бы она спастись взамен разрушенных мечт на спасение от кордицепса? Но отце принимает окончательное решение в одностороннем порядке, решая самостоятельно, что будет лучше для его дочери, после чего стреляет в Марлин.
🔥19❤‍🔥5
Вот и закончилась наша небольшая история длинной в 3,5 месяца. История, которая началась с длинного плана и сцены потери любимого заканчивается сейчас. Надеюсь, вам понравилось, и вы открыли для себя много нового. Мне — очень.

За это время почти каждая сцена прошла под нашим зорким глазом, каждый взгляд, каждая нотка «All Gone» была разобрана, да, рубрика про геймдев и сторителлинг в The Last of Us закончилась. Печально? Есть такое.

Но каждый финал — это шаг в новую историю.

Рубрика не останавливается, ведь нас ждут другие сцены, другие герои, другая история, но созданная с помощью таких же приёмов монтажа, сценарных подходов и таких же планов.

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

Это значит, что где-то уже начинается следующая.
❤‍🔥203
Как переписать большой JS-проект на TypeScript и не попасть в дурку?
(никак)
Именно этим вопросом мы задались, когда наконец взялись за задачу, которая висела над нами годами: перенос Имперского Стражника на TypeScript.

Что это нам дало?

🔹 Во-первых — стабильность.
Прощай, магическое “а почему тут строка вместо числа?”, “а почему undefined превратился в пустой массив?”, “а почему всё вообще сломалось?”.
С TypeScript багов после обновлений стало меньше, и появилось то самое чувство уверенности в коде, которого так не хватает в JS.

🔹 Во-вторых — контроль и понимание.
Строгая типизация дала бонусы статического анализа, позволила чётче выстроить архитектуру и выявить уникальные случаи, которые раньше были размазаны по коду.
Мы смогли ввести интерфейсы, сделать код легче и... приятнее.

🔹 В-третьих — головоломки для ума.
В условиях многомодального микросервиса возникали кейсы, в которых даже GPT говорила: "Я не знаю как это сделать"
Но в итоге — всё реализовано. Всего один as unknown каст на весь проект. Почти честно!

🔹 В-четвёртых — побочные апгрейды.
Работа с типами докатилась и до других проектов: появились дженерики в rgcache, улучшены сцены в regraf, типизировано то, на что раньше не хватало мотивации.

📍 Где мы сейчас?
Мы прошли отметку в 50% TypeScript-кода в репозитории.
Пишем утилиты, абстрактные классы, бойлерплейты на все случаи жизни.
Но, пожалуй, главное счастье — утилита для маппинга телеграм-ошибок в enum, которая избавила нас от игры “угадай строку в description” и свела обработку ошибок к одной equals-проверке.

🧩 Что дальше?
Завершить миграцию, привести REST API в порядок (пока там лес, JS и безысходность) и, наконец, поставить в YouTrack статус - готово.
🔥164👨‍💻1
😮 А пока идёт голосование — немного инсайдов из кухни Стражника!
Мы активно дорабатываем систему статистики и мониторинга, чтобы не просто чувствовать как живёт проект, но видеть это буквально на графиках.

Что умеем сейчас:
— отслеживать, когда и какие команды наиболее популярны
— понимать, насколько активен Лолофд (и не только, ведь стражник стал использоваться уже много где)
— реагировать заранее на сбои (или их попытки начаться) благодаря алертам
— и просто... залипать в красивые столбики и линии. У меня они теперь вместо скринсейвера

🔧 Появились и алерты — чтобы заранее ловить проблемы и не молиться, когда уже всё упало. Теперь мы получаем сигналы раньше и можем исправить до того, как станет больно.

📊 И да, вы тоже можете залипнуть в метрики (без алертов, но всё же) вот тут:
https://gf.redguy.ru/public-dashboards/e0e799d208844820bd772fdee8b136ca?orgId=1&refresh=5s
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
26🔥3❤‍🔥2
А пока голосов в опросе всё ещё не хватает… давайте вспомним про нейронку, которую мы обучаем для Стражника.

Я уже не раз о ней рассказывал, показывал графики, а некоторые из вас даже видели её в действии в официальных чатах.
Но ведь хочется не просто смотреть. Хочется ПОТЫКАТЬ!

Сейчас мы тестируем обновлённое ядро, которое позволяет системе:
— запускать несколько инстансов бота одновременно
— роутить трафик между ними
— и, что важно, делать это без потери сообщений или производительности.

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

🔍 Потыкать руками можно здесь: @ImMediaGuardBot
🔥17🤗3🙉1😘1