wip: TabTools_StepCalculator

This commit is contained in:
2023-09-20 01:30:58 +08:00
parent 39ede6eb44
commit 4b79428857
5 changed files with 806 additions and 212 deletions

View File

@ -1,3 +1,14 @@
import logging
from arcaea_offline.calculate.world_step import (
LegacyMapStepBooster,
MemoriesStepBooster,
PartnerBonus,
PlayResult,
calculate_play_rating_from_step,
calculate_step,
calculate_step_original,
)
from PySide6.QtCore import QEasingCurve, QObject, QSize, Qt, QTimeLine
from PySide6.QtGui import QIcon, QPainter, QPaintEvent, QPixmap
from PySide6.QtWidgets import (
@ -12,6 +23,8 @@ from ui.designer.tabs.tabTools.tabTools_StepCalculator_ui import (
Ui_TabTools_StepCalculator,
)
logger = logging.getLogger(__name__)
class MapTypeListWidgetWidget(QLabel):
def paintEvent(self, e: QPaintEvent) -> None:
@ -108,6 +121,120 @@ class TabTools_StepCalculator(Ui_TabTools_StepCalculator, QWidget):
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayRadioButton, 0)
self.mapTypeButtonGroup.addButton(self.mapTypeLegacyPlayPlusRadioButton, 1)
self.mapTypeButtonGroup.addButton(self.mapTypePlayRadioButton, 2)
self.mapTypeButtonGroup.idToggled.connect(self.stackedWidget.setCurrentIndex)
self.mapTypePlayRadioButton.setChecked(True)
self.legacyPlayPlusStaminaButtonGroup = QButtonGroup(self)
self.legacyPlayPlusStaminaButtonGroup.addButton(
self.legacyPlayPlus_x2StaminaRadioButton, 2
)
self.legacyPlayPlusStaminaButtonGroup.addButton(
self.legacyPlayPlus_x4StaminaRadioButton, 4
)
self.legacyPlayPlusStaminaButtonGroup.addButton(
self.legacyPlayPlus_x6StaminaRadioButton, 6
)
self.legacyPlayPlus_x2StaminaRadioButton.setChecked(True)
self.legacyPlayPlusFragmentsButtonGroup = QButtonGroup(self)
self.legacyPlayPlusFragmentsButtonGroup.addButton(
self.legacyPlayPlus_x11fragRadioButton, 100
)
self.legacyPlayPlusFragmentsButtonGroup.addButton(
self.legacyPlayPlus_x125fragRadioButton, 250
)
self.legacyPlayPlusFragmentsButtonGroup.addButton(
self.legacyPlayPlus_x15fragRadioButton, 500
)
self.mapTypeButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusStaminaButtonGroup.buttonToggled.connect(self.tryCalculate)
self.legacyPlayPlusFragmentsButtonGroup.buttonToggled.connect(self.tryCalculate)
self.play_memoryBoostCheckBox.toggled.connect(self.tryCalculate)
self.partnerStepValueSpinBox.valueChanged.connect(self.tryCalculate)
self.partnerSkillGroupBox.toggled.connect(self.tryCalculate)
self.partnerSkillStepBonusLineEdit.textChanged.connect(self.tryCalculate)
self.partnerSkillFinalMultiplierLineEdit.textChanged.connect(self.tryCalculate)
self.calculate_toStep_playResultSpinBox.valueChanged.connect(self.tryCalculate)
self.calculate_fromStep_targetStepSpinBox.valueChanged.connect(
self.tryCalculate
)
def toStepPlayResult(self):
return PlayResult(
play_rating=self.calculate_toStep_playResultSpinBox.value(),
partner_step=self.partnerStepValueSpinBox.value(),
)
def partnerBonus(self):
if self.partnerSkillGroupBox.isChecked():
try:
partnerBonus = PartnerBonus(
step_bonus=self.partnerSkillStepBonusLineEdit.text(),
final_multiplier=self.partnerSkillFinalMultiplierLineEdit.text(),
)
partnerBonus.step_bonus
partnerBonus.final_multiplier
return partnerBonus
except Exception:
return PartnerBonus()
return PartnerBonus()
def stepBooster(self):
if self.mapTypeButtonGroup.checkedId() == 1:
# Legacy Play+
stamina = self.legacyPlayPlusStaminaButtonGroup.checkedId()
if self.legacyPlayPlus_useFragmentsGroupBox.isChecked():
fragment = self.legacyPlayPlusFragmentsButtonGroup.checkedId()
fragment = fragment if fragment > -1 else None
else:
fragment = None
return None if stamina < 0 else LegacyMapStepBooster(stamina, fragment)
elif self.mapTypeButtonGroup.checkedId() == 2:
# General Music Play
if self.play_memoryBoostCheckBox.isChecked():
return MemoriesStepBooster()
else:
return None
else:
return None
def tryCalculate(self):
if self.partnerStepValueSpinBox.value() <= 0.0:
self.calculate_toStep_resultLabel.setText("...")
self.calculate_fromStep_resultLabel.setText("...")
return
# toStep
try:
playResult = self.toStepPlayResult()
partnerBonus = self.partnerBonus()
stepBooster = self.stepBooster()
stepOriginal = calculate_step_original(
playResult, partner_bonus=partnerBonus, step_booster=stepBooster
)
step = calculate_step(
playResult, partner_bonus=partnerBonus, step_booster=stepBooster
)
self.calculate_toStep_resultLabel.setText(f"{step}<br>({stepOriginal})")
except Exception:
logger.exception("Cannot calculate toStep")
self.calculate_toStep_resultLabel.setText("...")
# fromStep
try:
self.calculate_fromStep_resultLabel.setText(
str(
calculate_play_rating_from_step(
self.calculate_fromStep_targetStepSpinBox.value(),
self.partnerStepValueSpinBox.value(),
partner_bonus=partnerBonus,
step_booster=stepBooster,
)
)
)
except Exception:
logger.exception("Cannot calculate fromStep")
self.calculate_fromStep_resultLabel.setText("...")