Интересная и глубокая настольная стратегия «Подводные города». Выглядит громоздко, но на самом деле правила довольно логичны и объясняются быстро. Конечно, игра не семейного типа, а для менее казуальных игроков.
По сюжету у человечества в будущем кончилось место на земле, и люди строят города-купола на океаническом дне. Нужно правильно распределять ресурсы и создавать себе работающую экономику. Каждый ход есть десятки комбинаций действий, адекватный уровень напряжённости между игроками, но при этом на мой взгляд механика совсем не грузит, потому что почти всегда несколько одинаково выгодных вариантов. У многих еврогеймов недостаток в том, что для эффективной игры нужно сидеть и просчитывать свой ход далеко вперёд, отнимая у всех время и нехило нагружая свою голову. Здесь этого почти нет.
Пожалуй, у игры могли бы быть компоненты получше. По современным меркам они простоваты и рисовка не слишком богатая. Но это частично исправляет дополнение. И в любом случае, игра искупает любые замечания своим интересом и сбалансированностью.
Советую тем, кто играет в настолки, но эту почему-то пропустил.
#games
🚀 Вышел стабильный 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