Попробовали настольный Slay the Spire, и мне очень понравилось.
Кто не знает, Slay the Spire это изначально инди-видеоигра в жанре «роглайк на построение колоды». Нарисована она совсем простовато (не пиксель арт, и то хорошо), зато обладает своего рода эталонным геймдизайном. Там нет ничего лишнего, но есть всё нужное. Причём, большинство эффектов считается в уме, а пространство решений для игрока всё равно очень большое. Попытки других разработчиков скопировать эту игру и добавить в неё что-то дополнительное («Чёрная Книга», «Knock on the Coffin Lid») сразу показали, что результат становится сильно хуже.
Короче, если вам нужна игра не про «спинномозговой» геймплей, а про шевеление головой, при этом позволяющая зайти на 15 минуток в день сыграть пару боёв, реиграбельная и не зависящая от присутствия задротов (в отличие от онлайн игр), то это очень хороший вариант.
Поэтому, когда вышла настолка, вопрос о покупке не стоял. Да, настолки по видеоиграм нередко оказываются довольно вторичными и либо не предлагают ничего принципиально нового, либо, наоборот, переиначивают первоисточник сверх меры. Здесь у меня тоже были определённые опасения, например, о том, что потребуется перекладывать слишком много компонентов там, где в видеоигре действия выполнял компьютер.
К счастью, опасения не подтвердились, и авторы очень хорошо поработали над адаптацией: все числа уменьшили, сократили математику, упростили эффекты, не сломав их качественную суть, и добавили кооператив, который действительно играет роль. Прибавьте к этому приятные ощущения от того, что ты не на экране на карточки смотришь, а листаешь их в руках, плюс возможность разделить эмоции и тяготы прохождения с друзьями.
В общем, прямо очень порадовало. #games@clockstackwheels
🚀 Вышел стабильный JavaScript движок от Google для Android
Новая стабильная библиотека Jetpack JavaScript Engine позволит разработчикам выполнять JS код в изолированной и ограниченной среде.
class MainActivity : ComponentActivity() {
// Теперь nullable, без lateinit
private var jsSandbox: JavaScriptSandbox? = null
private var jsIsolate: JavaScriptIsolate? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (!JavaScriptSandbox.isSupported()) {
Log.e("JS", "JavaScriptSandbox не поддерживается")
return
}
lifecycleScope.launch {
// Создаём и сохраняем в nullable-поле
jsSandbox = JavaScriptSandbox
.createConnectedInstanceAsync(applicationContext)
.await()
jsIsolate = jsSandbox?.createIsolate()
// При выполнении гарантируем, что jsIsolate != null
val result: String = jsIsolate
?.evaluateJavaScriptAsync(JS_SCRIPT_SCRING)
?.await()
?: "Ошибка: isolate не инициализирован"
Log.d("JS", "Результат выполнения: $result")
}
}
override fun onDestroy() {
super.onDestroy()
// Закрываем только если не null
jsIsolate?.close()
jsSandbox?.close()
}
}
#jetpack#js