Skip to content

Commit c3d1ce1

Browse files
authored
Merge pull request #246 from cc004/dev
Dev
2 parents 8254c06 + 8d14796 commit c3d1ce1

10 files changed

Lines changed: 116 additions & 36 deletions

File tree

autopcr/core/pcrclient.py

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -724,44 +724,55 @@ async def read_story(self, story_id: int):
724724
await self.story_check(story_id)
725725
return await self.story_view(story_id)
726726

727+
async def draw_fpc_story(self, period: eFpcPeriod, fpc_operation_type: eFpcOperationType):
728+
req = SubStoryFpcDrawStoryRequest()
729+
req.period = period
730+
req.fpc_operation_type = fpc_operation_type
731+
return await self.request(req)
732+
733+
async def read_fpc_story(self, sub_story_id: int):
734+
req = SubStoryFpcReadStoryRequest()
735+
req.sub_story_id = sub_story_id
736+
return await self.request(req)
737+
727738
async def read_ais_story(self, sub_story_id: int):
728739
req = SubStoryAisReadStoryRequest()
729740
req.sub_story_id = sub_story_id
730-
await self.request(req)
741+
return await self.request(req)
731742

732743
async def confirm_ais_story(self):
733744
req = SubStoryAisConfirmRequest()
734-
await self.request(req)
745+
return await self.request(req)
735746

736747
async def read_nyd_story(self, sub_story_id: int):
737748
req = SubStoryNydReadStoryRequest()
738749
req.sub_story_id = sub_story_id
739-
await self.request(req)
750+
return await self.request(req)
740751

741752
async def read_xac_story(self, sub_story_id: int):
742753
req = SubStoryXacReadStoryRequest()
743754
req.sub_story_id = sub_story_id
744-
await self.request(req)
755+
return await self.request(req)
745756

746757
async def read_asb_story(self, sub_story_id: int):
747758
req = SubStoryAsbReadStoryRequest()
748759
req.sub_story_id = sub_story_id
749-
await self.request(req)
760+
return await self.request(req)
750761

751762
async def read_wtm_story(self, sub_story_id: int):
752763
req = SubStoryWtmReadStoryRequest()
753764
req.sub_story_id = sub_story_id
754-
await self.request(req)
765+
return await self.request(req)
755766

756767
async def read_wts_story(self, sub_story_id: int):
757768
req = SubStoryWtsReadStoryRequest()
758769
req.sub_story_id = sub_story_id
759-
await self.request(req)
770+
return await self.request(req)
760771

761772
async def read_bmy_story(self, sub_story_id: int):
762773
req = SubStoryBmyReadStoryRequest()
763774
req.sub_story_id = sub_story_id
764-
await self.request(req)
775+
return await self.request(req)
765776

766777
async def put_mme_piece(self, sub_story_id: int):
767778
req = SubStoryMmePutPieceRequest()
@@ -776,66 +787,66 @@ async def read_mme_story(self, sub_story_id: int):
776787
async def read_xeh_story(self, sub_story_id: int):
777788
req = SubStoryXehReadStoryRequest()
778789
req.sub_story_id = sub_story_id
779-
await self.request(req)
790+
return await self.request(req)
780791

781792
async def read_lsv_story(self, sub_story_id: int):
782793
req = SubStoryLsvReadStoryRequest()
783794
req.sub_story_id = sub_story_id
784-
await self.request(req)
795+
return await self.request(req)
785796

786797
async def read_dsb_story(self, sub_story_id: int):
787798
req = SubStoryDsbReadStoryRequest()
788799
req.sub_story_id = sub_story_id
789-
await self.request(req)
800+
return await self.request(req)
790801

791802
async def read_ysn_story(self, sub_story_id: int):
792803
req = SubStoryYsnReadStoryRequest()
793804
req.sub_story_id = sub_story_id
794-
await self.request(req)
805+
return await self.request(req)
795806

796807
async def read_nop_story(self, sub_story_id: int):
797808
req = SubStoryNopReadStoryRequest()
798809
req.sub_story_id = sub_story_id
799-
await self.request(req)
810+
return await self.request(req)
800811

801812
async def read_mhp_story(self, sub_story_id: int):
802813
req = SubStoryMhpReadStoryRequest()
803814
req.sub_story_id = sub_story_id
804-
await self.request(req)
815+
return await self.request(req)
805816

806817
async def read_svd_story(self, sub_story_id: int):
807818
req = SubStorySvdReadStoryRequest()
808819
req.sub_story_id = sub_story_id
809-
await self.request(req)
820+
return await self.request(req)
810821

811822
async def read_ssp_story(self, sub_story_id: int):
812823
req = SubStorySspReadSspStoryRequest()
813824
req.sub_story_id = sub_story_id
814-
await self.request(req)
825+
return await self.request(req)
815826

