Skip to content

Commit 96f048d

Browse files
committed
Add: emotion control for gems farming
1 parent e02154d commit 96f048d

1 file changed

Lines changed: 59 additions & 10 deletions

File tree

module/campaign/gems_farming.py

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from module.base.decorator import cached_property
12
from module.campaign.campaign_base import CampaignBase
23
from module.campaign.run import CampaignRun
34
from module.combat.assets import BATTLE_PREPARATION
5+
from module.combat.emotion import Emotion
46
from module.equipment.assets import *
57
from module.equipment.fleet_equipment import FleetEquipment
68
from module.exception import CampaignEnd, ScriptError
@@ -22,6 +24,32 @@
2224
SIM_VALUE = 0.92
2325

2426

27+
class GemsEmotion(Emotion):
28+
29+
def check_reduce(self, battle):
30+
"""
31+
Overwrite emotion.check_reduce()
32+
Check emotion before entering a campaign.
33+
34+
Args:
35+
battle (int): Battles in this campaign
36+
37+
Raise:
38+
CampaignEnd: Pause current task to prevent emotion control in the future.
39+
"""
40+
if not self.is_calculate:
41+
return
42+
43+
recovered, delay = self._check_reduce(battle)
44+
if delay:
45+
self.config.GEMS_EMOTION_TRIGGERED = True
46+
logger.info('Detect low emotion, pause current task')
47+
raise CampaignEnd('Emotion control')
48+
49+
def wait(self, fleet_index):
50+
pass
51+
52+
2553
class GemsCampaignOverride(CampaignBase):
2654

2755
def handle_combat_low_emotion(self):
@@ -73,12 +101,30 @@ def load_campaign(self, name, folder='campaign_main'):
73101
super().load_campaign(name, folder)
74102

75103
class GemsCampaign(GemsCampaignOverride, self.module.Campaign):
76-
pass
104+
@cached_property
105+
def emotion(self) -> GemsEmotion:
106+
return GemsEmotion(config=self.config)
77107

78108
self.campaign = GemsCampaign(device=self.campaign.device, config=self.campaign.config)
79-
self.campaign.config.override(Emotion_Mode='ignore')
109+
self.campaign.config.override(Emotion_Mode='ignore_calculate')
80110
self.campaign.config.override(EnemyPriority_EnemyScaleBalanceWeight='S1_enemy_first')
81111

112+
@property
113+
def emotion_lower_bound(self):
114+
return 4 + self.campaign._map_battle * 2
115+
116+
def get_emotion(self):
117+
if self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all':
118+
return self.campaign.config.Emotion_Fleet2Value
119+
else:
120+
return self.campaign.config.Emotion_Fleet1Value
121+
122+
def set_emotion(self, emotion):
123+
if self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all':
124+
self.campaign.config.set_record(Emotion_Fleet2Value=emotion)
125+
else:
126+
self.campaign.config.set_record(Emotion_Fleet1Value=emotion)
127+
82128
@property
83129
def change_vanguard(self):
84130
return 'ship' in self.config.GemsFarming_ChangeVanguard
@@ -150,7 +196,7 @@ def get_common_rarity_cv(self):
150196

151197
logger.hr('FINDING FLAGSHIP')
152198

153-
scanner = ShipScanner(level=(1, 31), emotion=(10, 150),
199+
scanner = ShipScanner(level=(1, 31), emotion=(self.emotion_lower_bound, 150),
154200
fleet=self.fleet_to_attack, status='free')
155201
scanner.disable('rarity')
156202

@@ -196,7 +242,7 @@ def get_common_rarity_cv(self):
196242

197243
def get_common_rarity_dd(self):
198244
"""
199-
Get a common rarity dd with level is 100 (70 for servers except CN) and emotion > 10
245+
Get a common rarity dd with level is 100 (70 for servers except CN) and emotion > self.emotion_lower_bound
200246
201247
_dock_reset() needs to be called later.
202248
@@ -228,7 +274,7 @@ def get_common_rarity_dd(self):
228274
else:
229275
max_level = 70
230276

231-
scanner = ShipScanner(level=(max_level, max_level), emotion=(10, 150),
277+
scanner = ShipScanner(level=(max_level, max_level), emotion=(self.emotion_lower_bound, 150),
232278
fleet=[0, self.fleet_to_attack], status='free')
233279
scanner.disable('rarity')
234280

@@ -301,8 +347,9 @@ def flagship_change_execute(self):
301347

302348
ship = self.get_common_rarity_cv()
303349
if ship:
304-
self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button)
305-
350+
target_ship = min(ship, key=lambda s: (s.level, -s.emotion))
351+
self.set_emotion(target_ship.emotion)
352+
self._ship_change_confirm(target_ship.button)
306353
logger.info('Change flagship success')
307354
return True
308355
else:
@@ -332,12 +379,14 @@ def vanguard_change_execute(self):
332379

333380
ship = self.get_common_rarity_dd()
334381
if ship:
335-
self._ship_change_confirm(max(ship, key=lambda s: s.emotion).button)
336-
382+
target_ship = max(ship, key=lambda s: s.emotion)
383+
self.set_emotion(min(self.get_emotion(), target_ship.emotion))
384+
self._ship_change_confirm(target_ship.button)
337385
logger.info('Change vanguard ship success')
338386
return True
339387
else:
340388
logger.info('Change vanguard ship failed, no DD in common rarity.')
389+
self.set_emotion(0) # a failure in vanguard change means low emotion DD, assuming 0.
341390
self._dock_reset()
342391
self.ui_back(check_button=page_fleet.check_button)
343392
return False
@@ -376,7 +425,7 @@ def run(self, name, folder='campaign_main', mode='normal', total=0):
376425
try:
377426
super().run(name=name, folder=folder, total=total)
378427
except CampaignEnd as e:
379-
if e.args[0] == 'Emotion withdraw':
428+
if e.args[0] in ['Emotion withdraw', 'Emotion control']:
380429
self._trigger_emotion = True
381430
else:
382431
raise e

0 commit comments

Comments
 (0)