65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
import argparse
|
|
import collections
|
|
import re
|
|
|
|
from map_helpers import parse_map
|
|
|
|
if __name__=='__main__':
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("mapfile")
|
|
|
|
args = parser.parse_args()
|
|
M = parse_map(args.mapfile)
|
|
# Format of this map parsing
|
|
# dict(coordinates->mapkey)
|
|
grid = M["grid"]
|
|
# dict(mapkey->tilecontents)
|
|
dictionary = M["dictionary"]
|
|
# tilecontents are a list of atoms, path is first
|
|
|
|
lootdrop_path = "/obj/effect/spawner/lootdrop/maintenance"
|
|
area_path = "/area"
|
|
|
|
follow_up = set()
|
|
for key, atoms in dictionary.items():
|
|
#atom is a string
|
|
for atom in atoms:
|
|
if atom.startswith(lootdrop_path):
|
|
if(key in follow_up):
|
|
print("Hey, '{}' has multiple maintlootdrops...")
|
|
follow_up.add(key)
|
|
|
|
# Count the number of times each map key appears
|
|
appears = collections.Counter()
|
|
for coord, key in grid.items():
|
|
if key in follow_up:
|
|
appears[key] += 1
|
|
|
|
tally = collections.Counter()
|
|
for key in follow_up:
|
|
# Because I am a terrible person, and don't actually care about
|
|
# building a proper parser for this "object notation" that byond
|
|
# uses, I'm just going to cheat.
|
|
area = None
|
|
count = 0
|
|
|
|
for atom in dictionary[key]:
|
|
if atom.startswith(lootdrop_path):
|
|
amount = 1
|
|
mo = re.search(r'lootcount = (\d+)', atom)
|
|
if mo is not None:
|
|
amount = int(mo.group(1))
|
|
count += amount
|
|
|
|
elif atom.startswith(area_path):
|
|
area = atom
|
|
|
|
# Multiply by the number of times this model is used
|
|
tally[area] += (count * appears[key])
|
|
|
|
for area, total in tally.items():
|
|
print("{}: {}".format(area, total))
|
|
|
|
print("TOTAL: {}".format(sum(tally.values())))
|