1+ from datetime import datetime
2+
3+ import numpy as np
4+
5+ from module .base .decorator import cached_property
16from module .campaign .campaign_base import CampaignBase
27from module .campaign .run import CampaignRun
38from module .combat .assets import BATTLE_PREPARATION
9+ from module .combat .emotion import Emotion
410from module .equipment .assets import *
511from module .equipment .equipment import Equipment
612from module .exception import CampaignEnd
@@ -63,15 +69,51 @@ def handle_combat_low_emotion(self):
6369 raise CampaignEnd ('Emotion withdraw' )
6470
6571
72+ class GemsEmotion (Emotion ):
73+ def check_reduce (self , battle ):
74+ """
75+ Override Emotion.check_reduce to trigger stop condition when emotion is too low before battle.
76+ """
77+ method = self .config .Fleet_FleetOrder
78+ if method == 'fleet1_all_fleet2_standby' :
79+ battle = (battle , 0 )
80+ elif method == 'fleet1_standby_fleet2_all' :
81+ battle = (0 , battle )
82+
83+ battle = tuple (np .array (battle ) * self .reduce_per_battle_before_entering )
84+ logger .info (f'Expect emotion reduce: { battle } ' )
85+
86+ self .update ()
87+ self .record ()
88+ self .show ()
89+ recovered = max ([f .get_recovered (b ) for f , b in zip (self .fleets , battle )])
90+ if recovered > datetime .now ():
91+ self .config .GEMS_EMOTION_TRIGGERED = True
92+ raise CampaignEnd ('Emotion control' )
93+
94+ def wait (self , fleet_index ):
95+ """
96+ Override Emotion.wait to trigger stop condition when emotion is too low after battle.
97+ """
98+ self .update ()
99+ self .record ()
100+ self .show ()
101+ fleet = self .fleets [fleet_index - 1 ]
102+ recovered = fleet .get_recovered (expected_reduce = self .reduce_per_battle )
103+ if recovered > datetime .now ():
104+ self .config .GEMS_EMOTION_TRIGGERED = True
105+
106+
66107class GemsFarming (CampaignRun , Dock ):
67108 def load_campaign (self , name , folder = 'campaign_main' ):
68109 super ().load_campaign (name , folder )
69110
70111 class GemsCampaign (GemsCampaignOverride , self .module .Campaign ):
71- pass
112+ @cached_property
113+ def emotion (self ):
114+ return GemsEmotion (config = self .config )
72115
73116 self .campaign = GemsCampaign (device = self .campaign .device , config = self .campaign .config )
74- self .campaign .config .override (Emotion_Mode = 'ignore' )
75117 self .campaign .config .override (EnemyPriority_EnemyScaleBalanceWeight = 'S1_enemy_first' )
76118
77119 @property
@@ -97,6 +139,8 @@ def max_level(self):
97139 def min_emotion (self ):
98140 return (2 + self .campaign ._map_battle ) * self .campaign .emotion .reduce_per_battle
99141
142+ _new_fleet_emotion = 0
143+
100144 @property
101145 def fleet_to_attack_index (self ):
102146 if self .config .Fleet_FleetOrder == 'fleet1_standby_fleet2_all' :
@@ -209,13 +253,15 @@ def flagship_change_execute(self):
209253 candidate = self .get_common_rarity_cv ()
210254 if candidate :
211255 ship = max (candidate , key = lambda s : (s .level , s .emotion ))
256+ self ._new_fleet_emotion = min (ship .emotion , self ._new_fleet_emotion ) if self ._new_fleet_emotion else ship .emotion
212257 self .dock_select_one (ship .button )
213258 self .dock_reset ()
214259 self .dock_select_confirm (check_button = page_fleet .check_button )
215260 logger .info ('Change flagship success' )
216261 return True
217262
218263 logger .info ('Change flagship failed, no CV in common rarity.' )
264+ self ._new_fleet_emotion = 0
219265 self .dock_reset ()
220266 self .ui_leave_ship ()
221267 return False
@@ -315,13 +361,15 @@ def vanguard_change_execute(self):
315361 candidate = self .get_common_rarity_dd (min_emotion = self .min_emotion )
316362 if candidate :
317363 ship = max (candidate , key = lambda s : s .emotion )
364+ self ._new_fleet_emotion = min (ship .emotion , self ._new_fleet_emotion ) if self ._new_fleet_emotion else ship .emotion
318365 self .dock_select_one (ship .button )
319366 self .dock_reset ()
320367 self .dock_select_confirm (check_button = page_fleet .check_button )
321368 logger .info ('Change vanguard success' )
322369 return True
323370
324371 logger .info ('Change vanguard failed, no DD in common rarity.' )
372+ self ._new_fleet_emotion = 0
325373 self .dock_reset ()
326374 self .ui_leave_ship ()
327375 return False
@@ -364,7 +412,7 @@ def triggered_stop_condition(self, oil_check=True):
364412 logger .hr ('TRIGGERED LV32 LIMIT' )
365413 return True
366414
367- if self .campaign .map_is_auto_search and self . campaign . config .GEMS_EMOTION_TRIGGERED :
415+ if self .campaign .config .GEMS_EMOTION_TRIGGERED :
368416 self ._trigger_emotion = True
369417 logger .hr ('TRIGGERED EMOTION LIMIT' )
370418 return True
@@ -388,17 +436,23 @@ def run(self, name, folder='campaign_main', mode='normal', total=0):
388436 try :
389437 super ().run (name = name , folder = folder , total = total )
390438 except CampaignEnd as e :
391- if e .args [0 ] == 'Emotion withdraw' :
439+ if "Emotion" in e .args [0 ]:
392440 self ._trigger_emotion = True
393441 else :
394442 raise e
395443
396444 # End
397445 if self ._trigger_lv32 or self ._trigger_emotion :
446+ self ._new_fleet_emotion = 150
398447 success = self .flagship_change ()
399448 if self .change_vanguard :
400449 success = success and self .vanguard_change ()
401450
451+ if self .fleet_to_attack == 2 :
452+ self .campaign .config .set_record (Emotion_Fleet2Value = self ._new_fleet_emotion )
453+ else :
454+ self .campaign .config .set_record (Emotion_Fleet1Value = self ._new_fleet_emotion )
455+
402456 if is_limit and self .config .StopCondition_RunCount <= 0 :
403457 logger .hr ('Triggered stop condition: Run count' )
404458 self .config .StopCondition_RunCount = 0
0 commit comments