Formulator / parser.py
ango
04.09 commit
f0b1638
raw
history blame
2.45 kB
from typing import Dict
from base.buff import Buff
from base.skill import Skill
from utils.lua import parse
class Parser:
records: dict
status: dict
start_time: list
end_time: list
info_flag: bool
fight_flag: bool
school: int
def __init__(self, skills: Dict[str, Skill], buffs: Dict[str, Buff]):
self.skills = skills
self.buffs = buffs
def reset(self):
self.info_flag = True
self.fight_flag = False
self.records = {}
self.status = {}
self.start_time = []
self.end_time = []
def parse_info(self, detail):
if isinstance(detail, list):
self.info_flag = False
def parse_time(self, detail, timestamp):
if detail[1]:
self.start_time.append(int(timestamp))
self.records[self.start_time[-1]] = {}
self.fight_flag = True
else:
self.end_time.append(int(timestamp))
self.fight_flag = False
def parse_buff(self, detail):
buff_id, buff_stack, buff_level = detail[4], detail[5], detail[8]
if buff_id not in self.buffs:
return
if not buff_stack:
self.status.pop((buff_id, buff_level))
else:
self.status[(buff_id, buff_level)] = buff_stack
def parse_skill(self, detail, timestamp):
skill = detail[4], detail[5]
if skill[0] not in self.skills:
return
current_record = self.records[self.start_time[-1]]
if skill not in current_record:
current_record[skill] = {}
status = tuple(
(buff_id, buff_level, buff_stack) for (buff_id, buff_level), buff_stack in self.status.items()
)
if status not in current_record[skill]:
current_record[skill][status] = []
current_record[skill][status].append(int(timestamp) - self.start_time[-1])
def __call__(self, file_name):
self.reset()
for line in open(file_name):
row = line.split("\t")
if row[4] == "4" and self.info_flag:
self.parse_info(parse(row[-1]))
elif row[4] == "5":
self.parse_time(parse(row[-1]), row[3])
elif row[4] == "13":
self.parse_buff(parse(row[-1]))
elif row[4] == "21" and self.fight_flag:
self.parse_skill(parse(row[-1]), row[3])
return self.records