Бойся роботов
Hard Reset Redux построен на высокой динамике в сеттинге киберпанка. В вашем распоряжении два вида оружия и механические ноги. Но в новой части добавляется и катана, которая даётся вам во время прохождения сюжета. Оружия два, но каждое из них имеет ещё по четыре модификации, которые сильно его изменяют. Из автомата можно создать дробовик или даже гранатомёт, а из плазменного оружия получится отличная лазерная винтовка. К тому же все модификации ещё и улучшаются, можно увеличить радиус взрыва, добавить снайперский прицел, увеличить скорострельность и всё в таком духе. Наш солдат не остаётся без внимания, поэтому его можно улучшать точно так же, как и оружие. По мере прохождения сюжета и улучшения нашего героя, на экране будут появляться новые элементы. Да, по сути, прокачка героя, это восстановление интерфейса к привычному виду. А могли бы и реальной прокачкой заняться…
Какая-то странная трубаКакая-то странная труба
Качаться и стрелять, это хорошее, но не бесплатное занятие. Чтобы на всё хватало кредитов, требуется уничтожать роботов. Их в игре не очень много, но и не мало. Поначалу встретятся роботы размером с большую крысу, а далее уже настоящие бойцы пойдут. Всего роботов можно разделить на несколько видов:
- Роботы ближнего боя — это очень маленькие роботы, которые нападают в больших количествах. Они очень шустрые, но бьют не сильно. К ним относятся и киборги, которые похожи на обычных людей;
- Ходячие бомбы — мелкие роботы, которые стремятся взорваться в ваших объятиях;
- Роботы дальнего боя — продвинутые роботы из человеческих тел с пушками на перевес;
- Гибриды — большие создания, которые дерутся в ближнем бою, но имеют способности для дальних атак со всех сторон;
- Летающие роботы — нападают без предупреждения и исключительно с воздуха.
Время для перекураВремя для перекура
Так же все роботы, как и оружие, имеют свои модификации. Модификации отличают роботов не только небольшими внешними изменениями, но и силой атаки вместе с поведением в бою. В новой части добавили рывок и визуально улучшили ускорение, что неплохо поднимает динамику игры. Но все бои проводятся на определённых аренах, а в оружии можно и запутаться, особенно на высокой сложности. Благо нам дают поубивать и здоровенных боссов. Они не очень сложные и тактику их уничтожения нам обязательно расскажут в самом начале битвы. Итог.
Геймплей Hard Reset Redux отличается своей простотой и динамикой. Нам требуется лишь стрелять и быстро двигаться в любом направлении. Стреляем мы в большое количество противников, которые достаточно разнообразны. И в Hard Reset Redux модифицируется всё, даже противники. А дабы разнообразить наши побегушки, нам периодически выдают боссов на растерзание, чаще маленьких, но встречаются и довольно большие. Hard Reset Redux отличается от современных шутеров своей простотой и динамикой, это настоящий олдскул. За геймплей можно поставить 8 баллов. Выкиньте ненужные мысли, возьмите любимое оружие и бегите уничтожать многочисленных врагов, вспомните былые времена.
Место с огромным количеством мелких…Место с огромным количеством мелких…
Особенности Hard Reset Redux
- Мир киберпанка. Игроков действительно порадует, а некоторых и сильно удивит тот мир, который для них придумали разработчики. Тут технологии будущего тесно переплетаются с нашим, повседневным миром, от чего картина становится не только целостной, но и весьма привлекательной.
- Сложные миссии. На самом деле, это только плюс, причем, большой. Во многих шутерах надо лишь брать в руки пушку и стрелять во все, что движется. Здесь же придется решать различные загадки и принимать сложные решения, но в то же время и сражаться с противниками, которые ни на минуту не оставят в покое главного героя.
- Новые виды противников. В одних проектах ставка делается на зомби, в других – на киборгов. В данном случае разработчики соединили и то, и другое, что дало возможность игрокам сражаться с оригинальным видом противников, которые не встречаются больше ни в какой игре, которая ранее выходила в подобном направлении.
Красоты Бельфегора
Графика Hard Reset Redux должна отличаться от оригинала 2011 года… Должна, но не обязана. Из множества критики в адрес Hard Reset Redux я заметил одно высказывание по поводу того, что город до сих пор пустой. Но мы же не во всём городе то играем, мы пробираемся только в определённый сектор, который был атакован роботами. Поэтому людей и не видно, а вот былая жизнь заметна. Все остальные претензии верны. На дворе 2020 год, но графика прекрасна лишь для 2011 года. Более того, некоторые текстуры даже ухудшили, как и освещение. Добавили эффекты дождя и ускорения, но ничего более. На данный момент игры выглядит уныло не только текстурами и полигонами, но и разнообразными эффектами. Игру выпустили с обновлённой графикой для консолей текущего поколения и ПК. Но если на консоли её впервые завезли, то для ПК она уже устаревшая.
Иногда пулемёт превращается в адское оружиеИногда пулемёт превращается в адское оружие
Зато производительность улучшилась в два раза, вот так достижение. За пять лет доработки, Flying Wild Hog смогли добавить эффекты дождя и размытости, и всё. Может обновлённый движок и хорош, но демонстрировать такую графику в 2020 году и кричать про обновление, это неправильно. Итог.
Hard Reset в 2011 году не только весело и интересно игралась, но и выглядела очень даже прилично. И за её графику можно было вполне поставить 8 баллов, ну огонь был так себе. С тех пор прошло пять лет, а, следовательно, вычитаем по баллу за год. В результате получаем 3 балла за графику. Ну, хорошо, всё-таки имеются изменения, они даже огонь немного улучшили и производительность подняли. Уговорили, ставим 4 балла.
Классное освещениеКлассное освещение
Сброс в обход системы
В особо тяжёлых случаях, когда смартфон вообще не загружается в штатном режиме, сделать хард-ресет можно с помощью меню восстановления (так называемого рекавери). Для этого смартфон надо загрузить в Recovery с помощью специальной комбинации клавиш. Некоторые альтернативные версии Android или специальные приложения позволяют перегружаться в Recovery прямо из системы.
Обычно для загрузки в Recovery достаточно выключить устройство, затем зажать кнопку питания одновременно с одной из кнопок громкости. Для разных моделей смартфонов или планшетов комбинации отличаются. Так, для HTC это питание плюс уменьшение громкости, для LG – примерно то же, только кнопку питания надо после появления логотипа отпустить и нажать повторно. Рекомендуем найти точную инструкцию для вашей модели.
Зайдя в меню восстановления, вы должны стереть данные (пункт меню Wipe). Иногда полный сброс называется Factory Hard Reset.
После процедуры ваше устройство лишится всех личных данных. Если вы этого и хотели, то поздравляем: хард-ресет своё дело сделал! Если же вашей задачей было вернуть устройство в работоспособное состояние, то данные придётся восстанавливать вручную или из бэкапов.
Часто рекомендуется делать hard reset перед установкой новой версии Android или кастомной прошивки. Тогда стоит записать образ прошивки не во внутреннюю память устройства, а на OTG-носитель (подключенную внешнюю флэшку). Так удаление старых данных будет более надёжным. Современные Android-устройства поддерживают OTG даже на уровне меню восстановления.
История Флетчера
Сюжет Hard Reset Redux кажется банальным, но с интересными поворотами. За короткий промежуток времени, наш главный герой превращается из солдата-алкоголика в ренегата-спасителя. И слушать это интересно, но такого мало. Сюжет короткий и подаётся маленькими частями с помощью непонятных комиксов между уровнями. Да, нам всё объясняют, даже зависимость от алкоголя, но мы по стандарту становимся спасителями всего человечества, хотя изначально мы являемся обычным солдатом. Во время самой игры нам, что-то вещают из штаба Корпорации, но мы этого практически не слышим.
Не все смогли добежатьНе все смогли добежать
Итог.
Никакого сюжета во время игры, всё исключительно между уровнями. Необычные повороты встречаются лишь…раз. Да и то, просто необычно его подали. Поэтому сюжет Hard Reset Redux заслуживает лишь 5 баллов. Но сюжет и его подача не так важна, как геймплей.
Как сделать
Самый простой способ сделать жесткую перезагрузку — найти соответствующую опцию в настройках телефона. Пара тапов, ввод защитного кода — процесс запущен.
Существует и альтернативный вариант: сделать сброс с помощью нажатия комбинации клавиш. Каких именно? Индивидуально для каждого производителя смартфонов. Что делать? Топать в сторону hardreset.info. Веб-сервис содержит инструкции по активации жесткой перезагрузки для огромного числа трубок от невообразимых производителей. Я серьезно, стоит заглянуть на hardreset.info только из желания позабавиться.
А вы можете похвастаться тем, что держали в руках трубку от одного из этих производителей?
Ко всему прочему, hardreset.info дает инструкции и для обычных телефонов, таких древних, с кнопочками.
А вы знали, что сброс можно сделать не только на смартфонах?
Сама процедура сброса требует от пользователя минимум усилий. Достаточно следовать рекомендациям гида. Некоторые телефоны имеют несколько инструкций аппаратного сброса, в том числе и видео.
Быстрее крутим колёсико
Управление Hard Reset Redux оставляет двоякое впечатление. В отличие от версии 2011 года, в современной версии имеется рывок, который срабатывает автоматически при нажатии «Shift». Ускорение работает на тот же «Shift», поэтому постоянные рывки вместе с ускорением не всем пришлись по душе. Но я к таким не отношусь, мне эта идея понравилась. В Hard Reset Redux нет каких-нибудь моментов, где требуется, что-то одно, всегда нужен рывок, а затем может и ускорение. Поэтому данное решение в минус нельзя засчитать.
А вот и новое оружиеА вот и новое оружие
Ещё одно отличие от олдскула, это смена модификаций оружия. Ладно, само оружие меняется на одну кнопку, это не беда, но модификации меняются через колёсико мыши… Вот тут начинается веселье. Стреляешь ты из плазменного автомата в средних врагов, на тебя выбегают мелкие крысы, меняешь модификацию на электрическую и стреляешь в крыс из винтовки… Понимаешь, что модификация не та, меняешь ещё и получаешь третью неверную модификацию. Берёшь другое оружие и там такая же проблема. И пока крутишься со сменой модификаций, получаешь уже достаточно урона, чтобы сдохнуть. Почему бы модификации на цифры не сделать… Все остальные аспекты управления остались стандартными. Бегаем, прыгаем, улучшаемся через мышку и продолжаем бегать. А ПКМ не всегда используется для прицела, она больше похоже на альтернативную атаку. Никаких мини-игр или чего-то ещё, максимум, это придётся искать нужное место для взрыва.
Хорошо летитХорошо летит
Итог.
Управление Hard Reset Redux в некоторых аспектах сделано удобно, но в некоторых не совсем. В принципе у нас имеется стандарт для олдскула и проблема со сменой модификации. А значит, за управление в Hard Reset Redux сложно поставить более 7 баллов. В нём всё стоит на привычных местах, но смена оружия просто ужасна.
Redux. Простой как грабли
Мне уже доводилось заглядывать в репозиторий библиотеки redux, но откуда-то появилась мысль углубиться в его реализацию. Своим в некотором роде шокирующим или даже разочаровывающим открытием я хотел бы поделиться с сообществом. TL;DR:
базовая логика redux помещается в 7 строк JS кода.
О redux вкратце (вольный перевод заголовка на гитхабе):
Redux — библиотека управления состоянием для приложений, написанных на JavaScript.
Она помогает писать приложения, которые ведут себя стабильно/предсказуемо, работают на разных окружениях (клиент/сервер/нативный код) и легко тестируемы.
Я склонировал репозиторий redux, открыл в редакторе папку с исходниками (игнорируя docs, examples и прочее) и взялся за ножницы клавишу Delete:
- Удалил все комментарии из кода
Каждый метод библиотеки задокументирован с помощью JSDoc весьма подробно - Убрал валидацию и логирование ошибок
В каждом методе жёстко контролируются входные параметры с выведением очень приятных глазу подробных комментариев в консоль - Убрал методы bindActionCreators, subscribe, replaceReducer и observable
.… потому что мог. Ну или потому что поленился писать для них примеры. Но без корнер-кейсов они ещё менее интересны, чем то, что ждёт вас впереди.
А теперь давайте разберём то, что осталось
Пишем redux за 7 строк
Весь базовый функционал redux умещается в малюсенький файлик, ради которого вряд ли кто-нибудь будет создавать github репозиторий
.
Так устроен redux. 18 страниц вакансий на HeadHunter с поисковым запросом «redux» — люди, которые надеются, что вы разберетесь в 7 строках кода. Всё остальное — синтаксический сахар.
С этими 7 строками уже можно писать TodoApp. Или что угодно. Но мы быстренько перепишем TodoApp из документации к redux.
// Инициализация хранилища function todosReducer(state, action) { switch (action.type) { case ‘ADD_TODO’: return [ …state, { id: action.id, text: action.text, completed: false } ] case ‘TOGGLE_TODO’: return state.map(todo => { if (todo.id === action.id) { return { …todo, completed: !todo.completed } } return todo }) default: return state } } const initialTodos = [] const store = createStore(todosReducer, initialTodos) // Использование store.dispatch({ type: ‘ADD_TODO’, id: 1, text: ‘Понять насколько redux прост’ }) store.getState() // [{ id: 1, text: ‘Понять насколько redux прост’, completed: false }] store.dispatch({ type: ‘TOGGLE_TODO’, id: 1 }) store.getState() // [{ id: 1, text: ‘Понять насколько redux прост’, completed: true }] Уже на этом этапе я думал бросить микрофон со сцены и уйти, но
show must go on
. Давайте посмотрим, как устроен метод.
combineReducers
Это метод, который позволяет вместо того, чтобы создавать один огромный reducer для всего состояния приложения сразу, разбивать его на отдельные модули.
Используется он так:
// здесь мы переиспользуем метод todosReducer из прошлого примера function counterReducer(state, action) { if (action.type === ‘ADD’) { return state + 1 } else { return state } } const reducer = combineReducers({ todoState: todoReducer, counterState: counterReducer }) const initialState = { todoState: [], counterState: 0, } const store = createStore(reducer, initialState) Дальше использовать этот store можно так же, как предыдущий.
Разница моего примера и описанного в той же документации к TodoApp довольно забавная.
В документации используют модный синтаксис из ES6 (7/8/∞):
const reducer = combineReducers({ todos, counter }) и соответственно переименовывают todoReducer в todos и counterReducer в counter. И многие в своём коде делают то же самое. В итоге разницы нет, но для человека, знакомящегося с redux, с первого раза эта штука выглядит магией, потому что ключ части состояния
(state.todos)
соответствует функции, названной также только по желанию разработчика
(function todos(){})
.
Если бы нам нужно было написать такой функционал на нашем micro-redux, мы бы сделали так:
function reducer(state, action) { return { todoState: todoReducer(state, action), counterState: counterReducer(state, action), } } Этот код плохо масштабируется. Если у нас 2 «под-состояния», нам нужно дважды написать
(state, action)
, а хорошие программисты так не делают
, правда?
В следующем примере от вас ожидается, что вы не испугаетесь метода Object.entries и Деструктуризации параметров функции
Однако реализация метода combineReducers довольно простая (напоминаю, это если убрать валидацию и вывод ошибок) и самую малость отрефакторить на свой вкус: function combineReducers(reducersMap) { return function combinationReducer(state, action) { const nextState = {} Object.entries(reducersMap).forEach(([key, reducer]) => { nextState[key] = reducer(state[key], action) }) return nextState } } Мы добавили к нашему детёнышу redux ещё 9 строк и массу удобства.
Перейдём к ещё одной важной фиче, которая кажется слишком сложной, чтобы пройти мимо неё.
applyMiddleware
middleware в разрезе redux — это какая-то штука, которая слушает все dispatch и при определенных условиях делает что-то
. Логирует, проигрывает звуки, делает запросы к серверу,… —
что-то
.
В оригинальном коде middleware передаются как дополнительные параметры в createStore, но если не жалеть лишнюю строчку кода, то использование этого функционала выглядит так:
const createStoreWithMiddleware = applyMiddleware(someMiddleware)(createStore) const store = createStoreWithMiddleware(reducer, initialState) При этом реализация метода applyMiddleware, когда ты потратишь 10 минут на ковыряние в чужом коде, сводится к очень простой вещи: createStore возвращает объект с полем «dispatch». dispatch, как мы помним (не помним) из первого листинга кода, — это функция, которая всего лишь применяет редюсер к нашему текущему состоянию (newState = reducer(state, action)). Так вот applyMiddleware не более чем переопределяет метод
dispatch
, добавляя перед (или после) обновлением состояния какую-то пользовательскую логику.
Возьмём, например, самый популярный middleware от создателей redux — redux-thunk
Его смысл сводится к тому, что можно делать не только
store.dispatch({type: ‘SOME_ACTION_TYPE’, some_useful_data: 1 }) но и передавать в store.dispatch сложные функции function someStrangeAction() { return async function(dispatch, getState) { if(getState().counterState % 2) { dispatch({ type: ‘ADD’, }) } await new Promise(resolve => setTimeout(resolve, 1000)) dispatch({ type: ‘TOGGLE_TODO’, id: 1 }) } } И теперь, когда мы выполним команду dispatch(someStrangeAction()) то:
- если значение store.getState().counterState не делится на 2, оно увеличится на 1
- через секунду после вызова нашего метода, todo с id=1 переключит completed true на false или наоборот.
Итак, я залез в репозиторий redux-thunk, и сделал то же самое что и с redux — удалил комментарии и параметры, которые расширяют базовый функционал, но не изменяют основной
Получилось следующее:
const thunk = store => dispatch => action => { if (typeof action === ‘function’) { return action(store.dispatch, store.getState) } return dispatch(action) } я понимаю, что конструкция const thunk = store => dispatch => action выглядит жутковато, но её тоже просто нужно вызвать пару раз с произвольными параметрами и вы осознаете, что всё не так страшно, это просто функция, возвращающая функцию, возвращающую функцию (ладно, согласен, страшно)
Напомню, оригинальный метод createStore
выглядел так
function createStore(reducer, initialState) { let state = initialState return { dispatch: action => { state = reducer(state, action) }, getState: () => state, } } То есть он принимал атрибуты (reducer, initialState) и возвращал объект с ключами { dispatch, getState }.
Оказалось, что реализовать метод applyMiddleware
проще, чем понять, как он работает. Мы берём уже реализованный метод
createStore
и переопределяем его возвращаемое значение:
function applyMiddleware(middleware) { return function createStoreWithMiddleware(createStore) { return (reducer, state) => { const store = createStore(reducer, state) return { dispatch: action => middleware(store)(store.dispatch)(action), getState: store.getState, } } } }
Вывод
Под капотом redux содержатся очень простые логические операции. Операции на уровне «Если бензин в цилиндре загорается, давление увеличивается». А вот то, сможете ли вы построить на этих понятиях болид Формулы 1 — уже решайте сами.
P.S.
Для добавления в мой «micro-redux» упрощённого метода store.subscribe потребовалось 8 строк кода. А вам?
Что мы будем слушать
Звуковое сопровождение в Hard Reset Redux находится на хорошем уровне. Звуки оружия сложно оценить, так как оно своеобразное, но, по крайней мере, оно хорошо воспринимается. Враги будут слышны хорошо и каждый по-разному, можно будет понять, какого размера враг на вас движется. А сообщения вы принимать исключительно через наушник, который и будет воспроизводить голос с помехами, как и следует в данной стилистике, но! Но иногда сообщения будут воспроизводиться так тихо, что без субтитров не обойтись.
Куда дели полигоны?Куда дели полигоны?
А чем же нас порадуют музыка и звуки мира. Музыка в Hard Reset Redux подобрана нужного стиля и набирает обороты во время боевых стычек. По ней вы поймёте, когда около вас появляются враги. Какого-то крутого трека не имеется, но музыка неплохо подбадривает. А вот звуки мира… Да, разная поверхность издаёт разные звуки от наших шагов. Да, разные бочки или места разрушения звучат неплохо. Но окружающий мир? Он пустой! Вот мы видим огромный корабль, который пролетает над нами, но никаких звуков нет. Где шумы из домов, где шум остального города? Почему нет никаких звуков от всего того, что находится в метре от нас… Это немного печалит. Итог.
Оружие и враги в Hard Reset Redux озвучены хорошо. Все взрывы и разрушения звучат нормально, и даже шаги хорошо озвучены. Уровень всех звуков заслуживает 7 баллов, так как он хороший. Но отсутствие звуков мира, немного печалит, поэтому снижаем оценку на 2 балла, ведь ещё и с голосом проблемы. И получаем 5 баллов за звучание в Hard Reset Redux.
Корабль летающий на силе мыслиКорабль летающий на силе мысли
Сброс через компьютер
Достаточно экзотичный способ hard reset, который применяется, когда на смартфоне по каким-то причинам не работают клавиши или тачскрин.
На вашем компьютере должен быть установлен Android Debug Bridge (ADB), а на смартфоне или планшете активирован режим ADB. Тогда процедура будет выглядеть в общем случае так:
- Подключить смартфон к компьютеру USB-кабелем
- Запустить на компьютере командную строку командой cmd
- Набрать в командной строке adb reboot recovery
- Выполнить hard reset (wipe) на смартфоне, выбрав нужный пункт клавишами или касанием
Для разных моделей смартфонов процедура хард-ресета может отличаться. Рекомендуем уточнить нюансы для вашего аппарата. Однако в целом схема остаётся такой, как описано выше.
Моя твоя не понимать
Локализация Hard Reset Redux получилась довольно странной. Видеовставки переведены лишь субтитрами, а вот остальная игра локализована полностью. Весь текстовый перевод сделан в стилистике игры и ошибками не пестрит. Но имеется и тот текст, который решили не переводить. Я говорю про текст, расположенный на рекламных блоках. Вокруг главного героя в игре имеется куча текста, но его решили не переводить. Голос во время наших забегов слышен на нашем языке, но видео идёт на английском. Видимо разработчики наняли актёров, но вскоре надоело им платить, поэтому решили забить на дальнейший перевод. Иного объяснения я не вижу. Или переводи всё, иль ничего. К тому же голос из сообщений иногда бывает очень тихим.
А вот и киборгиА вот и киборги
Итог.
Локализовали Hard Reset Redux странным образом, вроде бы всё перевели и качественно, а вроде бы и нет. В игре полный перевод имеется, но только во время наших пострелушек, а во время загрузки-видео, нам уже глаголят на английском языке. К тому же текст на улице не весь переведён, точнее сказать, весь не переведён. Лучше бы Flying Wild Hog остановились на переводе всего текста, нежели сделать «фифти-фифти». Поэтому вычитаем треть не переведённого голоса и 1/10 всего текста. И того получаем 6 баллов за локализацию в Hard Reset Redux.
Пора разобраться с роботами
Hard Reset Redux является отличным представителем олдскула в наши дни. Геймплей заставит вас окунуться в детство и беззаботно потратить часик-другой на уничтожение роботов. Картинка сделана хорошо, а звук позволит насладиться яркими игровыми моментами. Hard Reset Redux сделана для игрока и ради игрока, в ней нет никакой сложности и всё интуитивно понятно. И сюжет сделан на хорошем уровне, он есть, он не тупой, но и не гениальный.
Размытие работает даже на интерфейсРазмытие работает даже на интерфейс
Всё кроме сюжета относится к игре 2011 года. Но на улице уже 2016 год! Где графика? Где измененное управление? Где улучшенные звуки и физика? Ничего этого нет. Игру улучшали 5 лет и ничего не сделали. Зато увеличили производительность и улучшили незначительные моменты. Стоит ли брать Hard Reset Redux? Если хотите поиграть в Hard Reset, то лучше взять Hard Reset Redux, он немного приятнее, но до 2020 года не дотягивает, не смотря на свой олдскул.
- Опубликованы системные требования и дата выхода Hard Reset Redux
- Разработчики намеренно ухудшили графику в Hard Reset Redux