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' :
@@ -206,13 +250,15 @@ def flagship_change_execute(self):
206250 candidate = self .get_common_rarity_cv ()
207251 if candidate :
208252 ship = max (candidate , key = lambda s : (s .level , s .emotion ))
253+ self ._new_fleet_emotion = min (ship .emotion , self ._new_fleet_emotion ) if self ._new_fleet_emotion else ship .emotion
209254 self .dock_select_one (ship .button )
210255 self .dock_reset ()
211256 self .dock_select_confirm (check_button = page_fleet .check_button )
212257 logger .info ('Change flagship success' )
213258 return True
214259
215260 logger .info ('Change flagship failed, no CV in common rarity.' )
261+ self ._new_fleet_emotion = 0
216262 self .dock_reset ()
217263 self .ui_leave_ship ()
218264 return False
@@ -312,13 +358,15 @@ def vanguard_change_execute(self):
312358 candidate = self .get_common_rarity_dd (min_emotion = self .min_emotion )
313359 if candidate :
314360 ship = max (candidate , key = lambda s : s .emotion )
361+ self ._new_fleet_emotion = min (ship .emotion , self ._new_fleet_emotion ) if self ._new_fleet_emotion else ship .emotion
315362 self .dock_select_one (ship .button )
316363 self .dock_reset ()
317364 self .dock_select_confirm (check_button = page_fleet .check_button )
318365 logger .info ('Change vanguard success' )
319366 return True
320367
321368 logger .info ('Change vanguard failed, no DD in common rarity.' )
369+ self ._new_fleet_emotion = 0
322370 self .dock_reset ()
323371 self .ui_leave_ship ()
324372 return False
@@ -361,7 +409,7 @@ def triggered_stop_condition(self, oil_check=True):
361409 logger .hr ('TRIGGERED LV32 LIMIT' )
362410 return True
363411
364- if self .campaign .map_is_auto_search and self . campaign . config .GEMS_EMOTION_TRIGGERED :
412+ if self .campaign .config .GEMS_EMOTION_TRIGGERED :
365413 self ._trigger_emotion = True
366414 logger .hr ('TRIGGERED EMOTION LIMIT' )
367415 return True
@@ -385,17 +433,23 @@ def run(self, name, folder='campaign_main', mode='normal', total=0):
385433 try :
386434 super ().run (name = name , folder = folder , total = total )
387435 except CampaignEnd as e :
388- if e .args [0 ] == 'Emotion withdraw' :
436+ if "Emotion" in e .args [0 ]:
389437 self ._trigger_emotion = True
390438 else :
391439 raise e
392440
393441 # End
394442 if self ._trigger_lv32 or self ._trigger_emotion :
443+ self ._new_fleet_emotion = 150
395444 success = self .flagship_change ()
396445 if self .change_vanguard :
397446 success = success and self .vanguard_change ()
398447
448+ if self .fleet_to_attack == 2 :
449+ self .campaign .config .set_record (Emotion_Fleet2Value = self ._new_fleet_emotion )
450+ else :
451+ self .campaign .config .set_record (Emotion_Fleet1Value = self ._new_fleet_emotion )
452+
399453 if is_limit and self .config .StopCondition_RunCount <= 0 :
400454 logger .hr ('Triggered stop condition: Run count' )
401455 self .config .StopCondition_RunCount = 0
0 commit comments