Merge pull request #169 from lucasnlm/add-tutorial

Add tutorial
This commit is contained in:
Lucas Nunes 2020-09-17 09:39:33 -03:00 committed by GitHub
commit 861524fea5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
91 changed files with 2451 additions and 469 deletions

View file

@ -12,8 +12,8 @@ android {
defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid
versionCode 800111
versionName '8.0.11'
versionCode 800101
versionName '8.1.0'
minSdkVersion 21
targetSdkVersion 30
multiDexEnabled true
@ -126,7 +126,7 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
// Google
implementation 'com.google.android.material:material:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
// Koin
implementation 'org.koin:koin-android:2.1.6'

View file

@ -2,11 +2,13 @@ package dev.lucasnlm.antimine
import android.content.DialogInterface
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.text.format.DateUtils
import android.view.View
import android.view.WindowManager
import android.widget.FrameLayout
import android.widget.Toast
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.TooltipCompat
@ -39,13 +41,14 @@ import dev.lucasnlm.antimine.share.ShareManager
import dev.lucasnlm.antimine.stats.StatsActivity
import dev.lucasnlm.antimine.support.SupportAppDialogFragment
import dev.lucasnlm.antimine.theme.ThemeActivity
import dev.lucasnlm.antimine.tutorial.view.TutorialCompleteDialogFragment
import dev.lucasnlm.antimine.tutorial.view.TutorialLevelFragment
import dev.lucasnlm.external.IBillingManager
import dev.lucasnlm.external.IInstantAppManager
import dev.lucasnlm.external.IPlayGamesManager
import dev.lucasnlm.external.ReviewWrapper
import dev.lucasnlm.external.model.PurchaseInfo
import kotlinx.android.synthetic.main.activity_game.*
import kotlinx.android.synthetic.main.activity_game.ad_placeholder
import kotlinx.android.synthetic.main.activity_game.minesCount
import kotlinx.android.synthetic.main.activity_game.timer
import kotlinx.android.synthetic.main.activity_tv_game.*
@ -101,7 +104,11 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
findViewById<FrameLayout>(R.id.levelContainer).doOnLayout {
if (!isFinishing) {
loadGameFragment()
if (!preferencesRepository.isTutorialCompleted()) {
loadGameTutorial()
} else {
loadGameFragment()
}
}
}
@ -181,6 +188,13 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
currentSaveId = it
}
)
tips.observe(
this@GameActivity,
{
tipsCounter.text = it.toString()
}
)
}
override fun onBackPressed() {
@ -241,8 +255,45 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
)
}
private fun refreshShortcutIcon(isEndGame: Boolean = false) {
if (isEndGame || instantAppManager.isEnabled(this)) {
private fun disableShortcutIcon(hide: Boolean = false) {
tipsCounter.visibility = View.GONE
shortcutIcon.apply {
visibility = if (hide) View.GONE else View.VISIBLE
isClickable = false
animate().alpha(0.3f).start()
}
}
private fun refreshTipShortcutIcon() {
tipsCounter.apply {
visibility = View.VISIBLE
text = gameViewModel.getTips().toString()
}
shortcutIcon.apply {
TooltipCompat.setTooltipText(this, getString(R.string.help))
setImageResource(R.drawable.tip)
setColorFilter(minesCount.currentTextColor)
visibility = View.VISIBLE
animate().alpha(1.0f).start()
setOnClickListener {
lifecycleScope.launch {
analyticsManager.sentEvent(Analytics.UseTip)
if (gameViewModel.getTips() > 0) {
if (!gameViewModel.revealRandomMine()) {
Toast.makeText(applicationContext, R.string.cant_do_it_now, Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(applicationContext, R.string.help_win_a_game, Toast.LENGTH_SHORT).show()
}
}
}
}
}
private fun refreshEndGameShortcutIcon(victory: Boolean = false, isOldGame: Boolean) {
if ((isOldGame || !victory) && !instantAppManager.isEnabled(this)) {
shortcutIcon.apply {
TooltipCompat.setTooltipText(this, getString(R.string.new_game))
setImageResource(R.drawable.retry)
@ -277,6 +328,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
}
}
tipsCounter.visibility = View.GONE
shortcutIcon.apply {
when (status) {
is Status.Over, is Status.Running -> {
@ -317,7 +369,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
}
override fun onDrawerClosed(drawerView: View) {
if (hasNoOtherFocusedDialog()) {
if (hasNoOtherFocusedDialog() && hasActiveGameFragment()) {
gameViewModel.resumeGame()
}
@ -330,7 +382,9 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
}
)
if (preferencesRepository.isFirstUse()) {
if (preferencesRepository.isFirstUse() &&
(preferencesRepository.isTutorialCompleted())
) {
openDrawer(GravityCompat.START)
preferencesRepository.completeFirstUse()
}
@ -356,7 +410,9 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
R.id.previous_games -> openSaveHistory()
R.id.stats -> openStats()
R.id.play_games -> googlePlay()
R.id.translation -> openCrowdIn()
R.id.remove_ads -> showSupportAppDialog()
R.id.tutorial -> loadGameTutorial()
else -> handled = false
}
@ -377,6 +433,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
// New Features
findItem(R.id.themes).setActionView(R.layout.new_icon)
findItem(R.id.tutorial).setActionView(R.layout.new_icon)
}
}
@ -423,8 +480,27 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
private fun loadGameFragment() {
supportFragmentManager.apply {
popBackStack()
findFragmentByTag(TutorialLevelFragment.TAG)?.let { it ->
beginTransaction().apply {
remove(it)
commitAllowingStateLoss()
}
}
if (findFragmentByTag(LevelFragment.TAG) == null) {
beginTransaction().apply {
replace(R.id.levelContainer, LevelFragment(), LevelFragment.TAG)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
commitAllowingStateLoss()
}
}
}
}
private fun loadGameTutorial() {
disableShortcutIcon(true)
supportFragmentManager.apply {
findFragmentById(R.id.levelContainer)?.let { it ->
beginTransaction().apply {
remove(it)
@ -433,8 +509,8 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
}
beginTransaction().apply {
replace(R.id.levelContainer, LevelFragment())
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
replace(R.id.levelContainer, TutorialLevelFragment(), TutorialLevelFragment.TAG)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
commitAllowingStateLoss()
}
}
@ -503,6 +579,12 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
}
}
private fun showCompletedTutorialDialog() {
TutorialCompleteDialogFragment().run {
showAllowingStateLoss(supportFragmentManager, TutorialCompleteDialogFragment.TAG)
}
}
private fun showEndGameDialog(victory: Boolean) {
val currentGameStatus = status
if (currentGameStatus is Status.Over && !isFinishing && !drawer.isDrawerOpen(GravityCompat.START)) {
@ -514,7 +596,8 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
victory,
score?.rightMines ?: 0,
score?.totalMines ?: 0,
currentGameStatus.time
currentGameStatus.time,
if (victory) 1 else 0
).apply {
showAllowingStateLoss(supportFragmentManager, EndGameDialogFragment.TAG)
}
@ -534,13 +617,17 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
}
private fun changeDifficulty(newDifficulty: Difficulty) {
preferencesRepository.completeTutorial()
if (status == Status.PreGame) {
GlobalScope.launch {
loadGameFragment()
lifecycleScope.launch {
gameViewModel.startNewGame(newDifficulty)
}
} else {
newGameConfirmation {
GlobalScope.launch {
loadGameFragment()
lifecycleScope.launch {
gameViewModel.startNewGame(newDifficulty)
}
}
@ -551,19 +638,34 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
when (event) {
Event.ResumeGame -> {
status = Status.Running
refreshShortcutIcon()
refreshTipShortcutIcon()
}
Event.StartNewGame -> {
status = Status.PreGame
refreshShortcutIcon()
disableShortcutIcon()
refreshAds()
}
Event.Resume, Event.Running -> {
status = Status.Running
gameViewModel.runClock()
refreshShortcutIcon()
refreshTipShortcutIcon()
keepScreenOn(true)
}
Event.StartTutorial -> {
status = Status.PreGame
gameViewModel.stopClock()
disableShortcutIcon(true)
loadGameTutorial()
}
Event.FinishTutorial -> {
gameViewModel.startNewGame(Difficulty.Beginner)
disableShortcutIcon()
loadGameFragment()
status = Status.Over(0, Score(4, 4, 25))
analyticsManager.sentEvent(Analytics.TutorialCompleted)
preferencesRepository.completeTutorial()
showCompletedTutorialDialog()
}
Event.Victory -> {
val isResuming = (status == Status.PreGame)
val score = Score(
@ -573,12 +675,14 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
)
status = Status.Over(currentTime, score)
gameViewModel.stopClock()
gameViewModel.revealAllEmptyAreas()
gameViewModel.showAllEmptyAreas()
gameViewModel.victory()
refreshShortcutIcon(true)
refreshEndGameShortcutIcon(true, isResuming)
keepScreenOn(false)
if (!isResuming) {
gameViewModel.addNewTip()
waitAndShowEndGameDialog(
victory = true,
await = false
@ -593,7 +697,7 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
totalArea
)
status = Status.Over(currentTime, score)
refreshShortcutIcon(true)
refreshEndGameShortcutIcon(false, isResuming)
keepScreenOn(false)
gameViewModel.stopClock()
@ -653,6 +757,10 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
} == 0
}
private fun hasActiveGameFragment(): Boolean {
return supportFragmentManager.findFragmentByTag(LevelFragment.TAG) != null
}
override fun onDismiss(dialog: DialogInterface?) {
gameViewModel.run {
refreshUserPreferences()
@ -708,6 +816,12 @@ class GameActivity : ThematicActivity(R.layout.activity_game), DialogInterface.O
}
}
private fun openCrowdIn() {
Intent(Intent.ACTION_VIEW, Uri.parse("https://crowdin.com/project/antimine-android")).let {
startActivity(it)
}
}
private fun showSupportAppDialog() {
if (supportFragmentManager.findFragmentByTag(SupportAppDialogFragment.TAG) == null &&
!instantAppManager.isEnabled(this)

View file

@ -5,6 +5,7 @@ import dev.lucasnlm.antimine.common.level.di.LevelModule
import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager
import dev.lucasnlm.antimine.core.analytics.models.Analytics
import dev.lucasnlm.antimine.core.di.CommonModule
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.di.AppModule
import dev.lucasnlm.antimine.di.ViewModelModule
import dev.lucasnlm.external.IAdsManager
@ -14,6 +15,7 @@ import org.koin.core.context.startKoin
open class MainApplication : MultiDexApplication() {
private val analyticsManager: IAnalyticsManager by inject()
private val preferencesRepository: IPreferencesRepository by inject()
private val adsManager: IAdsManager by inject()
@ -29,6 +31,10 @@ open class MainApplication : MultiDexApplication() {
sentEvent(Analytics.Open)
}
if (BuildConfig.FLAVOR == "foss") {
preferencesRepository.setPremiumFeatures(true)
}
adsManager.start(applicationContext)
}
}

View file

@ -31,12 +31,13 @@ class AboutViewModel(
"Hungarian" to sequenceOf("Hermann Márk"),
"Italian" to sequenceOf("Mattia - MisterWeeMan", "Nicola Lorenzetti"),
"Japanese" to sequenceOf("Ryota Hasegawa"),
"Korean" to sequenceOf("Forever_"),
"Norwegian" to sequenceOf("Eule Hecking"),
"Polish" to sequenceOf("Sebastian Jasiński", "Sebastian Skibiński"),
"Portuguese (BR)" to sequenceOf("Lucas Lima"),
"Russian" to sequenceOf("gaich@xda", "ask45t", "Ekaterina543"),
"Spanish" to sequenceOf("Alfredo Jara", "Aldo Rodriguez", "Inail"),
"Turkish" to sequenceOf("creuzwagen", "Fatih Fırıncı"),
"Turkish" to sequenceOf("arda şahin", "creuzwagen", "Fatih Fırıncı"),
"Ukrainian" to sequenceOf("Dmitry Shuba"),
"Vietnamese" to sequenceOf("pnhpnh"),
).map {

View file

@ -10,6 +10,7 @@ import dev.lucasnlm.antimine.playgames.viewmodel.PlayGamesViewModel
import dev.lucasnlm.antimine.stats.viewmodel.StatsViewModel
import dev.lucasnlm.antimine.text.viewmodel.TextViewModel
import dev.lucasnlm.antimine.theme.viewmodel.ThemeViewModel
import dev.lucasnlm.antimine.tutorial.viewmodel.TutorialViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
@ -24,6 +25,9 @@ val ViewModelModule = module {
viewModel { TextViewModel(get()) }
viewModel { ThemeViewModel(get(), get(), get(), get()) }
viewModel {
GameViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get())
GameViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get())
}
viewModel {
TutorialViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get())
}
}

View file

@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
@ -12,11 +13,8 @@ import androidx.fragment.app.FragmentManager
import androidx.lifecycle.lifecycleScope
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.level.viewmodel.EndGameDialogEvent
import dev.lucasnlm.antimine.level.viewmodel.EndGameDialogViewModel
import dev.lucasnlm.external.Ads
import dev.lucasnlm.external.IAdsManager
import dev.lucasnlm.external.IInstantAppManager
import kotlinx.coroutines.flow.collect
import org.koin.android.ext.android.inject
@ -25,9 +23,6 @@ import org.koin.androidx.viewmodel.ext.android.viewModel
class EndGameDialogFragment : AppCompatDialogFragment() {
private val instantAppManager: IInstantAppManager by inject()
private val adsManager: IAdsManager by inject()
private val preferencesRepository: IPreferencesRepository by inject()
private val endGameViewModel by viewModel<EndGameDialogViewModel>()
private val gameViewModel by sharedViewModel<GameViewModel>()
@ -40,7 +35,8 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
isVictory = if (getInt(DIALOG_TOTAL_MINES, 0) > 0) getBoolean(DIALOG_IS_VICTORY) else null,
time = getLong(DIALOG_TIME, 0L),
rightMines = getInt(DIALOG_RIGHT_MINES, 0),
totalMines = getInt(DIALOG_TOTAL_MINES, 0)
totalMines = getInt(DIALOG_TOTAL_MINES, 0),
received = getInt(DIALOG_RECEIVED, -1)
)
)
}
@ -72,6 +68,15 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
}
}
findViewById<TextView>(R.id.received_message).apply {
if (state.received > 0 && state.isVictory == true) {
visibility = View.VISIBLE
text = getString(R.string.you_have_received, state.received)
} else {
visibility = View.GONE
}
}
if (state.isVictory == true) {
if (!instantAppManager.isEnabled(context)) {
setNeutralButton(R.string.share) { _, _ ->
@ -81,12 +86,6 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
} else {
setNeutralButton(R.string.retry) { _, _ ->
gameViewModel.retryObserver.postValue(Unit)
activity?.let {
if (!preferencesRepository.isPremiumEnabled()) {
adsManager.requestRewarded(it, Ads.RewardsAds)
}
}
}
}
}
@ -101,20 +100,27 @@ class EndGameDialogFragment : AppCompatDialogFragment() {
}.create()
companion object {
fun newInstance(victory: Boolean, rightMines: Int, totalMines: Int, time: Long) =
EndGameDialogFragment().apply {
arguments = Bundle().apply {
putBoolean(DIALOG_IS_VICTORY, victory)
putInt(DIALOG_RIGHT_MINES, rightMines)
putInt(DIALOG_TOTAL_MINES, totalMines)
putLong(DIALOG_TIME, time)
}
fun newInstance(
victory: Boolean,
rightMines: Int,
totalMines: Int,
time: Long,
received: Int,
) = EndGameDialogFragment().apply {
arguments = Bundle().apply {
putBoolean(DIALOG_IS_VICTORY, victory)
putInt(DIALOG_RIGHT_MINES, rightMines)
putInt(DIALOG_TOTAL_MINES, totalMines)
putInt(DIALOG_RECEIVED, received)
putLong(DIALOG_TIME, time)
}
}
const val DIALOG_IS_VICTORY = "dialog_state"
private const val DIALOG_TIME = "dialog_time"
private const val DIALOG_RIGHT_MINES = "dialog_right_mines"
private const val DIALOG_TOTAL_MINES = "dialog_total_mines"
private const val DIALOG_RECEIVED = "dialog_received"
val TAG = EndGameDialogFragment::class.simpleName!!
}

View file

@ -24,7 +24,6 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
recyclerGrid.doOnLayout {
lifecycleScope.launch {
val loadGameUid = checkLoadGameDeepLink()
@ -35,7 +34,7 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
loadGameUid != null -> gameViewModel.loadGame(loadGameUid)
newGameDeepLink != null -> gameViewModel.startNewGame(newGameDeepLink)
retryDeepLink != null -> gameViewModel.retryGame(retryDeepLink)
else -> gameViewModel.loadLastGame()
else -> gameViewModel.loadGame()
}
withContext(Dispatchers.Main) {
@ -58,9 +57,9 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
levelSetup.observe(
viewLifecycleOwner,
{
getView()?.let { view ->
setupRecyclerViewSize(view, it)
{ minefield ->
getView()?.doOnLayout { view ->
setupRecyclerViewSize(view, minefield)
}
}
)
@ -76,7 +75,7 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
Event.Resume,
Event.ResumeGame,
Event.StartNewGame -> areaAdapter.setClickEnabled(true)
null -> { }
else -> { }
}
}
)
@ -113,4 +112,8 @@ open class LevelFragment : CommonLevelFragment(R.layout.fragment_level) {
null
}
}
companion object {
val TAG = LevelFragment::class.simpleName
}
}

View file

@ -8,6 +8,7 @@ sealed class EndGameDialogEvent {
val time: Long,
val rightMines: Int,
val totalMines: Int,
val received: Int,
) : EndGameDialogEvent()
data class ChangeEmoji(

View file

@ -7,4 +7,5 @@ data class EndGameDialogState(
val title: String,
val message: String,
val isVictory: Boolean?,
val received: Int
)

View file

@ -70,6 +70,7 @@ class EndGameDialogViewModel(
"",
"",
false,
0
)
override suspend fun mapEventToState(event: EndGameDialogEvent) = flow {
@ -80,7 +81,8 @@ class EndGameDialogViewModel(
titleEmoji = randomVictoryEmoji(),
title = context.getString(R.string.you_won),
message = messageTo(event.time, event.isVictory),
isVictory = true
isVictory = true,
received = event.received
)
}
false -> {
@ -88,7 +90,8 @@ class EndGameDialogViewModel(
titleEmoji = randomGameOverEmoji(),
title = context.getString(R.string.you_lost),
message = messageTo(event.time, event.isVictory),
isVictory = false
isVictory = false,
received = event.received
)
}
null -> {
@ -96,7 +99,8 @@ class EndGameDialogViewModel(
titleEmoji = randomNeutralEmoji(),
title = context.getString(R.string.new_game),
message = context.getString(R.string.new_game_request),
isVictory = false
isVictory = false,
received = event.received
)
}
}

View file

@ -38,7 +38,7 @@ class SupportAppDialogFragment : AppCompatDialogFragment() {
return AlertDialog.Builder(requireContext()).apply {
setView(R.layout.dialog_payments)
setNeutralButton(R.string.rating_button_no) { _, _ ->
setNeutralButton(R.string.no) { _, _ ->
analyticsManager.sentEvent(Analytics.DenyIapDialog)
}

View file

@ -0,0 +1,93 @@
package dev.lucasnlm.antimine.theme.view
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.Mark
object ExampleField {
fun getField() = listOf(
Area(
0,
0,
0,
1,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
1,
1,
0,
0,
hasMine = true,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
2,
2,
0,
0,
hasMine = true,
mistake = false,
mark = Mark.None,
isCovered = true
),
Area(
3,
0,
1,
2,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
4,
1,
1,
3,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
5,
2,
1,
3,
hasMine = true,
mistake = false,
mark = Mark.Flag,
isCovered = true
),
Area(
6,
0,
2,
0,
hasMine = true,
mistake = false,
mark = Mark.Question,
isCovered = true
),
Area(
7,
1,
2,
4,
hasMine = false,
mistake = false,
mark = Mark.None,
isCovered = false
),
Area(
8, 2, 2, 0,
hasMine = false, mistake = false, mark = Mark.None, isCovered = true, revealed = true
),
)
}

View file

@ -12,7 +12,6 @@ import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.AreaPaintSettings
import dev.lucasnlm.antimine.common.level.models.Mark
import dev.lucasnlm.antimine.common.level.view.AreaView
import dev.lucasnlm.antimine.core.themes.model.AppTheme
import dev.lucasnlm.antimine.theme.viewmodel.ThemeEvent
@ -25,18 +24,7 @@ class ThemeAdapter(
) : RecyclerView.Adapter<ThemeViewHolder>() {
private val themes: List<AppTheme> = themeViewModel.singleState().themes
private val minefield = listOf(
Area(0, 0, 0, 1, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(1, 1, 0, 0, hasMine = true, mistake = false, mark = Mark.None, isCovered = false),
Area(2, 2, 0, 0, hasMine = true, mistake = false, mark = Mark.None, isCovered = true),
Area(3, 0, 1, 2, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(4, 1, 1, 3, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(5, 2, 1, 3, hasMine = true, mistake = false, mark = Mark.Flag, isCovered = true),
Area(6, 0, 2, 0, hasMine = true, mistake = false, mark = Mark.Question, isCovered = true),
Area(7, 1, 2, 4, hasMine = false, mistake = false, mark = Mark.None, isCovered = false),
Area(8, 2, 2, 0, hasMine = false, mistake = false, mark = Mark.None, isCovered = true),
)
private val minefield = ExampleField.getField()
init {
setHasStableIds(true)

View file

@ -0,0 +1,171 @@
package dev.lucasnlm.antimine.tutorial.view
import android.annotation.SuppressLint
import android.content.Context
import android.util.Log
import android.view.GestureDetector
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.AreaPaintSettings
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.view.AreaAdapter
import dev.lucasnlm.antimine.common.level.view.AreaView
import dev.lucasnlm.antimine.common.level.view.AreaViewHolder
import dev.lucasnlm.antimine.core.control.ControlStyle
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.tutorial.viewmodel.TutorialViewModel
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
class TutorialAreaAdapter(
context: Context,
private val viewModel: TutorialViewModel,
private val preferencesRepository: IPreferencesRepository,
dimensionRepository: IDimensionRepository,
) : RecyclerView.Adapter<AreaViewHolder>() {
private var field = listOf<Area>()
private var isLowBitAmbient = false
private var isAmbientMode = false
private val paintSettings: AreaPaintSettings
private var clickEnabled: Boolean = false
init {
setHasStableIds(false)
paintSettings = AreaAdapter.createAreaPaintSettings(context.applicationContext, dimensionRepository.areaSize())
}
fun setAmbientMode(isAmbientMode: Boolean, isLowBitAmbient: Boolean) {
this.isLowBitAmbient = isLowBitAmbient
this.isAmbientMode = isAmbientMode
}
fun setClickEnabled(value: Boolean) {
clickEnabled = value
}
fun bindField(field: List<Area>) {
this.field = field
notifyDataSetChanged()
}
override fun getItemCount(): Int = field.size
private fun AreaView.onClickablePosition(position: Int, action: suspend (Int) -> Unit): Boolean {
return when {
position == RecyclerView.NO_POSITION -> {
Log.d(TAG, "Item no longer exists.")
false
}
clickEnabled -> {
requestFocus()
GlobalScope.launch {
action(position)
}
true
}
else -> false
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AreaViewHolder {
val view = AreaView(parent.context)
return AreaViewHolder(view).apply {
val style = preferencesRepository.controlStyle()
if (style == ControlStyle.DoubleClick || style == ControlStyle.DoubleClickInverted) {
view.isClickable = true
view.setOnDoubleClickListener(
object : GestureDetector.OnDoubleTapListener {
override fun onDoubleTap(e: MotionEvent?): Boolean {
return view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onDoubleClick(it)
}
}
override fun onDoubleTapEvent(e: MotionEvent?): Boolean {
return false
}
override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
return view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onSingleClick(it)
}
}
}
)
} else {
view.setOnTouchListener { _, motionEvent ->
when (motionEvent.action) {
MotionEvent.ACTION_DOWN -> {
view.isPressed = true
true
}
MotionEvent.ACTION_UP -> {
view.isPressed = false
val dt = motionEvent.eventTime - motionEvent.downTime
if (dt > preferencesRepository.customLongPressTimeout()) {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onLongClick(it)
}
} else {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onSingleClick(it)
}
}
}
else -> false
}
}
}
view.setOnKeyListener { _, keyCode, keyEvent ->
var handled = false
if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
when (keyEvent.action) {
KeyEvent.ACTION_DOWN -> {
handled = true
view.isPressed = true
}
KeyEvent.ACTION_UP -> {
handled = true
view.isPressed = false
val dt = keyEvent.eventTime - keyEvent.downTime
if (dt > preferencesRepository.customLongPressTimeout()) {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onLongClick(it)
}
} else {
view.onClickablePosition(absoluteAdapterPosition) {
viewModel.onSingleClick(it)
}
}
}
}
}
handled
}
}
}
private fun getItem(position: Int) = field[position]
override fun getItemId(position: Int): Long = getItem(position).id.toLong()
override fun onBindViewHolder(holder: AreaViewHolder, position: Int) {
val field = getItem(position)
holder.run {
val areaView = itemView as AreaView
areaView.bindField(field, viewModel.getAppTheme(), isAmbientMode, isLowBitAmbient, paintSettings)
}
}
companion object {
val TAG = TutorialAreaAdapter::class.simpleName!!
}
}

View file

@ -0,0 +1,57 @@
package dev.lucasnlm.antimine.tutorial.view
import android.annotation.SuppressLint
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDialogFragment
import androidx.fragment.app.FragmentManager
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.models.Difficulty
import dev.lucasnlm.antimine.common.level.models.Event
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
class TutorialCompleteDialogFragment : AppCompatDialogFragment() {
private val gameViewModel by sharedViewModel<GameViewModel>()
fun showAllowingStateLoss(manager: FragmentManager, tag: String?) {
val fragmentTransaction = manager.beginTransaction()
fragmentTransaction.add(this, tag)
fragmentTransaction.commitAllowingStateLoss()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
gameViewModel.startNewGame(Difficulty.Beginner)
}
@SuppressLint("InflateParams")
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
AlertDialog.Builder(requireContext()).apply {
val view = LayoutInflater
.from(context)
.inflate(R.layout.dialog_end_game, null, false)
.apply {
findViewById<TextView>(R.id.title).text = getString(R.string.tutorial_completed)
findViewById<TextView>(R.id.subtitle).visibility = View.GONE
findViewById<TextView>(R.id.received_message).visibility = View.GONE
findViewById<ImageView>(R.id.title_emoji)
.setImageResource(R.drawable.emoji_beaming_face_with_smiling_eyes)
}
setView(view)
setNeutralButton(R.string.retry) { _, _ ->
gameViewModel.eventObserver.postValue(Event.StartTutorial)
}
setPositiveButton(R.string.resume) { _, _ -> }
}.create()
companion object {
val TAG = TutorialCompleteDialogFragment::class.simpleName!!
}
}

View file

@ -0,0 +1,254 @@
package dev.lucasnlm.antimine.tutorial.view
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.models.Mark
object TutorialField {
fun getStep0(): List<Area> {
return (0..24).map {
Area(it, 0, 0, isCovered = true)
}.toList()
}
private fun getDefaultStep(): MutableList<Area> {
return mutableListOf(
Area(
0, 0, 0, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
1, 1, 0, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
2, 2, 0, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
3, 3, 0, 2, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
4, 4, 0, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
5, 0, 1, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
6, 1, 1, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
7, 2, 1, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
8, 3, 1, 2, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
9, 4, 1, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
10, 0, 2, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
11, 1, 2, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
12, 2, 2, 0, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
13, 3, 2, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
14, 4, 2, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
15, 0, 3, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
16, 1, 3, 2, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
17, 2, 3, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
18, 3, 3, 1, hasMine = false,
mistake = false, isCovered = false, mark = Mark.None,
highlighted = false,
),
Area(
19, 4, 3, 0, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
20, 0, 4, 0, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
21, 1, 4, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
22, 2, 4, 0, hasMine = true,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
23, 3, 4, 1, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
Area(
24, 4, 4, 0, hasMine = false,
mistake = false, isCovered = true, mark = Mark.None,
highlighted = false,
),
)
}
fun getStep1(): List<Area> {
return getDefaultStep().apply {
this[6] = this[6].copy(highlighted = true)
this[10] = this[10].copy(highlighted = true)
}
}
fun getStep2(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[11] = this[11].copy(highlighted = true)
this[15] = this[15].copy(highlighted = true)
}
}
fun getStep3(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(highlighted = true, isCovered = false)
this[20] = this[20].copy(highlighted = true)
this[21] = this[21].copy(highlighted = true)
}
}
fun getStep4(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[16] = this[16].copy(highlighted = true)
this[22] = this[22].copy(highlighted = true)
}
}
fun getStep5(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[17] = this[17].copy(highlighted = true)
this[23] = this[23].copy(highlighted = true)
this[22] = this[22].copy(mark = Mark.Flag)
}
}
fun getStep6(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[18] = this[18].copy(highlighted = true)
this[24] = this[24].copy(highlighted = true)
this[19] = this[19].copy(highlighted = true)
this[14] = this[14].copy(highlighted = true)
}
}
fun getStep7(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[24] = this[24].copy(isCovered = false)
this[19] = this[19].copy(isCovered = false)
this[14] = this[14].copy(isCovered = false)
this[13] = this[13].copy(highlighted = true)
this[9] = this[9].copy(highlighted = true)
}
}
fun getStep8(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[24] = this[24].copy(isCovered = false)
this[19] = this[19].copy(isCovered = false)
this[14] = this[14].copy(isCovered = false)
this[8] = this[8].copy(highlighted = true)
this[4] = this[4].copy(highlighted = true)
this[9] = this[9].copy(mark = Mark.Flag)
}
}
fun getStep9(): List<Area> {
return getDefaultStep().apply {
this[10] = this[10].copy(mark = Mark.Flag)
this[15] = this[15].copy(isCovered = false)
this[20] = this[20].copy(isCovered = false)
this[21] = this[21].copy(isCovered = false)
this[23] = this[23].copy(isCovered = false)
this[22] = this[22].copy(mark = Mark.Flag)
this[24] = this[24].copy(isCovered = false)
this[19] = this[19].copy(isCovered = false)
this[14] = this[14].copy(isCovered = false)
this[4] = this[4].copy(mark = Mark.Flag)
this[9] = this[9].copy(mark = Mark.Flag)
}
}
}

View file

@ -0,0 +1,138 @@
package dev.lucasnlm.antimine.tutorial.view
import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.core.content.ContextCompat
import androidx.core.text.bold
import androidx.core.text.buildSpannedString
import androidx.core.text.color
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.R
import dev.lucasnlm.antimine.common.level.models.Event
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.view.SpaceItemDecoration
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.tutorial.viewmodel.TutorialViewModel
import kotlinx.android.synthetic.main.fragment_tutorial_level.*
import kotlinx.coroutines.flow.collect
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
class TutorialLevelFragment : Fragment(R.layout.fragment_tutorial_level) {
private val dimensionRepository: IDimensionRepository by inject()
private val preferencesRepository: IPreferencesRepository by inject()
private val tutorialViewModel by viewModel<TutorialViewModel>()
private val gameViewModel by sharedViewModel<GameViewModel>()
private val areaAdapter by lazy {
TutorialAreaAdapter(requireContext(), tutorialViewModel, preferencesRepository, dimensionRepository).apply {
setClickEnabled(true)
}
}
private lateinit var recyclerGrid: RecyclerView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
recyclerGrid.apply {
addItemDecoration(SpaceItemDecoration(R.dimen.field_padding))
setHasFixedSize(true)
layoutManager = GridLayoutManager(view.context, 5)
adapter = areaAdapter
}
lifecycleScope.launchWhenCreated {
tutorialViewModel.run {
field.observe(
viewLifecycleOwner,
{ list ->
gameViewModel.stopClock()
gameViewModel.elapsedTimeSeconds.postValue(0L)
gameViewModel.mineCount.postValue(
list.count { it.hasMine }.coerceAtLeast(4) - list.count { it.mark.isFlag() }
)
areaAdapter.bindField(list)
if (tutorialState.value.completed) {
gameViewModel.eventObserver.postValue(Event.FinishTutorial)
}
}
)
}
}
lifecycleScope.launchWhenCreated {
tutorialViewModel.tutorialState.collect {
val flagAction = tutorialViewModel.flagActionLabel()
val openAction = tutorialViewModel.openActionLabel()
tutorial_top.apply {
text = buildSpannedString {
it.topMessage
.splitKeeping(flagAction, openAction)
.forEach {
when (it) {
flagAction, openAction -> {
bold { color(ContextCompat.getColor(context, R.color.accent)) { append(it) } }
}
else -> append(it)
}
}
}
setTextColor(
Color.argb(
255,
Color.red(tutorial_top.currentTextColor),
Color.green(tutorial_top.currentTextColor),
Color.blue(tutorial_top.currentTextColor),
),
)
}
tutorial_bottom.apply {
text = buildSpannedString {
it.bottomMessage
.splitKeeping(flagAction, openAction)
.forEach {
when (it) {
flagAction, openAction -> {
bold { color(ContextCompat.getColor(context, R.color.accent)) { append(it) } }
}
else -> append(it)
}
}
}
setTextColor(
Color.argb(
255,
Color.red(tutorial_top.currentTextColor),
Color.green(tutorial_top.currentTextColor),
Color.blue(tutorial_top.currentTextColor),
),
)
}
}
}
}
private fun String.splitKeeping(str: String): List<String> {
return this.split(str).flatMap { listOf(it, str) }.dropLast(1).filterNot { it.isEmpty() }
}
private fun String.splitKeeping(vararg targetStrings: String): List<String> {
var res = listOf(this)
targetStrings.forEach { str ->
res = res.flatMap { it.splitKeeping(str) }
}
return res
}
companion object {
val TAG = TutorialLevelFragment::class.simpleName
}
}

View file

@ -0,0 +1,8 @@
package dev.lucasnlm.antimine.tutorial.viewmodel
data class TutorialState(
val step: Int,
val topMessage: String,
val bottomMessage: String,
val completed: Boolean,
)

View file

@ -0,0 +1,220 @@
package dev.lucasnlm.antimine.tutorial.viewmodel
import android.content.Context
import dev.lucasnlm.antimine.common.R
import dev.lucasnlm.antimine.common.level.models.Area
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.ISavesRepository
import dev.lucasnlm.antimine.common.level.repository.IStatsRepository
import dev.lucasnlm.antimine.common.level.repository.ITipRepository
import dev.lucasnlm.antimine.common.level.utils.Clock
import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager
import dev.lucasnlm.antimine.core.analytics.models.Analytics
import dev.lucasnlm.antimine.core.control.ControlStyle
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
import dev.lucasnlm.antimine.core.sound.ISoundManager
import dev.lucasnlm.antimine.core.themes.repository.IThemeRepository
import dev.lucasnlm.antimine.tutorial.view.TutorialField
import dev.lucasnlm.external.IPlayGamesManager
import kotlinx.coroutines.flow.MutableStateFlow
class TutorialViewModel(
savesRepository: ISavesRepository,
statsRepository: IStatsRepository,
dimensionRepository: IDimensionRepository,
themeRepository: IThemeRepository,
soundManager: ISoundManager,
minefieldRepository: IMinefieldRepository,
analyticsManager: IAnalyticsManager,
playGamesManager: IPlayGamesManager,
tipRepository: ITipRepository,
private val clock: Clock,
private val context: Context,
private val hapticFeedbackManager: IHapticFeedbackManager,
private val preferencesRepository: IPreferencesRepository,
) : GameViewModel(
savesRepository,
statsRepository,
dimensionRepository,
preferencesRepository,
hapticFeedbackManager,
themeRepository,
soundManager,
minefieldRepository,
analyticsManager,
playGamesManager,
tipRepository,
clock,
) {
val tutorialState = MutableStateFlow(
TutorialState(
0,
context.getString(R.string.tutorial),
context.getString(R.string.tutorial_0_bottom, openActionLabel()),
completed = false,
)
)
init {
field.postValue(TutorialField.getStep0())
analyticsManager.sentEvent(Analytics.TutorialStarted)
}
private fun currentStep(): Int {
return tutorialState.value.step
}
fun openActionLabel(): String =
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> context.getString(R.string.single_click)
ControlStyle.FastFlag -> context.getString(R.string.long_press)
ControlStyle.DoubleClick -> context.getString(R.string.double_click)
ControlStyle.DoubleClickInverted -> context.getString(R.string.single_click)
}
fun flagActionLabel(): String =
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> context.getString(R.string.long_press)
ControlStyle.FastFlag -> context.getString(R.string.single_click)
ControlStyle.DoubleClick -> context.getString(R.string.single_click)
ControlStyle.DoubleClickInverted -> context.getString(R.string.double_click)
}
private fun postStep(step: List<Area>, top: String, bottom: String, completed: Boolean = false) {
field.postValue(step)
clock.stop()
tutorialState.value = tutorialState.value.copy(
completed = completed,
step = currentStep() + 1,
topMessage = top,
bottomMessage = bottom,
)
}
private fun openTileAction(index: Int) {
when (currentStep()) {
0 -> {
postStep(
TutorialField.getStep1(),
context.getString(R.string.tutorial_1_top),
context.getString(R.string.tutorial_1_bottom, flagActionLabel()),
)
}
2 -> {
if (index == 15) {
postStep(
TutorialField.getStep3(),
context.getString(R.string.tutorial_3_top),
context.getString(R.string.tutorial_3_bottom),
)
}
}
3 -> {
if (index == 20 || index == 21) {
postStep(
TutorialField.getStep4(),
context.getString(R.string.tutorial_4_top),
context.getString(R.string.tutorial_4_bottom, flagActionLabel()),
)
}
}
5 -> {
if (index == 23) {
postStep(
TutorialField.getStep6(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
6 -> {
if (index == 24 || index == 19 || index == 14) {
postStep(
TutorialField.getStep7(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
else -> {
hapticFeedbackManager.explosionFeedback()
}
}
}
private fun longTileAction(index: Int) {
when (currentStep()) {
1 -> {
if (index == 10) {
postStep(
TutorialField.getStep2(),
context.getString(R.string.tutorial_2_top),
context.getString(R.string.tutorial_2_bottom, openActionLabel()),
)
}
}
4 -> {
if (index == 22) {
postStep(
TutorialField.getStep5(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
7 -> {
if (index == 9) {
postStep(
TutorialField.getStep8(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
)
}
}
8 -> {
if (index == 4) {
postStep(
TutorialField.getStep9(),
context.getString(R.string.tutorial_5_top),
context.getString(R.string.tutorial_5_bottom, openActionLabel(), flagActionLabel()),
completed = true
)
}
}
else -> {
hapticFeedbackManager.explosionFeedback()
}
}
}
override suspend fun onDoubleClick(index: Int) {
clock.stop()
when (preferencesRepository.controlStyle()) {
ControlStyle.DoubleClick -> openTileAction(index)
ControlStyle.DoubleClickInverted -> longTileAction(index)
else -> {}
}
}
override suspend fun onSingleClick(index: Int) {
clock.stop()
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> openTileAction(index)
ControlStyle.FastFlag -> longTileAction(index)
ControlStyle.DoubleClick -> longTileAction(index)
ControlStyle.DoubleClickInverted -> openTileAction(index)
}
}
override suspend fun onLongClick(index: Int) {
clock.stop()
when (preferencesRepository.controlStyle()) {
ControlStyle.Standard -> longTileAction(index)
ControlStyle.FastFlag -> openTileAction(index)
else -> {}
}
}
}

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,3c-0.46,0 -0.93,0.04 -1.4,0.14C7.84,3.67 5.64,5.9 5.12,8.66c-0.48,2.61 0.48,5.01 2.22,6.56C7.77,15.6 8,16.13 8,16.69V19c0,1.1 0.9,2 2,2h0.28c0.35,0.6 0.98,1 1.72,1s1.38,-0.4 1.72,-1H14c1.1,0 2,-0.9 2,-2v-2.31c0,-0.55 0.22,-1.09 0.64,-1.46C18.09,13.95 19,12.08 19,10C19,6.13 15.87,3 12,3zM12.5,14h-1v-2.59L9.67,9.59l0.71,-0.71L12,10.5l1.62,-1.62l0.71,0.71l-1.83,1.83V14zM13.5,19c-0.01,0 -0.02,-0.01 -0.03,-0.01V19h-2.94v-0.01c-0.01,0 -0.02,0.01 -0.03,0.01c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5c0.01,0 0.02,0.01 0.03,0.01V18h2.94v0.01c0.01,0 0.02,-0.01 0.03,-0.01c0.28,0 0.5,0.22 0.5,0.5C14,18.78 13.78,19 13.5,19zM13.5,17h-3c-0.28,0 -0.5,-0.22 -0.5,-0.5c0,-0.28 0.22,-0.5 0.5,-0.5h3c0.28,0 0.5,0.22 0.5,0.5C14,16.78 13.78,17 13.5,17z" />
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12.65,15.67c0.14,-0.36 0.05,-0.77 -0.23,-1.05l-2.09,-2.06 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53h1.94c0.54,0 0.99,-0.45 0.99,-0.99v-0.02c0,-0.54 -0.45,-0.99 -0.99,-0.99L10,4L10,3c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v1L1.99,4c-0.54,0 -0.99,0.45 -0.99,0.99 0,0.55 0.45,0.99 0.99,0.99h10.18C11.5,7.92 10.44,9.75 9,11.35c-0.81,-0.89 -1.49,-1.86 -2.06,-2.88 -0.16,-0.29 -0.45,-0.47 -0.78,-0.47 -0.69,0 -1.13,0.75 -0.79,1.35 0.63,1.13 1.4,2.21 2.3,3.21L3.3,16.87c-0.4,0.39 -0.4,1.03 0,1.42 0.39,0.39 1.02,0.39 1.42,0L9,14l2.02,2.02c0.51,0.51 1.38,0.32 1.63,-0.35zM17.5,10c-0.6,0 -1.14,0.37 -1.35,0.94l-3.67,9.8c-0.24,0.61 0.22,1.26 0.87,1.26 0.39,0 0.74,-0.24 0.88,-0.61l0.89,-2.39h4.75l0.9,2.39c0.14,0.36 0.49,0.61 0.88,0.61 0.65,0 1.11,-0.65 0.88,-1.26l-3.67,-9.8c-0.22,-0.57 -0.76,-0.94 -1.36,-0.94zM15.88,17l1.62,-4.33L19.12,17h-3.24z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M5,13.18v2.81c0,0.73 0.4,1.41 1.04,1.76l5,2.73c0.6,0.33 1.32,0.33 1.92,0l5,-2.73c0.64,-0.35 1.04,-1.03 1.04,-1.76v-2.81l-6.04,3.3c-0.6,0.33 -1.32,0.33 -1.92,0L5,13.18zM11.04,3.52l-8.43,4.6c-0.69,0.38 -0.69,1.38 0,1.76l8.43,4.6c0.6,0.33 1.32,0.33 1.92,0L21,10.09L21,16c0,0.55 0.45,1 1,1s1,-0.45 1,-1L23,9.59c0,-0.37 -0.2,-0.7 -0.52,-0.88l-9.52,-5.19c-0.6,-0.32 -1.32,-0.32 -1.92,0z"/>
</vector>

View file

@ -83,10 +83,26 @@
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/new_game"
android:padding="14dp"
android:alpha="0.0"
android:clickable="false"
ads:layout_constraintRight_toRightOf="parent"
ads:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/retry"
tools:visibility="visible"/>
tools:alpha="1.0"/>
<TextView
android:id="@+id/tipsCounter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="41dp"
android:textSize="12sp"
android:textStyle="bold"
android:visibility="gone"
tools:text="100"
tools:visibility="visible"
ads:layout_constraintBottom_toBottomOf="@+id/shortcutIcon"
ads:layout_constraintEnd_toEndOf="@+id/shortcutIcon"
ads:layout_constraintTop_toTopOf="parent" />
<FrameLayout
android:id="@+id/levelContainer"

View file

@ -50,4 +50,19 @@
app:layout_constraintTop_toBottomOf="@+id/title"
tools:text="You did 5/12 in 34 seconds." />
<TextView
android:id="@+id/received_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/you_have_received"
android:layout_marginTop="4dp"
android:textSize="14sp"
android:textAlignment="center"
android:gravity="center"
app:drawableEndCompat="@drawable/tip"
app:drawableTint="@color/accent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/subtitle"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_gravity="center">
<TextView
android:id="@+id/tutorial_top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:paddingHorizontal="24dp"
android:gravity="center_horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/recyclerGrid"
tools:text="Tutorial"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerGrid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:clipChildren="false"
android:clipToPadding="false"
android:contentDescription="@null"
android:fadeScrollbars="true"
android:importantForAccessibility="no"
android:overScrollMode="never"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:scrollbars="none" />
<TextView
android:id="@+id/tutorial_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:gravity="center_horizontal"
android:textSize="16sp"
android:paddingHorizontal="24dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recyclerGrid"
tools:text="You can start by clicking at any random place." />
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -78,6 +78,12 @@
android:checkable="false"
android:icon="@drawable/settings"
android:title="@string/settings" />
<item
android:id="@+id/tutorial"
android:checkable="false"
android:icon="@drawable/tutorial"
android:title="@string/tutorial" />
</group>
<group android:id="@+id/play_games_group">
@ -103,6 +109,12 @@
android:checkable="false"
android:title="@string/rating" />
<item
android:id="@+id/translation"
android:icon="@drawable/translate"
android:checkable="false"
android:title="@string/translation" />
<item
android:id="@+id/about"
android:icon="@drawable/info"

View file

@ -25,6 +25,10 @@ class MockPreferencesRepository : IPreferencesRepository {
override fun completeFirstUse() { }
override fun isTutorialCompleted(): Boolean = true
override fun completeTutorial() { }
override fun customLongPressTimeout(): Long = 400L
override fun themeId(): Long = 1L
@ -57,6 +61,14 @@ class MockPreferencesRepository : IPreferencesRepository {
override fun showSupport(): Boolean = true
override fun getTips(): Int = 0
override fun setTips(tips: Int) { }
override fun getExtraTips(): Int = 5
override fun setExtraTips(tips: Int) { }
override fun useFlagAssistant(): Boolean = false
override fun useHapticFeedback(): Boolean = true

View file

@ -48,7 +48,8 @@ class ThemeViewModelTest : IntentViewModelTest() {
toolbarMine = R.drawable.mine,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed,
)
)
@ -81,7 +82,8 @@ class ThemeViewModelTest : IntentViewModelTest() {
toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed,
)
)
@ -114,7 +116,8 @@ class ThemeViewModelTest : IntentViewModelTest() {
toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed,
)
)

View file

@ -8,8 +8,8 @@ android {
defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid
versionCode 800111
versionName '8.0.11'
versionCode 800101
versionName '8.1.0'
minSdkVersion 21
targetSdkVersion 30
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

View file

@ -212,6 +212,15 @@ class GameController {
}
}
fun revealRandomMine(): Boolean {
val result: Boolean
field = MinefieldHandler(field.toMutableList(), false).run {
result = revealRandomMine()
result()
}
return result
}
fun hasAnyMineExploded(): Boolean = mines().firstOrNull { it.mistake } != null
fun hasFlaggedAllMines(): Boolean = rightFlags() == minefield.mines

View file

@ -18,7 +18,7 @@ import dev.lucasnlm.antimine.common.level.database.models.Stats
Save::class,
Stats::class
],
version = 6,
version = 7,
exportSchema = false
)
@TypeConverters(

View file

@ -5,9 +5,11 @@ import dev.lucasnlm.antimine.common.level.database.AppDataBase
import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.ISavesRepository
import dev.lucasnlm.antimine.common.level.repository.IStatsRepository
import dev.lucasnlm.antimine.common.level.repository.ITipRepository
import dev.lucasnlm.antimine.common.level.repository.MinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.SavesRepository
import dev.lucasnlm.antimine.common.level.repository.StatsRepository
import dev.lucasnlm.antimine.common.level.repository.TipRepository
import dev.lucasnlm.antimine.common.level.utils.Clock
import dev.lucasnlm.antimine.common.level.utils.HapticFeedbackManager
import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager
@ -48,4 +50,8 @@ val LevelModule = module {
single {
HapticFeedbackManager(get())
} bind IHapticFeedbackManager::class
single {
TipRepository(get())
} bind ITipRepository::class
}

View file

@ -22,6 +22,13 @@ class MinefieldHandler(
.forEach { field[it.id] = it.copy(isCovered = false) }
}
fun revealRandomMine(): Boolean {
return field.filter { it.hasMine && it.mark.isNone() && !it.revealed }.shuffled().firstOrNull()?.run {
field[this.id] = this.copy(revealed = true)
true
} ?: false
}
fun turnOffAllHighlighted() {
field.filter { it.highlighted }
.forEach { field[it.id] = it.copy(highlighted = false) }

View file

@ -10,4 +10,5 @@ data class Area(
val isCovered: Boolean = true,
val mark: Mark = Mark.None,
val highlighted: Boolean = false,
val revealed: Boolean = false,
)

View file

@ -8,4 +8,6 @@ enum class Event {
Running,
Victory,
GameOver,
StartTutorial,
FinishTutorial,
}

View file

@ -0,0 +1,50 @@
package dev.lucasnlm.antimine.common.level.repository
import dev.lucasnlm.antimine.core.preferences.IPreferencesRepository
interface ITipRepository {
fun setExtraTips(amount: Int)
fun removeTip(): Boolean
fun increaseTip()
fun getTotalTips(): Int
}
class TipRepository(
private val preferencesRepository: IPreferencesRepository
) : ITipRepository {
override fun setExtraTips(amount: Int) {
preferencesRepository.setExtraTips(amount)
}
override fun removeTip(): Boolean {
val tips = preferencesRepository.getTips()
val extra = preferencesRepository.getExtraTips()
return when {
tips >= 1 -> {
preferencesRepository.setTips(tips - 1)
true
}
preferencesRepository.getExtraTips() >= 1 -> {
preferencesRepository.setExtraTips(extra - 1)
true
}
else -> {
false
}
}
}
override fun increaseTip() {
val newValue = (preferencesRepository.getTips() + 1).coerceAtMost(MAX_TIPS).coerceAtLeast(0)
preferencesRepository.setTips(newValue)
}
override fun getTotalTips(): Int {
return preferencesRepository.getExtraTips() + preferencesRepository.getTips()
}
companion object {
const val MAX_TIPS = 15
}
}

View file

@ -79,7 +79,21 @@ fun Area.paintOnCanvas(
)
question?.draw(canvas)
}
else -> {}
else -> {
if (revealed) {
val padding = minePadding ?: context.resources.getDimension(R.dimen.mine_padding).toInt()
val revealedDrawable = ContextCompat.getDrawable(context, theme.assets.revealed)
revealedDrawable?.setBounds(
rectF.left.toInt() + padding,
rectF.top.toInt() + padding,
rectF.right.toInt() - padding,
rectF.bottom.toInt() - padding
)
revealedDrawable?.draw(canvas)
}
}
}
} else {
if (isAmbientMode) {

View file

@ -1,11 +1,12 @@
package dev.lucasnlm.antimine.common.level.view
import android.content.Context
import android.text.format.DateUtils
import android.os.Bundle
import android.view.View
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import dev.lucasnlm.antimine.common.R
import dev.lucasnlm.antimine.common.level.models.Minefield
import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
@ -23,6 +24,11 @@ abstract class CommonLevelFragment(@LayoutRes val contentLayoutId: Int) : Fragme
}
protected lateinit var recyclerGrid: RecyclerView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
}
private fun makeNewLayoutManager(boardWidth: Int) =
FixedGridLayoutManager().apply {
setTotalColumnCount(boardWidth)
@ -35,12 +41,6 @@ abstract class CommonLevelFragment(@LayoutRes val contentLayoutId: Int) : Fragme
setPadding(horizontalPadding, verticalPadding, 0, 0)
layoutManager = makeNewLayoutManager(levelSetup.width)
adapter = areaAdapter
alpha = 0.0f
animate().apply {
alpha(1.0f)
duration = DateUtils.SECOND_IN_MILLIS
}.start()
}
}

View file

@ -15,6 +15,7 @@ import dev.lucasnlm.antimine.common.level.repository.IDimensionRepository
import dev.lucasnlm.antimine.common.level.repository.IMinefieldRepository
import dev.lucasnlm.antimine.common.level.repository.ISavesRepository
import dev.lucasnlm.antimine.common.level.repository.IStatsRepository
import dev.lucasnlm.antimine.common.level.repository.ITipRepository
import dev.lucasnlm.antimine.common.level.utils.Clock
import dev.lucasnlm.antimine.common.level.utils.IHapticFeedbackManager
import dev.lucasnlm.antimine.core.analytics.IAnalyticsManager
@ -35,7 +36,7 @@ import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class GameViewModel(
open class GameViewModel(
private val savesRepository: ISavesRepository,
private val statsRepository: IStatsRepository,
private val dimensionRepository: IDimensionRepository,
@ -46,6 +47,7 @@ class GameViewModel(
private val minefieldRepository: IMinefieldRepository,
private val analyticsManager: IAnalyticsManager,
private val playGamesManager: IPlayGamesManager,
private val tipRepository: ITipRepository,
private val clock: Clock,
) : ViewModel() {
val eventObserver = MutableLiveData<Event>()
@ -62,6 +64,7 @@ class GameViewModel(
val difficulty = MutableLiveData<Difficulty>()
val levelSetup = MutableLiveData<Minefield>()
val saveId = MutableLiveData<Long>()
val tips = MutableLiveData(tipRepository.getTotalTips())
fun startNewGame(newDifficulty: Difficulty = currentDifficulty): Minefield {
clock.reset()
@ -203,6 +206,11 @@ class GameViewModel(
}
}
suspend fun loadGame(): Minefield {
val currentLevelSetup = levelSetup.value
return currentLevelSetup ?: loadLastGame()
}
fun pauseGame() {
if (initialized) {
if (gameController.hasMines()) {
@ -245,7 +253,7 @@ class GameViewModel(
}
}
suspend fun onLongClick(index: Int) {
open suspend fun onLongClick(index: Int) {
gameController
.longPress(index)
.filterNotNull()
@ -260,7 +268,7 @@ class GameViewModel(
}
}
suspend fun onDoubleClick(index: Int) {
open suspend fun onDoubleClick(index: Int) {
gameController
.doubleClick(index)
.filterNotNull()
@ -271,7 +279,7 @@ class GameViewModel(
}
}
suspend fun onSingleClick(index: Int) {
open suspend fun onSingleClick(index: Int) {
gameController
.singleClick(index)
.filterNotNull()
@ -354,7 +362,22 @@ class GameViewModel(
clock.stop()
}
fun revealAllEmptyAreas() = gameController.revealAllEmptyAreas()
fun showAllEmptyAreas() {
gameController.revealAllEmptyAreas()
}
fun revealRandomMine(): Boolean {
return if (gameController.revealRandomMine()) {
if (tipRepository.removeTip()) {
refreshField()
}
tips.postValue(tipRepository.getTotalTips())
true
} else {
false
}
}
fun explosionDelay() = if (preferencesRepository.useAnimations()) 750L else 0L
@ -403,6 +426,14 @@ class GameViewModel(
}
}
fun addNewTip() {
tipRepository.increaseTip()
}
fun getTips(): Int {
return tipRepository.getTotalTips()
}
fun victory() {
gameController.run {
analyticsManager.sentEvent(

View file

@ -91,6 +91,10 @@ sealed class Analytics(
object OpenThemes : Analytics("Open Themes")
object TutorialStarted : Analytics("Tutorial Started")
object TutorialCompleted : Analytics("Tutorial Completed")
object OpenAchievements : Analytics("Open Achievements")
object OpenLeaderboards : Analytics("Open Leaderboards")
@ -115,5 +119,7 @@ sealed class Analytics(
object TapRatingRequest : Analytics("Rating Request")
object UseTip : Analytics("Use Tip")
class TapGameReset(resign: Boolean) : Analytics("Game reset", mapOf("Resign" to resign.toString()))
}

View file

@ -16,6 +16,9 @@ interface IPreferencesRepository {
fun isFirstUse(): Boolean
fun completeFirstUse()
fun isTutorialCompleted(): Boolean
fun completeTutorial()
fun customLongPressTimeout(): Long
fun themeId(): Long
@ -40,6 +43,11 @@ interface IPreferencesRepository {
fun setShowSupport(show: Boolean)
fun showSupport(): Boolean
fun getTips(): Int
fun setTips(tips: Int)
fun getExtraTips(): Int
fun setExtraTips(tips: Int)
fun useFlagAssistant(): Boolean
fun useHapticFeedback(): Boolean
fun areaSizeMultiplier(): Int

View file

@ -77,6 +77,14 @@ class PreferencesRepository(
preferencesManager.putBoolean(PREFERENCE_FIRST_USE, false)
}
override fun isTutorialCompleted(): Boolean {
return preferencesManager.getBoolean(PREFERENCE_TUTORIAL_COMPLETED, false)
}
override fun completeTutorial() {
preferencesManager.putBoolean(PREFERENCE_TUTORIAL_COMPLETED, true)
}
override fun customLongPressTimeout(): Long =
preferencesManager.getInt(PREFERENCE_LONG_PRESS_TIMEOUT, ViewConfiguration.getLongPressTimeout()).toLong()
@ -155,6 +163,10 @@ class PreferencesRepository(
if (!preferencesManager.contains(PREFERENCE_LONG_PRESS_TIMEOUT)) {
preferencesManager.putInt(PREFERENCE_LONG_PRESS_TIMEOUT, defaultLongPressTimeout)
}
if (preferencesManager.contains(PREFERENCE_FIRST_USE)) {
preferencesManager.putBoolean(PREFERENCE_TUTORIAL_COMPLETED, true)
}
}
override fun setPremiumFeatures(status: Boolean) {
@ -174,6 +186,22 @@ class PreferencesRepository(
return preferencesManager.getBoolean(PREFERENCE_SHOW_SUPPORT, true)
}
override fun getTips(): Int {
return preferencesManager.getInt(PREFERENCE_TIPS, 5)
}
override fun setTips(tips: Int) {
preferencesManager.putInt(PREFERENCE_TIPS, tips)
}
override fun getExtraTips(): Int {
return preferencesManager.getInt(PREFERENCE_EXTRA_TIPS, 0)
}
override fun setExtraTips(tips: Int) {
preferencesManager.putInt(PREFERENCE_EXTRA_TIPS, tips)
}
private companion object {
private const val PREFERENCE_VIBRATION = "preference_vibration"
private const val PREFERENCE_ASSISTANT = "preference_assistant"
@ -192,9 +220,12 @@ class PreferencesRepository(
private const val PREFERENCE_PROGRESSIVE_VALUE = "preference_progressive_value"
private const val PREFERENCE_LONG_PRESS_TIMEOUT = "preference_long_press_timeout"
private const val PREFERENCE_FIRST_USE = "preference_first_use"
private const val PREFERENCE_TUTORIAL_COMPLETED = "preference_tutorial_completed"
private const val PREFERENCE_USE_COUNT = "preference_use_count"
private const val PREFERENCE_REQUEST_RATING = "preference_request_rating"
private const val PREFERENCE_PREMIUM_FEATURES = "preference_premium_features"
private const val PREFERENCE_SHOW_SUPPORT = "preference_show_support"
private const val PREFERENCE_TIPS = "preference_current_tips"
private const val PREFERENCE_EXTRA_TIPS = "preference_extra_tips"
}
}

View file

@ -10,4 +10,5 @@ data class Assets(
@DrawableRes val mine: Int,
@DrawableRes val mineExploded: Int,
@DrawableRes val mineLow: Int,
@DrawableRes val revealed: Int,
)

View file

@ -58,7 +58,8 @@ class ThemeRepository(
toolbarMine = R.drawable.mine,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed
)
private fun fromDefaultPalette(context: Context) =

View file

@ -36,6 +36,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
)
@ -69,6 +70,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
)
@ -102,6 +104,7 @@ object Themes {
mine = R.drawable.mine_low,
mineExploded = R.drawable.mine_low,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
)
@ -139,6 +142,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_white,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -171,6 +175,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -203,6 +208,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -235,6 +241,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -267,6 +274,7 @@ object Themes {
mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
)
),
AppTheme(
@ -299,6 +307,7 @@ object Themes {
mine = R.drawable.mine_pink,
mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -331,6 +340,7 @@ object Themes {
mine = R.drawable.mine_pink,
mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -362,7 +372,8 @@ object Themes {
toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -394,7 +405,8 @@ object Themes {
toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -427,6 +439,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -458,7 +471,8 @@ object Themes {
toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_pink_exploded,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_white,
)
),
AppTheme(
@ -491,6 +505,7 @@ object Themes {
mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
)
),
AppTheme(
@ -522,7 +537,8 @@ object Themes {
toolbarMine = R.drawable.mine_low,
mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
)
),
AppTheme(
@ -555,6 +571,7 @@ object Themes {
mine = R.drawable.mine_white,
mineExploded = R.drawable.mine_white,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
)
),
AppTheme(
@ -587,6 +604,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
)
),
AppTheme(
@ -619,6 +637,7 @@ object Themes {
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
)
),
AppTheme(
@ -645,12 +664,13 @@ object Themes {
),
assets = Assets(
wrongFlag = R.drawable.red_flag,
flag = R.drawable.flag,
flag = R.drawable.flag_black,
questionMark = R.drawable.question,
toolbarMine = R.drawable.mine,
mine = R.drawable.mine,
mineExploded = R.drawable.mine_exploded_red,
mineLow = R.drawable.mine_low,
revealed = R.drawable.mine_revealed_black,
)
)
)

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33000000"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33ffffff"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33000000"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="#33ffffff"
android:pathData="M331.722,124.091l-33.743,-67.204l-83.901,0l-33.84,65.28l-80.22,0l-37.443,65.714l37.443,67.649l-37.443,66.12l37.42,67.746l80.243,0l39.239,65.717l75.084,0l37.161,-66.643l79.759,-0.019l37.942,-66.801l-40.501,-65.64l40.501,-68.129l-38.02,-63.79z" />
</vector>

View file

@ -13,7 +13,6 @@
android:fadeScrollbars="true"
android:overScrollMode="never"
android:padding="78dp"
android:scrollbars="none"
android:alpha="0" />
android:scrollbars="none" />
</FrameLayout>

View file

@ -15,7 +15,6 @@
android:fadeScrollbars="true"
android:importantForAccessibility="no"
android:overScrollMode="never"
android:scrollbars="none"
android:alpha="0" />
android:scrollbars="none" />
</FrameLayout>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="af">
<string name="app_name">Antimine</string>
<string name="app_description">Verwyder versteekte myne van \'n mynveld.</string>
<string name="tutorial">Handleiding</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Speletjies</string>
<string name="previous_games">Vorige Speletjies</string>
<string name="minefield">Moeilikheidsgraad</string>
@ -21,20 +34,20 @@
<string name="height">Hoogte</string>
<string name="mines">Myne</string>
<string name="retry_sure">Wil u \'n nuwe spel begin met hierdie kaart?</string>
<string name="show_licenses">Show Licenses</string>
<string name="show_licenses">Wys lisensies</string>
<string name="new_game_request">Wil u \'n nuwe spel begin met hierdie kaart?</string>
<string name="mines_remaining">%d myne</string>
<string name="game_time">Game Time</string>
<string name="game_time">Speeltyd</string>
<string name="mine">Myne</string>
<string name="settings_general">Algemeen</string>
<string name="settings_gameplay">Gameplay</string>
<string name="settings_gameplay">Spel</string>
<string name="settings_accessibility">Toeganklikheid</string>
<string name="size">Grootte</string>
<string name="system">Stelsel</string>
<string name="rating">Terugvoer</string>
<string name="support_title">Ondersteun ons!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string>
<string name="support_description">Met u hulp kan ons nuwe funksies implementeer en ons projek aktief hou.</string>
<string name="support_action">Ondersteuning</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</string>
<string name="translators_text">This game was translated by the following people:</string>
@ -43,11 +56,11 @@
<string name="victories">Oorwinnings</string>
<string name="you_lost">Jy het verloor!</string>
<string name="defeats">Nederlae</string>
<string name="game_over_desc_1">Good luck on your next game.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string>
<string name="fail_to_share">Failed to share</string>
<string name="game_over_desc_1">Sterkte met u volgende wedstryd.</string>
<string name="game_over_desc_4">U het die wedstryd binne %1$d sekondes voltooi.</string>
<string name="fail_to_share">Kon nie deel nie</string>
<string name="version_s">Weergawe %1$s</string>
<string name="sound_effects">Sound Effects</string>
<string name="sound_effects">Byklanke</string>
<string name="are_you_sure">Is jy seker?</string>
<string name="enable_automatic_flags">Aktiveer outomatiese plasing van vlaggies</string>
<string name="open_areas">Open Areas</string>
@ -55,16 +68,19 @@
<string name="average_time">Average Time</string>
<string name="performance">Werkverrigting</string>
<string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string>
<string name="use_question_mark">Gebruik die vraagteken</string>
<string name="control">Kontrole</string>
<string name="arrow"></string>
<string name="single_click">Single Click</string>
<string name="double_click">Double Click</string>
<string name="single_click">Enkele tik</string>
<string name="double_click">Dubbeltik</string>
<string name="long_press">Lang-druk</string>
<string name="open_tile">Maak oop</string>
<string name="flag_tile">Merk</string>
<string name="retry">Weer probeer</string>
<string name="empty">Leeg</string>
<string name="cant_do_it_now">Onmoontlik om dit nou te doen</string>
<string name="you_have_received">U het ontvang: +%1$d</string>
<string name="help_win_a_game">Vir meer hulp, moet u \'n wedstryd wen.</string>
<string name="unknown_error">Onbekende fout.</string>
<string name="leaderboards">Leierbord</string>
<string name="cancel">Kanselleer</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string>
<string name="unlock">Ontsluit</string>
<string name="achievements">Prestasies</string>
<string name="rating_button_no">Nee</string>
<string name="no">Nee</string>
<string name="general">Algemeen</string>
<string name="source_code">Bron Kode</string>
<string name="translation">Vertalings</string>
@ -91,7 +107,7 @@
<string name="delete_all">Verwyder alles</string>
<string name="themes">Temas</string>
<string name="try_it">Încearcă</string>
<string name="delete_all_message">Delete all events permanently.</string>
<string name="delete_all_message">Vee alle gebeure permanent uit.</string>
<string name="all_mines_disabled">All mines were disabled.</string>
<string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Verwyder Advertensies</string>
<string name="help">Help</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ar">
<string name="app_name">Antimine</string>
<string name="app_description">يجب عليك مسح لوحة مستطيلة تحتوي على ألغام مخفية دون تفجير أي منها.</string>
<string name="tutorial">الدورة التعليمية</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">ألعاب</string>
<string name="previous_games">الألعاب السابقة</string>
<string name="minefield">الصعوبة</string>
@ -65,6 +78,9 @@
<string name="flag_tile">علم</string>
<string name="retry">إعادة المحاولة</string>
<string name="empty">فارغ</string>
<string name="cant_do_it_now">من المستحيل القيام بذلك الآن</string>
<string name="you_have_received">لقد استملت مبلغ: +%1$d</string>
<string name="help_win_a_game">للمزيد من المساعدة، يجب أن تفوز بلعبة.</string>
<string name="unknown_error">خطأ غير معروف.</string>
<string name="leaderboards">المتصدرين</string>
<string name="cancel">الغاء</string>
@ -72,7 +88,7 @@
<string name="yes">نعم</string>
<string name="unlock">فتح القفل</string>
<string name="achievements">الإنجازات</string>
<string name="rating_button_no">لا</string>
<string name="no">لا</string>
<string name="general">عام</string>
<string name="source_code">رمز المصدر</string>
<string name="translation">الترجمة</string>
@ -103,4 +119,5 @@
<string name="flag_placed">وضع العلم!</string>
<string name="flag_removed">إزالة العلم!</string>
<string name="remove_ad">إزالة الإعلانات</string>
<string name="help">مساعدة</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="bg">
<string name="app_name">Antimine</string>
<string name="app_description">Вие трябва да изчистите квадратна дъска която има скрити мини без да взривите нито една от тях.</string>
<string name="tutorial">Туториал</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Игри</string>
<string name="previous_games">Предишни Игри</string>
<string name="minefield">Трудност</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Флаг</string>
<string name="retry">Опитайте отново</string>
<string name="empty">Празно</string>
<string name="cant_do_it_now">Невъзможно е да се направи това сега</string>
<string name="you_have_received">Получихте: +%1$d</string>
<string name="help_win_a_game">За повече помощ трябва да спечелите игра.</string>
<string name="unknown_error">Неизвестна грешка.</string>
<string name="leaderboards">Класиране</string>
<string name="cancel">Отказ</string>
@ -72,7 +88,7 @@
<string name="yes">Да</string>
<string name="unlock">Отключи</string>
<string name="achievements">Постижения</string>
<string name="rating_button_no">Не</string>
<string name="no">Не</string>
<string name="general">Основни</string>
<string name="source_code">Програмен Код</string>
<string name="translation">Превод</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Флагът е сложен!</string>
<string name="flag_removed">Глагът е премахнат!</string>
<string name="remove_ad">Премахване на реклами</string>
<string name="help">Помощ</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ca">
<string name="app_name">Antimines</string>
<string name="app_description">Has de netejar un tauler rectangular amb mines amagades sense detonar-ne cap.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Jocs</string>
<string name="previous_games">Partides prèvies</string>
<string name="minefield">Camp de mines</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandera</string>
<string name="retry">Reintenta</string>
<string name="empty">Buida</string>
<string name="cant_do_it_now">És impossible fer-ho ara</string>
<string name="you_have_received">Heu rebut: +%1$d</string>
<string name="help_win_a_game">Per obtenir més ajuda, heu de guanyar una partida.</string>
<string name="unknown_error">Error desconegut.</string>
<string name="leaderboards">Llista de líders</string>
<string name="cancel">Cancel•lar</string>
@ -72,7 +88,7 @@
<string name="yes"></string>
<string name="unlock">Desbloqueja</string>
<string name="achievements">Assoliments</string>
<string name="rating_button_no">No</string>
<string name="no">No</string>
<string name="general">General</string>
<string name="source_code">Codi font</string>
<string name="translation">Traduccions</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandera col·locada!</string>
<string name="flag_removed">Has tret la bandera!</string>
<string name="remove_ad">Elimina els anuncis</string>
<string name="help">Ajuda</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="cs">
<string name="app_name">Anti-Mine</string>
<string name="app_description">Musíte vyčistit obdélníkovou desku obsahující skryté miny, aniž by kterákoliv z nich vybuchla.</string>
<string name="tutorial">Tutoriál</string>
<string name="tutorial_completed">Tutoriál dokončen</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Hry</string>
<string name="previous_games">Předchozí hry</string>
<string name="minefield">Obtížnost</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Vlajka</string>
<string name="retry">Opakovat</string>
<string name="empty">Prázdné</string>
<string name="cant_do_it_now">Není možné to nyní udělat</string>
<string name="you_have_received">Obdrželi jste: +%1$d</string>
<string name="help_win_a_game">Pro další pomoc musíte vyhrát hru.</string>
<string name="unknown_error">Neznámá chyba.</string>
<string name="leaderboards">Žebříčky</string>
<string name="cancel">Zrušit</string>
@ -72,7 +88,7 @@
<string name="yes">Ano</string>
<string name="unlock">Odemknout</string>
<string name="achievements">Úspěchy</string>
<string name="rating_button_no">Ne</string>
<string name="no">Ne</string>
<string name="general">Obecné</string>
<string name="source_code">Zdrojový kód</string>
<string name="translation">Překlad</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Vlajka umístěna!</string>
<string name="flag_removed">Vlajka odstraněna!</string>
<string name="remove_ad">Odstranit reklamy</string>
<string name="help">Nápověda</string>
</resources>

View file

@ -2,97 +2,113 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="da">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string>
<string name="tutorial">Vejledning</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Spil</string>
<string name="previous_games">Forrige Spil</string>
<string name="minefield">Sværhedsgrad</string>
<string name="standard">Standard</string>
<string name="beginner">Beginner</string>
<string name="intermediate">Intermediate</string>
<string name="expert">Expert</string>
<string name="open">Open</string>
<string name="beginner">Begynder</string>
<string name="intermediate">Mellemliggende</string>
<string name="expert">Ekspert</string>
<string name="open">Åbn</string>
<string name="settings">Settings</string>
<string name="animations">Animations</string>
<string name="vibration">Haptic Feedback</string>
<string name="about">About</string>
<string name="events">Statistics</string>
<string name="custom">Custom</string>
<string name="animations">Animationer</string>
<string name="vibration">Haptisk Feedback</string>
<string name="about">Om</string>
<string name="events">Statistik</string>
<string name="custom">Tilpasset</string>
<string name="start">Start</string>
<string name="width">Width</string>
<string name="height">Height</string>
<string name="width">Bredde</string>
<string name="height">Højde</string>
<string name="mines">Mines</string>
<string name="retry_sure">If you start a new game, your current progress will be lost.</string>
<string name="show_licenses">Show Licenses</string>
<string name="new_game_request">Do you want to start a new game?</string>
<string name="mines_remaining">%d mines</string>
<string name="game_time">Game Time</string>
<string name="retry_sure">Hvis du starter et nyt spil, vil dit nuværende fremskridt gå tabt.</string>
<string name="show_licenses">Vis Licenser</string>
<string name="new_game_request">Vil du starte et nyt spil?</string>
<string name="mines_remaining">%d miner</string>
<string name="game_time">Spil Tid</string>
<string name="mine">Mine</string>
<string name="settings_general">General</string>
<string name="settings_general">Generelt</string>
<string name="settings_gameplay">Gameplay</string>
<string name="settings_accessibility">Accessibility</string>
<string name="size">Size</string>
<string name="settings_accessibility">Tilgængelighed</string>
<string name="size">Størrelse</string>
<string name="system">System</string>
<string name="rating">Feedback</string>
<string name="support_title">Support us!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</string>
<string name="translators_text">This game was translated by the following people:</string>
<string name="sign_in_failed">Failed to sign in. Please check your network connection and try again.</string>
<string name="you_won">You won!</string>
<string name="victories">Victories</string>
<string name="you_lost">You lost!</string>
<string name="defeats">Defeats</string>
<string name="game_over_desc_1">Good luck on your next game.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string>
<string name="fail_to_share">Failed to share</string>
<string name="rating">Tilbagemelding</string>
<string name="support_title">Støt os!</string>
<string name="support_description">Med din hjælp vil vi være i stand til at implementere nye funktioner og holde vores projekt aktivt.</string>
<string name="support_action">Støtte</string>
<string name="rating_message">Hvis du kan lide dette spil, bedes du give os en feedback. Det vil hjælpe os meget.</string>
<string name="used_software_text">Dette spil bruger følgende tredjepartssoftware:</string>
<string name="translators_text">Dette spil blev oversat af følgende personer:</string>
<string name="sign_in_failed">Kan ikke forbinde. Tjek venligst din netværksforbindelse, og prøv igen.</string>
<string name="you_won">Du vandt!</string>
<string name="victories">Sejre</string>
<string name="you_lost">Du tabte!</string>
<string name="defeats">Nederlag</string>
<string name="game_over_desc_1">Held og lykke med dit næste spil.</string>
<string name="game_over_desc_4">Du færdiggjorde minefeltet om %1$d sekunder.</string>
<string name="fail_to_share">Mislykkedes at dele</string>
<string name="version_s">Version %1$s</string>
<string name="sound_effects">Sound Effects</string>
<string name="are_you_sure">Are you sure?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string>
<string name="open_areas">Open Areas</string>
<string name="total_time">Total Time</string>
<string name="average_time">Average Time</string>
<string name="performance">Performance</string>
<string name="sound_effects">Lyd effekter</string>
<string name="are_you_sure">Er du sikker?</string>
<string name="enable_automatic_flags">Aktivér automatisk placering af flag</string>
<string name="open_areas">Åbne Områder</string>
<string name="total_time">Total Tid</string>
<string name="average_time">Gennemsnitlig Tid</string>
<string name="performance">Ydeevne</string>
<string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string>
<string name="use_question_mark">Brug flag med spørgsmålstegn</string>
<string name="control">Controls</string>
<string name="arrow"></string>
<string name="single_click">Single Click</string>
<string name="double_click">Double Click</string>
<string name="long_press">Long Press</string>
<string name="open_tile">Open</string>
<string name="single_click">Enkelt tryk</string>
<string name="double_click">Dobbeltklik</string>
<string name="long_press">Langt tryk</string>
<string name="open_tile">Åbn</string>
<string name="flag_tile">Flag</string>
<string name="retry">Retry</string>
<string name="empty">Empty</string>
<string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string>
<string name="resume">Resume</string>
<string name="yes">Yes</string>
<string name="unlock">Unlock</string>
<string name="retry">Forsøg igen</string>
<string name="empty">Tomt</string>
<string name="cant_do_it_now">Umuligt at gøre det nu</string>
<string name="you_have_received">Du har modtaget: +%1$d</string>
<string name="help_win_a_game">For mere hjælp, skal du vinde et spil.</string>
<string name="unknown_error">Ukendt fejl.</string>
<string name="leaderboards">Turneringsskema</string>
<string name="cancel">Annuller</string>
<string name="resume">Fortsæt</string>
<string name="yes">Ja</string>
<string name="unlock">Lås op</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="general">General</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
<string name="licenses">Licenses</string>
<string name="google_play_games">Google Play Games</string>
<string name="connect">Connect</string>
<string name="connecting">Connecting</string>
<string name="disconnect">Disconnect</string>
<string name="disconnected">Disconnected</string>
<string name="new_game">New Game</string>
<string name="share">Share</string>
<string name="share_menu">Share</string>
<string name="no_network">No internet connection.</string>
<string name="open_menu">Open Menu</string>
<string name="close_menu">Close Menu</string>
<string name="delete_all">Delete all</string>
<string name="themes">Themes</string>
<string name="try_it">Try It</string>
<string name="delete_all_message">Delete all events permanently.</string>
<string name="all_mines_disabled">All mines were disabled.</string>
<string name="no">Nej</string>
<string name="general">Generelt</string>
<string name="source_code">Kildekode</string>
<string name="translation">Oversættelser</string>
<string name="licenses">Licenser</string>
<string name="google_play_games">Google Play Spil</string>
<string name="connect">Tilslut</string>
<string name="connecting">Tilslutter</string>
<string name="disconnect">Afbryd</string>
<string name="disconnected">Afbrudt</string>
<string name="new_game">Nyt Spil</string>
<string name="share">Del</string>
<string name="share_menu">Del</string>
<string name="no_network">Ingen internetforbindelse.</string>
<string name="open_menu">Åbn Menu</string>
<string name="close_menu">Luk Menu</string>
<string name="delete_all">Slet alle</string>
<string name="themes">Temaer</string>
<string name="try_it">Prøv det</string>
<string name="delete_all_message">Slet alle begivenheder permanent.</string>
<string name="all_mines_disabled">Alle miner blev deaktiveret.</string>
<string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string>
<string name="desc_question_area">Doubtful area</string>
@ -102,5 +118,6 @@
<string name="you_exploded_a_mine">You exploded a mine!</string>
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string>
<string name="remove_ad">Fjern annoncer</string>
<string name="help">Hjælp</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="de">
<string name="app_name">Antimine</string>
<string name="app_description">Du musst ein rechteckiges Spielfeld, das versteckte Minen enthält, räumen, ohne irgendeine davon zur Explosion zu bringen.</string>
<string name="tutorial">Anleitung</string>
<string name="tutorial_completed">Anleitung Abgeschlossen</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Spiele</string>
<string name="previous_games">Vorherige Spiele</string>
<string name="minefield">Schwierigkeitsgrad</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flagge</string>
<string name="retry">Erneut versuchen</string>
<string name="empty">Leer</string>
<string name="cant_do_it_now">Das kann jetzt nicht gemacht werden</string>
<string name="you_have_received">Du hast erhalten: +%1$d</string>
<string name="help_win_a_game">Für mehr Hilfe musst du ein Spiel gewinnen.</string>
<string name="unknown_error">Unbekannter Fehler.</string>
<string name="leaderboards">Ranglisten</string>
<string name="cancel">Abbrechen</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string>
<string name="unlock">Entsperren</string>
<string name="achievements">Erfolge</string>
<string name="rating_button_no">Nein</string>
<string name="no">Nein</string>
<string name="general">Allgemein</string>
<string name="source_code">Quellcode</string>
<string name="translation">Übersetzung</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Markierung platziert!</string>
<string name="flag_removed">Markierung entfernt!</string>
<string name="remove_ad">Werbung entfernen</string>
<string name="help">Hilfe</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="el">
<string name="app_name">Antimine</string>
<string name="app_description">Πρέπει να καθαρίσετε μια ορθογώνια πλακέτα που περιέχει κρυμμένες \"νάρκες\" χωρίς να πυροδοτήσετε καμία από αυτές.</string>
<string name="tutorial">Οδηγίες</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Παιχνίδια</string>
<string name="previous_games">Προηγούμενα Παιχνίδια</string>
<string name="minefield">Δυσκολία</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Σημαία</string>
<string name="retry">Ξαναδοκιμάστε</string>
<string name="empty">Κενό</string>
<string name="cant_do_it_now">Αδύνατο να το κάνουμε τώρα</string>
<string name="you_have_received">Εχεις λάβει: +%1$d</string>
<string name="help_win_a_game">Για περισσότερη βοήθεια, πρέπει να κερδίσετε ένα παιχνίδι.</string>
<string name="unknown_error">Άγνωστο σφάλμα.</string>
<string name="leaderboards">Πίνακες κατάταξης</string>
<string name="cancel">Ακύρωση</string>
@ -72,7 +88,7 @@
<string name="yes">Ναι</string>
<string name="unlock">Ξεκλείδωμα</string>
<string name="achievements">Επιτεύγματα</string>
<string name="rating_button_no">Όχι</string>
<string name="no">Όχι</string>
<string name="general">Γενικά</string>
<string name="source_code">Πηγαίος Κώδικας</string>
<string name="translation">Μετάφραση</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Η Σημαία τοποθετήθηκε!</string>
<string name="flag_removed">Η σημαία αφαιρέθηκε!</string>
<string name="remove_ad">Κατάργηση διαφημίσεων</string>
<string name="help">Βοήθεια</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flag</string>
<string name="retry">Retry</string>
<string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: %1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string>
@ -72,7 +88,7 @@
<string name="yes">Yes</string>
<string name="unlock">Unlock</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="no">No</string>
<string name="general">General</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string>
<string name="help">Help</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es-rES">
<string name="app_name">Anti-Mina</string>
<string name="app_description">Usted tiene que limpiar un tablero cuadrado que contiene minas escondidas sin detonarlas.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">¡Tutorial Completado!</string>
<string name="tutorial_0_bottom">Puedes empezar por %1$s en cualquier cuadrado aleatorio.</string>
<string name="tutorial_1_top">Los números indican cuántas minas están adyacentes al cuadrado destacado.</string>
<string name="tutorial_1_bottom">Por lo tanto, si la esquina 1⃣ tiene sólo un cuadrado adyacente, debe ser una mina. %1$s para marcarlo.</string>
<string name="tutorial_2_top">El siguiente cuadrado sin abrir no tiene una mina porque el número es 1⃣ , no 2⃣ .</string>
<string name="tutorial_2_bottom">Puedes abrirlo com %1$s.</string>
<string name="tutorial_3_top">Puedes abrir todos los demás lugares sin abrir adyacentes a 1⃣ . Sabes dónde está la mina adyacente.</string>
<string name="tutorial_3_bottom">Puede abrir todos los otros cuadrados cerrados y adyacentes a 1⃣ .</string>
<string name="tutorial_4_top">Sabemos dónde está una de las minas, así que sólo hay una posibilidad para la otra.</string>
<string name="tutorial_4_bottom">%1$s para marcar la mina adyacente a 2⃣ .</string>
<string name="tutorial_5_top">Verifique el número resaltado.</string>
<string name="tutorial_5_bottom">%1$s para abrir o %2$s para marcar.</string>
<string name="games">Juegos</string>
<string name="previous_games">Juegos anteriores</string>
<string name="minefield">Dificultad</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandera</string>
<string name="retry">Reintentar</string>
<string name="empty">Vacío</string>
<string name="cant_do_it_now">Imposible hacer eso ahora</string>
<string name="you_have_received">Has recibido: +%1$d</string>
<string name="help_win_a_game">Para obtener más Ayuda, debes ganar una partida.</string>
<string name="unknown_error">Error desconocido.</string>
<string name="leaderboards">Ránking</string>
<string name="cancel">Cancelar</string>
@ -72,7 +88,7 @@
<string name="yes"></string>
<string name="unlock">Desbloquear</string>
<string name="achievements">Logros</string>
<string name="rating_button_no">No</string>
<string name="no">No</string>
<string name="general">General</string>
<string name="source_code">Código Fuente</string>
<string name="translation">Traducción</string>
@ -103,4 +119,5 @@
<string name="flag_placed">¡Bandera colocada!</string>
<string name="flag_removed">¡Bandera eliminada!</string>
<string name="remove_ad">Eliminar anuncios</string>
<string name="help">Ayuda</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fi">
<string name="app_name">Antimine</string>
<string name="app_description">Sinun täytyy tyhjentää piileskeleviä miinoja sisältävä suorakulmainen taulu räjäyttämättä miinoja kertaakaan.</string>
<string name="tutorial">Opetusohjelma</string>
<string name="tutorial_completed">Opetuspeli Suoritettu</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Pelit</string>
<string name="previous_games">Edelliset pelit</string>
<string name="minefield">Vaikeustaso</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Lippu</string>
<string name="retry">Yritä uudelleen</string>
<string name="empty">Tyhjä</string>
<string name="cant_do_it_now">Ei mahdollista tehdä sitä nyt</string>
<string name="you_have_received">Olet saanut: +%1$d</string>
<string name="help_win_a_game">Saat enemmän apua, sinun täytyy voittaa pelin.</string>
<string name="unknown_error">Tuntematon virhe.</string>
<string name="leaderboards">Tulostaulukot</string>
<string name="cancel">Peruuta</string>
@ -72,7 +88,7 @@
<string name="yes">Kyllä</string>
<string name="unlock">Avaa</string>
<string name="achievements">Saavutukset</string>
<string name="rating_button_no">No</string>
<string name="no">Ei</string>
<string name="general">Yleiset</string>
<string name="source_code">Lähdekoodi</string>
<string name="translation">Käännökset</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Lippu asetettu!</string>
<string name="flag_removed">Lippu poistettu!</string>
<string name="remove_ad">Poista Mainokset</string>
<string name="help">Apua</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="fr">
<string name="app_name">Anti-Mine</string>
<string name="app_description">Vous devez vider un tableau rectangulaire contenant des mines cachées sans en détonner.</string>
<string name="tutorial">Tutoriel</string>
<string name="tutorial_completed">Tutoriel Terminé</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Jeux</string>
<string name="previous_games">Parties précédentes</string>
<string name="minefield">Difficulté</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Drapeau</string>
<string name="retry">Réessayer</string>
<string name="empty">Vide</string>
<string name="cant_do_it_now">Impossible de faire cela maintenant</string>
<string name="you_have_received">Vous avez reçu : +%1$d</string>
<string name="help_win_a_game">Pour plus d\'Aide, vous devez gagner une partie.</string>
<string name="unknown_error">Erreur inconnue.</string>
<string name="leaderboards">Classements</string>
<string name="cancel">Annuler</string>
@ -72,7 +88,7 @@
<string name="yes">Oui</string>
<string name="unlock">Déverrouiller</string>
<string name="achievements">Succès</string>
<string name="rating_button_no">Non</string>
<string name="no">Non</string>
<string name="general">Général</string>
<string name="source_code">Code source</string>
<string name="translation">Traduction</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Drapeau placé !</string>
<string name="flag_removed">Drapeau retiré !</string>
<string name="remove_ad">Supprimer les publicités</string>
<string name="help">Aide</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="hi">
<string name="app_name">Antimine</string>
<string name="app_description">लोकप्रिय लॉजिक पजल माइन्सवीपर. बोर्ड से माइंस साफ करता है वर्ग से संकेत को प्रयोग करते हुए जिसे आपने पहले से खोला है.</string>
<string name="tutorial">ट्यूटोरियल</string>
<string name="tutorial_completed">ट्यूटोरियल पूरा हुआ</string>
<string name="tutorial_0_bottom">आप किसी भी यादृच्छिक क्षेत्र पर %1$s द्वारा शुरू कर सकते हैं।</string>
<string name="tutorial_1_top">संख्या इंगित करती है कि कितने खदान हाइलाइट किए गए क्षेत्र से सटे हैं।</string>
<string name="tutorial_1_bottom">इसलिए, यदि कोने 1, में केवल एक निकट क्षेत्र है, तो यह एक खदान होना चाहिए। इसे चिह्नित करने के लिए %1$s</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">गेम्स</string>
<string name="previous_games">पिछला गेम्स</string>
<string name="minefield">कठिनाई</string>
@ -32,9 +45,9 @@
<string name="size">आकार</string>
<string name="system">प्रणाली</string>
<string name="rating">फीडबैक</string>
<string name="support_title">हमें सपॉर्ट कीजिये!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string>
<string name="support_title">हमें सहयोग दीजिये!</string>
<string name="support_description">आपकी मदद से, हम नई सुविधाओं को लागू करने और अपनी परियोजना को सक्रिय रखने में सक्षम होंगे।</string>
<string name="support_action">हमें सहयोग दीजिये</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</string>
<string name="translators_text">This game was translated by the following people:</string>
@ -65,6 +78,9 @@
<string name="flag_tile">ध्वज</string>
<string name="retry">फिर प्रयास करें</string>
<string name="empty">खाली</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">अज्ञात त्रुटि।</string>
<string name="leaderboards">लीडरबोर्ड</string>
<string name="cancel">रद्द करें</string>
@ -72,7 +88,7 @@
<string name="yes">हाँ</string>
<string name="unlock">अनलॉक करें</string>
<string name="achievements">उपलब्धियां</string>
<string name="rating_button_no">नहीं</string>
<string name="no">नहीं</string>
<string name="general">सामान्य</string>
<string name="source_code">सोर्स कोड</string>
<string name="translation">अनुवाद</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">विज्ञापन निकालें</string>
<string name="help">मदद</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="hu">
<string name="app_name">Antimine</string>
<string name="app_description">Meg kell tisztítanod egy rejtett aknákkal teli, négyszögletes pályát anélkül, hogy akár egyet is felrobbantanál.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Játékok</string>
<string name="previous_games">Előző játékok</string>
<string name="minefield">Nehézség</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Zászló</string>
<string name="retry">Újra</string>
<string name="empty">Üres</string>
<string name="cant_do_it_now">Most lehetetlen ezt megtenni</string>
<string name="you_have_received">Kapott összeg: +%1$d</string>
<string name="help_win_a_game">További segítségért meg kell nyernie egy játékot.</string>
<string name="unknown_error">Ismeretlen hiba.</string>
<string name="leaderboards">Ranglista</string>
<string name="cancel">Mégse</string>
@ -72,7 +88,7 @@
<string name="yes">Igen</string>
<string name="unlock">Zárolás feloldása</string>
<string name="achievements">Trófeák</string>
<string name="rating_button_no">Nem</string>
<string name="no">Nem</string>
<string name="general">Általános</string>
<string name="source_code">Forráskód</string>
<string name="translation">Fordítás</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Zászló elhelyezve!</string>
<string name="flag_removed">Zászló eltávolítva!</string>
<string name="remove_ad">Reklámok eltávolítása</string>
<string name="help">Segítség</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="id">
<string name="app_name">Antimine</string>
<string name="app_description">Kosongkan ranjau tersembunyi dari medan ranjau</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial selesai</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Permainan</string>
<string name="previous_games">Tantangan Sebelumnya</string>
<string name="minefield">Kesulitan</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bendera</string>
<string name="retry">Ulangi</string>
<string name="empty">Kosong</string>
<string name="cant_do_it_now">Tidak mungkin melakukan itu sekarang</string>
<string name="you_have_received">Anda telah menerima: +%1$d</string>
<string name="help_win_a_game">Untuk Bantuan lebih lanjut, Anda harus memenangkan permainan.</string>
<string name="unknown_error">Galat tak diketahui.</string>
<string name="leaderboards">Papan Peringkat</string>
<string name="cancel">Batal</string>
@ -72,7 +88,7 @@
<string name="yes">Ya</string>
<string name="unlock">Buka</string>
<string name="achievements">Prestasi</string>
<string name="rating_button_no">Tidak</string>
<string name="no">Tidak</string>
<string name="general">Umum</string>
<string name="source_code">Kode sumber</string>
<string name="translation">Alih Bahasa</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bendera diletakkan!</string>
<string name="flag_removed">Bendera dihapus!</string>
<string name="remove_ad">Hapus Iklan</string>
<string name="help">Bantuan</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="it">
<string name="app_name">Antimine</string>
<string name="app_description">L\'obbiettivo del gioco è ripulire un campo rettangolare che contiene mine nascoste senza detonarne nessuna.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completato</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Giochi</string>
<string name="previous_games">Partite Precedenti</string>
<string name="minefield">Difficoltà</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandiera</string>
<string name="retry">Riprova</string>
<string name="empty">Vuoto</string>
<string name="cant_do_it_now">Impossibile farlo ora</string>
<string name="you_have_received">Hai ricevuto: +%1$d</string>
<string name="help_win_a_game">Per ulteriori aiuti, devi vincere una partita.</string>
<string name="unknown_error">Errore sconosciuto.</string>
<string name="leaderboards">Classifiche</string>
<string name="cancel">Annulla</string>
@ -72,7 +88,7 @@
<string name="yes"></string>
<string name="unlock">Sblocca</string>
<string name="achievements">Progressi</string>
<string name="rating_button_no">No</string>
<string name="no">No</string>
<string name="general">Generale</string>
<string name="source_code">Codice sorgente</string>
<string name="translation">Traduzione</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandiera piazzata!</string>
<string name="flag_removed">Bandiera rimossa!</string>
<string name="remove_ad">Rimuovi gli Annunci</string>
<string name="help">Help</string>
</resources>

View file

@ -1,106 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="he">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string>
<string name="standard">Standard</string>
<string name="beginner">Beginner</string>
<string name="intermediate">Intermediate</string>
<string name="expert">Expert</string>
<string name="open">Open</string>
<string name="settings">Settings</string>
<string name="animations">Animations</string>
<string name="vibration">Haptic Feedback</string>
<string name="about">About</string>
<string name="events">Statistics</string>
<string name="custom">Custom</string>
<string name="start">Start</string>
<string name="width">Width</string>
<string name="height">Height</string>
<string name="mines">Mines</string>
<string name="retry_sure">If you start a new game, your current progress will be lost.</string>
<string name="show_licenses">Show Licenses</string>
<string name="new_game_request">Do you want to start a new game?</string>
<string name="mines_remaining">%d mines</string>
<string name="game_time">Game Time</string>
<string name="mine">Mine</string>
<string name="settings_general">General</string>
<string name="settings_gameplay">Gameplay</string>
<string name="settings_accessibility">Accessibility</string>
<string name="size">Size</string>
<string name="system">System</string>
<string name="rating">Feedback</string>
<string name="support_title">Support us!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string>
<string name="app_description">צריך לנקות את הלוח הריבועי המכיל מוקשים נסתרים מבלי לפוצץ אף אחד מהם.</string>
<string name="tutorial">הדרכה</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">משחקים</string>
<string name="previous_games">משחקים קודמים</string>
<string name="minefield">רמת קושי</string>
<string name="standard">רגיל</string>
<string name="beginner">רמת התחלה</string>
<string name="intermediate">רמה בינונית</string>
<string name="expert">רמה גבוהה</string>
<string name="open">פתיחה</string>
<string name="settings">הגדרות</string>
<string name="animations">אנימציות</string>
<string name="vibration">משוב רטט</string>
<string name="about">אודות</string>
<string name="events">סטטיסטיקה</string>
<string name="custom">התאמה אישית</string>
<string name="start">התחלה</string>
<string name="width">רוחב</string>
<string name="height">גובה</string>
<string name="mines">מוקשים</string>
<string name="retry_sure">כאשר יתחיל משחק חדש, ההתקדמות הנוכחית שלך תיעלם.</string>
<string name="show_licenses">הצג רשיונות</string>
<string name="new_game_request">האם ברצונך להתחיל משחק חדש?</string>
<string name="mines_remaining">%d מוקשים</string>
<string name="game_time">זמן משחק</string>
<string name="mine">מוקש</string>
<string name="settings_general">כללי</string>
<string name="settings_gameplay">משחק</string>
<string name="settings_accessibility">נגישות</string>
<string name="size">גודל</string>
<string name="system">מערכת</string>
<string name="rating">משוב</string>
<string name="support_title">תמכו בנו!</string>
<string name="support_description">עם עזרתך, נוכל להוסיף דברים חדשים ולשמור על הפרויקט שלנו פעיל.</string>
<string name="support_action">לתמוך</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</string>
<string name="translators_text">This game was translated by the following people:</string>
<string name="sign_in_failed">Failed to sign in. Please check your network connection and try again.</string>
<string name="you_won">You won!</string>
<string name="victories">Victories</string>
<string name="you_lost">You lost!</string>
<string name="defeats">Defeats</string>
<string name="game_over_desc_1">Good luck on your next game.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string>
<string name="fail_to_share">Failed to share</string>
<string name="version_s">Version %1$s</string>
<string name="sound_effects">Sound Effects</string>
<string name="are_you_sure">Are you sure?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string>
<string name="sign_in_failed">אין אפשרות להתחבר. בדוק את חיבור הרשת ונסה שוב.</string>
<string name="you_won">ניצחת!</string>
<string name="victories">נצחונות</string>
<string name="you_lost">הפסדת!</string>
<string name="defeats">הפסדים</string>
<string name="game_over_desc_1">בהצלחה במשחק הבא.</string>
<string name="game_over_desc_4">סיימת את שדה המוקשים ב%1$d שניות.</string>
<string name="fail_to_share">השיתוף נכשל</string>
<string name="version_s">גרסה %1$s</string>
<string name="sound_effects">אפקטי צליל</string>
<string name="are_you_sure">את/ה בטוח/ה?</string>
<string name="enable_automatic_flags">מיקום דגלים אוטומטי</string>
<string name="open_areas">Open Areas</string>
<string name="total_time">Total Time</string>
<string name="average_time">Average Time</string>
<string name="performance">Performance</string>
<string name="total_time">זמן כולל</string>
<string name="average_time">זמן ממוצע</string>
<string name="performance">ביצועים</string>
<string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string>
<string name="control">Controls</string>
<string name="arrow"></string>
<string name="single_click">Single Click</string>
<string name="double_click">Double Click</string>
<string name="long_press">Long Press</string>
<string name="open_tile">Open</string>
<string name="flag_tile">Flag</string>
<string name="retry">Retry</string>
<string name="empty">Empty</string>
<string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string>
<string name="resume">Resume</string>
<string name="yes">Yes</string>
<string name="unlock">Unlock</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="general">General</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
<string name="licenses">Licenses</string>
<string name="use_question_mark">סימן שאלה</string>
<string name="control">פקדים</string>
<string name="arrow">🠨</string>
<string name="single_click">לחיצה בודדת</string>
<string name="double_click">לחיצה כפולה</string>
<string name="long_press">לחץ לחיצה ארוכה</string>
<string name="open_tile">פתוח</string>
<string name="flag_tile">דגל</string>
<string name="retry">נסה שנית</string>
<string name="empty">ריק</string>
<string name="cant_do_it_now">אי אפשר לעשות את זה עכשיו</string>
<string name="you_have_received">קיבלת: +%1$d</string>
<string name="help_win_a_game">לקבלת עזרה נוספת, עליך לנצח במשחק.</string>
<string name="unknown_error">שגיאה לא ידועה.</string>
<string name="leaderboards">לוח תוצאות</string>
<string name="cancel">ביטול</string>
<string name="resume">לְהַמשִׁיך</string>
<string name="yes"> כן</string>
<string name="unlock">בטל את הנעילה</string>
<string name="achievements">הישגים</string>
<string name="no">לא</string>
<string name="general">כללי</string>
<string name="source_code">קוד מקור</string>
<string name="translation">תרגומים</string>
<string name="licenses">רשיונות</string>
<string name="google_play_games">Google Play Games</string>
<string name="connect">Connect</string>
<string name="connecting">Connecting…</string>
<string name="disconnect">Disconnect</string>
<string name="disconnected">Disconnected</string>
<string name="new_game">New Game</string>
<string name="share">Share</string>
<string name="share_menu">Share</string>
<string name="no_network">No internet connection.</string>
<string name="open_menu">Open Menu</string>
<string name="close_menu">Close Menu</string>
<string name="delete_all">Delete all</string>
<string name="themes">Themes</string>
<string name="try_it">Try It</string>
<string name="connect">התחבר</string>
<string name="connecting">מתחבר</string>
<string name="disconnect">נתק</string>
<string name="disconnected">מנותק</string>
<string name="new_game">משחק חדש</string>
<string name="share">שותף</string>
<string name="share_menu">שותף</string>
<string name="no_network">אין חיבור לאינטרנט.</string>
<string name="open_menu">פתח תפריט</string>
<string name="close_menu">סגור תפריט</string>
<string name="delete_all">מחק הכל</string>
<string name="themes">ערכות נושא</string>
<string name="try_it">נסה את זה</string>
<string name="delete_all_message">Delete all events permanently.</string>
<string name="all_mines_disabled">All mines were disabled.</string>
<string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string>
<string name="desc_question_area">Doubtful area</string>
<string name="desc_wrongly_marked_area">Wrongly marked area</string>
<string name="exploded_mine">Exploded Mine</string>
<string name="game_started">Game Started</string>
<string name="you_exploded_a_mine">You exploded a mine!</string>
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string>
<string name="exploded_mine">מוקש מפוצץ</string>
<string name="game_started">המשחק החל</string>
<string name="you_exploded_a_mine">פוצצת מוקש!</string>
<string name="flag_placed">דגל הונח!</string>
<string name="flag_removed">דגל הוסר!</string>
<string name="remove_ad">הסרת פרסומות</string>
<string name="help">עזרה</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ja">
<string name="app_name">Antimine</string>
<string name="app_description">地雷が隠された長方形から1つも爆発させることなくクリアしましょう。</string>
<string name="tutorial">チュートリアル</string>
<string name="tutorial_completed">チュートリアル完了</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">ゲーム回数</string>
<string name="previous_games">前のゲーム</string>
<string name="minefield">難易度</string>
@ -65,6 +78,9 @@
<string name="flag_tile"></string>
<string name="retry">リトライ</string>
<string name="empty"></string>
<string name="cant_do_it_now">今それを行うことは不可能です</string>
<string name="you_have_received">受け取りました: +%1$d</string>
<string name="help_win_a_game">ヘルプを増やすには、ゲームに勝つ必要があります。</string>
<string name="unknown_error">不明なエラーです。</string>
<string name="leaderboards">リーダーボード</string>
<string name="cancel">キャンセル</string>
@ -72,7 +88,7 @@
<string name="yes">はい</string>
<string name="unlock">ロック解除</string>
<string name="achievements">達成</string>
<string name="rating_button_no">いいえ</string>
<string name="no">いいえ</string>
<string name="general">全般</string>
<string name="source_code">ソースコード</string>
<string name="translation">翻訳</string>
@ -103,4 +119,5 @@
<string name="flag_placed">フラグを立てました!</string>
<string name="flag_removed">フラグを消しました!</string>
<string name="remove_ad">広告を削除</string>
<string name="help">ヘルプ</string>
</resources>

View file

@ -1,106 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ko">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="app_description">당신은 이 사각형 게임판에 숨겨진 지뢰를 하나도 터뜨리지 않고 게임을 끝내야 합니다.</string>
<string name="tutorial">튜토리얼</string>
<string name="tutorial_completed">튜토리얼 완료</string>
<string name="tutorial_0_bottom">아무 곳에나 %1$s해서 게임을 시작하세요.</string>
<string name="tutorial_1_top">이 숫자는 선택한 곳의 인접한 구간에 얼마나 많은 지뢰가 있는지 나타냅니다.</string>
<string name="tutorial_1_bottom">따라서, 1⃣ 으로 표시된 부분에 인접한 구역이 한 군데밖에 없다면, 그것은 지뢰일 것입니다. %1$s해서 깃발을 세우세요.</string>
<string name="tutorial_2_top">그 다음 열리지 않은 구역은 숫자가 2⃣ 가 아닌 1⃣ 이기에, 지뢰를 가지고 있지 않습니다.</string>
<string name="tutorial_2_bottom">%1$s해서 그 칸을 여세요.</string>
<string name="tutorial_3_top">이 1⃣ 이라 표시된 구역에 똑같은 상황이 나왔습니다. 인접한 지뢰가 어디 있는지 확인할 수 있을겁니다.</string>
<string name="tutorial_3_bottom">1⃣ 근처의 모든 칸을 열어도 됩니다.</string>
<string name="tutorial_4_top">이미 지뢰 하나는 어디 있는지 알고 있습니다. 그러니 나머지 하나가 있을 경우의 수는 단 한가지입니다.</string>
<string name="tutorial_4_bottom">%1$s해서 2⃣ 에 인접한 칸에 있는 지뢰에 깃발을 세우세요.</string>
<string name="tutorial_5_top">표시된 숫자를 확인하세요.</string>
<string name="tutorial_5_bottom">해당 구역이 안전하다고 생각하면 %1$s하고, 해당 구역에 지뢰가 있다고 생각하면 %2$s하세요.</string>
<string name="games">게임</string>
<string name="previous_games">이전 게임</string>
<string name="minefield">난이도</string>
<string name="standard">기본</string>
<string name="beginner">초급</string>
<string name="intermediate">중급</string>
<string name="expert">고급</string>
<string name="open">Open</string>
<string name="open">오픈</string>
<string name="settings">설정</string>
<string name="animations">Animations</string>
<string name="vibration">Haptic Feedback</string>
<string name="about">About</string>
<string name="animations">애니메이션</string>
<string name="vibration">햅틱 피드백</string>
<string name="about">정보</string>
<string name="events">통계</string>
<string name="custom">Custom</string>
<string name="custom">사용자 지정</string>
<string name="start">시작</string>
<string name="width">Width</string>
<string name="height">Height</string>
<string name="width">가로</string>
<string name="height">세로</string>
<string name="mines">지뢰 수</string>
<string name="retry_sure">If you start a new game, your current progress will be lost.</string>
<string name="show_licenses">Show Licenses</string>
<string name="new_game_request">Do you want to start a new game?</string>
<string name="mines_remaining">%d mines</string>
<string name="game_time">Game Time</string>
<string name="mine">Mine</string>
<string name="settings_general">General</string>
<string name="settings_gameplay">Gameplay</string>
<string name="settings_accessibility">Accessibility</string>
<string name="size">Size</string>
<string name="system">System</string>
<string name="rating">Feedback</string>
<string name="support_title">Support us!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</string>
<string name="translators_text">This game was translated by the following people:</string>
<string name="sign_in_failed">Failed to sign in. Please check your network connection and try again.</string>
<string name="you_won">You won!</string>
<string name="victories">Victories</string>
<string name="you_lost">You lost!</string>
<string name="defeats">Defeats</string>
<string name="game_over_desc_1">Good luck on your next game.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string>
<string name="fail_to_share">Failed to share</string>
<string name="version_s">Version %1$s</string>
<string name="sound_effects">Sound Effects</string>
<string name="are_you_sure">Are you sure?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string>
<string name="open_areas">Open Areas</string>
<string name="total_time">Total Time</string>
<string name="average_time">Average Time</string>
<string name="performance">Performance</string>
<string name="retry_sure">새 게임을 시작하면 현재 진행 상황이 손실됩니다.</string>
<string name="show_licenses">저작권 표시</string>
<string name="new_game_request">새로운 게임을 시작하시겠습니까?</string>
<string name="mines_remaining">%d </string>
<string name="game_time">게임 시간</string>
<string name="mine">지뢰</string>
<string name="settings_general">일반</string>
<string name="settings_gameplay">게임 플레이</string>
<string name="settings_accessibility">접근성</string>
<string name="size">크기</string>
<string name="system">시스템</string>
<string name="rating">피드백</string>
<string name="support_title">우리를 지원해주세요!</string>
<string name="support_description">새로운 기능을 구현하고 프로젝트가 계속 진행될 수 있게 도와주세요.</string>
<string name="support_action">지원</string>
<string name="rating_message">이 게임이 좋으시다면, 피드백을 남겨주세요. 저희에게 많은 도움이 됩니다.</string>
<string name="used_software_text">이 게임은 해당 서드파티 소프트웨어를 사용합니다:</string>
<string name="translators_text">이 게임은 다음 사람들에 의해 번역되었습니다:</string>
<string name="sign_in_failed">게임에 접속할 수 없습니다. 네트워크 환경을 확인해고 다시 접속해주세요.</string>
<string name="you_won">성공!</string>
<string name="victories">성공 횟수</string>
<string name="you_lost">실패!</string>
<string name="defeats">실패 횟수</string>
<string name="game_over_desc_1">다음 판에서는 잘하시길 빕니다.</string>
<string name="game_over_desc_4">%1$d초만에 이번 판을 끝내셨습니다.</string>
<string name="fail_to_share">공유 실패</string>
<string name="version_s">버전: %1$s</string>
<string name="sound_effects">효과음</string>
<string name="are_you_sure">확실합니까?</string>
<string name="enable_automatic_flags">자동으로 깃발 놓기 사용</string>
<string name="open_areas">칸 열기</string>
<string name="total_time">총 시간</string>
<string name="average_time">평균 시간</string>
<string name="performance">퍼포먼스</string>
<string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string>
<string name="control">Controls</string>
<string name="use_question_mark">물음표 깃발 사용</string>
<string name="control">컨트롤</string>
<string name="arrow"></string>
<string name="single_click">Single Click</string>
<string name="double_click">Double Click</string>
<string name="long_press">Long Press</string>
<string name="open_tile">Open</string>
<string name="flag_tile">Flag</string>
<string name="retry">Retry</string>
<string name="empty">Empty</string>
<string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string>
<string name="resume">Resume</string>
<string name="yes">Yes</string>
<string name="unlock">Unlock</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="general">General</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
<string name="licenses">Licenses</string>
<string name="google_play_games">Google Play Games</string>
<string name="connect">Connect</string>
<string name="connecting">Connecting…</string>
<string name="disconnect">Disconnect</string>
<string name="disconnected">Disconnected</string>
<string name="new_game">New Game</string>
<string name="share">Share</string>
<string name="share_menu">Share…</string>
<string name="no_network">No internet connection.</string>
<string name="open_menu">Open Menu</string>
<string name="close_menu">Close Menu</string>
<string name="delete_all">Delete all</string>
<string name="themes">Themes</string>
<string name="try_it">Try It</string>
<string name="delete_all_message">Delete all events permanently.</string>
<string name="all_mines_disabled">All mines were disabled.</string>
<string name="desc_convered_area">Covered area</string>
<string name="desc_marked_area">Marked area</string>
<string name="desc_question_area">Doubtful area</string>
<string name="desc_wrongly_marked_area">Wrongly marked area</string>
<string name="exploded_mine">Exploded Mine</string>
<string name="game_started">Game Started</string>
<string name="you_exploded_a_mine">You exploded a mine!</string>
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string>
<string name="single_click">단일 클릭</string>
<string name="double_click">더블 클릭</string>
<string name="long_press">길게 누르기</string>
<string name="open_tile">칸 열기</string>
<string name="flag_tile">깃발 세우기</string>
<string name="retry">재시도</string>
<string name="empty">비어있음</string>
<string name="cant_do_it_now">지금은 불가능 해</string>
<string name="you_have_received">당신은 받았습니다: +%1$d</string>
<string name="help_win_a_game">더 많은 도움을 받으려면 게임에서 승리해야합니다.</string>
<string name="unknown_error">알 수 없는 오류 발생</string>
<string name="leaderboards">리더보드</string>
<string name="cancel">취소</string>
<string name="resume">계속하기</string>
<string name="yes"></string>
<string name="unlock">잠금 해제</string>
<string name="achievements">도전 과제</string>
<string name="no">아니오</string>
<string name="general">기본설정</string>
<string name="source_code">소스 코드</string>
<string name="translation">번역</string>
<string name="licenses">라이선스</string>
<string name="google_play_games">Google Play 게임</string>
<string name="connect">연결하기</string>
<string name="connecting">연결중…</string>
<string name="disconnect">연결 해제</string>
<string name="disconnected">연결 해제됨</string>
<string name="new_game">새 게임</string>
<string name="share">공유하기</string>
<string name="share_menu">…을 통해 공유하기</string>
<string name="no_network">인터넷에 연결되어 있지 않습니다.</string>
<string name="open_menu">메뉴 열기</string>
<string name="close_menu">메뉴 닫기</string>
<string name="delete_all">모두 삭제</string>
<string name="themes">테마 선택</string>
<string name="try_it">사용해보세요</string>
<string name="delete_all_message">모든 이벤트 알림을 영구히 삭제합니다.</string>
<string name="all_mines_disabled">모든 지뢰를 찾았습니다.</string>
<string name="desc_convered_area">연 칸</string>
<string name="desc_marked_area">깃발 꽂은 칸</string>
<string name="desc_question_area">의심스러운 칸</string>
<string name="desc_wrongly_marked_area">깃발을 잘못 꽂은 칸</string>
<string name="exploded_mine">터진 지뢰</string>
<string name="game_started">게임 시작됨</string>
<string name="you_exploded_a_mine">지뢰가 터졌습니다!</string>
<string name="flag_placed">깃발 설치 완료!</string>
<string name="flag_removed">깃발 제거 완료!</string>
<string name="remove_ad">광고 제거</string>
<string name="help">도움말</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="nl">
<string name="app_name">Antimijn</string>
<string name="app_description">Je moet een rechthoekig bord met verborgen mijnen verwijderen zonder er een te ontploffen.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Voltooid</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string>
<string name="previous_games">Vorige games</string>
<string name="minefield">Moeilijkheidsgraad</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Vlag</string>
<string name="retry">Opnieuw</string>
<string name="empty">Leeg</string>
<string name="cant_do_it_now">Onmogelijk om dat nu te doen</string>
<string name="you_have_received">Je hebt ontvangen: +%1$d</string>
<string name="help_win_a_game">Voor meer hulp moet je een spel winnen.</string>
<string name="unknown_error">Onbekende fout.</string>
<string name="leaderboards">Ranglijsten</string>
<string name="cancel">Anneleren</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string>
<string name="unlock">Ontgrendelen</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">Nee</string>
<string name="no">Nee</string>
<string name="general">Algemeen</string>
<string name="source_code">Bron code</string>
<string name="translation">Vertaling</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Vlag geplaatst!</string>
<string name="flag_removed">Vlag verwijderd!</string>
<string name="remove_ad">Verwijder advertenties</string>
<string name="help">Help</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="no">
<string name="app_name">Antimine</string>
<string name="app_description">Du må fjerne en rektangulær plate med skjulte miner uten å løsne noen av dem.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Spill</string>
<string name="previous_games">Tidligere Spill</string>
<string name="minefield">Vanskelighet</string>
@ -33,8 +46,8 @@
<string name="system">System</string>
<string name="rating">Ttilbakemelding</string>
<string name="support_title">Støtt oss!</string>
<string name="support_description">Med din hjelp kan vi implementere nye funksjoner og holde prosjektet vårt aktivt.</string>
<string name="support_action">Støtte</string>
<string name="support_description">Med hjelpen din kan vi implementere nye funksjoner og holde prosjektet aktivt.</string>
<string name="support_action">For å støtte</string>
<string name="rating_message">Hvis du liker dette spillet, gi oss en tilbakemelding. Det vil hjelpe oss mye.</string>
<string name="used_software_text">Dette spillet bruker følgende tredjeparter programvare:</string>
<string name="translators_text">Dette spillet ble oversatt av følgende personer:</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flagg</string>
<string name="retry">Prøv på nytt</string>
<string name="empty">Tom</string>
<string name="cant_do_it_now">Umulig å gjøre det nå</string>
<string name="you_have_received">Du har mottatt: +%1$d</string>
<string name="help_win_a_game">For mer hjelp, må du vinne et spill.</string>
<string name="unknown_error">Ukjent feil.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Avbryt</string>
@ -72,7 +88,7 @@
<string name="yes">Ja</string>
<string name="unlock">Lås opp</string>
<string name="achievements">Prestasjoner</string>
<string name="rating_button_no">Nei</string>
<string name="no">Nei</string>
<string name="general">Generelt</string>
<string name="source_code">Kildekode</string>
<string name="translation">Oversettelse</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flagg plassert!</string>
<string name="flag_removed">Flagg fjernet!</string>
<string name="remove_ad">Fjern Reklame</string>
<string name="help">Hjelp</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl">
<string name="app_name">Antimine</string>
<string name="app_description">Znajdź wszystkie ukryte miny znajdujące się na kwadratowej planszy unikając ich detonacji.</string>
<string name="tutorial">Samouczek</string>
<string name="tutorial_completed">Samouczek ukończony</string>
<string name="tutorial_0_bottom">%1$s na dowolnym polu, aby rozpocząć.</string>
<string name="tutorial_1_top">Liczby wskazują, jaka ilość min przylega do podświetlonego pola.</string>
<string name="tutorial_1_bottom">Z tego wynika, że jeśli do narożnika 1⃣ przylega tylko jedno pole, musi znajdować się tam mina. %1$s, aby ją oznaczyć.</string>
<string name="tutorial_2_top">Na kolejnym nieodkrytym polu nie znajduje się mina, ponieważ posiada ono liczbę 1⃣ , a nie 2⃣ .</string>
<string name="tutorial_2_bottom">Możesz je odkryć przez %1$s.</string>
<string name="tutorial_3_top">To samo dzieje się w przypadku tego 1⃣ . Z pewnością wiesz, gdzie jest przylegająca mina.</string>
<string name="tutorial_3_bottom">Możesz odkryć wszystkie pozostałe pola przylegające do 1⃣ .</string>
<string name="tutorial_4_top">Wiemy już, gdzie jest jedna z min. Istnieje więc tylko jedna możliwa pozycja dla drugiej.</string>
<string name="tutorial_4_bottom">%1$s, aby oznaczyć minę przylegającą do 2⃣ .</string>
<string name="tutorial_5_top">Sprawdź podświetlony numer.</string>
<string name="tutorial_5_bottom">%1$s, aby odkryć lub %2$s, aby oznaczyć.</string>
<string name="games">Rozgrywki</string>
<string name="previous_games">Poprzednie rozgrywki</string>
<string name="minefield">Rozgrywki</string>
@ -61,10 +74,13 @@
<string name="single_click">Pojedyncze kliknięcie</string>
<string name="double_click">Podwójne kliknięcie</string>
<string name="long_press">Długie naciśnięcie</string>
<string name="open_tile">Otwórz</string>
<string name="open_tile">Odkryj</string>
<string name="flag_tile">Oznacz</string>
<string name="retry">Jeszcze raz</string>
<string name="empty">Puste</string>
<string name="cant_do_it_now">Nie można tego teraz zrobić</string>
<string name="you_have_received">Otrzymałeś: +%1$d</string>
<string name="help_win_a_game">Aby uzyskać więcej pomocy, musisz wygrać grę.</string>
<string name="unknown_error">Nieznany błąd.</string>
<string name="leaderboards">Tablica wyników</string>
<string name="cancel">Anuluj</string>
@ -72,7 +88,7 @@
<string name="yes">Tak</string>
<string name="unlock">Odblokuj</string>
<string name="achievements">Osiągnięcia</string>
<string name="rating_button_no">Nie</string>
<string name="no">Nie</string>
<string name="general">Ogólne</string>
<string name="source_code">Kod źródłowy</string>
<string name="translation">Tłumaczenie</string>
@ -102,5 +118,6 @@
<string name="you_exploded_a_mine">Zdetonowano minę!</string>
<string name="flag_placed">Umieszczono flagę!</string>
<string name="flag_removed">Usunięto flagę!</string>
<string name="remove_ad">Usunąć reklamy</string>
<string name="remove_ad">Usuń reklamy</string>
<string name="help">Pomoc</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pt-rBR">
<string name="app_name">Antimine</string>
<string name="app_description">Você deve limpar um campo cheio de mines escondidas sem detonar nenhumas delas.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Concluído</string>
<string name="tutorial_0_bottom">Para começar dê um %1$s em qualquer quadrado aleatório.</string>
<string name="tutorial_1_top">Os números indicam quantas minas existem adjacentes ao quadrado destacado.</string>
<string name="tutorial_1_bottom">Portanto, se o canto 1⃣ tem apenas um quadrado adjacente, ele deve ter uma minha. Use %1$s para sinalizá-lo.</string>
<string name="tutorial_2_top">O próximo quadrado fechado não tem uma mina porque o número é 1⃣ , não 2⃣ .</string>
<string name="tutorial_2_bottom">Você pode abri-lo com %1$s.</string>
<string name="tutorial_3_top">O mesmo acontece nesse 1⃣ . Você sabe onde está a mina adjacente.</string>
<string name="tutorial_3_bottom">Você pode abrir todos os outros quadrados fechados adjacentes a 1⃣ .</string>
<string name="tutorial_4_top">Sabemos onde está uma das minas. Então, há apenas uma possibilidade para a outra.</string>
<string name="tutorial_4_bottom">%1$s para sinalizar a mina adjacente a 2⃣ .</string>
<string name="tutorial_5_top">Verifique o número destacado.</string>
<string name="tutorial_5_bottom">%1$s para abrir ou %2$s para sinalizar.</string>
<string name="games">Jogos</string>
<string name="previous_games">Jogos anteriores</string>
<string name="minefield">Dificuldade</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bandeira</string>
<string name="retry">Tentar de novo</string>
<string name="empty">Vazio</string>
<string name="cant_do_it_now">Impossível fazer isso agora</string>
<string name="you_have_received">Você recebeu: +%1$d</string>
<string name="help_win_a_game">Para mais Ajuda, você deve ganhar um jogo.</string>
<string name="unknown_error">Erro Desconhecido.</string>
<string name="leaderboards">Classificações</string>
<string name="cancel">Cancelar</string>
@ -72,7 +88,7 @@
<string name="yes">Sim</string>
<string name="unlock">Desbloquear</string>
<string name="achievements">Conquistas</string>
<string name="rating_button_no">Não</string>
<string name="no">Não</string>
<string name="general">Geral</string>
<string name="source_code">Código fonte</string>
<string name="translation">Tradução</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandeira colocada!</string>
<string name="flag_removed">Bandeira removida!</string>
<string name="remove_ad">Remover Propagandas</string>
<string name="help">Ajuda</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pt-rPT">
<string name="app_name">Antimine</string>
<string name="app_description">Você deve limpar um campo contendo minas escondidas sem detonar nenhuma delas.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completo</string>
<string name="tutorial_0_bottom">Você pode começar por %1$s em qualquer quadrado aleatório.</string>
<string name="tutorial_1_top">Os números indicam quantas minas estão adjacentes ao quadrado em destaque.</string>
<string name="tutorial_1_bottom">Portanto, se o canto 1⃣ tem apenas um quadrado adjacente, ele deve ter uma mina. %1$s para sinalizá-lo.</string>
<string name="tutorial_2_top">O próximo quadrado não aberto não tem uma mina, porque o número é 1⃣ , não 2⃣ .</string>
<string name="tutorial_2_bottom">Você pode abri-lo com %1$s.</string>
<string name="tutorial_3_top">O mesmo acontece neste 1⃣ . Você sabe onde está a sua mina adjacente.</string>
<string name="tutorial_3_bottom">Você pode abrir todos os outros lugares não abertos adjacentes a 1⃣ .</string>
<string name="tutorial_4_top">Sabemos onde está uma das minas. Então, há apenas uma possibilidade para a outra.</string>
<string name="tutorial_4_bottom">%1$s para sinalizar a mina adjacente a 2⃣ .</string>
<string name="tutorial_5_top">Verifique o número destacado.</string>
<string name="tutorial_5_bottom">%1$s para abrir ou %2$s para marcar.</string>
<string name="games">Jogos</string>
<string name="previous_games">Jogos anteriores</string>
<string name="minefield">Dificuldade</string>
@ -58,13 +71,16 @@
<string name="use_question_mark">Usar Ponto de Interrogação</string>
<string name="control">Controlos</string>
<string name="arrow"></string>
<string name="single_click">Clique único</string>
<string name="double_click">Duplo Clique</string>
<string name="long_press">Toque longo</string>
<string name="single_click">Toque Único</string>
<string name="double_click">Toque Duplo</string>
<string name="long_press">Toque Longo</string>
<string name="open_tile">Abrir</string>
<string name="flag_tile">Bandeira</string>
<string name="retry">Tentar Novamente</string>
<string name="empty">Vazio</string>
<string name="cant_do_it_now">Impossível fazer isso agora</string>
<string name="you_have_received">Você recebeu: +%1$d</string>
<string name="help_win_a_game">Para mais Ajuda, você deve ganhar um jogo.</string>
<string name="unknown_error">Erro desconhecido.</string>
<string name="leaderboards">Líderes</string>
<string name="cancel">Cancelar</string>
@ -72,7 +88,7 @@
<string name="yes">Sim</string>
<string name="unlock">Desbloquear</string>
<string name="achievements">Conquistas</string>
<string name="rating_button_no">Não</string>
<string name="no">Não</string>
<string name="general">Geral</string>
<string name="source_code">Código Fonte</string>
<string name="translation">Tradução</string>
@ -85,7 +101,7 @@
<string name="new_game">Novo Jogo</string>
<string name="share">Compartilhar</string>
<string name="share_menu">Compartilhar…</string>
<string name="no_network">Sem ligação à internet.</string>
<string name="no_network">Sem ligação à Internet.</string>
<string name="open_menu">Abrir o Menu</string>
<string name="close_menu">Fechar menu</string>
<string name="delete_all">Apagar tudo</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bandeira colocada!</string>
<string name="flag_removed">Bandeira removida!</string>
<string name="remove_ad">Remover Anúncios</string>
<string name="help">Ajuda</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ro">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial completat</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="minefield">Dificultate</string>
@ -26,56 +39,59 @@
<string name="mines_remaining">%d de mine</string>
<string name="game_time">Durata Jocului</string>
<string name="mine">Mină</string>
<string name="settings_general">General</string>
<string name="settings_gameplay">Gameplay</string>
<string name="settings_accessibility">Accessibility</string>
<string name="size">Size</string>
<string name="system">System</string>
<string name="rating">Feedback</string>
<string name="support_title">Support us!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="settings_general">Generalități</string>
<string name="settings_gameplay">Joc</string>
<string name="settings_accessibility">Accesibilitate</string>
<string name="size">Dimensiune</string>
<string name="system">Sistem</string>
<string name="rating">Opinii</string>
<string name="support_title">Susțineți-ne!</string>
<string name="support_description">Cu ajutorul tău, vom fi capabili să implementăm noi funcții și să menținem proiectul nostru activ.</string>
<string name="support_action">Suport</string>
<string name="rating_message">Dacă vă place acest joc, vă rugăm să ne dați un feedback. Ne va ajuta foarte mult.</string>
<string name="used_software_text">This game uses the following third parties software:</string>
<string name="translators_text">This game was translated by the following people:</string>
<string name="sign_in_failed">Nu se poate conecta. Te rugăm să îți verifici conexiunea la rețea și să încerci din nou.</string>
<string name="you_won">You won!</string>
<string name="victories">Victories</string>
<string name="you_lost">You lost!</string>
<string name="defeats">Defeats</string>
<string name="game_over_desc_1">Good luck on your next game.</string>
<string name="game_over_desc_4">You finished the minefield in %1$d seconds.</string>
<string name="fail_to_share">Failed to share</string>
<string name="version_s">Version %1$s</string>
<string name="sound_effects">Sound Effects</string>
<string name="are_you_sure">Are you sure?</string>
<string name="enable_automatic_flags">Enable automatic placing of flags</string>
<string name="you_won">Aţi câștigat!</string>
<string name="victories">Victorii</string>
<string name="you_lost">Aţi pierdut!</string>
<string name="defeats">Înfrângeri</string>
<string name="game_over_desc_1">Mult noroc la următorul joc.</string>
<string name="game_over_desc_4">Ai terminat câmpul minat în %1$d secunde.</string>
<string name="fail_to_share">Share-uirea imaginii a eșuat</string>
<string name="version_s">Versiunea %1$s</string>
<string name="sound_effects">Efecte sonore</string>
<string name="are_you_sure">Sînteți sigur?</string>
<string name="enable_automatic_flags">Activează plasarea automată a steagurilor</string>
<string name="open_areas">Open Areas</string>
<string name="total_time">Total Time</string>
<string name="average_time">Average Time</string>
<string name="performance">Performance</string>
<string name="total_time">Timp total</string>
<string name="average_time">Timp mediu</string>
<string name="performance">Performanță</string>
<string name="ok">OK</string>
<string name="use_question_mark">Use Question Mark</string>
<string name="control">Controls</string>
<string name="use_question_mark">Folosește Semn de Întrebare</string>
<string name="control">Controale</string>
<string name="arrow"></string>
<string name="single_click">Single Click</string>
<string name="double_click">Double Click</string>
<string name="long_press">Long Press</string>
<string name="open_tile">Open</string>
<string name="flag_tile">Flag</string>
<string name="single_click">Atingere simplă</string>
<string name="double_click">Apasare dubla</string>
<string name="long_press">Atingeți lung</string>
<string name="open_tile">Deschide</string>
<string name="flag_tile">Steag</string>
<string name="retry">Încearcă din nou</string>
<string name="empty">Empty</string>
<string name="empty">Gol</string>
<string name="cant_do_it_now">Nu se poate face acest lucru acum</string>
<string name="you_have_received">Ați primit: +%1$d</string>
<string name="help_win_a_game">Pentru mai mult ajutor, trebuie să câștigi un joc.</string>
<string name="unknown_error">Eroare necunoscută.</string>
<string name="leaderboards">Clasamente</string>
<string name="cancel">Anulează</string>
<string name="resume">Continuă</string>
<string name="yes">Da</string>
<string name="unlock">Unlock</string>
<string name="unlock">Deblochează</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="no">Nu</string>
<string name="general">General</string>
<string name="source_code">Cod sursă</string>
<string name="translation">Translation</string>
<string name="translation">Translare</string>
<string name="licenses">Licenţe</string>
<string name="google_play_games">Jocurile Google Play</string>
<string name="connect">Conectează-te</string>
@ -88,9 +104,9 @@
<string name="no_network">Lipseste conexiune la internet.</string>
<string name="open_menu">Deschide meniul</string>
<string name="close_menu">Închide meniul</string>
<string name="delete_all">Delete all</string>
<string name="themes">Themes</string>
<string name="try_it">Try It</string>
<string name="delete_all">Șterge tot</string>
<string name="themes">Teme</string>
<string name="try_it">Încearcă-l</string>
<string name="delete_all_message">Delete all events permanently.</string>
<string name="all_mines_disabled">Toate minele au fost dezactivate.</string>
<string name="desc_convered_area">Covered area</string>
@ -102,5 +118,6 @@
<string name="you_exploded_a_mine">Ai explodat o mină!</string>
<string name="flag_placed">Steagul a fost plasat!</string>
<string name="flag_removed">Steagul a fost eliminat!</string>
<string name="remove_ad">Remove Ads</string>
<string name="remove_ad">Eliminați Reclamele</string>
<string name="help">Ajutor</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="ru">
<string name="app_name">Anti-Mine</string>
<string name="app_description">Вам необходимо расчистить прямоугольную площадь со спрятанными минами, не взорвав ни одну из них.</string>
<string name="tutorial">Обучение</string>
<string name="tutorial_completed">Обучение завершено</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Игры</string>
<string name="previous_games">Предыдущие игры</string>
<string name="minefield">Сложность</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Флаг</string>
<string name="retry">Повторить</string>
<string name="empty">Пусто</string>
<string name="cant_do_it_now">Невозможно сделать это сейчас</string>
<string name="you_have_received">Вы получили: +%1$d</string>
<string name="help_win_a_game">Для получения дополнительной помощи вы должны выиграть игру.</string>
<string name="unknown_error">Неизвестная ошибка.</string>
<string name="leaderboards">Списки лидеров</string>
<string name="cancel">Отмена</string>
@ -72,7 +88,7 @@
<string name="yes">Да</string>
<string name="unlock">Разблокировать</string>
<string name="achievements">Достижения</string>
<string name="rating_button_no">Нет</string>
<string name="no">Нет</string>
<string name="general">Общее</string>
<string name="source_code">Исходный код</string>
<string name="translation">Перевод</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Флаг установлен!</string>
<string name="flag_removed">Флаг снят!</string>
<string name="remove_ad">Удалить рекламу</string>
<string name="help">Помощь</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="sv-rSE">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flag</string>
<string name="retry">Retry</string>
<string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string>
@ -72,7 +88,7 @@
<string name="yes">Yes</string>
<string name="unlock">Unlock</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="no">No</string>
<string name="general">General</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string>
<string name="help">Help</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="th">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Flag</string>
<string name="retry">Retry</string>
<string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string>
@ -72,7 +88,7 @@
<string name="yes">Yes</string>
<string name="unlock">Unlock</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="no">No</string>
<string name="general">General</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string>
<string name="help">Help</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="tr">
<string name="app_name">Anti-Mine</string>
<string name="app_description">Hiçbirini patlatmadan gizli mayın içeren dikdörtgen bir tahtayı temizlemelisiniz.</string>
<string name="tutorial">Eğitim</string>
<string name="tutorial_completed">Eğitim tamamlandı</string>
<string name="tutorial_0_bottom">Rastgele karede %1$s ile başlayabilirsiniz.</string>
<string name="tutorial_1_top">Numaralar vurgulanan kareye kaç tane bitişik mayın olduğuna işaret eder.</string>
<string name="tutorial_1_bottom">Bu nedenle, köşe 1 sadece bir bitişik kareye sahipse, bu bir mayın olmalıdır. İşaretlemek için %1$s.</string>
<string name="tutorial_2_top">Bir sonraki açılmamış karede mayın yok çünkü sayı 2⃣değil, 1⃣.</string>
<string name="tutorial_2_bottom">%1$s ile açabilirsin.</string>
<string name="tutorial_3_top">Bu 1⃣\'de de aynı şey. Bitişik mayının nerede olduğunu biliyorsun.</string>
<string name="tutorial_3_bottom">1⃣\'e bitişik bütün açılmamış mayınları açabilirsin.</string>
<string name="tutorial_4_top">Mayınların bir tanesinin nerede olduğunu biliyoruz. Böylece diğer mayın için sadece bir olasılık var.</string>
<string name="tutorial_4_bottom">2⃣\'ye komşu olan mayını işaretlemek için %1$s.</string>
<string name="tutorial_5_top">Vurgulanan numarayı kontrol edin.</string>
<string name="tutorial_5_bottom">Açmak için %1$s ya da işaretlemek için %2$s.</string>
<string name="games">Oyunlar</string>
<string name="previous_games">Önceki Oyunlar</string>
<string name="minefield">Zorluk</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Bayrak</string>
<string name="retry">Yeniden dene</string>
<string name="empty">Boş</string>
<string name="cant_do_it_now">Bunu şimdi yapmak imkansız</string>
<string name="you_have_received">Aldın: +%1$d</string>
<string name="help_win_a_game">Daha fazla Yardım için bir oyun kazanmalısınız.</string>
<string name="unknown_error">Bilinmeyen hata.</string>
<string name="leaderboards">Liderlik Tablosu</string>
<string name="cancel">İptal</string>
@ -72,7 +88,7 @@
<string name="yes">Evet</string>
<string name="unlock">Kilidini Aç</string>
<string name="achievements">Başarımlar</string>
<string name="rating_button_no">Hayır</string>
<string name="no">Hayır</string>
<string name="general">Genel</string>
<string name="source_code">Kaynak Kodu</string>
<string name="translation">Çeviri</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Bayrak yerleştirildi!</string>
<string name="flag_removed">Bayrak kaldırıldı!</string>
<string name="remove_ad">Reklamları kaldır</string>
<string name="help">Yardım</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="uk">
<string name="app_name">Сапер</string>
<string name="app_description">Вам потрібно очистити поле від схованих мін, не детонуючи їх.</string>
<string name="tutorial">Навчальний посібник</string>
<string name="tutorial_completed">Навчання пройдено</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Ігри</string>
<string name="previous_games">Попередня гра</string>
<string name="minefield">Складність</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Прапор</string>
<string name="retry">Повторити</string>
<string name="empty">Пусто</string>
<string name="cant_do_it_now">Неможливо зробити це зараз</string>
<string name="you_have_received">Ви отримали: +%1$d</string>
<string name="help_win_a_game">Для отримання додаткової допомоги ви повинні виграти гру.</string>
<string name="unknown_error">Невідома помилка.</string>
<string name="leaderboards">Таблиця лідерів</string>
<string name="cancel">Відмінити</string>
@ -72,7 +88,7 @@
<string name="yes">Так</string>
<string name="unlock">Розблокування</string>
<string name="achievements">Досягнення</string>
<string name="rating_button_no">Ні</string>
<string name="no">Ні</string>
<string name="general">Загальне</string>
<string name="source_code">Вихідний код</string>
<string name="translation">Переклад</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Прапор розміщено!</string>
<string name="flag_removed">Прапор вилучено!</string>
<string name="remove_ad">Прибрати рекламу</string>
<string name="help">Help</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="vi">
<string name="app_name">Dò mìn</string>
<string name="app_description">Bạn phải mở tất cả các ô trên một bãi mìn mà không làm nổ cục mìn nào.</string>
<string name="tutorial">Hướng dẫn</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Trò chơi</string>
<string name="previous_games">Trò chơi Trước</string>
<string name="minefield">Độ khó</string>
@ -65,6 +78,9 @@
<string name="flag_tile">Cờ</string>
<string name="retry">Thử lại</string>
<string name="empty">Trống</string>
<string name="cant_do_it_now">Không thể làm điều đó bây giờ</string>
<string name="you_have_received">Bạn đã nhận được: +%1$d</string>
<string name="help_win_a_game">Để có thêm Trợ giúp, bạn phải thắng một trò chơi.</string>
<string name="unknown_error">Lỗi không xác định.</string>
<string name="leaderboards">Bảng xếp hạng</string>
<string name="cancel">Huỷ</string>
@ -72,7 +88,7 @@
<string name="yes"></string>
<string name="unlock">Mở khoá</string>
<string name="achievements">Thành tựu</string>
<string name="rating_button_no">Không</string>
<string name="no">Không</string>
<string name="general">Tổng quan</string>
<string name="source_code">Mã nguồn</string>
<string name="translation">Dịch thuật</string>
@ -103,4 +119,5 @@
<string name="flag_placed">Đã cắm cờ!</string>
<string name="flag_removed">Đã tháo cờ hiệu!</string>
<string name="remove_ad">Loại bỏ quảng cáo</string>
<string name="help">Trợ Giúp</string>
</resources>

View file

@ -2,6 +2,19 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="zh-rCN">
<string name="app_name">Antimine - 扫雷</string>
<string name="app_description">你需要清除一个隐藏着地雷的矩形面板,不能使任何地雷爆炸。</string>
<string name="tutorial">教学模式</string>
<string name="tutorial_completed">已完成的教程</string>
<string name="tutorial_0_bottom">你可以在任意的正方形开始 %1$s.</string>
<string name="tutorial_1_top">数字表明有多少地雷与高亮的正方形相邻。</string>
<string name="tutorial_1_bottom">因此,如果角 1⃣ 只有一个相邻的正方形,它必须是一个地雷。 %1$s 来标记它。</string>
<string name="tutorial_2_top">下一个未打开的方块没有地雷,因为数字是 1⃣ , 而不是 2⃣ 。</string>
<string name="tutorial_2_bottom">您可以通过 %1$s 打开它。</string>
<string name="tutorial_3_top">此 1⃣ 发生同样的情况。您知道其相邻的矿藏在哪里。</string>
<string name="tutorial_3_bottom">您可以在 1⃣ 旁打开所有其他未打开的方块</string>
<string name="tutorial_4_top">我们知道其中一枚地雷在哪里,因此,另一枚地雷只有一种可能性。</string>
<string name="tutorial_4_bottom">%1$s 标记附近的 2⃣ 的矿。</string>
<string name="tutorial_5_top">检查高亮的数字。</string>
<string name="tutorial_5_bottom">%1$s 打开或 %2$s 标记。</string>
<string name="games">游戏</string>
<string name="previous_games">上一局</string>
<string name="minefield">难度</string>
@ -65,6 +78,9 @@
<string name="flag_tile">标志</string>
<string name="retry">重试</string>
<string name="empty"></string>
<string name="cant_do_it_now">现在无法做到这一点。</string>
<string name="you_have_received">您已收到: +%1$d</string>
<string name="help_win_a_game">为了获得更多帮助,你必须赢得一场游戏。</string>
<string name="unknown_error">未知错误。</string>
<string name="leaderboards">排行榜</string>
<string name="cancel">取消</string>
@ -72,7 +88,7 @@
<string name="yes"></string>
<string name="unlock">解锁​​​​</string>
<string name="achievements">成就</string>
<string name="rating_button_no"></string>
<string name="no"></string>
<string name="general">通用</string>
<string name="source_code">源代码</string>
<string name="translation">翻译</string>
@ -103,4 +119,5 @@
<string name="flag_placed">标记已放置!</string>
<string name="flag_removed">标记已移除!</string>
<string name="remove_ad">去除广告</string>
<string name="help">帮助</string>
</resources>

View file

@ -1,7 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="en">
<string name="app_name">Antimine</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="tutorial">Tutorial</string>
<string name="tutorial_completed">Tutorial Completed</string>
<string name="tutorial_0_bottom">You can start by %1$s at any random square.</string>
<string name="tutorial_1_top">The numbers indicates how many mines are adjacent to the highlighted square.</string>
<string name="tutorial_1_bottom">Therefore, if the corner 1⃣ has only one adjacent square, it must be a mine. %1$s to flag it.</string>
<string name="tutorial_2_top">The next unopened square doesn\'t have a mine because the number is 1⃣ , not 2⃣ .</string>
<string name="tutorial_2_bottom">You can open it by %1$s.</string>
<string name="tutorial_3_top">The same happens on this 1⃣ . You know where its adjacent mine is.</string>
<string name="tutorial_3_bottom">You can open all other unopened squares adjacent to 1⃣ .</string>
<string name="tutorial_4_top">We know where one of the mines are. So, there\'s only one possibility to the other one.</string>
<string name="tutorial_4_bottom">%1$s to flag the mine adjacent to 2⃣ .</string>
<string name="tutorial_5_top">Check the highlighted number.</string>
<string name="tutorial_5_bottom">%1$s to open or %2$s to mark.</string>
<string name="games">Games</string>
<string name="previous_games">Previous Games</string>
<string name="minefield">Difficulty</string>
@ -9,6 +20,7 @@
<string name="beginner">Beginner</string>
<string name="intermediate">Intermediate</string>
<string name="expert">Expert</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="open">Open</string>
<string name="settings">Settings</string>
<string name="animations">Animations</string>
@ -33,7 +45,6 @@
<string name="system">System</string>
<string name="rating">Feedback</string>
<string name="support_title">Support us!</string>
<string name="support_description">With your help, we\'ll be able to implement new features and keep our project active.</string>
<string name="support_action">To support</string>
<string name="rating_message">If you like this game, please give us a feedback. It will help us a lot.</string>
<string name="used_software_text">This game uses the following third parties software:</string>
@ -65,6 +76,9 @@
<string name="flag_tile">Flag</string>
<string name="retry">Retry</string>
<string name="empty">Empty</string>
<string name="cant_do_it_now">Impossible to do that now</string>
<string name="you_have_received">You have received: +%1$d</string>
<string name="help_win_a_game">For more Help, you must win a game.</string>
<string name="unknown_error">Unknown error.</string>
<string name="leaderboards">Leaderboards</string>
<string name="cancel">Cancel</string>
@ -72,7 +86,7 @@
<string name="yes">Yes</string>
<string name="unlock">Unlock</string>
<string name="achievements">Achievements</string>
<string name="rating_button_no">No</string>
<string name="no">No</string>
<string name="general">General</string>
<string name="source_code">Source Code</string>
<string name="translation">Translation</string>
@ -103,4 +117,7 @@
<string name="flag_placed">Flag placed!</string>
<string name="flag_removed">Flag removed!</string>
<string name="remove_ad">Remove Ads</string>
<string name="help">Help</string>
<string name="app_description">You have to clear a rectangular board containing hidden mines without detonating any of them.</string>
<string name="app_name">Antimine</string>
</resources>

View file

@ -6,8 +6,8 @@ android {
compileSdkVersion 30
defaultConfig {
versionCode 800111
versionName '8.0.11'
versionCode 800101
versionName '8.1.0'
minSdkVersion 21
targetSdkVersion 30
}

View file

@ -10,8 +10,8 @@ android {
compileSdkVersion 30
defaultConfig {
versionCode 800111
versionName '8.0.11'
versionCode 800101
versionName '8.1.0'
minSdkVersion 21
targetSdkVersion 30
}

View file

@ -8,8 +8,8 @@ android {
defaultConfig {
// versionCode and versionName must be hardcoded to support F-droid
versionCode 800111
versionName '8.0.11'
versionCode 800101
versionName '8.1.0'
applicationId 'dev.lucasnlm.antimine'
minSdkVersion 23
targetSdkVersion 30

View file

@ -17,8 +17,6 @@ class WatchLevelFragment : CommonLevelFragment(R.layout.fragment_level) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerGrid = view.findViewById(R.id.recyclerGrid)
recyclerGrid.doOnLayout {
lifecycleScope.launch {
val levelSetup = gameViewModel.loadLastGame()

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="new_game">New Game</string>
<string name="victory">You won!&#xA0;😎</string>
<string name="game_over">Exploded!&#xA0;😢</string>
<string name="new_game">Nyt spil</string>
<string name="victory">Du vandt!&#xA0;😎</string>
<string name="game_over">Eksploderet!&#xA0;😢</string>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="new_game">New Game</string>
<string name="victory">You won!&#xA0;😎</string>
<string name="game_over">Exploded!&#xA0;😢</string>
<string name="new_game">משחק חדש</string>
<string name="victory">נצחון!&#xA0;😎</string>
<string name="game_over">פיצוץ!&#xA0;😢</string>
</resources>

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="new_game">New Game</string>
<string name="victory">You won!&#xA0;😎</string>
<string name="game_over">Exploded!&#xA0;😢</string>
<string name="new_game">새 게임</string>
<string name="victory">승리!&#xA0;😎</string>
<string name="game_over">펑! 게임 오버!&#xA0;😢</string>
</resources>