+ return `(self.crew, self.msgs)`
+
+class StandingsTable:
+ def __init__(self, use_puzzles=None, col_width=6):
+ if use_puzzles is None:
+ if opts.ship_duty:
+ use_puzzles=[
+ 'Navigating','Battle Navigation',
+ 'Gunning',
+ ['Sailing','Rigging'],
+ 'Bilging',
+ 'Carpentry',
+ 'Treasure Haul'
+ ]
+ else:
+ use_puzzles=puzzles
+ self._puzzles = use_puzzles
+ self.s = ''
+ self._cw = col_width-1
+
+ def _pline(self, pirate, puzstrs):
+ self.s += ' %-*s' % (max_pirate_namelen, pirate)
+ for v in puzstrs:
+ self.s += ' %-*.*s' % (self._cw,self._cw, v)
+ self.s += '\n'
+
+ def _puzstr(self, pi, puzzle):
+ if not isinstance(puzzle,list): puzzle = [puzzle]
+ try: standing = max([pi.standings[p] for p in puzzle])
+ except KeyError: return '?'
+ if not standing: return ''
+ s = ''
+ if self._cw > 4:
+ c1 = standingvals[standing][0]
+ if standing < 3: c1 = c1.lower() # 3 = Master
+ s += `standing`
+ if self._cw > 5:
+ s += ' '
+ s += '*' * (standing / 2)
+ s += '+' * (standing % 2)
+ return s
+
+ def headings(self):
+ def puzn_redact(name):
+ if isinstance(name,list):
+ return '/'.join(
+ ["%.*s" % (self._cw/2, puzn_redact(n))
+ for n in name])
+ spc = name.find(' ')
+ if spc < 0: return name
+ return name[0:min(4,spc)] + name[spc+1:]
+ self._pline('', map(puzn_redact, self._puzzles))
+ def literalline(self, line):
+ self.s += line + '\n'
+ def pirate(self, pi):
+ puzstrs = [self._puzstr(pi,puz) for puz in self._puzzles]
+ self._pline(pi.name, puzstrs)
+
+ def results(self):
+ return self.s
+
+def do_pirate(pirates, bu):
+ print '{'
+ for pirate in pirates:
+ info = PirateInfo(pirate)
+ print '%s: %s,' % (`pirate`, info)
+ print '}'
+
+def prep_crew_of(args, bu, max_age=300):
+ if len(args) != 1: bu('crew-of takes one pirate name')
+ pi = PirateInfo(args[0], max_age)
+ return CrewInfo(pi.crew[0], max_age)
+
+def do_crew_of(args, bu):
+ ci = prep_crew_of(args, bu)
+ print ci
+
+def do_standings_crew_of(args, bu):
+ ci = prep_crew_of(args, bu, 60)
+ tab = StandingsTable()
+ tab.headings()
+ for (rank, members) in ci.crew:
+ if not members: continue
+ tab.literalline('%s:' % rank)
+ for p in members:
+ pi = PirateInfo(p, random.randint(900,1800))
+ tab.pirate(pi)
+ print tab.results()