"""Code for the hacking portion of the game."""
from hermes import *
import Leech
def hackBbs(bbsNumber):
instance.data.theirDrives = bbsNumber
instance.data.theirTotalMegs = bbsNumber * 7
instance.data.theirMegsLeft = instance.data.theirTotalMegs
instance.data.theirSoftwareStrength = bbsNumber
instance.data.theirBackupStrength = 1
instance.data.theirMoney = bbsNumber * 60
hack(userWonVsBbs, userLostVsBbs)
def userWonVsBbs():
print
print Style(fgGreen)(
'Their computer is FRIED!')
print Style(fgGreen)(
'And look, the BBS had a bank account with %s in it!' % (
formatCurrency(instance.data.theirMoney, 0)))
user.data.money += instance.data.theirMoney
user.data.drivesLeftToNextLevel -= instance.data.theirDrives
checkLevelUp()
def userLostVsBbs():
print
print Style(fgRed)('There goes your hard disk and half your money!')
print Style(fgRed)('Better luck next time...')
user.data.money /= 2
def hackUser(otherUser):
instance.data.otherUser = otherUser
instance.data.theirTotalMegs = otherUser.data.totalMegs
instance.data.theirMegsLeft = instance.data.theirTotalMegs
instance.data.theirSoftwareStrength \
= Leech.Software[otherUser.data.softwareType].strength
instance.data.theirBackupStrength \
= Leech.Backups[otherUser.data.backupType].strength
hack(userWonVsUser, userLostVsUser)
def userWonVsUser():
otherUser = instance.data.otherUser
print
print Style(fgGreen)(
'Their computer is FRIED!')
print Style(fgGreen)(
'And look, the user had %s on them!' % (
formatCurrency(otherUser.data.money, 0)))
user.data.money += otherUser.data.money
otherUser.data.money = 0
if user.data.level >= otherUser.data.level:
user.data.drivesLeftToNextLevel -= otherUser.data.level * 3
checkLevelUp()
else:
user.data.level, otherUser.data.level \
= otherUser.data.level, user.data.level
user.data.drivesLeftToNextLevel, otherUser.data.drivesLeftToNextLevel \
= otherUser.data.drivesLeftToNextLevel, \
user.data.drivesLeftToNextLevel
print
print Style(fgGreen)('You defeated a higher-level leech!')
print Style(fgGreen)('The LLL promotes you to level %d.' % (
user.data.level))
print Style(fgGreen)('The other user is demoted to level %d.' % (
otherUser.data.level))
if otherUser.data.softwareType > user.data.softwareType:
user.data.softwareType, otherUser.data.softwareType \
= otherUser.data.softwareType, user.data.softwareType
print
print Style(fgGreen)("You downloaded the other user's software!")
if otherUser.data.backupType > user.data.backupType:
user.data.backupType, otherUser.data.backupType \
= otherUser.data.backupType, user.data.backupType
print
print Style(fgGreen)("You stole the other user's backup method!")
def userLostVsUser():
otherUser = instance.data.otherUser
print
print Style(fgRed)('There goes your hard disk and ALL of your money!')
otherUser.data.money += user.data.money
user.data.money = 0
otherUser.data.drivesLeftToNextLevel -= user.data.level * 3
checkLevelUp(otherUser)
if user.data.softwareType > otherUser.data.softwareType:
user.data.softwareType, otherUser.data.softwareType \
= otherUser.data.softwareType, user.data.softwareType
print
print Style(fgRed)('The other user downloaded your software!')
if user.data.backupType > otherUser.data.backupType:
user.data.backupType, otherUser.data.backupType \
= otherUser.data.backupType, user.data.backupType
print
print Style(fgRed)('The other user stole your backup method!')
def hackLLL():
instance.data.theirTotalMegs = 360
instance.data.theirMegsLeft = instance.data.theirTotalMegs
instance.data.theirSoftwareStrength \
= Leech.Software[user.data.softwareType].strength
instance.data.theirBackupStrength \
= Leech.Backups[user.data.backupType].strength
hack(userWonVsLLL, userLostVsLLL, userLostVsLLL)
def userWonVsLLL():
print
print Style(fgGreen)("The LLL's computer is done for!")
print Style(fgGreen)('They enter you into the Leech Hall of Fame!')
print
print 'The game has been reset. Thanks for playing Leech!'
bbs.data.highScores.append(user.name, time.localtime())
for u in external.users:
u.deleteData()
instance.data.stillPlaying = False
def userLostVsLLL():
print
print Style(fgRed)('The LLL is very upset. You are demoted to level 30.')
print Style(fgRed)('Better luck next time...')
user.data.level = 30
user.data.drivesLeftToNextLevel = user.data.level * 10
instance.data.stillHacking = False
def checkLevelUp(u=user):
if u.data.drivesLeftToNextLevel > 0:
return
u.data.level += 1
u.data.totalMegs += 10
u.data.drivesLeftToNextLevel = u.data.level * 10
u.data.trojanHorses += 1
if u.data.trojanHorses < 0:
u.data.trojanHorses = 0
elif u.data.trojanHorses > 30:
u.data.trojanHorses = 30
u.data.fastBackups += 1
if u.data.fastBackups < 0:
u.data.fastBackups = 0
elif u.data.fastBackups > 30:
u.data.fastBackups = 30
if u == user:
instance.data.megsLeft += 10
print
print Style(fgGreen)(
'The LLL is pleased with your work. You are now level %d!' % (
u.data.level))
def disconnect():
print
print 'You unplug your modem before any more damage was done...'
instance.data.stillHacking = False
def backupFiles():
if user.data.fastBackups <= 0:
print
print Style(fgRed)(
'You are out of Fast Backups, the files are gone for good!')
return
user.data.fastBackups -= 1
megsRecovered \
= instance.randrange(1, 5) \
* Leech.Backups[user.data.backupType].strength
if megsRecovered >= user.data.totalMegs - instance.data.megsLeft:
allMegsRecovered = True
instance.data.megsLeft = user.data.totalMegs
else:
allMegsRecovered = False
instance.data.megsLeft += megsRecovered
print
print 'You run a backup program',
for i in range(5):
print '.',
time.sleep(0.5)
print
if allMegsRecovered:
print Style(fgGreen)('All of your megs were recovered!')
else:
print Style(fgGreen)('You recovered %d megs.' % (megsRecovered))
def trashFiles():
myAttackRoll = instance.randrange(1, 10)
theirMegsDestroyed \
= (Leech.Software[user.data.softwareType].strength * myAttackRoll) \
/ instance.data.theirBackupStrength
instance.data.theirMegsLeft -= theirMegsDestroyed
theirAttackRoll = instance.randrange(1, 10)
myMegsDestroyed \
= (instance.data.theirSoftwareStrength * theirAttackRoll) \
/ Leech.Backups[user.data.backupType].strength
instance.data.megsLeft -= myMegsDestroyed
print
if theirMegsDestroyed:
print Style(fgGreen)(
'You trash %s megs!' % (theirMegsDestroyed))
else:
print Style(fgRed)(
'You got line noise! None of their megs were destroyed.')
if myMegsDestroyed:
print Style(fgRed)(
'They purge %d megs!' % (myMegsDestroyed))
else:
print Style(fgGreen)(
'They deleted an EMPTY directory! None of your megs were destroyed.')
if instance.randrange(20) == 0:
bugMegs \
= instance.randrange(1, 5) \
* Leech.Software[user.data.softwareType].strength
instance.data.megsLeft -= bugMegs
print Style(fgRed)(
'There was a bug in your software! %d megs were destroyed.' % (
bugMegs))
def uploadTrojanHorse():
if user.data.trojanHorses <= 0:
print
print Style(fgRed)('You are out of Trojan Horses!')
return
user.data.trojanHorses -= 1
megsDestroyed \
= instance.randrange(1, 5) \
* Leech.Software[user.data.softwareType].strength
instance.data.theirMegsLeft -= megsDestroyed
print
print 'You upload a trojan horse',
for i in range(5):
print '.',
time.sleep(0.5)
print
print Style(fgGreen)(
'The idiot runs it! %d megs are trashed!' % (megsDestroyed))
def hack(wonFunc, lostFunc, disconnectFunc=disconnect):
"""Menu for the hacking portion of the game.
The wonFunc will be called if the user wins, lostFunc will be called
if the opponent wins.
If both sides have all of their megs destroyed, then user is
considered to have lost.
"""
print
print 'You begin to hack!'
instance.data.stillHacking = True
while instance.data.stillHacking:
print
print 'You have %d megs left.' % (instance.data.megsLeft)
print 'They have %d megs left.' % (instance.data.theirMegsLeft)
cmd = multipleChoicePrompt(
'[T]rash Files, [D]isconnect, [U]pload Trojan or [B]ackup Files: ',
choiceList={
'T': ('Trash Files', trashFiles),
'D': ('Disconnect', disconnectFunc),
'U': ('Upload Trojan', uploadTrojanHorse),
'B': ('Backup Files', backupFiles),
})
cmd()
if instance.data.megsLeft <= 0:
lostFunc()
instance.data.stillHacking = False
instance.data.stillPlaying = False
elif instance.data.theirMegsLeft <= 0:
wonFunc()
instance.data.stillHacking = False