Forráskód Böngészése

updated the scraping to grab a few more things, and to use tuples instead of dicts in the feat, skill, and level lists

jmelesky 7 éve
szülő
commit
8ae1149a3d
2 módosított fájl, 199 hozzáadás és 19 törlés
  1. 186 10
      queryfeats.py
  2. 13 9
      scrapefeats.py

+ 186 - 10
queryfeats.py

@@ -2,14 +2,144 @@
 
 import pickle
 import pprint
+import re
+
+
+charsheet = {
+    'bab': 9,
+    'str': 20,
+    'dex': 14,
+    'con': 14,
+    'int': 14,
+    'wis': 10,
+    'cha': 10,
+    'level': [
+        ('fighter', 9)
+    ],
+    'feat': [
+        'toughness',
+        'armor proficiency, medium',
+        'power attack',
+        'combat stamina',
+        'improved unarmed strike',
+        'combat expertise',
+        'point blank shot',
+        'deadly aim',
+        'improved bull rush',
+        'improved overrun',
+        'improved trip',
+        'weapon focus',
+        'weapon focus with chosen weapon',
+        'weapon focus (greataxe)',
+        'weapon focus (glaive)',
+        'weapon focus with chosen melee weapon',
+        'weapon focus with selected weapon',
+        'weapon focus with the chosen weapon',
+        'weapon focus (any two-handed reach weapon)',
+        'weapon specialization',
+        'weapon specialization with selected weapon',
+        'improved critical',
+        'armor focus',
+        'proficiency with selected armor',
+        'medium armor proficiency',
+        'light armor proficiency',
+        'proficiency with light armor',
+        'proficiency with medium armor',
+        'armor training class feature',
+        'armor trainingclass feature',
+        'martial focus',
+        'weapon training class feature',
+        'combat reflexes',
+    ],
+    'skill': [
+        ('knowledge (arcane)', 9),
+        ('knowledge (dungeoneering)', 9),
+        ('knowledge (local)', 9),
+        ('knowledge (nature)', 9),
+        ('knowledge (planes)', 9),
+        ('knowledge (religion)', 9),
+        ('knowledge (engineering)', 1),
+        ('knowledge (geography)', 2),
+        ('knowledge (history)', 4),
+        ('acrobatics', 9),
+        ('climb', 3),
+        ('atealth', 1),
+        ('disable device', 1),
+        ('spellcraft', 1),
+        ('intimidate', 1),
+        ('use magic device', 1),
+        ('diplomacy', 1),
+        ('perception', 1),
+        ('linguistics', 4),
+        ('lore (divine battles)', 4),
+        ('art (anatomy)', 1),
+        ('perform (oratory)', 2),
+    ],
+}
+
 
 with open('feats.pickle', 'rb') as f:
     allfeats = pickle.load(f)
 
-prefeats = {}
 
-for f in allfeats:
-    if 'feat' in f['prereqs']:
+def texify(textstr):
+    textstr = re.sub(r'—', '\textemdash', textstr)
+    textstr = re.sub(r'"', "''", textstr)
+    return textstr
+
+
+def grabfeat(feats, featname):
+    for f in feats:
+        if f['name'].lower() == featname.lower():
+            return f
+
+def fillsreqs(pr, charsheet):
+    qual = True
+    for attr in ['str', 'dex', 'con', 'int', 'wis', 'cha', 'bab']:
+        if attr in pr:
+            if int(pr[attr]) > charsheet[attr]:
+                qual = False
+        if 'level' in pr:
+            for l in pr['level']:
+                print(l)
+                llqual = False
+                for ll in charsheet['level']:
+                    print(ll)
+                    if l[0] == ll[0] and int(l[1]) <= ll[1]:
+                        llqual = True
+                        break
+                if llqual == False:
+                    qual = False
+                    break
+        if 'skill' in pr:
+            for s in pr['skill']:
+                squal = False
+                for cs in charsheet['skill']:
+                    if s[0] == cs[0] and int(s[1]) <= cs[1]:
+                        csqual = True
+                        break
+                if csqual == False:
+                    qual = False
+                    break
+        return qual
+
+
+def qualfeat(feat, charsheet):
+    if feat['prereqs']:
+        return fillsreqs(feat['prereqs'], charsheet)
+    else:
+        return True
+
+
+
+
+def qualfeats(feats, charsheet):
+    return [f for f in feats if qualfeat(f, charsheet)]
+
+
+def prefeats(feats):
+    for f in allfeats:
+        prefeats = {}
         fs = f['prereqs']['feat']
         if isinstance(fs, list):
             for pf in fs:
