toontown-just-works/toontown/quest/QuestRewardCounter.py
2024-07-07 18:08:39 -05:00

150 lines
6.2 KiB
Python

from panda3d.core import *
from direct.directnotify import DirectNotifyGlobal
import Quests
from toontown.toonbase import ToontownGlobals
from toontown.fishing import FishGlobals
from toontown.suit import SuitDNA
from toontown.racing import RaceGlobals
from toontown.estate import GardenGlobals
from toontown.golf import GolfGlobals
class QuestRewardCounter:
notify = directNotify.newCategory('QuestRewardCounter')
def __init__(self):
self.reset()
def reset(self):
self.maxHp = 15
self.maxCarry = 20
self.maxMoney = 40
self.questCarryLimit = 1
self.teleportAccess = []
self.trackAccess = [0,
0,
0,
0,
1,
1,
0]
self.trackProgressId = -1
self.trackProgress = 0
def addTeleportAccess(self, zoneId):
if zoneId not in self.teleportAccess:
self.teleportAccess.append(zoneId)
def addTrackAccess(self, track):
self.trackAccess[track] = 1
def addTrackProgress(self, trackId, progressIndex):
if self.trackProgressId != trackId:
self.notify.warning('tried to update progress on a track toon is not training')
self.trackProgress = self.trackProgress | 1 << progressIndex
def getTrackProgress(self):
return (self.trackProgressId, self.trackProgress)
def clearTrackProgress(self):
self.trackProgressId = -1
self.trackProgress = 0
def setFromAvatar(self, av):
rewardIds = []
for q in av.quests:
questId, fromNpcId, toNpcId, rewardId, toonProgress = q
if rewardId == Quests.NA:
rewardId = Quests.getFinalRewardId(questId, fAll=1)
rewardIds.append(rewardId)
self.notify.debug('Ignoring rewards: %s' % rewardIds)
self.setRewardIndex(av.rewardTier, rewardIds, av.rewardHistory)
fishHp = int(len(av.fishCollection) / FishGlobals.FISH_PER_BONUS)
self.notify.debug('Adding %s hp for fish collection' % fishHp)
self.maxHp += fishHp
flowerHp = int(len(av.flowerCollection) / GardenGlobals.FLOWERS_PER_BONUS)
self.notify.debug('Adding %s hp for fish collection' % flowerHp)
self.maxHp += flowerHp
HQdepts = (ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.SellbotHQ), ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.LawbotHQ), ToontownGlobals.cogHQZoneId2deptIndex(ToontownGlobals.CashbotHQ))
levels = av.getCogLevels()
cogTypes = av.getCogTypes()
suitHp = 0
for dept in HQdepts:
level = levels[dept]
type = cogTypes[dept]
if type >= SuitDNA.suitsPerDept - 1:
for milestoneLevel in ToontownGlobals.CogSuitHPLevels:
if level >= milestoneLevel:
suitHp += 1
else:
break
self.notify.debug('Adding %s hp for cog suits' % suitHp)
self.maxHp += suitHp
kartingHp = int(av.kartingTrophies.count(1) / RaceGlobals.TrophiesPerCup)
self.notify.debug('Adding %s hp for karting trophies' % kartingHp)
self.maxHp += kartingHp
golfHp = int(av.golfTrophies.count(True) / GolfGlobals.TrophiesPerCup)
self.notify.debug('Adding %s hp for golf trophies' % golfHp)
self.maxHp += golfHp
def setRewardIndex(self, tier, rewardIds, rewardHistory):
self.reset()
for tierNum in xrange(tier):
for rewardId in Quests.getRewardsInTier(tierNum):
reward = Quests.getReward(rewardId)
reward.countReward(self)
self.notify.debug('Assigning reward %d' % rewardId)
for rewardId in rewardHistory:
if rewardId in Quests.getRewardsInTier(tier):
if rewardIds.count(rewardId) != 0:
rewardIds.remove(rewardId)
self.notify.debug('Ignoring reward %d' % rewardId)
else:
reward = Quests.getReward(rewardId)
reward.countReward(self)
self.notify.debug('Assigning reward %d' % rewardId)
self.notify.debug('Remaining rewardIds %s' % rewardIds)
self.maxHp = min(ToontownGlobals.MaxHpLimit, self.maxHp)
def assignReward(self, rewardId, rewardIds):
if rewardIds.count(rewardId) != 0:
rewardIds.remove(rewardId)
self.notify.debug('Ignoring reward %d' % rewardId)
else:
reward = Quests.getReward(rewardId)
reward.countReward(self)
self.notify.debug('Assigning reward %d' % rewardId)
def fixAvatar(self, av):
self.setFromAvatar(av)
anyChanged = 0
if self.maxHp != av.maxHp:
self.notify.info('Changed avatar %d to have maxHp %d instead of %d' % (av.doId, self.maxHp, av.maxHp))
av.b_setMaxHp(self.maxHp)
anyChanged = 1
if self.maxCarry != av.maxCarry:
self.notify.info('Changed avatar %d to have maxCarry %d instead of %d' % (av.doId, self.maxCarry, av.maxCarry))
av.b_setMaxCarry(self.maxCarry)
anyChanged = 1
if self.maxMoney != av.maxMoney:
self.notify.info('Changed avatar %d to have maxMoney %d instead of %d' % (av.doId, self.maxMoney, av.maxMoney))
av.b_setMaxMoney(self.maxMoney)
anyChanged = 1
if self.questCarryLimit != av.questCarryLimit:
self.notify.info('Changed avatar %d to have questCarryLimit %d instead of %d' % (av.doId, self.questCarryLimit, av.questCarryLimit))
av.b_setQuestCarryLimit(self.questCarryLimit)
anyChanged = 1
if self.teleportAccess != av.teleportZoneArray:
self.notify.info('Changed avatar %d to have teleportAccess %s instead of %s' % (av.doId, self.teleportAccess, av.teleportZoneArray))
av.b_setTeleportAccess(self.teleportAccess)
anyChanged = 1
if self.trackAccess != av.trackArray:
self.notify.info('Changed avatar %d to have trackAccess %s instead of %s' % (av.doId, self.trackAccess, av.trackArray))
av.b_setTrackAccess(self.trackAccess)
anyChanged = 1
if av.fixTrackAccess():
anyChanged = 1
return anyChanged