diff --git a/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui b/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui
index 6ec3853..10e8f70 100644
--- a/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui
+++ b/ui/designer/tabs/tabTools/tabTools_StepCalculator.ui
@@ -14,6 +14,13 @@
TabTools_StepCalculator
+ -
+
+
+ detailedLogOutput
+
+
+
-
diff --git a/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py b/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py
index 6693313..26ea820 100644
--- a/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py
+++ b/ui/designer/tabs/tabTools/tabTools_StepCalculator_ui.py
@@ -28,6 +28,11 @@ class Ui_TabTools_StepCalculator(object):
TabTools_StepCalculator.setWindowTitle(u"TabTools_StepCalculator")
self.verticalLayout_3 = QVBoxLayout(TabTools_StepCalculator)
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
+ self.detailedLogOutputCheckBox = QCheckBox(TabTools_StepCalculator)
+ self.detailedLogOutputCheckBox.setObjectName(u"detailedLogOutputCheckBox")
+
+ self.verticalLayout_3.addWidget(self.detailedLogOutputCheckBox)
+
self.mapTypeWidget = QWidget(TabTools_StepCalculator)
self.mapTypeWidget.setObjectName(u"mapTypeWidget")
self.horizontalLayout = QHBoxLayout(self.mapTypeWidget)
@@ -369,6 +374,7 @@ class Ui_TabTools_StepCalculator(object):
# setupUi
def retranslateUi(self, TabTools_StepCalculator):
+ self.detailedLogOutputCheckBox.setText(QCoreApplication.translate("TabTools_StepCalculator", u"detailedLogOutput", None))
self.mapTypeLegacyPlayRadioButton.setText("")
self.mapTypePlayRadioButton.setText("")
self.mapTypeLegacyPlayPlusRadioButton.setText("")
diff --git a/ui/implements/tabs/tabTools/tabTools_StepCalculator.py b/ui/implements/tabs/tabTools/tabTools_StepCalculator.py
index 473068e..1770fdf 100644
--- a/ui/implements/tabs/tabTools/tabTools_StepCalculator.py
+++ b/ui/implements/tabs/tabTools/tabTools_StepCalculator.py
@@ -1,7 +1,13 @@
import logging
+from arcaea_offline.calculate import calculate_play_rating
from arcaea_offline.calculate.world_step import (
+ AmaneBelowExPartnerBonus,
+ AwakenedEtoPartnerBonus,
+ AwakenedIlithPartnerBonus,
+ AwakenedLunaPartnerBonus,
LegacyMapStepBooster,
+ MayaPartnerBonus,
MemoriesStepBooster,
PartnerBonus,
PlayResult,
@@ -9,6 +15,7 @@ from arcaea_offline.calculate.world_step import (
calculate_step,
calculate_step_original,
)
+from arcaea_offline.models import Chart, Score
from PySide6.QtCore import QEasingCurve, QObject, QSize, Qt, QTimeLine
from PySide6.QtGui import QIcon, QPainter, QPaintEvent, QPixmap
from PySide6.QtWidgets import (
@@ -22,6 +29,8 @@ from PySide6.QtWidgets import (
from ui.designer.tabs.tabTools.tabTools_StepCalculator_ui import (
Ui_TabTools_StepCalculator,
)
+from ui.implements.components.chartAndScoreInput import ChartAndScoreInput
+from ui.implements.components.songIdSelector import SongIdSelectorMode
logger = logging.getLogger(__name__)
@@ -69,11 +78,23 @@ class ButtonGrayscaleEffectApplier(QObject):
target.setGraphicsEffect(effect)
+class ChartAndScoreInputDialog(ChartAndScoreInput):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setWindowFlag(Qt.WindowType.Dialog, True)
+ self.setSongIdSelectorMode(SongIdSelectorMode.Chart)
+
+
class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
+ self.calculate_toStep_calculatePlayResultFromScoreButton.clicked.connect(
+ self.openChartAndScoreInputDialog
+ )
+
+ # set icons
staminaIcon = QIcon(":/images/stepCalculator/stamina.png")
for radioButton in [
self.legacyPlayPlus_x2StaminaRadioButton,
@@ -104,6 +125,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
button.setIconSize(mapTypeIconSize)
button.setIcon(pixmap)
+ # apply grayscale effects
self.buttonGrayscaleEffectAppliers = []
for button in [
self.mapTypeLegacyPlayRadioButton,
@@ -117,6 +139,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
applier = ButtonGrayscaleEffectApplier(button)
self.buttonGrayscaleEffectAppliers.append(applier)
+ # create button groups
self.mapTypeButtonGroup = QButtonGroup(self)
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayRadioButton, 0)
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayPlusRadioButton, 1)
@@ -147,6 +170,7 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
self.legacyPlayPlus_x15fragRadioButton, 500
)
+ # bind calculate functions
self.mapTypeButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusStaminaButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusFragmentsButtonGroup.buttonToggled.connect(self.tryCalculate)
@@ -160,6 +184,65 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
self.tryCalculate
)
+ # connect partner skill preset buttons
+ self.partnerSkillPresetButton_awakenedIlith.clicked.connect(
+ self.applyPartnerPreset
+ )
+ self.partnerSkillPresetButton_awakenedEto.clicked.connect(
+ self.applyPartnerPreset
+ )
+ self.partnerSkillPresetButton_awakenedLuna.clicked.connect(
+ self.applyPartnerPreset
+ )
+ self.partnerSkillPresetButton_amaneBelowEx.clicked.connect(
+ self.applyPartnerPreset
+ )
+ self.partnerSkillPresetButton_maya.clicked.connect(self.applyPartnerPreset)
+
+ def openChartAndScoreInputDialog(self):
+ dialog = ChartAndScoreInputDialog(self)
+ dialog.scoreCommited.connect(
+ lambda: self.setPlayResultFromChartAndScoreInput(dialog)
+ )
+ dialog.show()
+
+ def setPlayResultFromChartAndScoreInput(self, dialog: ChartAndScoreInputDialog):
+ if score := dialog.score():
+ chart = dialog.chart()
+ self.calculate_toStep_playResultSpinBox.setValue(
+ float(calculate_play_rating(chart.constant / 10, score.score))
+ )
+ dialog.close()
+ dialog.deleteLater()
+ else:
+ return
+
+ def applyPartnerPreset(self):
+ if not self.sender():
+ return
+
+ objectName = self.sender().objectName()
+
+ if not objectName:
+ return
+
+ formatString = "partnerSkillPresetButton_{}"
+ if objectName == formatString.format("awakenedIlith"):
+ pb = AwakenedIlithPartnerBonus
+ elif objectName == formatString.format("awakenedEto"):
+ pb = AwakenedEtoPartnerBonus
+ elif objectName == formatString.format("awakenedLuna"):
+ pb = AwakenedLunaPartnerBonus
+ elif objectName == formatString.format("amaneBelowEx"):
+ pb = AmaneBelowExPartnerBonus
+ elif objectName == formatString.format("maya"):
+ pb = MayaPartnerBonus
+ else:
+ return
+
+ self.partnerSkillStepBonusLineEdit.setText(str(pb.step_bonus))
+ self.partnerSkillFinalMultiplierLineEdit.setText(str(pb.final_multiplier))
+
def toStepPlayResult(self):
return PlayResult(
play_rating=self.calculate_toStep_playResultSpinBox.value(),
@@ -177,6 +260,8 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
partnerBonus.final_multiplier
return partnerBonus
except Exception:
+ if self.detailedLogOutputCheckBox.isChecked():
+ logger.exception("Cannot parse PartnerBonus input")
return PartnerBonus()
return PartnerBonus()
@@ -220,7 +305,8 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
)
self.calculate_toStep_resultLabel.setText(f"{step}
({stepOriginal})")
except Exception:
- logger.exception("Cannot calculate toStep")
+ if self.detailedLogOutputCheckBox.isChecked():
+ logger.exception("Cannot calculate toStep")
self.calculate_toStep_resultLabel.setText("...")
# fromStep
@@ -236,5 +322,6 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
)
)
except Exception:
- logger.exception("Cannot calculate fromStep")
+ if self.detailedLogOutputCheckBox.isChecked():
+ logger.exception("Cannot calculate fromStep")
self.calculate_fromStep_resultLabel.setText("...")
diff --git a/ui/resources/lang/en_US.ts b/ui/resources/lang/en_US.ts
index 9f557fb..d4d3b5a 100644
--- a/ui/resources/lang/en_US.ts
+++ b/ui/resources/lang/en_US.ts
@@ -755,7 +755,7 @@ validation
tab.stepCalculator
-
+ Step Calculator
@@ -1021,7 +1021,7 @@ validation
detailedLogOutput
-
+ Detailed log output
diff --git a/ui/resources/lang/zh_CN.ts b/ui/resources/lang/zh_CN.ts
index 17509fb..a5c7b0f 100644
--- a/ui/resources/lang/zh_CN.ts
+++ b/ui/resources/lang/zh_CN.ts
@@ -754,7 +754,7 @@
tab.stepCalculator
-
+ 步数计算器
@@ -1020,7 +1020,7 @@
detailedLogOutput
-
+ 详细日志输出