"""Utility functions, constants and style definitions for the Leech
game."""
import time
from hermes import *
HeaderStyle = Style(fgYellow)
NameStyle = Style(fgGreen)
ValueStyle = Style(fgMagenta)
BbsListNumberStyle = Style(fgLtGray)
BbsListNameStyle = Style(fgMagenta)
ModemStyle = Style(fgCyan)
class _LeechItem:
def __init__(self, name, value):
self.id = int(name)
s, p, n = value.split(',')
self.strength = int(s)
self.price = int(p)
self.name = n.strip()
self.priceString = formatCurrency(self.price, 0)
self.salePrice = self.price / 2
self.salePriceString = formatCurrency(self.salePrice, 0)
Backups = loadStringList(
'BackupTypes',
nameDecoder=lambda n: int(n),
valueDecoder=lambda n,v: _LeechItem(n, v))
Software = loadStringList(
'SoftwareTypes',
nameDecoder=lambda n: int(n),
valueDecoder=lambda n,v: _LeechItem(n, v))
class _LeechBbs:
def __init__(self, value):
pn, n = value.split(',', 1)
self.phoneNumber = pn.strip()
self.name = n.strip()
BbsList = loadStringList(
'BbsList',
nameDecoder=lambda n: int(n),
valueDecoder=lambda n,v: _LeechBbs(v))
def printBulletin(byline=None, text=None):
if byline is None:
byline = bbs.data.lllBulletinByline
if text is None:
text = bbs.data.lllBulletin
print HeaderStyle('=' * 72)
print 'LLL Bulletin by %s' % (byline)
print HeaderStyle('=' * 72)
print
print text
def printTopScores():
clearScreen()
print HeaderStyle('=' * 72)
print 'Top Scores'
print HeaderStyle('=' * 72)
print
if bbs.data.highScores:
for name, date in bbs.data.highScores[-10:]:
print ' %s won on %02d/%02d/%04d' % (
name, date[1], date[2], date[0])
else:
print ' No one has won yet. Maybe you will be the first?'
print
def printStats(u=user):
"""Print the given leech's statistics.
This function will not print `private' statistics if the requested
leech is not the currently playing leech.
@param u: The leech to print.
"""
if u == user:
megsLeft = instance.data.megsLeft
else:
megsLeft = u.data.totalMegs
stats = [
('Level:', u.data.level),
('Rank:', getUserRank(u)),
('Software:', Software[u.data.softwareType].name),
('Backup:', Backups[u.data.backupType].name),
('Megs left:', '%d (%d)' % (megsLeft, u.data.totalMegs)),
('Money:', formatCurrency(u.data.money, 0)),
]
if u == user:
stats = stats + [
('Money in LLL account:', formatCurrency(u.data.moneyInBank, 0)),
('Calls to BBSs left:',
prefs.data.bbsCallsPerPlay - instance.data.bbsCalls),
('Calls to leeches left:',
prefs.data.leechCallsPerPlay - instance.data.leechCalls),
('Drives left to crash:', u.data.drivesLeftToNextLevel),
('Fast Backups left:', u.data.fastBackups),
('Trojan Horses left:', u.data.trojanHorses),
]
if u.sysop and prefs.data.unlimitedSysopPlay:
stats.append(
('Games left today:',
'Unlimited'))
else:
stats.append(
('Games left today:',
prefs.data.playsPerDay - u.data.playsToday))
clearScreen()
print HeaderStyle('=' * 72)
print u.name
print HeaderStyle('=' * 72)
for name, value in stats:
print '%s %s' % (
NameStyle('%-24s' % name), ValueStyle(str(value)))
def listLeeches():
"""Prints a list of all of the leeches registered with the game.
The leeches are ordered by rank. A pause is displayed every
screenful and the header is redrawn with each new screen.
"""
leechList = []
for u in external.users.values():
leechList.append({
'rank': getUserRank(u),
'name': u.name,
'level': u.data.level,
'last': u.data.lastTimePlayed,
})
leechList.sort(lambda a, b: a['rank'] - b['rank'])
for index, leech in enumerate(leechList):
if index % (user.screenHeight - 3) == 0:
if index > 0:
pausePrompt()
clearScreen()
print Style(fgLtGray)(
'Rank Leech Name Lvl Last Play ')
print HeaderStyle(
'==== ================================ === ==========')
print Style(fgLtGray)('#%(rank)3d' % leech),
print Style(fgCyan)('%(name)-32s' % leech),
print Style(fgCyan)('%(level)3d' % leech),
print Style(fgMagenta)('%02d/%02d/%04d' % (
leech['last'][1], leech['last'][2], leech['last'][0]))
def dialModem(phoneNumber, baudRate):
"""Pretends to dial the Leech Virtual Modem."""
print ModemStyle('ATDT%s' % (phoneNumber))
time.sleep(0.75)
print ModemStyle('<authentic modem sounds>')
time.sleep(0.75)
print ModemStyle('CONNECT %d' % (baudRate))
def hangupModem():
"""Terminates the call on our Leech Virtual Modem."""
time.sleep(0.5)
print ModemStyle('NO CARRIER')
def compareUsersByRank(u1, u2):
levelDiff = u1.data.level - u2.data.level
if levelDiff:
return levelDiff
softwareDiff = u1.data.softwareType - u2.data.softwareType
if softwareDiff:
return softwareDiff
backupDiff = u1.data.backupType - u2.data.backupType
if backupDiff:
return backupDiff
totalMoneyDiff \
= (u1.data.money + u1.data.moneyInBank) \
- (u2.data.money + u2.data.moneyInBank)
if totalMoneyDiff:
return totalMoneyDiff
return cmp(u1.data.firstTimePlayed, u2.data.firstTimePlayed)
def getUserRank(u=user):
users = external.users.values()
users.sort(compareUsersByRank)
users.reverse()
rank = users.index(u) + 1
return rank