StarRailCopilot/dev_tools/keywords/item.py
2024-05-28 00:51:16 +08:00

138 lines
4.3 KiB
Python

import typing as t
from dev_tools.keywords.base import GenerateKeyword, SHARE_DATA
from module.base.decorator import cached_property
from module.config.utils import deep_get
class GenerateItemBase(GenerateKeyword):
purpose_type = []
blacklist = []
def iter_items(self) -> t.Iterable[dict]:
for data in SHARE_DATA.ItemConfig.values():
item_id = data.get('ID', 0)
text_id = deep_get(data, keys='ItemName.Hash')
subtype = data.get('ItemSubType', 0)
rarity = data.get('Rarity', 0)
purpose = data.get('PurposeType', 0)
item_group = data.get('ItemGroup', 0)
yield dict(
text_id=text_id,
rarity=rarity,
item_id=item_id,
item_group=item_group,
dungeon_id=-1,
subtype=subtype,
purpose=purpose,
)
def iter_keywords(self) -> t.Iterable[dict]:
for data in self.iter_items():
if data['subtype'] == 'Material' and data['purpose'] in self.purpose_type:
if data['item_id'] in self.blacklist:
continue
data['dungeon_id'] = self.dict_itemid_to_dungeonid.get(data['item_id'], -1)
yield data
def iter_rows(self) -> t.Iterable[dict]:
for data in super().iter_rows():
data.pop('subtype')
data.pop('purpose')
yield data
@cached_property
def dict_itemid_to_dungeonid(self):
"""
MappingInfo is like
dungeon_id:
dungeon_level:
data
"""
dic = {}
for level_data in SHARE_DATA.MappingInfo.values():
# Use the highest level
# And must contain:
# "Type": "FARM_ENTRANCE",
# "FarmType": "COCOON",
for dungeon_data in level_data.values():
if dungeon_data.get('Type') != 'FARM_ENTRANCE':
continue
# parse
dungeon_id = dungeon_data.get('ID', 0)
for item_data in dungeon_data.get('DisplayItemList', []):
item_id = item_data.get('ItemID', 0)
if item_id < 100:
continue
dic.setdefault(item_id, dungeon_id)
return dic
class GenerateItemCurrency(GenerateItemBase):
output_file = './tasks/planner/keywords/item_currency.py'
# Leave 'Credit' and `Trailblaze_EXP`
whitelist = [2, 22]
def iter_keywords(self) -> t.Iterable[dict]:
for data in self.iter_items():
if data['subtype'] == 'Virtual' and data['item_id'] < 100:
if data['item_id'] not in self.whitelist:
continue
yield data
class GenerateItemExp(GenerateItemBase):
output_file = './tasks/planner/keywords/item_exp.py'
purpose_type = [1, 5, 6]
# 'Lost_Essence' is not available in game currently
blacklist = [234]
class GenerateItemAscension(GenerateItemBase):
output_file = './tasks/planner/keywords/item_ascension.py'
purpose_type = [2]
# 'Enigmatic_Ectostella' is not available in game currently
blacklist = [110400]
class GenerateItemTrace(GenerateItemBase):
output_file = './tasks/planner/keywords/item_trace.py'
purpose_type = [3]
# Can't farm Tears_of_Dreams
blacklist = [110101]
class GenerateItemWeekly(GenerateItemBase):
output_file = './tasks/planner/keywords/item_weekly.py'
purpose_type = [4]
class GenerateItemCalyx(GenerateItemBase):
output_file = './tasks/planner/keywords/item_calyx.py'
purpose_type = [7]
def iter_keywords(self) -> t.Iterable[dict]:
items = list(super().iter_keywords())
# Copy dungeon_id from green item to all items in group
dic_group_to_dungeonid = {}
for item in items:
dungeon = item['dungeon_id']
if dungeon > 0:
dic_group_to_dungeonid[item['item_group']] = dungeon
for item in items:
dungeon = dic_group_to_dungeonid[item['item_group']]
item['dungeon_id'] = dungeon
yield from items
def generate_items():
GenerateItemCurrency()()
GenerateItemExp()()
GenerateItemAscension()()
GenerateItemTrace()()
GenerateItemWeekly()()
GenerateItemCalyx()()