816827
async def read_ske_story(self, sub_story_id: int):
817828
req = SubStorySkeReadStoryRequest()
818829
req.sub_story_id = sub_story_id
819-
await self.request(req)
830+
return await self.request(req)
820831

821832
async def read_dvs_story(self, sub_story_id: int):
822833
req = SubStoryDvsReadStoryRequest()
823834
req.sub_story_id = sub_story_id
824-
await self.request(req)
835+
return await self.request(req)
825836

826837
async def read_won_story(self, sub_story_id: int):
827838
req = SubStoryWonReadStoryRequest()
828839
req.sub_story_id_list = [sub_story_id]
829-
await self.request(req)
840+
return await self.request(req)
830841

831842
async def confirm_ske_story(self):
832843
req = SubStorySkeConfirmRequest()
833-
await self.request(req)
844+
return await self.request(req)
834845

835846
async def read_lto_story(self, sub_story_id: int):
836847
req = SubStoryLtoReadStoryRequest()
837848
req.sub_story_id = sub_story_id
838-
await self.request(req)
849+
return await self.request(req)
839850

840851
async def read_hatsune_dear(self, event_id: int, story_id: int):
841852
req = HatsuneDearFinishRequest()

autopcr/db/database.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,14 @@ def hatsune_item(self) -> Dict[int, HatsuneItem]:
12031203
.to_dict(lambda x: x.event_id, lambda x: x)
12041204
)
12051205

1206+
@lazy_property
1207+
def fpc_story_data(self) -> Dict[int, FpcStoryDatum]:
1208+
with self.dbmgr.session() as db:
1209+
return (
1210+
FpcStoryDatum.query(db)
1211+
.to_dict(lambda x: x.sub_story_id, lambda x: x)
1212+
)
1213+
12061214
@lazy_property
12071215
def ais_story_data(self) -> Dict[int, AisStoryDatum]:
12081216
with self.dbmgr.session() as db:

autopcr/model/handlers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,9 @@ async def update(self, mgr: datamgr, request):
727727
if self.rewards:
728728
for reward in self.rewards:
729729
mgr.update_inventory(reward)
730+
if self.exchange_rewards:
731+
for reward in self.exchange_rewards:
732+
mgr.update_inventory(reward)
730733

731734
@handles
732735
class SubStoryAisReadStoryResponse(responses.SubStoryAisReadStoryResponse):

