/
parse_enchants.py
executable file
·102 lines (91 loc) · 2.71 KB
/
parse_enchants.py
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env python3
from enum import Enum
from fsm import FSM
# Exclude psalms, etc.
VALID_QUALITY=['primary','secondary','relic','morality']
class Enchant():
def __init__(self, name):
self.name = name # str
self.desc = None # str
self.desc_repl = None # str
self.slots = [] # [str, ...]
self.quality = None # str
self.groups = [] # [str, ...]
self.range = None # (low, high)
def __str__(self):
s = '<Enchant '+self.name+' '+str((self.desc,self.desc_repl,self.slots,self.quality,self.groups,self.range))+'>'
return s
_S = Enum('_S', 'TOP ITEMS ENCHANT, VALUES')
# Complex FSM actions
def capture_item(M,D):
D['items'][M[0]] = M[1].split(',')
def create_enchant(M,D):
D['temp'] = Enchant(M[0])
def translate_quality(M,D):
qual = M[0]
T = { 'godlike':'relic' }
if qual in T:
qual = T[qual]
D['temp'].quality = qual
def commit_enchant(M,D):
if D['temp'].quality in VALID_QUALITY:
D['enchants'].append(D['temp'])
return _S.TOP
def set_range(M,D):
D['temp'].range = float(M[0]), float(M[1])
def set_item(M,D):
if M[0]=='':
D['temp'].slots = []
else:
D['temp'].slots = M[0].split(',')
machine = {
_S.TOP: [
(r'Templates', lambda: _S.ITEMS),
(r'Enchantment', lambda: _S.ENCHANT),
(r'', None),
],
_S.ITEMS: [
(r'{', None),
(r'(.*)=(.*)', capture_item),
(r'}', lambda: _S.TOP),
],
_S.ENCHANT: [
(r'{', None),
(r'Name=(.*)', create_enchant),
(r'NameID=(.*)', lambda M,D: setattr(D['temp'],'desc',str.lower(M[0]))),
(r'Property=(.*)', lambda M,D: setattr(D['temp'],'desc_repl',M[0])),
(r'ArtifactTypes=(.*)', set_item),
(r'EnchantQuality=(.*)', translate_quality),
(r'Groups=(.*)', lambda M,D: setattr(D['temp'],'groups',M[0].split(','))),
(r'Values$', lambda: _S.VALUES),
(r'}', commit_enchant),
(r'.*', None),
],
_S.VALUES: [
(r'100=(.*),(.*)', set_range),
(r'(.*)=(.*),(.*)', None), # FIXME: item level interpolation is NYI (@100)
(r'}', lambda: _S.ENCHANT),
(r'.*', None),
]
}
def parse_enchants(file):
fsm = FSM(_S, _S.TOP, [_S.TOP], machine)
fsm.reset()
fsm.data = {'items':{}, 'enchants':[], 'temp': None}
#fsm.tracing(True)
while True:
rawline = file.readline()
if rawline=='':
fsm.terminate()
return fsm.data['items'], fsm.data['enchants']
line = rawline.strip()
fsm(line)
raise Exception('Unknown error: file parsing failed.')
if __name__=='__main__':
with open('enchantments.cfg') as f:
items,enchants = parse_enchants(f)
print(str(len(items))+' items counted')
print(str(len(enchants))+' items counted')
print(enchants[37])
print(enchants[79])
#print([_.name for _ in enchants].index('critical_hit_chance_major'))