Skip to content

Commit 2f327fd

Browse files
authored
Merge pull request #232 from lclbm/feat/unit-evolution
feat: unit evolution
2 parents db9e8cd + 965d610 commit 2f327fd

4 files changed

Lines changed: 119 additions & 0 deletions

File tree

‎autopcr/core/pcrclient.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,22 @@ async def multi_promotion(self, unit_id: int, target_promotion_level: int, equip
386386
) for equips in equip_recipe_list]
387387
return await self.request(req)
388388

389+
async def unit_multi_evolution(
390+
self,
391+
unit_id: int,
392+
current_rarity: int,
393+
after_rarity: int,
394+
current_gold_num: int,
395+
current_memory_piece_num: int,
396+
):
397+
req = UnitMultiEvolutionRequest()
398+
req.unit_id = unit_id
399+
req.current_rarity = current_rarity
400+
req.after_rarity = after_rarity
401+
req.current_gold_num = current_gold_num
402+
req.current_memory_piece_num = current_memory_piece_num
403+
return await self.request(req)
404+
389405
async def unit_free_promotion(self, unit_id: int, target_promotion_level: int):
390406
req = UnitFreePromotionRequest()
391407
req.unit_id = unit_id

‎autopcr/model/handlers.py‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,19 @@ async def update(self, mgr: datamgr, request):
11321132
mgr.ex_equips.pop(ex_serial_id, None)
11331133
mgr.ex_equips[request.serial_id].enhancement_pt = request.after_enhancement_pt
11341134

1135+
1136+
@handles
1137+
class UnitMultiEvolutionResponse(responses.UnitMultiEvolutionResponse):
1138+
async def update(self, mgr: datamgr, request: UnitMultiEvolutionRequest):
1139+
for u in self.unit_data_list or []:
1140+
mgr.unit[u.id] = u
1141+
if self.user_gold:
1142+
mgr.gold = self.user_gold
1143+
if self.item_data:
1144+
for item in self.item_data:
1145+
mgr.update_inventory(item)
1146+
1147+
11351148
# 菜 就别玩
11361149
def custom_dict(self, *args, **kwargs):
11371150
original_dict = super(TravelStartRequest, self).dict(*args, **kwargs)

‎autopcr/module/modules/__init__.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ class ModuleList:
162162
unit_memory_buy,
163163
unit_set_unique_equip_growth,
164164
unit_exceed,
165+
unit_evolution,
165166
]
166167
)
167168

‎autopcr/module/modules/unit.py‎

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,3 +1040,92 @@ async def do_task(self, client: pcrclient):
10401040
],
10411041
)
10421042
self._log(f"{self.unit_name}突破成功")
1043+
1044+
@description(
1045+
"批量角色升星"
1046+
"\n忽略盈余:默认只有在角色碎片完全盈余的条件下才可以进行升星,开启后可忽略盈余检查"
1047+
"\n升至最高星级:开启后会升级至填写的目标星级范围内的最大可升级星级"
1048+
)
1049+
@name("角色升星")
1050+
@unitlist("unit_evolution_units", "角色")
1051+
@singlechoice("unit_evolution_to_rarity", "目标星级", 5, range(2, 6))
1052+
@booltype("unit_evolution_to_max_rarity", "升至最高星级", False)
1053+
@booltype("unit_evolution_ignore_memory", "忽略盈余", False)
1054+
@default(False)
1055+
class unit_evolution(UnitController):
1056+
async def do_task(self, client: pcrclient):
1057+
self.client = client
1058+
unit_list = self.get_config("unit_evolution_units")
1059+
target_rarity = self.get_config("unit_evolution_to_rarity")
1060+
to_max_rarity = self.get_config("unit_evolution_to_max_rarity")
1061+
ignore_memory = self.get_config("unit_evolution_ignore_memory")
1062+
1063+
for unit_id in unit_list:
1064+
self.unit_id = int(unit_id)
1065+
if self.unit_id not in self.client.data.unit:
1066+
self._warn(f"未解锁角色{self.unit_name}")
1067+
continue
1068+
1069+
if self.unit.unit_rarity >= target_rarity:
1070+
self._warn(f"{self.unit_name}已到目标{target_rarity}星,无需升星")
1071+
continue
1072+
1073+
client = self.client
1074+
token = (eInventoryType.Item, self.memory_id)
1075+
required_dict = db.rarity_up_required[unit_id]
1076+
all_memory_demand = client.data.get_unit_memory_demand(self.unit_id)
1077+
memory_demand = {
1078+
i: sum(
1079+
required_dict[i][token]
1080+
for i in range(self.unit.unit_rarity + 1, i + 1)
1081+
)
1082+
for i in range(self.unit.unit_rarity + 1, target_rarity + 1)
1083+
}
1084+
rarity_memory_demand = memory_demand[target_rarity]
1085+
memory_inventory = client.data.get_inventory(token)
1086+
all_memory_gap = all_memory_demand - memory_inventory
1087+
1088+
if not ignore_memory and all_memory_gap > 0:
1089+
self._warn(
1090+
f"{self.unit_name}记忆碎片总需求{all_memory_demand},库存{memory_inventory},不满足升星条件"
1091+
)
1092+
continue
1093+
1094+
if not to_max_rarity and rarity_memory_demand > memory_inventory:
1095+
self._warn(
1096+
f"{self.unit_name}升至{target_rarity}星所需记忆碎片{rarity_memory_demand},库存{memory_inventory},不满足升星条件"
1097+
)
1098+
continue
1099+
1100+
min_memory_demand = min(memory_demand.values())
1101+
if min_memory_demand > memory_inventory:
1102+
self._warn(
1103+
f"{self.unit_name}碎片库存{memory_inventory},升星最低需要记忆碎片{min_memory_demand},不满足升星条件"
1104+
)
1105+
continue
1106+
1107+
to_rarity = min(
1108+
target_rarity,
1109+
max(k for k, v in memory_demand.items() if memory_inventory >= v),
1110+
)
1111+
if to_rarity != target_rarity:
1112+
self._log(
1113+
f"{self.unit_name}记忆碎片库存{memory_inventory},升级至{target_rarity}星需要{rarity_memory_demand}碎片"
1114+
f",最大可升级至{to_rarity}星"
1115+
)
1116+
1117+
# 1->2需要2w mana,2->3需要3w mana,以此类推
1118+
mana = sum(
1119+
10_000 * i for i in range(self.unit.unit_rarity + 1, to_rarity + 1)
1120+
)
1121+
if not await self.client.prepare_mana(mana): # 这点mana都没了吗
1122+
raise AbortError(f"mana不足,升星共需{mana}")
1123+
1124+
await client.unit_multi_evolution(
1125+
unit_id=self.unit_id,
1126+
current_rarity=self.unit.unit_rarity,
1127+
after_rarity=to_rarity,
1128+
current_gold_num=self.client.data.get_mana(),
1129+
current_memory_piece_num=memory_inventory,
1130+
)
1131+
self._log(f"{self.unit_name}升星至{to_rarity}星")

0 commit comments

Comments
 (0)