@@ -17,14 +147,60 @@ for f in allfeats:
                     prefeats[pf] += 1
                 else:
                     prefeats[pf] = 1
-        else:
-            if fs in prefeats:
-                prefeats[fs] += 1
             else:
-                prefeats[fs] = 1
+                if fs in prefeats:
+                    prefeats[fs] += 1
+                else:
+                    prefeats[fs] = 1
+    return prefeats
+
+def asfeat(feat):
+    featsnip = '\subsubsection*{%s}\n\n' % feat['name']
+    featsnip += '\\textbf{Benefit:} %s\n\n' % feat['benefit']
+    if feat['trick']:
+        featsnip += '\\textbf{Combat Trick:} %s\n\n' % feat['trick']
+
+    if feat['special']:
+        featsnip += '\\textbf{Special:} %s\n\n' % feat['special']
+
+    return featsnip
+
+def aschainfeat(feat):
+    featsnip = '\item \\textbf{%s} %s\n\n' % (feat['name'], feat['benefit'])
+    if feat['trick']:
+        featsnip += '\\textbf{Combat Trick:} %s\n\n' % feat['trick']
+    if feat['special']:
+        featsnip += '\\textbf{Special:} %s\n\n' % feat['special']
+    return featsnip
+
+
+
+def chainfeats(feats):
+    chainsnip = '\begin{itemize}\n\n'
+    for f in feats:
+        chainsnip += aschainfeat(f)
+    chainsnip += '\end{itemize}'
+
+    return chainsnip
+
+
+if __name__ == '__main__':
+    sectsnip = ''
+    for f in sorted(charsheet['feat']):
+        ff = grabfeat(allfeats, f)
+        if ff:
+            sectsnip += asfeat(ff)
+    print(sectsnip)
+
+    sectsnip = ''
+
+
+# for f in allfeats:
+#     if 'skill' in f['prereqs']:
+#         pprint.pprint(f['prereqs']['skill'])
 
-outfeats = sorted(prefeats, key=lambda x: prefeats[x])
+# outfeats = sorted(prefeats, key=lambda x: prefeats[x])
 
-for of in outfeats:
-    print("%s, %s" % (of, prefeats[of]))
+# for of in outfeats:
+#     print("%s, %s" % (of, prefeats[of]))
 

+ 13 - 9
scrapefeats.py

@@ -43,7 +43,7 @@ def addreq(reqset, t, req):
             reqset[t] = [reqset[t]]
         reqset[t].append(req)
     else:
-        reqset[t] = req
+        reqset[t] = [req]
 
     return reqset
 
@@ -52,27 +52,31 @@ def parse_prereqs(reqtext, sep=r'[,;]'):
     reqs = {}
     for req in [sanitext(x).lower() for x in re.split(sep, reqtext)]:
         if req.find(' or ') > -1:
-            reqs = addreq(reqs, 'or', parse_prereqs(req, sep=' or '))
+            reqs = addreq(reqs, 'or', parse_prereqs(req, sep=r'\Wor\W'))
         elif req.find(' and ') > -1:
-            reqs = addreq(reqs, 'and', parse_prereqs(req, sep=' and '))
+            reqs = addreq(reqs, 'and', parse_prereqs(req, sep=r'\Wand\W'))
         else:
             m = re.search(r'^(\w{3}) (\d{2})$', req)
             if m:
                 reqs = addreq(reqs, m.group(1), m.group(2))
             else:
-                m = re.search(r'^base attack bonus \+(\d+)$', req)
+                m = re.search(r'^base\s+attack\s+bonus\s+\+{0,1}(\d+)$', req)
                 if m:
                     reqs = addreq(reqs, 'bab', m.group(1))
                 else:
-                    m = re.search(r'^(.*?) level (\d+)', req)
+                    m = re.search(r'^(.*?)\Wlevel (\d+)', req)
                     if m:
-                        reqs = addreq(reqs, 'level', {m.group(1): m.group(2)})
+                        reqs = addreq(reqs, 'level', (m.group(1), m.group(2)))
                     else:
-                        m = re.search(r'^(.*?) (\d+) rank', req)
+                        m = re.search(r'^(\d+).*level (.*)$', req)
                         if m:
-                            reqs = addreq(reqs, 'skill', {m.group(1): m.group(2)})
+                            reqs = addreq(reqs, 'level', (m.group(2), m.group(1)))
                         else:
-                            reqs = addreq(reqs, 'feat', req)
+                            m = re.search(r'^(.*?) (\d+) rank', req)
+                            if m:
+                                reqs = addreq(reqs, 'skill', (m.group(1), m.group(2)))
+                            else:
+                                reqs = addreq(reqs, 'feat', req)
 
 
     return reqs