File size: 1,828 Bytes
025687f
 
 
 
 
 
 
 
 
 
 
 
 
b8aecdd
025687f
 
 
 
 
 
 
b8aecdd
025687f
b8aecdd
025687f
 
 
 
 
 
 
 
 
 
 
b8aecdd
025687f
 
 
 
b8aecdd
 
025687f
 
 
b8aecdd
 
 
025687f
b8aecdd
 
 
025687f
 
 
 
 
b8aecdd
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from typing import Dict

from luadata import unserialize

from base.buff import Buff
from base.skill import Skill


class Parser:
    def __init__(self, skills: Dict[str, Skill], buffs: Dict[str, Buff]):
        self.skills = skills
        self.buffs = buffs

        self.records = {}
        self.status = {}

        self.start_time = 0
        self.end_time = 0

    def parse_time(self, detail, timestamp):
        if detail[1]:
            self.start_time = int(timestamp)
        else:
            self.end_time = int(timestamp)
            return True

    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

        if skill not in self.records:
            self.records[skill] = {}
        status = tuple(
            (buff_id, buff_level, buff_stack) for (buff_id, buff_level), buff_stack in self.status.items()
        )
        if status not in self.records[skill]:
            self.records[skill][status] = []
        self.records[skill][status].append(int(timestamp) - self.start_time)

    def __call__(self, file_name):
        for line in open(file_name):
            row = line.split("\t")
            if row[4] == "5" and self.parse_time(unserialize(row[-1]), row[3]):
                break
            elif row[4] == "13":
                self.parse_buff(unserialize(row[-1]))
            elif row[4] == "21":
                self.parse_skill(unserialize(row[-1]), row[3])
        return self.records