Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified app/src/main/assets/Tw/close.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class ScriptLauncherResponseHandler @Inject constructor(

giftBoxResp?.let { handleGiftBoxResponse(it) }

prefs.loopIntoLotteryAfterPresentBox = resp.returnToLottery

ScriptModeEnum.Lottery
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,16 +160,39 @@ class ScriptManager @Inject constructor(
}

is AutoLottery.ExitException -> {
val msg = when (e.reason) {
// Resetting these preferences ensures that the script does not loop into the lottery
// or assume the present box is full after handling an AutoLottery.ExitException.
preferences.loopIntoLotteryAfterPresentBox = false
preferences.isPresentBoxFull = false
val msg = when (val reason = e.reason) {
AutoLottery.ExitReason.PresentBoxFull -> context.getString(R.string.present_box_full)
AutoLottery.ExitReason.RanOutOfCurrency -> context.getString(R.string.lottery_currency_depleted)
is AutoLottery.ExitReason.PresentBoxFullAndCannotSelectAnymore -> {
if (reason.pickedGoldEmbers == 0) {
context.getString(R.string.present_box_full_and_embers_are_overflowing)
} else {
context.getString(
R.string.present_box_full_and_have_pick_at_least_embers,
reason.pickedGoldEmbers
)
}
}

AutoLottery.ExitReason.NoEmbersFound -> context.getString(R.string.no_embers_found)
is AutoLottery.ExitReason.CannotSelectAnyMore -> {
context.getString(R.string.picked_exp_stacks, reason.pickedStacks, reason.pickedGoldEmbers)
}

AutoLottery.ExitReason.Abort -> context.getString(R.string.aborted)
}

messages.notify(msg)
messageBox.show(scriptExitedString, msg)
}

is AutoGiftBox.ExitException -> {
preferences.loopIntoLotteryAfterPresentBox = false
preferences.isPresentBoxFull = false
val msg = when (val reason = e.reason) {
is AutoGiftBox.ExitReason.CannotSelectAnyMore -> context.getString(
R.string.picked_exp_stacks,
Expand All @@ -178,6 +201,11 @@ class ScriptManager @Inject constructor(
)

AutoGiftBox.ExitReason.NoEmbersFound -> context.getString(R.string.no_embers_found)
is AutoGiftBox.ExitReason.ReturnToLottery -> context.getString(
R.string.picked_exp_stacks_return_to_lottery,
reason.pickedStacks,
reason.pickedGoldEmbers
)
}

messages.notify(msg)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,14 @@ class FineTuneSettingsViewModel @Inject constructor(
valueRange = 0..50,
valueRepresentation = { "${it}ms" },
hint = "Delay between individual taps/clicks when doing so repeatedly like at the end of battles, friend point summon and lottery script."
)
),
FineTuneItem(
pref = prefs.lottoSpin,
name = R.string.p_fine_tune_lotto_clicks,
icon = icon(R.drawable.ic_click),
valueRange = 10..20,
hint = "The number of clicks for lotto spin. Decrease this if your device is lagging."
),
)
),
FineTuneGroup(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@ fun ColumnScope.GiftBoxLauncherContent(
maxGoldEmberTotalCount: Int,
changeMaxGoldEmberTotalCount: (Int) -> Unit
) {
Text(
text = stringResource(R.string.p_script_mode_gift_box_warning),
modifier= Modifier.fillMaxWidth(),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.secondary
)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package io.github.fate_grand_automata.ui.launcher

import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.expandVertically
import androidx.compose.animation.shrinkVertically
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutHorizontally
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
Expand All @@ -12,12 +17,14 @@ import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import io.github.fate_grand_automata.R
import io.github.fate_grand_automata.scripts.prefs.IPreferences
Expand All @@ -28,8 +35,9 @@ fun lotteryLauncher(
modifier: Modifier = Modifier
): ScriptLauncherResponseBuilder {
var receiveEmbers by remember { mutableStateOf(prefs.receiveEmbersWhenGiftBoxFull) }
var maxGoldEmberStackSize by remember { mutableStateOf(prefs.maxGoldEmberStackSize) }
var maxGoldEmberTotalCount by remember { mutableStateOf(prefs.maxGoldEmberTotalCount) }
var returnToLotteryAfterPresentBox by remember { mutableStateOf(prefs.loopIntoLotteryAfterPresentBox) }
var maxGoldEmberStackSize by remember { mutableIntStateOf(prefs.maxGoldEmberStackSize) }
var maxGoldEmberTotalCount by remember { mutableIntStateOf(prefs.maxGoldEmberTotalCount) }

Column(
modifier = modifier
Expand Down Expand Up @@ -67,23 +75,64 @@ fun lotteryLauncher(
)
}

if (receiveEmbers) {
GiftBoxLauncherContent(
maxGoldEmberStackSize = maxGoldEmberStackSize,
changeMaxGoldEmberStackSize = { maxGoldEmberStackSize = it },
maxGoldEmberTotalCount = maxGoldEmberTotalCount,
changeMaxGoldEmberTotalCount = { maxGoldEmberTotalCount = it }
AnimatedVisibility(
visible = receiveEmbers,
label = "Animate the showing of the gift box settings",
enter = slideInVertically { it } + expandVertically(expandFrom = Alignment.Top),
exit = slideOutHorizontally { -it } + shrinkVertically(shrinkTowards = Alignment.Top)
) {
Column(
modifier = Modifier.fillMaxWidth()
) {
GiftBoxLauncherContent(
maxGoldEmberStackSize = maxGoldEmberStackSize,
changeMaxGoldEmberStackSize = { maxGoldEmberStackSize = it },
maxGoldEmberTotalCount = maxGoldEmberTotalCount,
changeMaxGoldEmberTotalCount = { maxGoldEmberTotalCount = it },
)
}
}
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 5.dp)
.clickable(
enabled = receiveEmbers,
onClick = {
returnToLotteryAfterPresentBox = !returnToLotteryAfterPresentBox
}
)
) {
Text(
stringResource(R.string.p_return_to_lottery),
style = MaterialTheme.typography.bodyMedium,
color = when(receiveEmbers) {
true -> MaterialTheme.colorScheme.secondary
false -> MaterialTheme.colorScheme.secondary.copy(alpha = 0.3f)
},
textAlign = TextAlign.Justify
)

Switch(
checked = returnToLotteryAfterPresentBox,
onCheckedChange = { returnToLotteryAfterPresentBox = it },
enabled = receiveEmbers
)
}


}

return ScriptLauncherResponseBuilder(
canBuild = { true },
build = {
ScriptLauncherResponse.Lottery(
if (receiveEmbers) {
giftBox = if (receiveEmbers) {
ScriptLauncherResponse.GiftBox(maxGoldEmberStackSize, maxGoldEmberTotalCount)
} else null
} else null,
returnToLottery = returnToLotteryAfterPresentBox
)
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ sealed class ScriptLauncherResponse {
data object Cancel : ScriptLauncherResponse()
data class FP(val limit: Int?) : ScriptLauncherResponse()
data class Lottery(
val giftBox: GiftBox?
val giftBox: GiftBox?,
val returnToLottery: Boolean,
) : ScriptLauncherResponse()

data class GiftBox(
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/res/values/localized.xml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ Skills"</string>
<string name="p_runs">"Runs"</string>
<string name="p_roll_limit">"Limit number of rolls"</string>
<string name="p_receive_embers">"Receive embers"</string>
<string name="p_return_to_lottery">"Experimental:\nReturn to lottery after successfully getting ember/s from present box.\nThis will loop until you got full present box and embers in storage."</string>
<string name="p_battle_config_name">"Name"</string>
<string name="p_battle_config_cmd">"Command"</string>
<string name="p_battle_config_notes">"Notes"</string>
Expand Down Expand Up @@ -158,6 +159,7 @@ Copy or rename it if you want to keep it."</string>
<string name="p_fine_tune_mlb_similarity">"MLB Similarity"</string>
<string name="p_fine_tune_stage_counter_similarity">"Stage Counter Similarity"</string>
<string name="p_fine_tune_clicks">"Clicks"</string>
<string name="p_fine_tune_lotto_clicks">"Lotto Clicks"</string>
<string name="p_fine_tune_wait_after_clicking">"Wait after clicking"</string>
<string name="p_fine_tune_click_duration">"Click duration"</string>
<string name="p_fine_tune_click_delay">"Multi-Click Interval"</string>
Expand Down Expand Up @@ -237,6 +239,8 @@ Please turn on accessibility for this app from System settings. If it is already
<string name="lottery_currency_depleted">"Ran out of lottery currency"</string>
<string name="inventory_full">"Inventory Full"</string>
<string name="present_box_full">"Present Box Full"</string>
<string name="present_box_full_and_embers_are_overflowing">"Present Box is full and Embers are overflowing."</string>
<string name="present_box_full_and_have_pick_at_least_embers">"Present Box is full and Embers are overflowing. Have pick at least %d Gold embers"</string>
<string name="support_img_maker_not_found">"No support images were found on the current screen. Are you on Support selection or Friend list screen?"</string>
<string name="support_selection_manual">"Support selection set to Manual"</string>
<string name="support_selection_preferred_not_set">"When using 'preferred' support selection mode, specify at least one Servant or Craft Essence."</string>
Expand All @@ -256,7 +260,10 @@ Please turn on accessibility for this app from System settings. If it is already
<string name="avg_time_per_run">"Average time per run: %s"</string>
<string name="turns_count">"Turns: %d"</string>
<string name="turns_stats">"Turns: %1$d (min), %2$.02f (avg), %3$d (max)"</string>

<string name="picked_exp_stacks">"Picked %1$d EXP stacks, resulting in a total amount of %2$d Gold embers"</string>
<string name="picked_exp_stacks_return_to_lottery">"Picked %d EXP stacks, resulting in a total amount of %d Gold embers. Returning to lottery."</string>

<string name="no_embers_found">"Couldn't find Embers on screen. Make sure that you've filtered for EXP cards."</string>
<string name="root_failed">"Failed to get root access"</string>
<string name="p_mats">"Materials"</string>
Expand Down Expand Up @@ -454,6 +461,10 @@ After pressing on the button, switch the app filter from \"Not optimized\" to \"
<string name="p_treat_support_like_own_servant">Treat Support like own Servants</string>
<string name="p_treat_support_like_own_servant_summary">Will do normal face card checks instead of looking for the "Support" icon on face cards. This solves problems with super-buffed Support Servants, but will break card priority if you have 2 of the same Servant in the party.</string>

<string name="aborted">Aborted</string>

<string name="p_script_mode_gift_box_warning">Please ensure you have set the filters to Embers only.</string>

<string name="p_screenshot_bond">"Screenshot Bond"</string>
<string name="p_screenshot_bond_summary">"Experimental screenshot of bond level up regardless of level to 'bond' folder\nNote: Auto-click on another results screen might cause occasional missed screenshots, potentially skipping the bond level-up."</string>
<string name="p_hide_sq_in_resource">Hide SQ in AP Resources</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ class PreferencesImpl @Inject constructor(

override var receiveEmbersWhenGiftBoxFull by prefs.receiveEmbersWhenGiftBoxFull

override var loopIntoLotteryAfterPresentBox by prefs.loopIntoLotteryAfterPresentBox

override var isPresentBoxFull by prefs.isPresentBoxFull

override var lottoSpin by prefs.lottoSpin

private val autoSkillMap = mutableMapOf<String, IBattleConfig>()

override val servant: IServantEnhancementPreferences =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ class PrefsCore @Inject constructor(
val shouldLimitFP = maker.bool("should_fp_limit")
val limitFP = maker.int("fp_limit", 1)
val receiveEmbersWhenGiftBoxFull = maker.bool("receive_embers_when_gift_box_full")
val loopIntoLotteryAfterPresentBox = maker.bool("loop_into_lottery_after_present_box")
val isPresentBoxFull = maker.bool("is_present_box_full")
val lottoSpin = maker.stringAsInt("lotto_spin", 20)

val supportSwipesPerUpdate = maker.int("support_swipes_per_update_x", 10)
val supportMaxUpdates = maker.int("support_max_updates_x", 5)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ class AutoBattle @Inject constructor(
// Lock the Ordeal Call for JP server
if (prefs.gameServer !is GameServer.Jp) return false

return images[Images.Close] in locations.ordealCallOutOfPodsRegion
return images[Images.Close] in locations.closeLowerMiddleScreenRegion
}

private fun ordealCallOutOfPods() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package io.github.fate_grand_automata.scripts.entrypoints
import io.github.fate_grand_automata.scripts.IFgoAutomataApi
import io.github.fate_grand_automata.scripts.Images
import io.github.fate_grand_automata.scripts.enums.GameServer
import io.github.fate_grand_automata.scripts.enums.ScriptModeEnum
import io.github.fate_grand_automata.scripts.modules.ConnectionRetry
import io.github.lib_automata.EntryPoint
import io.github.lib_automata.ExitManager
Expand All @@ -21,7 +22,9 @@ class AutoGiftBox @Inject constructor(
private val connectionRetry: ConnectionRetry
) : EntryPoint(exitManager), IFgoAutomataApi by api {
sealed class ExitReason {
object NoEmbersFound : ExitReason()

class ReturnToLottery(val pickedStacks: Int, val pickedGoldEmbers: Int) : ExitReason()
data object NoEmbersFound : ExitReason()
class CannotSelectAnyMore(val pickedStacks: Int, val pickedGoldEmbers: Int) : ExitReason()
}

Expand Down Expand Up @@ -72,6 +75,35 @@ class AutoGiftBox @Inject constructor(
receiveEnabledPattern in receiveEnabledRegion
)


if (prefs.loopIntoLotteryAfterPresentBox && prefs.scriptMode == ScriptModeEnum.Lottery) {
val isFullDialog = locations.closeLowerMiddleScreenRegion.exists(
images[Images.Close],
timeout = 10.seconds
)
if (isFullDialog) {
prefs.isPresentBoxFull = true
locations.closeLowerMiddleScreenRegion.click()
0.5.seconds.wait()
}
// close window
locations.resultCeRewardCloseClick.click()
1.seconds.wait()

locations.lottery.checkRegion.exists(
images[Images.LotteryBoxFinished],
timeout = 15.seconds
)

throw ExitException(
ExitReason.ReturnToLottery(
totalSelected.pickedStacks,
totalSelected.pickedGoldEmbers
)
)
}


throw ExitException(
ExitReason.CannotSelectAnyMore(
totalSelected.pickedStacks,
Expand Down
Loading