diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt
index 583e59863..be2e2939d 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt
@@ -773,6 +773,7 @@ object NativeLibrary {
const val BUTTON_DEBUG = 781
const val BUTTON_GPIO14 = 782
const val BUTTON_SWAP = 800
+ const val BUTTON_TURBO = 801
}
/**
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt
index c91f63d40..cb4ea96d9 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.kt
@@ -52,7 +52,7 @@ class EmulationActivity : AppCompatActivity() {
get() = PreferenceManager.getDefaultSharedPreferences(CitraApplication.appContext)
var isActivityRecreated = false
private val emulationViewModel: EmulationViewModel by viewModels()
- private val settingsViewModel: SettingsViewModel by viewModels()
+ val settingsViewModel: SettingsViewModel by viewModels()
private lateinit var binding: ActivityEmulationBinding
private lateinit var screenAdjustmentUtil: ScreenAdjustmentUtil
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt
index d5d78710e..b6b2c1c67 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt
@@ -954,12 +954,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
private fun showToggleControlsDialog() {
val editor = preferences.edit()
- val enabledButtons = BooleanArray(15)
+ val enabledButtons = BooleanArray(16)
enabledButtons.forEachIndexed { i: Int, _: Boolean ->
// Buttons that are disabled by default
var defaultValue = true
when (i) {
- 6, 7, 12, 13, 14 -> defaultValue = false
+ 6, 7, 12, 13, 14, 15 -> defaultValue = false
}
enabledButtons[i] = preferences.getBoolean("buttonToggle$i", defaultValue)
}
@@ -1137,10 +1137,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
.apply()
val editor = preferences.edit()
- for (i in 0 until 15) {
+ for (i in 0 until 16) {
var defaultValue = true
when (i) {
- 6, 7, 12, 13, 14 -> defaultValue = false
+ 6, 7, 12, 13, 14, 15 -> defaultValue = false
}
editor.putBoolean("buttonToggle$i", defaultValue)
}
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.kt b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.kt
index 9b30a7fb1..c3c6bd7ef 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.kt
+++ b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.kt
@@ -1,4 +1,4 @@
-// Copyright 2023 Citra Emulator Project
+// Copyright Citra Emulator Project / Azahar Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
@@ -24,6 +24,7 @@ import androidx.preference.PreferenceManager
import org.citra.citra_emu.CitraApplication
import org.citra.citra_emu.NativeLibrary
import org.citra.citra_emu.R
+import org.citra.citra_emu.features.hotkeys.HotkeyFunctions
import org.citra.citra_emu.utils.EmulationMenuSettings
import java.lang.NullPointerException
import kotlin.math.min
@@ -44,6 +45,8 @@ class InputOverlay(context: Context?, attrs: AttributeSet?) : SurfaceView(contex
private var buttonBeingConfigured: InputOverlayDrawableButton? = null
private var dpadBeingConfigured: InputOverlayDrawableDpad? = null
private var joystickBeingConfigured: InputOverlayDrawableJoystick? = null
+ private val settingsViewModel = NativeLibrary.sEmulationActivity.get()!!.settingsViewModel
+ private val hotkeyFunctions = HotkeyFunctions(settingsViewModel.settings)
// Stores the ID of the pointer that interacted with the 3DS touchscreen.
private var touchscreenPointerId = -1
@@ -104,6 +107,11 @@ class InputOverlay(context: Context?, attrs: AttributeSet?) : SurfaceView(contex
swapScreen()
}
+ if (button.id == NativeLibrary.ButtonType.BUTTON_TURBO && button.status == NativeLibrary.ButtonState.PRESSED) {
+
+ hotkeyFunctions.setTurboSpeed((!hotkeyFunctions.isTurboSpeedEnabled))
+ }
+
NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, button.id, button.status)
shouldUpdateView = true
}
@@ -468,6 +476,18 @@ class InputOverlay(context: Context?, attrs: AttributeSet?) : SurfaceView(contex
)
)
}
+
+ if (preferences.getBoolean("buttonToggle15", false)) {
+ overlayButtons.add(
+ initializeOverlayButton(
+ context,
+ R.drawable.button_turbo,
+ R.drawable.button_turbo_pressed,
+ NativeLibrary.ButtonType.BUTTON_TURBO,
+ orientation
+ )
+ )
+ }
}
fun refreshControls() {
@@ -673,6 +693,14 @@ class InputOverlay(context: Context?, attrs: AttributeSet?) : SurfaceView(contex
NativeLibrary.ButtonType.BUTTON_SWAP.toString() + "-Y",
resources.getInteger(R.integer.N3DS_BUTTON_SWAP_Y).toFloat() / 1000 * maxY
)
+ .putFloat(
+ NativeLibrary.ButtonType.BUTTON_TURBO.toString() + "-X",
+ resources.getInteger(R.integer.N3DS_BUTTON_TURBO_X).toFloat() / 1000 * maxX
+ )
+ .putFloat(
+ NativeLibrary.ButtonType.BUTTON_TURBO.toString() + "-Y",
+ resources.getInteger(R.integer.N3DS_BUTTON_TURBO_Y).toFloat() / 1000 * maxY
+ )
.apply()
}
@@ -816,6 +844,14 @@ class InputOverlay(context: Context?, attrs: AttributeSet?) : SurfaceView(contex
NativeLibrary.ButtonType.BUTTON_SWAP.toString() + portrait + "-Y",
resources.getInteger(R.integer.N3DS_BUTTON_SWAP_PORTRAIT_Y).toFloat() / 1000 * maxY
)
+ .putFloat(
+ NativeLibrary.ButtonType.BUTTON_TURBO.toString() + portrait + "-X",
+ resources.getInteger(R.integer.N3DS_BUTTON_TURBO_PORTRAIT_X).toFloat() / 1000 * maxX
+ )
+ .putFloat(
+ NativeLibrary.ButtonType.BUTTON_TURBO.toString() + portrait + "-Y",
+ resources.getInteger(R.integer.N3DS_BUTTON_TURBO_PORTRAIT_Y).toFloat() / 1000 * maxY
+ )
.apply()
}
@@ -928,6 +964,7 @@ class InputOverlay(context: Context?, attrs: AttributeSet?) : SurfaceView(contex
NativeLibrary.ButtonType.BUTTON_START,
NativeLibrary.ButtonType.BUTTON_SELECT,
NativeLibrary.ButtonType.BUTTON_SWAP -> 0.08f
+ NativeLibrary.ButtonType.BUTTON_TURBO -> 0.10f
NativeLibrary.ButtonType.TRIGGER_L,
NativeLibrary.ButtonType.TRIGGER_R,
diff --git a/src/android/app/src/main/res/drawable-hdpi/button_turbo.png b/src/android/app/src/main/res/drawable-hdpi/button_turbo.png
new file mode 100644
index 000000000..10a0eb8b9
Binary files /dev/null and b/src/android/app/src/main/res/drawable-hdpi/button_turbo.png differ
diff --git a/src/android/app/src/main/res/drawable-hdpi/button_turbo_pressed.png b/src/android/app/src/main/res/drawable-hdpi/button_turbo_pressed.png
new file mode 100644
index 000000000..fd35892d5
Binary files /dev/null and b/src/android/app/src/main/res/drawable-hdpi/button_turbo_pressed.png differ
diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_turbo.png b/src/android/app/src/main/res/drawable-xhdpi/button_turbo.png
new file mode 100644
index 000000000..6857a2d80
Binary files /dev/null and b/src/android/app/src/main/res/drawable-xhdpi/button_turbo.png differ
diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_turbo_pressed.png b/src/android/app/src/main/res/drawable-xhdpi/button_turbo_pressed.png
new file mode 100644
index 000000000..2047ed687
Binary files /dev/null and b/src/android/app/src/main/res/drawable-xhdpi/button_turbo_pressed.png differ
diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_turbo.png b/src/android/app/src/main/res/drawable-xxhdpi/button_turbo.png
new file mode 100644
index 000000000..55f2ad885
Binary files /dev/null and b/src/android/app/src/main/res/drawable-xxhdpi/button_turbo.png differ
diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_turbo_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_turbo_pressed.png
new file mode 100644
index 000000000..b3d436304
Binary files /dev/null and b/src/android/app/src/main/res/drawable-xxhdpi/button_turbo_pressed.png differ
diff --git a/src/android/app/src/main/res/drawable-xxxhdpi/button_turbo.png b/src/android/app/src/main/res/drawable-xxxhdpi/button_turbo.png
new file mode 100644
index 000000000..a235097e3
Binary files /dev/null and b/src/android/app/src/main/res/drawable-xxxhdpi/button_turbo.png differ
diff --git a/src/android/app/src/main/res/drawable-xxxhdpi/button_turbo_pressed.png b/src/android/app/src/main/res/drawable-xxxhdpi/button_turbo_pressed.png
new file mode 100644
index 000000000..47a911c4f
Binary files /dev/null and b/src/android/app/src/main/res/drawable-xxxhdpi/button_turbo_pressed.png differ
diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml
index bef6bb558..51b68bd60 100644
--- a/src/android/app/src/main/res/values/arrays.xml
+++ b/src/android/app/src/main/res/values/arrays.xml
@@ -131,6 +131,7 @@
- @string/controller_c
- @string/button_home
- @string/button_swap
+ - @string/button_turbo
diff --git a/src/android/app/src/main/res/values/integers.xml b/src/android/app/src/main/res/values/integers.xml
index 50cde75f8..1f19c2373 100644
--- a/src/android/app/src/main/res/values/integers.xml
+++ b/src/android/app/src/main/res/values/integers.xml
@@ -33,6 +33,8 @@
850
370
850
+ 630
+ 850
810
@@ -65,5 +67,7 @@
794
460
675
+ 453
+ 720
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index 612d12345..c77afdaeb 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -137,6 +137,7 @@
START
HOME
Swap Screens
+ Turbo
X
Y
L