Мобильный геймпад
4 поста
4 поста
1 пост
19 постов
8 постов
2 поста
1 пост
1 пост
8 постов
1 пост
Приветствую в очередной статье по очередной прочитанной книге, с которой начинается очередной цикл:
Мы - Евгения Замятина;
1984 - Джорджа Оруэлла;
О дивный новый мир - Олдоса Хаксли;
451 градус по Фаренгейту - Рэя Брэдбери.
Именно в таком порядке. Произведения были выбраны не случайно. Одним томным вечерком мне захотелось новенького, антиутопии. Спросил у знакомых, почитал различные топы в интернете и взял наиболее часто встречаемые наименования. Пробежался по культовой классике.
Но прежде чем перейдем к сути, давайте подтянем матчасть. Что есть утопия? Идеальный общественный строй где или лучше положение вещей ( нет войн например ) или лучше качество жизни ( никто не толстеет, сколько бы не ел, да и вообще все съедобное и вкусное :D ). Или все вместе. Простыми словами, утопия - то, что лучше текущей реальности. Ее противоположность - антиутопия. То есть описывая реальность должна быть хуже текущей. Все просто! Возможно вы хотите сказать: н-да, ну ты глупенький, разве кто-то этого не знает? Когда я смотрел топы антиутопий, у многих там торчал тот же "скотный двор". При всем моем уважении к чужой работе, но скотный двор - не антиутопия. Это сатира. Серьезно, кто эти топы составляет? Определения в любом случае ещё пригодятся, так что хорошенько запомним их. Спойлеры будут, неуместные шутки тоже, нытье - куда без него?
У меня есть мнение, что знаменитые авторы друг друга читают. Или читали, когда мир не был наполнен настолько огромным количеством инфомусора. В связи с чем, осознано или нет, могли развивать чужие идеи. Потому, по праву первой именитой антиутопии из выпущенных в 20 веке, определим "Мы" 1920 года выпуска как базу, от которой могли отталкиваться остальные. Много хорошего об этом романе я не слышал. Большинство пользуются им чтобы строить из себя настоящего эстета. Только напиши про 1984 - вырастут как грибы комментарии в стиле: "вообще-то, все слизано с романа Мы".
Ощущение, что комментаторы оба романа не читали. Или какой-то пакостник эту мысль сеет по интернету. Проказник. Роман "Мы" написан крайне тяжело, его литературный язык ужасен. Добраться до финала - реальное испытание. Однако "Мы" это настоящая антиутопия. Стеклянные дома, где вся твоя жизнь представлена на обозрение окружающим, секс с любым выбранным человеком по талонам - он не может отказать, отсутствие имен и фамилий и так далее. Все одинаково, открыто, обезличено, доступно. Мир Замятина настолько противоположен нашему, что вызывает отклик ненависти на каком-то клеточном уровне. Главный герой от лица которого идёт повествование - умный математик, принимающий участие в создании космического корабля. Несмотря на свой высокий статус, его жизнь ничем не отличается от прочих граждан. Госгазета предложила всем желающим написать послание возможным далёким соседям, чтобы прорекламировать их классное мироустройство. И главный герой решает описать быт и как он счастлив жить текущей жизнью. Заводит дневник проще говоря.
История, на самом-то деле, достаточно лихая и очень печальная. Мир пережил множество войн. Из людей осталось всего несколько миллионов живущих в единственном городе-государстве. Эдакий последний островок человеческой цивилизации на планете. Определим главные действующие лица:
Д-503 - наш горе математик;
I-330 - бунтарка.
Да и все, хех. Прочих я, пожалуй, выкину из краткого повествования по причине их эпизодичности и не особой важности, для все того же краткого повествования. Одним днём Д-503, казалось бы случайно, встречает I-330, которая начинает проявлять внимание к главному герою. Здесь Замятин делает интересный ход. I-330 понемногу ломает Д-503. Сначала интригует его, возбуждая в том интерес к себе, а затем вынуждает нарушать государственные правила. Понемногу, но все больше и больше стержень Д-503 ломается. Причем I-330 по ходу книги умудряется ловко манипулировать ходом мыслей Д-503, заставляя того считать, что он не принадлежит этому миру, а его место с дикарями в природе. Заставляет поверить, что народ свободных людей - его народ. Все это выглядит как толкание ребенка к антисоциальной деятельности. Манипуляции I-330 написаны настолько хорошо, что сам читатель будет до конца гадать - кто же она? Влюбленная девушка или бессердечная преступница, что использует Д-503 в собственных интересах? Достаточно преобразив мышление главного героя, I-330 наконец посвящает того в тайну существования оппозиции. Более того, она втягивает героя в участие в новой революции! План революционеров одновременно прост и специфичен. Они захотели посеять семена раскола в обществе, а затем взорвать городские стены, дабы впустить дикарей, зверей и прочие прелести природы, от которой успели отвыкнуть люди. Но был ещё и третий этап плана революции, о котором я тактически умолчу и вернусь к нему чуточку позже.
Первый этап удается реализовать без проблем. В праздник Единогласия, где всё общество голосует за переизбрание своего Благодетеля, тем самым показывая единство общество, революционеры голосуют против. И их оказывается достаточно много, чтобы произвести внушительный эффект на граждан, среди которых начинается паника. Со вторым этапом также не возникло сложностей. Но вот третий... Финал книги заставил меня крепко призадуматься. Видите ли, это история в которой тебе некому сопереживать, кроме Д-503. Несчастный человек-инструмент. Он был винтиком системы, который поверил в свою значимость и стал частью революции. Но и те лишь использовали его. Как один из главных строителей космического корабля, он мог дать к нему доступ революционерам. Хотели они улететь? Разрушить ракету и спасти другие цивилизации? Нет. Они хотели сжечь государство до тла, со всеми людьми в нем, направив сопло корабля на город. Плану не суждено было сбыться - правоохранители сумели схватить революционеров. Вскоре после всех этих событий, правительство одобряет массовую лоботомизацию населения. Людей насильно забирают, чтобы вырезать участок мозга отвечающий за фантазию. Включая нашего Д-503. Не просто репрессии на репрессиях, как любят в других антиутопиях, а натуральное превращение человека в биологического автоматона.
Вспоминая успех революционеров на дне Единения, понимаешь, что противников государства было много. Во всяком случае достаточно, чтобы бескровно изменить систему изнутри. По ходу сюжета тут и там будут встречаться революционеры на разных гос должностях. Мог ли жуткий план по сжигаю миллионов последних людей возникнуть из-за того, что революционеры узнали о грядущей лоботомизации? Или же их действия спровоцировали начало всеобщей принудительной операции? Мир Замятина жесток. Его людей охватило безумие в жажде разрушения и порядка. Потому это великолепная антиутопия - попади современный человек туда, он не станет героем спасителем. Он будет страдать.
Сначала я хотел все сделать одной статьей, но потом, описание за описанием, текст раздулся как труп всплывший со дна реки. С другой стороны это позволило разойтись с описанием сюжета, пусть и кратким, и собственными мыслями. Про "Мы" я вам наговорил. Мне не понравилось читать книгу, но понравилось ее осмысливать. "Мы" можно обсуждать, о ней можно спорить. Этого, как по мне, уже достаточно, чтобы считаться хорошей книгой, но из-за невозможности получить удовольствие от процесса, отличной ей не быть.
"Мы" был достаточно долго запрещен к печати в СССР. Конечно, когда слова "революция" и "единый вождь" встречаются в одном произведении, сразу же в голове всплывают ассоциации. Но даже при первом рассмотрении видно, что государство из романа и союз далеки друг от друга как звёзды от земли. Страх перед романом мог быть обусловлен как банальным скудоумием цензоров тех лет, так и боязнью тех, кто мог воспользоваться книгой.
I-330 в финале романа показала себя максимально идейной личностью. Это лишь укрепило мое мнение, что все ее кокетство с Д-503 было пропитано ложью. Она тот тип личности, для которого важна лишь идея. А все что стоит на пути к цели будет перемолото в фарш.
Мне бы хотелось узнать ваше мнение о книге, о конфликте и об отношении к I-330. Да и роман все же советую прочитать, сквозь боль и слезы.
Чтож, вот и финал. Спустя клиента на Godot, который может отправлять данные о нажатия, нужен сервер - для приема и отправки на ViGem.
Итак, серверная часть. Тут не так и много магии, как могло бы показаться.
get_ip - функция получения текущего ip сервера. ip назначается маршрутизатором, потому может меняться и желательно знать актуальный ip для того, чтобы показать его клиенту;
get_port - тут много не заморачивался и задал статичный, хотя можно проверять порт на занятость и искать любой свободный.
Так как способ отправки данных из прошлой части имеет нюанс - Json объект может отправляться кусками, то на сервере мы его собираем: строки 105, 130-134. То есть собираем данные пока не получим символ } - конец объекта.
Функции left_joystick_float, right_joystick_float, press_button и release_button встроены в библиотеку vgamepad, которую можно спокойно установить через pip. И все. Сервер принимает данные, смотрит какая метка в j_data['M']:
LJ - левый стик;
RJ - правый стик;
P - кнопка нажата;
U - кнопка отжата.
Остальные данные это координаты стика или же конкретная кнопка. Дальше данные передаются драйверу. На этом магия кончается.
Написание такого рода материала для меня хороший способ поднять мою ленивую жэпу и поделать какие-то дела, напрячь мозг хоть немного. Ещё так удобно закреплять знания в голове. Для меня сплошные плюсы, а вам... может узнали что-то новое. Честный обмен :) Д-а-а-а, там еще есть части с экспортом в apk, установками sdk, настройками окна в проекте, но опять же это все для формата туториала, чем данный цикл статей, увы, не является. Теперь, как и обещал, ссылка на полный код. Хотел на git, но потом решил на ЯндексДиск скинуть сразу и готовый apk, если не хотите собирать самостоятельно, и код и драйвер.
Ссылка на видео с игрой в Broforce на таком вот импровизированном геймпаде, на случай, если вам кажется игра на этом деле невозможной.
Глупо спорить, что это жуть как неудобно. Вещь жизнеспособная, ситуативная, забавная. Мне было приятно делать этот геймпад и смешно на нем играть.
Продолжаю небольшой цикл с рассказом о том, как я делал из своего телефона геймпад, чтобы просто поиграть с друзьями в Broforce на ноутбуке. Сегодня поговорим о переключениях между сценами, чтению и записи в json-объект и передачу данных по сети.
После первой + 1.5 статей у нас есть сцена с кнопками. Её мы назначим главной, чтобы при запуске приложения она нас сразу встречала после запуска программы. Теперь создадим сцену с настройками. В этот раз это будет узел Control, вместо Node2D, потому что в Control входят так нужные нам строки с записью текста. Зависимости такие:
Menu - узел Control содержащий все элементы
IP_line - узел LineEdit, строка куда пользователь впишет IP адрес
PORT_line - узел LineEdit, строка куда пользователь впишет порт
Save_data - узел Label, строка с текстом-статусом выполнения
buttons - Node2D узел, включающий в себя кнопки TouchScreenButton. Подтверждение введенных данных и возвращение на предыдущую сцену, соответственно.
Получить данные, которые пользователь будет писать в строках IP_line и PORT_line довольно просто, буквально две строки.
@onready var input_ip = $IP_line
@onready var input_port = $PORT_line
Создадим функцию для обработки события нажатия OK_buttons. Можете сделать это быстро нажав на кнопку->узел->двойное нажатие по событию pressed() (нажата)
Программа попросит выбрать к кому будет привязана кнопка - выбираем скрипт нашего "меню".
data - наш Json объект. Json в целом очень удобный формат хранения данных, представляющий из себя список словарей. То есть множество из пар вида КЛЮЧ: ЗНАЧЕНИЕ. Либо один единственный словарь, как в нашем случае. data содержит два поля ip и port. Значение пользователя получаем через ранее созданные input_ip и input_port, добавим к каждому .text - уточняем, что мы хотим получить текст из узла LineEdit.
Открываем файл на запись (FileAccess.WRITE) через встроенный FileAccess.open, проверяем, что файл получилось открыть или создать (если файла не было, он автоматически будет создан), и записываем туда данные. Остальное, надеюсь, в комментариях не нуждается, да и в целом подробное описание каждого чиха лучше ощущается в видео формате.
Чуть не забыл о Label! Подключим его строкой:
@onready var savedata_result := $Save_data
Функция _ready сработает сама при первом заходе в сцену. Она спрячет на Label, так как пользователь его видеть не должен. Та самая заглушка которую можно было видеть выше, будет скрыта если запустить приложение. Функция show_message принимает два параметра - сообщение, и Label, который должен выйти из скрытности и показать сообщение. Реализовал так, чтобы не приходилось писать под каждый отдельный Label свою функцию. Теперь, когда будет нажата кнопка ОК, под строками покажется сообщение-статус.
Для кнопки BACK_button - возвращения на предыдущую сцену - все куда проще:
get_tree().change_scene_to_file("res://Controller/controller.tscn")
Встроенные функции Godot позволяют легко переключаться между сценами, лишь бы вы правильно указывали пути и дерево было прогружено.
В сцене контроллер для подключения к серверу я сделал функцию connect_to_server, но само подключение осуществляется через встроенную connect_to_host. Чтобы ей пользоваться необходимо создать объект StreamPeerTCP
var peer : StreamPeerTCP = StreamPeerTCP.new()
Замечательно, теперь можем подключаться к TCP-серверам. Но это ещё не все.
Чертов poll. На самом деле не помню как точно обнаружил эту ошибку, но крови она мне выпила много. Дело в том, что в официальной документации на StreamPeerTCP забыли уточнить, что сервер желательно пинать, чтобы подключение не было отрублено. С одной стороны - логично. С другой - начинающий хлеб об этом не думает. _process ещё одна функция/фича Godot. Функция выполняется на фоне и делает это постоянно. Таким образом, если в теле оставите .poll и проверку статуса подключения (строки 39 и 40), то будет вам счастье. Строки с 41 по 44 были когда-то нужны для отладки - смотрел прием данных с сервера. Кто знает, когда пригодится.
Хорошо, подключили, как отправить данные? Тут на помощь приходят функции начинающиеся на put_ и также входящие в StreamPeerTCP. Чтобы было чуть понятнее, вот пример использования:
peer.put_utf8_string(message)
Таким образом отправляется сообщение в формате UTF-8. Это довольно примитивный уровень, но для закрытия текущей задачи его хватает.
Чтож, следующая статья будет последнее. В ней я немного расскажу о том, как устроил сервер и ещё немного об обработке нажатий. Там же будет ссылка на исходные коды на финальные версии сервера/клиента. К сожалению, исходя из последних новостей, в новых версиях ОС для мобильников хотят полностью запретить возможность установки сторонних приложений, а значит собрать на дому и "поиграться" становится все меньше и меньше возможностей.
Один хороший человек указал на довольно грубую ошибку с моей стороны. Я умудрился обложиться костылями пока делал кнопки. А все из-за банальной невнимательности.
Все это время у TouchScreenButton был чертов Shape2D! А значит области можно было назначить в одном узле и не городить кучу зависимостей. В общем настало время убрать за собой мусор.
Но начнем мы издалека. Представим, что мы очень ленивые люди ( мне и представлять не надо, родился с преимуществом, хех ). Нам нужно переместить кнопки нашего мобильного контроллера. И вот незадача - опять высчитывать пиксели, чтобы кнопки стояли ровно, по уровню. Можно ли как-то решить эту проблему? И да и нет. Дело в том, что узел Node2D и его дочки не дает таких возможностей. Данная привилегия осталась у узла Control. В обычной ситуации создается дочерний узел из состава Container (входит в Control). Одни позволяют выстраивать элементы по диагонали, другие по вертикали и так далее. Такие дочерние узлы - контейнеры - не видят элементы из состава Node2D. И вот тут в дело вступает магия костылей! Мое любимое.
Если закинуть кнопку, в нашем случае TouchScreenButton, в узел Control, то вы сможете привязать вашу кнопку к контейнеру. В моем случае я выбрал MarginContainer (Left_Buttons и Right_buttons в левой колонке зависимостей) для расстановки кнопок. Много играться не стал, успокоился и на этом. Что-то мне и такого хватило "_"
Теперь вы можете перемещать все кнопки сразу, двигая один лишь контейнер.
Как уже сказал, у узла/кнопки TouchScreenButton есть встроенный Shape2D (@_@), благодаря которому можно и без Area2D сузить область обработки нажатия.
И да, в TouchScreenButton заодно встроены сразу поля для текстур состояний нажатия и ожидания. Без кода. Зато мы познакомились с Area2D :DDD
Такой мини-бонус. К бонусу. Если помните, в прошлой части кнопки из левой половины контроллера были совсе-е-ем другие. Они мне не очень нравились и я сделал свои. Так как я довольно криворукий, пришлось подключать смекалку. Итак. Есть кнопка A - будет треугольником теперь, немного кисточки и заливки из Paint и вуаля.
Во вкладке холст есть удобные кнопки разворота. Не забудьте включить "прозрачный холст". Он конечно не понадобится для картинки, которая изначально была без фона, но мало ли что Windows удумает. Потом я сохранил каждый поворот отдельно и поменял цвета местами через заливку. 1 минута и 8 картинок для кнопок движений готовы.
Хочу также обратить ваше внимание на очень удобную функцию "Волшебное выделение", которое позволяет автоматически определять выделяющиеся объекты и вырезать их из фона. Может быть полезно в некоторых ситуациях.
Итак, это мой небольшой... Да на самом деле довольно большой! Рассказ как я делал из своего телефона контроллер. Небольшая предыстория. Решил я сыграть в Broforce с друзьями и тут понял, что если я притащу свой ноутбук с игрой, то поиграть с комфортом мы не сможем - нет столько контроллеров. В mvideo геймпады для xbox или ps стоили около 5 тысяч рублей. Можно было и китайские купить, которые обещали нормально работать при подключение к компьютеру, но... Но отсутствие доверия к качеству и жалось не то что к 5 тысяч, а к 700 рублям удавили возможность покупки на корню. И тут мы задумались, а можно ли сделать собственный мобильный контроллер. Конечно же мы нашли готовые проекты в google play, но они шли с вшитой рекламой и могли начать портить игровой процесс в самый неудобный момент. Так родился интересный проект для реализации. Был ли у меня опыт с Godot? Нет. Разработчик или хотя бы хоть сколько-то программист? Нет. Удивительно, что можно сделать при беспардонном упорстве и наличии гугла. Проект я в итоге сделал. Потом забил на него. А недавно вспомнил! И решил переделать :) Эта и все последующие статьи как раз пересказ процесса ПЕРЕСОЗДАНИЯ мобильного контроллера. Кусочек результата старого проекта ниже:
Зачем вообще переделывать, а не дорабатывать готовое? Я решил серьезно углубиться в Godot и реально сделать свой проект, игру. Ту в которую я бы хотел сыграть. Все же гнаться за мечтой, даже детской, это несколько романтично, возвышено и тупо. Меня устраивает. Старый контроллер имел серьезные проблемы в самой своей базе. Так же его переработка хороший способ убить сразу несколько зайцев. Структура проекта "Контроллер" осталась старой.
Сервер на Python - принимает подключение телефона, получает нажатия и передает их драйверу ViGEmBus. Сервер поддерживает подключение до 4ех человек;
Контроллер на Godot (далее по тексту клиент) - подключается к серверу, передает ему нажатия. Для хобби-прототипа сильно париться не хотелось. У клиента всего 2 сцены - настройки и сам контроллер;
ViGEmBus - драйвер для эмуляции виртуальных игровых контроллеров в операционных системах Windows. К сожалению, поддержка этого чуда прекратилась, и что будет теперь, мне не ясно. Скорее всего рано или поздно настанет момент, когда драйвер перестанет быть совместим с играми или новой версией ОС. Но пока что наслаждаемся.
Бесплатные картинки для кнопок взял с https://itch.io/game-assets/free/tag-gamepad. Набор приличный, на любой вкус. Со стиками было проще всего - не стал создавать велосипед и загрузил Virtual Joystick от MarcoFazio через AssetLib. А вот кнопки делал через узел TouchScreenButton - в документации Godot этот узел как раз предназначен для обработки на сенсорных устройствах. Загрузил текстуры для кнопок ииии... И границы текстур оказались слегка больше, чем ожидалось.
К стикам это не относится, так как они созданы через другую сущность Control. Пока не забивайте этим голову.
В общем Godot правильно определяет границы - я ведь не обрезал прозрачные лишние части. Вроде и черт с ним, но ведь нажатия будут обрабатываться неправильно - в местах пересечений будет срабатывать несколько кнопок. Вариантов была два (по крайней мере о которых я прочитал):
Обрезать кнопки в редакторе убирая пустоты;
Забить на TouchScreenButton и создавать области вручную через Area2D и CollisionShape2D.
Будучи здравомыслящим(?) человеком, я выбрал второй вариант. Чтоб больше страданий было, хех. Если пошагово, то создавалось все это дело следующим образом:
Для 4ех левых кнопок был создан отдельный узел Node2D (CrossButtons1);
Для каждой кнопки создан узел Area2D (UpArea);
Для Area2D были созданы Sprite2D (UPsprite) - отображение кнопки, и CollisionShape2D (для него я уже поленился название выдумывать) - зона обработки нажатия.
Для узла CrossButtons1, в который входят кнопки, добавляем скрипт со следующим текстом:
зашел сюда по быстрому сделать кнопку? Хотел скопировать текст, а тут картинка? Уж прости, картинка красивее текста выглядела.
Строка 4 нужна для привязки функции обработки нажатия к нашей области Area2D (UpArea). Строки 8 и 10 ловят нажатие и отпускание кнопки.
Это все супер, но как будто лень писать подобный код для каждой новой кнопки. Благо, действительно есть способ попроще.
Пробегаемся по всем подузлам нашего Node2D (CrossButtons1), находим те, что принадлежат типу Area2D и подключаемся функцию _on_button_input для обработки всех кнопок в Node2D. Для нашей задачи главное понимать, какая кнопка была нажата - получаем через button.name.
Замечательно, но что если мы хотим, чтобы картинка кнопки менялась при нажатии? Вышеописанные методы уже не сработают, придется работать с каждым Area2D узлом отдельно. В целом ничего страшного. Делаем все те же шаги, что раньше, но создаем скрипт для узла Area2D. В него грузим картинки состояний.
Код +- тот же, но добавляем:
Строка 7 - начальное состояние/начальная картинка;
Строки 12 и 15 для переключения состояния/картинки при обработке нажатия.
Все что осталось - томная работа по повторению процесса для создания всех нужных кнопок. В следующей части добавлю новую сцену, ввод текста и сохранение данных в json формате. И немного работы сети. У-о-о-т. Спасибо за чтение. Дельные замечания и советы приветствуются, ибо в плане создания подобного я ещё профан.
А я вернулся-я-я ла-ла-ла
И потихоньку схожу с ума-а-а...
Написание чего-либо для меня как такая славная отдушина, а для вас - очередное душное чтиво. Честный обмен! В этот раз мне захотелось поговорить не о книге, нейросетях, инвестициях, играх или короткометражках, а о манге. Произведений данного... формата, о которых я хотел бы вам поведать, скопилось уж больно много. Надо бы проредить ряды. Для начала хочу отметить следующие манги:
Ш(C)ибатарианец;
Нежить и неудача;
Задуши меня;
Огненный удар;
Магия и мускулы;
Дорохэдоро.
Это законченные произведения с которыми было приятно провести время... Противоречивая фраза учитывая специфику того же "огненного удара", но да ладно. О вышеупомянутых мы обязательно поговорим, однако сегодня у нас Stellar Friends ( звёздные друзья ). Переводом этой манги на русский язык особо никто не занимается, сам ее читал на сайте manga plus, с английским переводом. Удовольствие сомнительное, но на ресурсе можно почитать много популярных произведений. А теперь, переходим к делу. Спойлеры? Будут! Неуместные и несмешные шутки? Конечно!
Изначально я ошибочно посчитал эту мангу очередным около хоррором. На это намекала довольно стремная (почти) первая страница.
Вступление у манги достаточно размеренное и долгое. Читателю презентуют двух главных героев истории. Юта - разумный и спокойный молодой человек. В детстве имел проблемы со взаимодействием со сверстниками. Окто - эксцентричная, энергичная, заводная, с гигантским шилом в... гиперактивная она. Ищет сверхъестественное, ибо обывательская жизнь кажется ей до смерти скучной. Юта же ей в этом всячески помогает. Знакомство у них выдалось необычное, ибо молодая шабутная дама буквально пробила стену квартиры молотком! Да ещё и приняла Юту за грабителя! Правда он в своей квартире был, но Окто о таких вещах не думала - дыра же в ее комнате, значит и за дырой ее комната. В общем Юта получил молотком по голове.
Возможно в тот момент его мозг получил повреждение и потому он безумно привязался к девчуле, не знаю. Просто примите как факт - два не самых социальных ребенка привязались друг к другу. Без претензий, знакомство топ.
Однажды, друзья потащились в заброшенное здание, в очередной раз искать сверхъестественное. Именно там, на Окто упал кусок потолка.
Мать девочки слетела с катушек и обвинила юношу в случившемся. Извечные проделки Окто привели к тому, что Юта не завел себе других друзей - тяжело, когда все смотрят на тебя как на фрика. Парень остался совсем один.
История переносится во времени немного вперёд. Юта переехал и пытается воскресить Окто, воспроизводя ритуалы из нелепых книжек по оккультизму. Что он только не пробовал, чтобы вернуть свою вторую половину. Юта буквально помешался, но ничего не получалось. Окто осталась мертвой, а подавленный Юта, не зная что делать, лежал на полу, рыдая. В его сердце кипела ярость, отчаяние, боль от утраты. Он взмолил, потребовал, закричал: "вернись к жизни, Окто!"
Словно ответ от мироздания, перед ним явилась падающая звезда. Живое создание из космоса так впечатлилась его искренним желанием, что решила выбрать его своим хозяином и исполнила его просьбу - Окто воскресла. Радости не было предела, но герой у нас умный, он решил поинтересоваться: на кой черт это все звезде? Оказывается, исполнение желаний приносит неописуемое удовольствие инопланетянину. Сродни плотским утехам у людей.
Короткую идиллию нарушает внезапно ворвавшийся в дом монстр. Тут звезда решает пояснить небольшо-о-о-ой такой нюанс. На планете может быть исполнено лишь одно желание. Если звёзд было несколько, то сила исполнения распределяется и желания реализуются не в полной мере. Вид Окто исказился, девочка стала похожа на недоделанную куклу. Угроза неминуемой смерти приближалась. Паре героев ничего не осталось, кроме как найти в себе силы сражаться.
Это был небольшой пересказ первых 2ух с половиной глав из 28. Ниже пойдет мнение и территория гигантских спойлеров про финал и ключевые моменты. Так что если заинтересовались историей - переходите к оригинальному произведению.
По сюжету далее идёт борьба за право исполнить свое желание в полной мере. Этого, думаю уже догадались, можно добиться уничтожением желаний других загадавших. Потому и называю это королевской битвой - победитель будет один.
В целом, после пары боев я произведение забросил, хех. Пришел тут значится, читать хоррор и посмотреть на жуткие картинки, а тут что? Драка детей с психами? Короче первые 7 глав сплошное надувательство.
Спустя месяц меня загрызло чувство незаконченного дела и я вернулся к чтению, да и ничего другого интересно на тот момент не было. И надо же, это не произведение формата "монстр недели", где каждую главу или арку новый противник. У нас тут драма! Сюжет!
Юта эгоистичен, но он полностью осознает, что делает. Да, часть загадавших желание тот ещё мусор, желающий смерти всем подряд, но в истории есть и простодушные добряки. И все эти мечты нашему герою предстоит стереть в порошок. Натурально убить часть естества в человеке. Юта поначалу не принимает активного участия в битвах, и щадит врагов. Но совсем скоро перебарывает себя, убивая жалость, сосредотачиваясь на цели и более не останавливаясь ни перед чем. Хороший ты или плохой - твои мечты будут уничтожены юным пареньком, безумно жаждущим вернуть свою подругу.
Раз ты уже уничтожил желание Ичиго... то просто обязан стать небесным королем (победитель королевской битвы) и исполнить свое желание - вернуть Окто к жизни. И когда ты это сделаешь... наконец можешь отправиться в ад ;)
Почему звезды упали так близко друг к другу? Почему одна попала к Юте? Почему силы исполнения работают не совсем так, как звезда говорила в самом начале? Почему на планету, куда не должно было прилететь больше одной звёзды, упало целых 24?! Все темные пятна стираются являя нам главного MasterMind этого спектакля! Окто-чан. Ага, вы правильно прочитали. Все это время главный злодей ( или почти главный ) был скрыт от глаз читателя! Воскрешенная Окто - подделка, созданная по образу идеала из головы Юты. Окто умерла, а её душа осталась ожидать окончательного отделения от мира живых. Пока Юта корил себя, Окто пересматривала свою жизнь и все это время с ней была звезда. Потолок не просто так упал на нее - это звезда, привлеченная ее желанием, пробила плитку и убила героиню. Теперь желание некому было загадывать. И звезда и Окто оказались в тупике. Но! Шабутной девахе в голову пришел гениальный план! Если желание не исполнить - загадывающий мертв, значит она разделит его на множество мелких и забросит в мир. Кусок за куском отрывая от звёзды, на земле исполнились: "хочу вернуться к жизни", "хочу вернуть сокровенное", "хочу уничтожить мир", "не хочу умирать одна", "хочу быть самой сильной" и другие хотелки.
Когда Юта уничтожил последнее желание, Окто ожила, взаправду, в совершенстве. Звезда наконец смогла исполнить ее желание - наполнить мир сверхъестественными штуками! Зомби! Гиганты! Роботы-уничтожители с лазерными лучами! Безумие, разрушение, смерти! Окто поехавшая на всю голову. И Юта полон любви к ней.
Вот реальные Джокер (Окто) и Харли (Юта), а не вот эта дичь снизу.
Осознавая ужас, который Окто устроила, Юта абсолютно серьезно сказал, что ему плевать на других. Но действительно ли это то, чего так желала его подруга? Действительно ли она готова отправиться в ад? Окто дрогнула. Долгое время самокопания в посмертии, жертва и борьба Юты, его любовь и преданность. Юта, Юта, Юта. Окто, пусть и не без помощи поддельной Окто, пришла к понимаю - все чего она хотела, это чтобы Юта не бросил ее. Страх одиночества толкнул девчушку в пучину безумия.
И когда Хэппи-энд был уже виден на страницах, Падающая звезда ворвалась на сцену, пыхтя от возбуждения - такое офигенно желание пропадает! Целая планета в труху! Пришельцу плевать на все и всех, он просто хочет получить кайф от исполнения супер шизанутого желания. Даже если для этого надо подвергнуть Юту смертельной опасности, а Окто промыть мозги операбельным путем - он это сделает.
Герои бессильны, звезда неуязвима, выхода нет. Но появляется поддельная, самая сильная, самая крутая Окто-чан и заявляет: "желание реальной Окто хрень! Давай уничтожим вселенную!"
Звезда в шоке. У нее нет слов. Желание абсурдно, невыполнимо, сумасбродно... Великолепно!
Что... Бред, столь абсурдная логика! Такое детское, жалкое, непродуманное желание... Это именно тот уровень сумасшествия, который я так хотел исполнить! Как странно... Я думал ты подделка... Эффект от слияния с реальной? Ох-х, как же сильно я хочу исполнить это желание! Я весь дрожу от предвкушения! ( У меня адаптированный перевод, а не дословный -.- )
В общем девочка предложила уничтожить отрезок вселенной с момента где звезда упала на землю, тем самым стерев всю цепочку событий, которая привела к текущему исходу. Нет падения звёзды - нет мертвой Окто.
Как же я обожаю картинку. Тягучие формы, словно нефть разлитая в океане. Раскадровка в которой нет проблем с ориентацией. Некоторые фреймы изобилуют качеством и детализацией, что хочется художнику руки целовать.
Манга вышла несколько скомканной. Начинается вяло и с 12ой главы даёт резкий разгон в космос. Как я понял, это из-за того, что рейтинги были низкие, мангу хотели закрыть и создатель решил вырезать все, что считал неважным и ломануть аки локомотив, напролом, к финалу. В общем ситуация из разряда "и на пользу и во вред". Чувствуется, что кусков не хватает, но и провисающих частей не осталось. Сама по себе манга показалась мне поучительной. Смотрите сами:
Линия про котенка Морковку и его хозяйку Ичиго была о принятии утраты.
Линия Окто подводила к решению о том, чего реально желает сердце.
Линия Юты о верности.
Все они завершены, самодостаточны и хороши. Я получил большое удовольствие от прочтения и испытал искренние эмоции, пусть и от дешёвых трюков.
Немного подробнее остановимся на Ичиго. Я о ней особо не упоминал выше ( только одна картинка с самыми теплыми пожеланиями Юте ), но расскажу в заключении, так как это одновременно и хорошая история внутри истории и жёсткий косяк автора. Итак, девочка Ичиго. Добрая, аутсайдер в своем классе, у нее недавно появился отчим, а мать забеременела. Так получилось, что мама девочки переключила все свое внимание на новорожденного ребенка. Совсем маленькая Ичиго восприняла это как предательство со стороны родной матери и начала все больше и больше уходить в себя. Так продолжалось пока она не нашла маленького котенка, к которому привязалась и о котором заботилась. Когда котенок умер из-за случайности ( в которой Ичиго винила себя ), девочка окончательно закрылась от остальных. После того, как Юта уничтожил желание Ичиго, у той пропали все воспоминания о котенке, но осталась дыра - желание заботы и тепла. Эта дыра закрылась новорожденной сестричкой. Родители заплакали от счастья, увидев улыбающуюся Ичиго. Это шикарный финал с мощным посылом, о том как важно отпускать утрату, что нас окружает много другого важного. И знаете что? Если звёзды не было, то Ичиго сидит сейчас в комнате в депрессии. Типо, зачем нам было показывать крутой финал ее истории, если в итоге его стерли? Как по мне это жуткий прокол.
В остальном все шикарно, советую прочитать, это было весело, по крайней мере вторую половину точно. А вам - спасибо за внимание, господа хорошие. Ещё свидимся.
Привет дорогие читатели. Что-то я пропал надолго... Знаете, работа, диван, Helldivers 2, сериалы, работа. В целом, мне было чем заняться. За время простоя скопилось немало вещей, о которых я хотел вам поведать и первым будет мой небольшой опыт с ИИ. Так как смысла рассказывать вам, что такие нейросеть, я не вижу, перейдем сразу к делу. О, к слову, рассказ очень короткий и сделан как для самых маленьких. Так что жутких технических подробностей нет.
Ollama — мощный инструмент для работы с большими языковыми моделями (LLM). Он позволяет запустить модель на компьютере без необходимости постоянного подключения к интернету. Ставится на любую популярную ОС, будь то Windows, дистрибутив Linux или MacOS. Обиженных нет. Не требует знания языков программирования, однако для эффективного использования было бы хорошо знать Python на очень базовом минимуме.
Заходим на официальный сайт - https://ollama.com/search.
Скачиваем и устанавливаем программу на нужную вам систему ииии...
Вы великолепны! Почти. Открываем терминал (cmd в поисковой строке Windows).
Набираете "ollama -h", чтобы вывести список команд и проверить работоспособность. Далее:
Загрузить модель: ollama -pull имя_модели
Запустить: ollama -run имя_модели
Удалить: ollama -rm имя_модели
Имя модели берется с сайта Ollama. На нем же можно посмотреть полный список поддерживаемых моделей. Все мегапросто. Развлекайтесь на здоровье.
Красным подчеркнуты места на которые вам стоит обратить внимание в первую очередь:
Models - список моделей;
ollama run gemma3 - сайт сразу предлагает команду установки (run проверяет наличие модели перед запуском и, если ее нет, сам активирует pull);
View all - показать весь список версий одной модели. На самом деле та модель, что будет скачена по предлагаемой команде может быть не шибко эффективна для ваших задач. Потому всегда стоит ознакомиться со списком.
Конечно же у этого чуда есть и api к python если кому надо, то вот команда установки:
pip install ollama
И простой пример кода:
import ollama
response = ollama.generate(
model="ИМЯ МОДЕЛИ",
prompt="ЗАПРОС"
)
print(response["response"])
Ollama это замечательный инструмент, который позволяет любому человеку, будь то опытный программист или обычный скучающий обыватель, запустить у себя на компьютере настоящую нейронную модель. Однако не стоит ждать чуда! Chat GPT-4 на вашем компьютере не появится. Чем модель умнее, тем она требовательнее к "железу".
Как итог, поиграться? Да. Выполнить небольшую задачу? Да. Остальное - экспериментируйте!
А захотите поддержать меня - заходите в дзен, тыкните на статью - упадет копейка. Все ссылки в профиле.
17 декабря вышли оставшиеся 7 серий сериала "Секретный уровень". Освежим чутка память. "Секретный уровень" — анимационный сериал, состоящий из оригинальных коротких историй, действие которых разворачивается в мирах видеоигр. На первые 8 серий обзор уже был. Я старался оценивать эпизоды не беря во внимание первоисточник, но с новыми сериями это стало почти невозможно, потому описания серий могут сопровождаться небольшой информацией из(о) игр(ах).
Как и в прошлый раз, первое место занял самый самодостаточный эпизод. Юная бунтарка заводит роман с путешественником и улетает покорять далёкий космос, а по ее следу пускается обеспокоенный отец. Собственно он и выступает главным героем эпизода. Мужчина развивается от простого ремонтника кораблей до уверенного разнорабочего, который и кораблем управлять может и взрывчатку сделать. Основной сюжетной фишкой эпизода выступает гравитационное замедление времени, возникающее в ходе скоростного перелета космического корабля. В википедии почитал про этот эффект, очень интересно, но сложно для осознания. Замедление приводит к ситуациям где для одних героев проходят годы, а для других месяца. История получает финал и небольшой задел на будущее. В целом эпизод меня скорее порадовал. Да и люблю я космическую тематику.
В остальном же это реклама грядущей игры от студии Archetype. Сюжетные перипетии игры обещают выстроить как раз вокруг фишки с замедлением времени, так что посмотрим, что у них выйдет. По крайней мере звучит интересно.
Что мне не понравилось в эпизоде, дак это поведение дочери. За серию она успела: спасти своего мужчину из радиоактивного ада, устроить перестрелку с высокотехнологичной расой, чтобы прикрыть отход своего любимого, была пилотом корабля. Зачем ей вообще этот балласт? Давно бы уже свою команду сколотила да успешно исследовала миры.
Данный эпизод не наполнен каким-то крутым экшеном или музыкой. Honor of Kings старается взять картинкой, играясь с ракурсами и переходами, меняя положение и формы вещей, уходя в абстракцию, но не падая в психоделический приход. Основой эпизода служит философский спор между машиной и человеком. Борьба логики и непредсказуемости. По всем законам жанра человек, конечно же, победил. Радует только, что не совсем честная была та победа, ибо странно если машина знающая все ходы наперед - проиграет. Вообще, если эпизод разбирать, то можно много интересного заметить и придумать, но советую самим глянуть, порассуждать.
Первая треть эпизода меня сильно радовала. Я на мгновение узрел тот самый дух fallout 2 - черный юмор, значимость настроек персонажа. Это в большинстве современных игр все упрощено так, что как характеристики не крути - болванчик всегда будет одинаковый, а раньше развлекались на полную. The Outer Worlds, по моим воспоминаниям, старалась соответствовать духу первых fallout-ов как раз в плане системы характеристик и юмора. В серии то самое соответствие пытались передать через главного героя - юношу, не отличающегося умом и сообразительностью. Зато с огромным количеством очков удачи и а-а-абсолютной честностью! То всех работников рекламная табличка убьет, то среди испытательного состава единственный выживет ( процентов на 30%, Омниссия одобряет ). Шутки о корпоративной жадности тоже не забыли, но они быстро кончаются уступая серьезным мыслям.
И вот главная проблема. Все великолепие длится не долго и перетекает в драму о неразделённой любви, самоопределении в жизни, внутренней борьбе Бобра со злом. Серьезные темы, для которых не хватает оставшегося хронометража, перегружают хороший эпизод, низводя его до посредственности. Если хотите проникнуться The Outer Worlds, то лучше посмотрите видео с канала ВУЛПЕС, который умудрился прорекламировать игру лучше, чем фактическая реклама.
Такой милый эпизод для людей играющих в "rogue like" и выгорающих на этом деле. Что к чему? Rogue like - жанр компьютерных игр, где каждое прохождение не похоже на предыдущее. Для создания такого опыта обычно используются:
Случайно генерируемые уровни;
Случайные предметы падающие в награду ( броня, магия, оружие ) ;
Необратимость смерти. Умер - начал заново прохождение.
Из ближайших примеров могу привести мой любимый Dead Cells и, относительно, недавнее дополнение к God of war Ragnarok.
Эпизод вышел... жизненный. Заходишь в игру/подземелье, исследуешь его, думаешь, что легко победишь и тут "бац"! Все с самого начала. Раз за разом неудачи. Героиня эпизода уже готова опустить руки и разочароваться в себе, как старшая соратница объясняет, что каждая попытка это совершенно новый опыт. Это не неудача, а переход к следующему приключению. Раз за разом идя, совершенствуясь, продвигаясь глубже и глубже в саму суть игры/подземелья. Хотя в реальности, полагаю, девочка бы давно клавиатуру о стену разбила. Серия вышла приятной, с собственным визуальным стилем. Все в совокупности выделяет ее из общей массы сезона.
Пока смотрел эпизод, все думал, а что мне это напоминает? Астробой! Будто и визуал, и идеи те же. Если кто помнит, был такой мультик 2009 года выхода. Астробой создавался как адаптация японской манги, выпускаемой в период с 1952 по 1968 год. Да, такая вот древняя штука. Мегамен, созданный игровой компанией Capcom, по ее собственному признанию, был вдохновлён именно Астробоем, что и породило огромную схожесть персонажей и миров. Конечно странно сравнивать короткометражку и полный метр, но.. но черт его дери, не может несколько минут вместить предысторию персонажа. Все смотрится таким стремительным, нелепым и до придурковатости позитивным. Понятно, что эпизод существует только чтобы подогреть аудиторию к выпуску следующей игры. Хотя анонсов и не было, аккуратные заявления о разработке и желании выпускать больше игр во вселенной "Мегамен" звучали на протяжении последних 5 лет от разных представителей компании Capcom. Максимальная бездушность с красивой картинкой. Лучше потратьте время, просмотрите Астробоя 2009 года, хоть какие-то эмоции получите.
Эпизод с сюжетом в духе Ubisoft последних лет. Ну знаете, пираты, безжалостные головорезы-грабители, которые на самом деле дофига добрые, за братство, честность, умрут ради друга, а геноцид полицейских, порой и гражданских, это так, для души. Серия повествует о небольшой группе авантюристов, которые ухитрились украсть у огромной корпорации-монополиста навигационные пути, столь необходимые для безопасного путешествия по космосу. Так как эти пути были мега-супер-важные-секретные, за ними конечно же открылась охота. А там и патовая ситуация и гамбит с предателем в команде и спасение на грани. Так как оригинальную игру ругали за излишнюю инклюзивность, то позволю себе тут пошутить: в серии убили только белого европейца. Почти единорога грохнули - в серии других не было.
Сюжетно эпизод вышел посредственным, визуально - красивым. Если не вдумываться, то норм. После повторного просмотра эпизод был воспринят позитивнее. Надеюсь, компания Sony когда-нибудь пересмотрит свою деструктивную политику и перевыпустит Concord. В другом формате, с новыми персонажами.
На первых минутах мне эпизод показался даже интересным. Мир, где люди на постоянной основе ходят в очках виртуальной реальности. Вроде просто, а позволило ввести "систему достижений" за выполнение обыденных задач. Вот героиня доставляет заказ в короткий срок и получает новый цвет для своего велосипеда! Перекрашивай как угодно, только очки не снимай. Идея занятная, есть где разгуляться. Мне вспомнилась сразу комедия с Райаном Рейнольдсом - "Главный герой". Правда там уже неигровой персонаж надел очки игрока и начал видеть задания, аптечки и прочее.
Ну ладно, начали за здравие, а закончили рекламой Sony. К героине подходит странный мужик и отдает посылку, после чего за девочкой открывают охоту персонажи игр, издателем которых выступила Sony. Эпизод кончается чем-то в стиле: "а-а-а, точно, я же раньше играла в игры и это было так круто!". Подводя итог: самая безвкусная, ленивая, идиотская подача коммерческого продукта за все 15 серий. И ведь нормально бы было замени они персонажей любыми болванчиками, как они уже в самом конце и сделали, просто атаковав героиню роботами. Вышел бы такой весёлый эшен на 5 минут, где героиня использует способности персонажей из игр. Вместо этого получилась неловкая эксплуатация любимых многим персонажей. Может я не въехал и это мегаглубокий эпизод с метаидеями высшего уровня доступный лишь избранным?
Мнение моё не поменялось, вторая половина сезона вышла слабже. Причем кто-то в Amazon понимал, куда ветер дует, потому эпизоды расставили, скажем так, стратегично. Как и в первой половине, пытались размазать недовольство, дабы общее впечатление от сезона не было таким ужасным и оценки не скатились в ад.