autopcr/module/accountmgr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def __init__(self, parent: 'AccountManager', qid: str, account: str, readonly: b
7777
self.qq = qid
7878
self.alias = account
7979
self.token = f"{self.qq}_{self.alias}"
80-
super().__init__(self.data.config)
80+
super().__init__(deepcopy(self.data.config))
8181

8282
async def _do_aenter(self):
8383
if not self.readonly:

autopcr/module/modules/autosweep.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
@conditional_execution1("lazy_sweep_run_time", ["n庆典"])
1515
@singlechoice("lazy_sweep_strategy", "刷取策略", "刷最缺", ["刷最缺", "均匀刷"])
1616
@UnitListConfig('lazy_sweep_consider_units', "考虑角色")
17-
@description('根据【刷图推荐】结果刷n图,均匀刷指每次刷取的图覆盖所缺的需求装备,若无缺装备则刷取推荐的第一张图')
17+
@description('根据【刷图推荐】结果刷n图,均匀刷指每次刷取的图覆盖所缺的需求装备,无缺装备则停止刷')
1818
@name('懒人刷n图')
1919
@default(False)
2020
@tag_stamina_consume

autopcr/module/modules/caravan.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -381,15 +381,22 @@ def process_effect_turn(self):
381381
for effect in self.get_effect():
382382
effect.exec_count = 0
383383

384-
def is_effect_execable(self, effect: eBuddyEffectType) -> bool:
385-
buddys = self.get_effect(effect)
384+
def is_dice_retryable(self) -> bool:
385+
buddys = self.get_effect(eBuddyEffectType.RETRY)
386386
for buddy in buddys:
387387
if not buddy.exec_count:
388388
buddy.exec_count = 0
389389
if buddy.exec_count < db.caravan_buddy[buddy.buddy_id].effect_value_1:
390390
return True
391391
return False
392392

393+
def is_effect_exist(self, effect: eBuddyEffectType) -> bool:
394+
buddys = self.get_effect(effect)
395+
for buddy in buddys:
396+
if buddy.turn > 0:
397+
return True
398+
return False
399+
393400
def exec_effect(self, effect: eBuddyEffectType) -> int:
394401
buddys = self.get_effect(effect)
395402
for buddy in buddys:
@@ -563,7 +570,7 @@ async def update_rival_info(self, rival_info: RivalInfo):
563570

564571
assert isinstance(self.rival_info, RivalInfo), "rival_info must be an instance of RivalInfo"
565572
self.rival_info.block_id = rival_info.after_block_id
566-
self._log(f"若菜掷出了{rival_info.spots},到达格子 {self.rival_info.block_id}")
573+
self._log(f"若菜掷出了{rival_info.spots_list},到达格子 {self.rival_info.block_id}")
567574
if self.current_block_id == self.rival_info.block_id:
568575
self._log("若菜在当前格子,开始小游戏")
569576
self.state = eState.RIVAL_MINI_GAME
@@ -877,7 +884,7 @@ async def step(self):
877884

878885
elif self.state == eState.SELECT_RESULT:
879886
roll_num = self.dish_effect_manager.get_effect_influence_value(eDishEffectType.MULTI_DICE) or 1
880-
while not self.dish_effect_manager.is_dice_fix() and self.buddy_effect_manager.is_effect_execable(eBuddyEffectType.RETRY):
887+
while not self.dish_effect_manager.is_dice_fix() and self.buddy_effect_manager.is_dice_retryable():
881888
exec_count = self.buddy_effect_manager.exec_effect(eBuddyEffectType.RETRY)
882889
if sum(self.spots_list) >= 3 * roll_num:
883890
self._log(f"骰子结果 {self.spots_list} >= 3 * {roll_num}, 不低于期望,不重投")
@@ -910,7 +917,8 @@ async def step(self):
910917
if repeat_count:
911918
self._log(f"当前骰子结果 {self.spots_list}, 达到 {self.buddy_effect_manager.get_repeat_count()},停止投")
912919

913-
if self.buddy_effect_manager.is_effect_execable(eBuddyEffectType.SELECT_DICE_RESULT):
920+
if self.buddy_effect_manager.is_effect_exist(eBuddyEffectType.SELECT_DICE_RESULT) \
921+
or self.buddy_effect_manager.is_effect_exist(eBuddyEffectType.SELECT_FRONT_OR_BACK):
914922
choice = 1 + (self.spots_choices_1 < self.spots_choices_2)
915923
self._log(f"{self.spots_choices_1} vs {self.spots_choices_2},选择骰子结果 {choice}")
916924
await self.client.caravan_spots_choice(
@@ -1075,9 +1083,9 @@ async def do_task(self, client: pcrclient):
10751083
to_buy = Counter()
10761084
for item in limit_expend_items[:]:
10771085
coin = client.data.get_inventory((eInventoryType.Item, item.currency_id))
1078-
if coin < item.price:
1086+
if coin < cost + item.price:
10791087
if not rewards:
1080-
self._log(f"商店币不足{coin} < {item.price},无法购买 {db.get_inventory_name_san((item.reward_type, item.reward_id))}")
1088+
self._log(f"商店币不足{coin} < {cost + item.price},无法购买 {db.get_inventory_name_san((item.reward_type, item.reward_id))}及以后的物品")
10811089
break
10821090
if not is_enable_buy_bulk:
10831091
resp = await client.caravan_coin_shop_buy(

autopcr/module/modules/exequip.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ async def do_task(self, client: pcrclient):
9595
@default(True)
9696
@inttype('ex_equip_rank_max_num', '满突破个数', 5, list(range(-1, 51)))
9797
@MultiChoiceConfig('ex_equip_rank_up_kind', '合成种类', [], ['粉', '会战金', '普通金', '会战银'])
98-
@description('忽略已装备和锁定的EX装,满突破个数指同类满突破EX装超过阈值则不突破,-1表示不限制')
98+
@description('合成忽略已装备和锁定的EX装,满突破个数指同类满突破EX装超过阈值则不突破,-1表示不限制')
9999
class ex_equip_rank_up(Module):
100100
async def do_task(self, client: pcrclient):
101101
use_ex_equip = {ex_slot.serial_id: [unit.id, frame, ex_slot.slot]
@@ -120,7 +120,7 @@ async def do_task(self, client: pcrclient):
120120
.group_by(lambda ex: ex.ex_equipment_id) \
121121
.to_dict(lambda ex: ex.key, lambda ex: ex.to_list())
122122

123-
ex_equips_max_rank_cnt = Counter(flow(consider_ex_equips) \
123+
ex_equips_max_rank_cnt = Counter(flow(client.data.ex_equips.values()) \
124124
.where(lambda ex: ex.rank == db.get_ex_equip_max_rank(ex.ex_equipment_id)) \
125125
.group_by(lambda ex: ex.ex_equipment_id) \
126126
.to_dict(lambda ex: ex.key, lambda ex: ex.count()))

autopcr/module/modules/hatsune.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,14 @@ async def do_task(self, client: pcrclient):
164164
if is_abort: raise AbortError("")
165165
if is_skip: raise SkipError("")
166166

167-
@singlechoice("hatsune_gacha_strategy", "兑换策略", "全部兑换", ["前两轮尽早重置", "全部兑换"])
168-
@description('自动兑换,前两轮兑换处目标物品可选择重置')
167+
# @singlechoice("hatsune_gacha_strategy", "兑换策略", "全部兑换", ["全部兑换"])
168+
@description('自动兑换')
169169
@name('讨伐证交换')
170170
@default(True)
171171
class hatsune_gacha_exchange(Module):
172172
async def do_task(self, client: pcrclient):
173-
early_stop = False if self.get_config('hatsune_gacha_strategy') == "全部兑换" else True
173+
# early_stop = False if self.get_config('hatsune_gacha_strategy') == "全部兑换" else True
174+
early_stop = False
174175
event_active = False
175176

176177
for event in db.get_open_hatsune():

autopcr/module/modules/story.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ async def do_task(self, client: pcrclient):
188188
self._warn(f"暂不支持的活动{db.event_name[sub_storys.event_id]}")
189189
continue
190190

191+
if reader.special:
192+
await reader.special_read(sub_storys, self._log)
193+
continue
194+
191195
if any(sub_story.status == eEventSubStoryStatus.ADDED for sub_story in sub_storys.sub_story_info_list):
192196
await reader.confirm()
193197
for sub_story in sub_storys.sub_story_info_list:

autopcr/util/substory.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
from typing import Union
1+
from enum import IntEnum
2+
from typing import Callable, List, Union
3+
4+
from ..model.enums import eFpcOperationType, eFpcPeriod
5+
from ..model.enums import eEventSubStoryStatus
6+
7+
from .linq import flow
28
from ..core.pcrclient import pcrclient
39
from ..core.apiclient import apiclient
410
from ..model.common import EventSubStory
@@ -16,6 +22,7 @@ def decorator(cls):
1622
class SubStoryReader:
1723

1824
client: pcrclient
25+
special: bool = False
1926

2027
def is_readable(self, sub_story_id: int) -> bool:
2128
return True # it seems to be readable when it appear in the substory list
@@ -25,6 +32,7 @@ def is_puzzle_piece(self, sub_story_id: int) -> bool:
2532
def title(self, sub_story_id: int) -> str: ...
2633
async def read(self, sub_story_id: int): ...
2734
async def place_piece(self, sub_story_id: int): ...
35+
async def special_read(self, sub_storys: List[EventSubStory], _log: Callable): ...
2836
async def confirm(self): ...
2937

3038
def __init__(self, client: pcrclient):
@@ -35,6 +43,43 @@ def GetSubStoryReader(sub_story_data: EventSubStory, client: pcrclient) -> Union
3543
return constructor[sub_story_data.event_id](client)
3644
return None
3745

46+
@EventId(10140)
47+
class fpc_substory(SubStoryReader):
48+
special = True
49+
50+
def title(self, sub_story_id: int) -> str:
51+
return db.fpc_story_data[sub_story_id].title
52+
53+
async def read(self, sub_story_id: int):
54+
await self.client.read_fpc_story(sub_story_id)
55+
56+
async def special_read(self, sub_storys: EventSubStory, _log: Callable):
57+
all_ids = set(s.sub_story_id for s in sub_storys.sub_story_info_list)
58+
unread_ids = set(s.sub_story_id for s in sub_storys.sub_story_info_list if s.status == eEventSubStoryStatus.UNREAD)
59+
cnt = 0;
60+
last_period = eFpcPeriod.DAY
61+
for period in eFpcPeriod:
62+
unread_in_period = flow(unread_ids).where(lambda id: db.fpc_story_data[id].period == period).to_list()
63+
fpc_op = eFpcOperationType.DAY_NIGHT_CHANGE if last_period != period else eFpcOperationType.SKIP
64+
last_period = period
65+
for _ in range(80): # should not be more than 80 times
66+
if len(unread_in_period) == 0:
67+
break
68+
resp = await self.client.draw_fpc_story(period, fpc_op)
69+
fpc_op = eFpcOperationType.SKIP
70+
cnt += 1
71+
if resp.hit_sub_story_id in all_ids:
72+
if resp.hit_sub_story_id in unread_in_period:
73+
await self.read(resp.hit_sub_story_id)
74+
_log(f'阅读了{self.title(resp.hit_sub_story_id)}')
75+
unread_in_period.remove(resp.hit_sub_story_id)
76+
next((s for s in sub_storys.sub_story_info_list if s.sub_story_id == resp.hit_sub_story_id)).status = eEventSubStoryStatus.READED
77+
else:
78+
_log(f'80次未能完成故事阅读,下次再试吧')
79+
if cnt:
80+
_log(f'观看了{cnt}次表演')
81+
82+
3883
@EventId(10137)
3984
@EventId(10136)
4085
class ais_substory(SubStoryReader):

0 commit comments

Comments
 (0)