Merge branch 'features/dan' into 'master'

Features/dan



See merge request !2
This commit is contained in:
Alexander Behrhof 2015-08-13 18:20:28 -04:00
commit 1ea800b4bd
79 changed files with 1616 additions and 12900 deletions

View file

@ -32,6 +32,7 @@ dclass Account {
string ACCOUNT_ID db; string ACCOUNT_ID db;
uint16 ACCESS_LEVEL db; uint16 ACCESS_LEVEL db;
uint32 LAST_LOGIN_TS db; uint32 LAST_LOGIN_TS db;
uint8[] CHAT_SETTINGS db;
}; };
struct BarrierData { struct BarrierData {
@ -237,6 +238,7 @@ from toontown.safezone import SafeZoneManager/AI
from toontown.tutorial import TutorialManager/AI from toontown.tutorial import TutorialManager/AI
from toontown.catalog import CatalogManager/AI from toontown.catalog import CatalogManager/AI
from toontown.safezone import DistributedTreasure/AI from toontown.safezone import DistributedTreasure/AI
from toontown.safezone import DistributedEFlyingTreasure/AI
from toontown.coghq import DistributedCashbotBossTreasure/AI from toontown.coghq import DistributedCashbotBossTreasure/AI
from toontown.building import DistributedTrophyMgr/AI from toontown.building import DistributedTrophyMgr/AI
from toontown.building import DistributedBuilding/AI from toontown.building import DistributedBuilding/AI
@ -1522,6 +1524,9 @@ dclass DistributedTreasure : DistributedObject {
setReject() broadcast; setReject() broadcast;
}; };
dclass DistributedEFlyingTreasure : DistributedTreasure {
};
dclass DistributedCashbotBossTreasure : DistributedTreasure { dclass DistributedCashbotBossTreasure : DistributedTreasure {
setGoonId(uint32) required broadcast ram; setGoonId(uint32) required broadcast ram;
setFinalPosition(int16/10, int16/10, int16/10) required broadcast ram; setFinalPosition(int16/10, int16/10, int16/10) required broadcast ram;
@ -3150,7 +3155,7 @@ dclass ClientServicesManager : DistributedObjectGlobal {
acceptLogin(uint32 timestamp); acceptLogin(uint32 timestamp);
requestAvatars() clsend; requestAvatars() clsend;
setAvatars(PotentialToon[]); setAvatars(uint8[], PotentialToon[]);
createAvatar(blob dna, uint8 index) clsend; createAvatar(blob dna, uint8 index) clsend;
createAvatarResp(uint32 avId); createAvatarResp(uint32 avId);
@ -3197,7 +3202,7 @@ dclass TTSFriendsManager : DistributedObjectGlobal {
goingOffline(uint32 avId); goingOffline(uint32 avId);
getAvatarDetails(uint32) clsend; getAvatarDetails(uint32) clsend;
friendDetails(uint32, blob, uint16[], uint16, int16, int16, uint32, uint32, blob, blob, int8[]); friendDetails(uint32, blob, uint16[], int16, int16, uint32, uint32, blob, blob, int8[]);
getPetDetails(uint32) clsend; getPetDetails(uint32) clsend;
petDetails(uint32, uint32, string, uint32, uint32, uint16/1000[], PetTrait[], int8[], uint32); petDetails(uint32, uint32, string, uint32, uint32, uint16/1000[], PetTrait[], int8[], uint32);

View file

@ -33,7 +33,8 @@ want-gifting #t
want-top-toons #f want-top-toons #f
# Chat: # Chat:
want-whitelist #t want-whitelist #f
want-sequence-list #f
# Developer options: # Developer options:
show-population #t show-population #t

View file

@ -1,12 +1,9 @@
from direct.directnotify import DirectNotifyGlobal from direct.directnotify import DirectNotifyGlobal
from direct.distributed import DistributedObject from direct.distributed import DistributedObject
from otp.ai.MagicWordGlobal import * from otp.ai.MagicWordGlobal import *
lastClickedNametag = None lastClickedNametag = None
class MagicWordManager(DistributedObject.DistributedObject): class MagicWordManager(DistributedObject.DistributedObject):
notify = DirectNotifyGlobal.directNotify.newCategory('MagicWordManager') notify = DirectNotifyGlobal.directNotify.newCategory('MagicWordManager')
neverDisable = 1 neverDisable = 1
@ -20,6 +17,9 @@ class MagicWordManager(DistributedObject.DistributedObject):
DistributedObject.DistributedObject.disable(self) DistributedObject.DistributedObject.disable(self)
def handleMagicWord(self, magicWord): def handleMagicWord(self, magicWord):
if not base.localAvatar.isAdmin():
return
if magicWord.startswith('~~'): if magicWord.startswith('~~'):
if lastClickedNametag == None: if lastClickedNametag == None:
target = base.localAvatar target = base.localAvatar
@ -32,6 +32,7 @@ class MagicWordManager(DistributedObject.DistributedObject):
targetId = target.doId targetId = target.doId
self.sendUpdate('sendMagicWord', [magicWord, targetId]) self.sendUpdate('sendMagicWord', [magicWord, targetId])
if target == base.localAvatar: if target == base.localAvatar:
response = spellbook.process(base.localAvatar, target, magicWord) response = spellbook.process(base.localAvatar, target, magicWord)
if response: if response:

View file

@ -116,16 +116,16 @@ class Avatar(Actor, ShadowCaster):
elif self.playerType not in (NametagGroup.CCNormal, NametagGroup.CCSpeedChat): elif self.playerType not in (NametagGroup.CCNormal, NametagGroup.CCSpeedChat):
self.understandable = 1 self.understandable = 1
self.setPlayerType(NametagGroup.CCNonPlayer) self.setPlayerType(NametagGroup.CCNonPlayer)
elif settings['trueFriends'] and base.localAvatar.isTrueFriends(self.doId): elif base.localAvatar.isTrueFriends(self.doId):
self.understandable = 2 self.understandable = 2
self.setPlayerType(NametagGroup.CCNormal) self.setPlayerType(NametagGroup.CCNormal)
elif settings['speedchatPlus']: elif base.cr.wantSpeedchatPlus():
self.understandable = 1 self.understandable = 1
self.setPlayerType(NametagGroup.CCSpeedChat) self.setPlayerType(NametagGroup.CCSpeedChat)
else: else:
self.understandable = 0 self.understandable = 0
self.setPlayerType(NametagGroup.CCSpeedChat) self.setPlayerType(NametagGroup.CCSpeedChat)
if hasattr(self, 'adminAccess') and self.isAdmin(): if base.cr.wantSpeedchatPlus() and hasattr(self, 'adminAccess') and self.isAdmin() and self != base.localAvatar:
self.understandable = 2 self.understandable = 2
if not hasattr(self, 'nametag'): if not hasattr(self, 'nametag'):
self.notify.warning('no nametag attributed, but would have been used') self.notify.warning('no nametag attributed, but would have been used')

View file

@ -29,7 +29,11 @@ class WhiteList:
return i != self.numWords and self.words[i].startswith(text) return i != self.numWords and self.words[i].startswith(text)
def getReplacement(self, text, av=None, garbler=None): def getReplacement(self, text, av=None, garbler=None):
return '\x01WLRed\x01%s\x02' % text if not garbler else garbler.garble(av, len(text.split(' '))) if av and av == base.localAvatar:
return '\x01WLDisplay\x01%s\x02' % text
elif not garbler:
return '\x01WLRed\x01%s\x02' % text
return garbler.garble(av, len(text.split(' ')))
def processText(self, text, av=None, garbler=None): def processText(self, text, av=None, garbler=None):
if not self.words: if not self.words:

View file

@ -693,6 +693,18 @@ class OTPClientRepository(ClientRepositoryBase):
def handleAvatarsList(self, avatars): def handleAvatarsList(self, avatars):
self.avList = avatars self.avList = avatars
self.loginFSM.request('chooseAvatar', [self.avList]) self.loginFSM.request('chooseAvatar', [self.avList])
def handleChatSettings(self, chatSettings):
self.chatSettings = chatSettings
def wantSpeedchatPlus(self):
return self.chatSettings[0]
def wantTrueFriends(self):
return self.chatSettings[1]
def wantTypedChat(self):
return self.wantSpeedchatPlus() or self.wantTrueFriends()
@report(types=['args', 'deltaStamp'], dConfigParam='teleport') @report(types=['args', 'deltaStamp'], dConfigParam='teleport')
def enterChooseAvatar(self, avList): def enterChooseAvatar(self, avList):

View file

@ -202,4 +202,4 @@ WHISPER_COLORS = {
} }
def getFriendColor(handle): def getFriendColor(handle):
return CCNormal if settings['trueFriends'] and base.localAvatar.isTrueFriends(handle.doId) else CCSpeedChat return CCNormal if base.localAvatar.isTrueFriends(handle.doId) else CCSpeedChat

View file

@ -1,6 +1,7 @@
from direct.distributed.DistributedObjectAI import DistributedObjectAI from direct.distributed.DistributedObjectAI import DistributedObjectAI
from direct.distributed.ClockDelta import globalClockDelta from direct.distributed.ClockDelta import globalClockDelta
from direct.task import Task from direct.task import Task
from otp.ai.MagicWordGlobal import *
from toontown.effects.DistributedFireworkShowAI import DistributedFireworkShowAI from toontown.effects.DistributedFireworkShowAI import DistributedFireworkShowAI
from toontown.effects import FireworkShows from toontown.effects import FireworkShows
from toontown.toonbase import ToontownGlobals from toontown.toonbase import ToontownGlobals
@ -18,19 +19,21 @@ class NewsManagerAI(DistributedObjectAI):
def announceGenerate(self): def announceGenerate(self):
DistributedObjectAI.announceGenerate(self) DistributedObjectAI.announceGenerate(self)
self.__checkHolidays() self.__checkHolidays()
self.checkTask = taskMgr.doMethodLater(15, self.__checkHolidays, 'holidayCheckTask')
self.accept('avatarEntered', self.__handleAvatarEntered) self.accept('avatarEntered', self.__handleAvatarEntered)
taskMgr.doMethodLater(15, self.__checkHolidays, 'holidayCheckTask')
def delete(self): def delete(self):
DistributedObjectAI.delete(self) DistributedObjectAI.delete(self)
taskMgr.remove(self.checkTask) self.deleteTasks()
def deleteTasks(self):
taskMgr.remove('holidayCheckTask')
self.deleteFireworkTasks() self.deleteFireworkTasks()
def deleteFireworkTasks(self): def deleteFireworkTasks(self):
if self.fireworkTasks: for task in self.fireworkTasks:
for task in self.fireworkTasks: taskMgr.remove(task)
taskMgr.remove(task) self.fireworkTasks = []
self.fireworkTasks = []
def __handleAvatarEntered(self, av): def __handleAvatarEntered(self, av):
avId = av.getDoId() avId = av.getDoId()
@ -64,41 +67,44 @@ class NewsManagerAI(DistributedObjectAI):
else: else:
return HolidayGlobals.getStartDate(holiday) <= date <= HolidayGlobals.getEndDate(holiday) return HolidayGlobals.getStartDate(holiday) <= date <= HolidayGlobals.getEndDate(holiday)
def isHolidayRunning(self, id): def isHolidayRunning(self, *args):
return id in self.activeHolidays for id in args:
if id in self.activeHolidays:
return True
def startHoliday(self, id): def startHoliday(self, id):
if id in self.activeHolidays or id not in HolidayGlobals.Holidays: if id in self.activeHolidays or id not in HolidayGlobals.Holidays:
return return False
self.activeHolidays.append(id) self.activeHolidays.append(id)
self.startSpecialHoliday(id) self.startSpecialHoliday(id)
self.sendUpdate('startHoliday', [id]) self.sendUpdate('startHoliday', [id])
return True
def endHoliday(self, id): def endHoliday(self, id):
if id not in self.activeHolidays or id not in HolidayGlobals.Holidays: if id not in self.activeHolidays or id not in HolidayGlobals.Holidays:
return return False
self.activeHolidays.remove(id) self.activeHolidays.remove(id)
self.endSpecialHoliday(id) self.endSpecialHoliday(id)
self.sendUpdate('endHoliday', [id]) self.sendUpdate('endHoliday', [id])
return True
def startSpecialHoliday(self, id): def startSpecialHoliday(self, id):
if id == ToontownGlobals.FISH_BINGO or id == ToontownGlobals.SILLY_SATURDAY: if id == ToontownGlobals.FISH_BINGO or id == ToontownGlobals.SILLY_SATURDAY:
messenger.send('checkBingoState') messenger.send('startBingo')
elif id in [ToontownGlobals.SUMMER_FIREWORKS, ToontownGlobals.NEW_YEAR_FIREWORKS]: elif id in [ToontownGlobals.SUMMER_FIREWORKS, ToontownGlobals.NEW_YEAR_FIREWORKS]:
self.fireworkTasks.append(taskMgr.doMethodLater((60 - datetime.datetime.now().minute) * 60, self.startFireworkTask, 'initialFireworkTask-%s' % id, extraArgs=[id])) self.fireworkTasks.append(taskMgr.doMethodLater((60 - datetime.datetime.now().minute) * 60, self.startFireworkTask, 'initialFireworkTask-%s' % id, extraArgs=[id]))
def endSpecialHoliday(self, id): def endSpecialHoliday(self, id):
if id == ToontownGlobals.FISH_BINGO or id == ToontownGlobals.SILLY_SATURDAY: if id == ToontownGlobals.FISH_BINGO or id == ToontownGlobals.SILLY_SATURDAY:
messenger.send('checkBingoState') messenger.send('stopBingo')
elif id in [ToontownGlobals.SUMMER_FIREWORKS, ToontownGlobals.NEW_YEAR_FIREWORKS]: elif id in [ToontownGlobals.SUMMER_FIREWORKS, ToontownGlobals.NEW_YEAR_FIREWORKS]:
self.deleteFireworkTasks() self.deleteFireworkTasks()
def startFireworkTask(self, id, task=None): def startFireworkTask(self, id, task=None):
self.startFireworks(id) self.startFireworks(id)
self.fireworkTasks.append(taskMgr.doMethodLater(3600, self.startFireworks, 'fireworkTask-%s' % id, extraArgs=[id])) self.fireworkTasks.append(taskMgr.doMethodLater(3600, self.startFireworks, 'fireworkTask-%s' % id, extraArgs=[id]))
return Task.done
def startFireworks(self, type, task=None): def startFireworks(self, type, task=None):
maxShow = len(FireworkShows.shows.get(type, [])) - 1 maxShow = len(FireworkShows.shows.get(type, [])) - 1
@ -112,3 +118,31 @@ class NewsManagerAI(DistributedObjectAI):
fireworkShow.b_startShow(type, random.randint(0, maxShow), globalClockDelta.getRealNetworkTime()) fireworkShow.b_startShow(type, random.randint(0, maxShow), globalClockDelta.getRealNetworkTime())
return Task.again return Task.again
@magicWord(category=CATEGORY_PROGRAMMER)
def newsShutdown():
"""
Shutdown the news manager tasks.
"""
simbase.air.newsManager.deleteTasks()
return 'News manager shut down!'
@magicWord(category=CATEGORY_PROGRAMMER, types=[int])
def startHoliday(holiday):
"""
Start a holiday.
"""
if simbase.air.newsManager.startHoliday(holiday):
return 'Started holiday %s!' % holiday
return 'Holiday %s is already running!' % holiday
@magicWord(category=CATEGORY_PROGRAMMER, types=[int])
def stopHoliday(holiday):
"""
Stop a holiday.
"""
if simbase.air.newsManager.endHoliday(holiday):
return 'Stopped holiday %s!' % holiday
return 'Holiday %s is not running!' % holiday

View file

@ -15,12 +15,12 @@ class PromotionManagerAI:
def getPercentChance(self): def getPercentChance(self):
return 100.0 return 100.0
def recoverMerits(self, av, cogList, zoneId, multiplier = 1, extraMerits = None): def recoverMerits(self, av, cogList, zoneId, multiplier = 1, extraMerits = None, addInvasion = True):
avId = av.getDoId() avId = av.getDoId()
meritsRecovered = [0, 0, 0, 0] meritsRecovered = [0, 0, 0, 0]
if extraMerits is None: if extraMerits is None:
extraMerits = [0, 0, 0, 0] extraMerits = [0, 0, 0, 0]
if self.air.suitInvasionManager.getInvading(): if addInvasion and self.air.suitInvasionManager.getInvading():
multiplier *= getInvasionMultiplier() multiplier *= getInvasionMultiplier()
for i in xrange(len(extraMerits)): for i in xrange(len(extraMerits)):
if CogDisguiseGlobals.isSuitComplete(av.getCogParts(), i): if CogDisguiseGlobals.isSuitComplete(av.getCogParts(), i):

View file

@ -47,7 +47,7 @@ class FireCogPanel(StateData.StateData):
del self.backButton del self.backButton
self.loaded = 0 self.loaded = 0
def enter(self, numAvatars, localNum = None, luredIndices = None, trappedIndices = None, track = None, fireCosts = None): def enter(self, numAvatars, localNum = None, luredIndices = None, trappedIndices = None, track = None):
if not self.loaded: if not self.loaded:
self.load() self.load()
self.frame.show() self.frame.show()
@ -59,7 +59,7 @@ class FireCogPanel(StateData.StateData):
if len(trappedIndices) > 0: if len(trappedIndices) > 0:
if track == BattleBase.TRAP: if track == BattleBase.TRAP:
invalidTargets += trappedIndices invalidTargets += trappedIndices
self.__placeButtons(numAvatars, invalidTargets, localNum, fireCosts) self.__placeButtons(numAvatars, invalidTargets, localNum)
def exit(self): def exit(self):
self.frame.hide() self.frame.hide()
@ -87,23 +87,24 @@ class FireCogPanel(StateData.StateData):
def adjustToons(self, numToons, localNum): def adjustToons(self, numToons, localNum):
self.__placeButtons(numToons, [], localNum) self.__placeButtons(numToons, [], localNum)
def __placeButtons(self, numAvatars, invalidTargets, localNum, fireCosts): def __placeButtons(self, numAvatars, invalidTargets, localNum):
canfire = 0 canFire = 0
for i in xrange(4): for i in xrange(4):
if numAvatars > i and i not in invalidTargets and i != localNum: if numAvatars > i and i not in invalidTargets and i != localNum:
self.avatarButtons[i].show() self.avatarButtons[i].show()
self.avatarButtons[i]['text'] = '' self.avatarButtons[i]['text'] = ''
if fireCosts[i] <= localAvatar.getPinkSlips(): if localAvatar.getPinkSlips():
self.avatarButtons[i]['state'] = DGG.NORMAL self.avatarButtons[i]['state'] = DGG.NORMAL
self.avatarButtons[i]['text_fg'] = (0, 0, 0, 1) self.avatarButtons[i]['text_fg'] = (0, 0, 0, 1)
canfire = 1 canFire = 1
else: else:
self.avatarButtons[i]['state'] = DGG.DISABLED self.avatarButtons[i]['state'] = DGG.DISABLED
self.avatarButtons[i]['text_fg'] = (1.0, 0, 0, 1) self.avatarButtons[i]['text_fg'] = (1.0, 0, 0, 1)
else: else:
self.avatarButtons[i].hide() self.avatarButtons[i].hide()
if canfire: if canFire:
self.textFrame['text'] = TTLocalizer.FireCogTitle % localAvatar.getPinkSlips() self.textFrame['text'] = TTLocalizer.FireCogTitle % localAvatar.getPinkSlips()
else: else:
self.textFrame['text'] = TTLocalizer.FireCogLowTitle % localAvatar.getPinkSlips() self.textFrame['text'] = TTLocalizer.FireCogLowTitle % localAvatar.getPinkSlips()

View file

@ -200,7 +200,7 @@ def removeReviveSuit(suit, deathSuit):
if not deathSuit.isEmpty(): if not deathSuit.isEmpty():
deathSuit.detachNode() deathSuit.detachNode()
suit.cleanupLoseActor() suit.cleanupLoseActor()
suit.healthBar.show() suit.healthBar.geom.show()
suit.resetHealthBarForSkele() suit.resetHealthBarForSkele()

View file

@ -145,7 +145,7 @@ class DistributedBoardingParty(DistributedObject.DistributedObject, BoardingPart
if removedMember: if removedMember:
removedMemberName = removedMember.name removedMemberName = removedMember.name
messageText = TTLocalizer.BoardingMessageLeftGroup % removedMemberName messageText = TTLocalizer.BoardingMessageLeftGroup % removedMemberName
localAvatar.setSystemMessage(0, messageText, WTToontownBoardingGroup) localAvatar.setSystemMessage(removedMemberId, messageText, WTToontownBoardingGroup)
elif localAvatar.doId in oldMemberList and localAvatar.doId not in memberList: elif localAvatar.doId in oldMemberList and localAvatar.doId not in memberList:
messenger.send('updateGroupStatus') messenger.send('updateGroupStatus')
@ -172,7 +172,7 @@ class DistributedBoardingParty(DistributedObject.DistributedObject, BoardingPart
def postKick(self, leaderId): def postKick(self, leaderId):
self.notify.debug('%s was kicked out of the Boarding Group by %s' % (localAvatar.doId, leaderId)) self.notify.debug('%s was kicked out of the Boarding Group by %s' % (localAvatar.doId, leaderId))
localAvatar.setSystemMessage(0, TTLocalizer.BoardingMessageKickedOut, WTToontownBoardingGroup) localAvatar.setSystemMessage(leaderId, TTLocalizer.BoardingMessageKickedOut, WTToontownBoardingGroup)
def postSizeReject(self, leaderId, inviterId, inviteeId): def postSizeReject(self, leaderId, inviterId, inviteeId):
self.notify.debug('%s was not invited because the group is full' % inviteeId) self.notify.debug('%s was not invited because the group is full' % inviteeId)
@ -252,7 +252,7 @@ class DistributedBoardingParty(DistributedObject.DistributedObject, BoardingPart
if invitee: if invitee:
inviteeName = invitee.name inviteeName = invitee.name
messageText = TTLocalizer.BoardingMessageInvited % (inviterName, inviteeName) messageText = TTLocalizer.BoardingMessageInvited % (inviterName, inviteeName)
localAvatar.setSystemMessage(0, messageText, WTToontownBoardingGroup) localAvatar.setSystemMessage(inviteeId, messageText, WTToontownBoardingGroup)
def postMessageInvitationFailed(self, inviterId): def postMessageInvitationFailed(self, inviterId):
inviterName = '' inviterName = ''
@ -261,7 +261,7 @@ class DistributedBoardingParty(DistributedObject.DistributedObject, BoardingPart
inviterName = inviter.name inviterName = inviter.name
if self.invitationFailedMessageOk(inviterId): if self.invitationFailedMessageOk(inviterId):
messageText = TTLocalizer.BoardingMessageInvitationFailed % inviterName messageText = TTLocalizer.BoardingMessageInvitationFailed % inviterName
localAvatar.setSystemMessage(0, messageText, WTToontownBoardingGroup) localAvatar.setSystemMessage(inviterId, messageText, WTToontownBoardingGroup)
def postMessageAcceptanceFailed(self, inviteeId, reason): def postMessageAcceptanceFailed(self, inviteeId, reason):
inviteeName = '' inviteeName = ''
@ -271,7 +271,7 @@ class DistributedBoardingParty(DistributedObject.DistributedObject, BoardingPart
inviteeName = invitee.name inviteeName = invitee.name
if reason == BoardingPartyBase.INVITE_ACCEPT_FAIL_GROUP_FULL: if reason == BoardingPartyBase.INVITE_ACCEPT_FAIL_GROUP_FULL:
messageText = TTLocalizer.BoardingMessageGroupFull % inviteeName messageText = TTLocalizer.BoardingMessageGroupFull % inviteeName
localAvatar.setSystemMessage(0, messageText, WTToontownBoardingGroup) localAvatar.setSystemMessage(inviteeId, messageText, WTToontownBoardingGroup)
if self.inviterPanels.isInvitingPanelIdCorrect(inviteeId): if self.inviterPanels.isInvitingPanelIdCorrect(inviteeId):
self.inviterPanels.destroyInvitingPanel() self.inviterPanels.destroyInvitingPanel()
@ -364,17 +364,17 @@ class DistributedBoardingParty(DistributedObject.DistributedObject, BoardingPart
if groupFormed: if groupFormed:
if leaderId == quitterId: if leaderId == quitterId:
if not localAvatar.doId == leaderId: if not localAvatar.doId == leaderId:
localAvatar.setSystemMessage(0, TTLocalizer.BoardingMessageGroupDissolved, WTToontownBoardingGroup) localAvatar.setSystemMessage(leaderId, TTLocalizer.BoardingMessageGroupDissolved, WTToontownBoardingGroup)
elif not kick: elif not kick:
if not localAvatar.doId == quitterId: if not localAvatar.doId == quitterId:
quitter = base.cr.doId2do.get(quitterId) quitter = base.cr.doId2do.get(quitterId)
if quitter: if quitter:
quitterName = quitter.name quitterName = quitter.name
messageText = TTLocalizer.BoardingMessageLeftGroup % quitterName messageText = TTLocalizer.BoardingMessageLeftGroup % quitterName
localAvatar.setSystemMessage(0, messageText, WTToontownBoardingGroup) localAvatar.setSystemMessage(quitterId, messageText, WTToontownBoardingGroup)
else: else:
messageText = TTLocalizer.BoardingMessageGroupDisbandedGeneric messageText = TTLocalizer.BoardingMessageGroupDisbandedGeneric
localAvatar.setSystemMessage(0, messageText, WTToontownBoardingGroup) localAvatar.setSystemMessage(quitterId, messageText, WTToontownBoardingGroup)
return return
def requestInvite(self, inviteeId): def requestInvite(self, inviteeId):

View file

@ -1,4 +1,5 @@
from direct.directnotify.DirectNotifyGlobal import * from direct.directnotify.DirectNotifyGlobal import *
import cPickle
from otp.ai.AIBaseGlobal import * from otp.ai.AIBaseGlobal import *
from toontown.building import DistributedBuildingAI from toontown.building import DistributedBuildingAI
@ -19,6 +20,7 @@ class DistributedBuildingMgrAI:
self.dnaStore = dnaStore self.dnaStore = dnaStore
self.trophyMgr = trophyMgr self.trophyMgr = trophyMgr
self.__buildings = {} self.__buildings = {}
self.tableName = 'buildings_%s' % self.branchId
self.findAllLandmarkBuildings() self.findAllLandmarkBuildings()
def cleanup(self): def cleanup(self):
@ -105,10 +107,10 @@ class DistributedBuildingMgrAI:
return (blocks, hqBlocks, gagshopBlocks, petshopBlocks, kartshopBlocks) return (blocks, hqBlocks, gagshopBlocks, petshopBlocks, kartshopBlocks)
def findAllLandmarkBuildings(self): def findAllLandmarkBuildings(self):
backups = simbase.backups.load('block-info', (self.air.districtId, self.branchId), default={}) buildings = self.load()
(blocks, hqBlocks, gagshopBlocks, petshopBlocks, kartshopBlocks) = self.getDNABlockLists() (blocks, hqBlocks, gagshopBlocks, petshopBlocks, kartshopBlocks) = self.getDNABlockLists()
for blockNumber in blocks: for blockNumber in blocks:
self.newBuilding(blockNumber, backup=backups.get(blockNumber, None)) self.newBuilding(blockNumber, buildings.get(blockNumber, None))
for blockNumber in hqBlocks: for blockNumber in hqBlocks:
self.newHQBuilding(blockNumber) self.newHQBuilding(blockNumber)
for blockNumber in gagshopBlocks: for blockNumber in gagshopBlocks:
@ -118,25 +120,21 @@ class DistributedBuildingMgrAI:
for block in kartshopBlocks: for block in kartshopBlocks:
self.newKartShopBuilding(block) self.newKartShopBuilding(block)
def newBuilding(self, blockNumber, backup=None): def newBuilding(self, blockNumber, blockData = None):
building = DistributedBuildingAI.DistributedBuildingAI( building = DistributedBuildingAI.DistributedBuildingAI(self.air, blockNumber, self.branchId, self.trophyMgr)
self.air, blockNumber, self.branchId, self.trophyMgr)
building.generateWithRequired(self.branchId) building.generateWithRequired(self.branchId)
if backup is not None: if blockData:
state = backup.get('state', 'toon') building.track = blockData.get('track', 'c')
if ((state == 'suit') and simbase.air.wantCogbuildings) or ( building.realTrack = blockData.get('track', 'c')
(state == 'cogdo') and simbase.air.wantCogdominiums): building.difficulty = int(blockData.get('difficulty', 1))
building.track = backup.get('track', 'c') building.numFloors = int(blockData.get('numFloors', 1))
building.difficulty = backup.get('difficulty', 1) building.numFloors = max(1, min(5, building.numFloors))
building.numFloors = backup.get('numFloors', 1) building.becameSuitTime = blockData.get('becameSuitTime', time.time())
building.updateSavedBy(backup.get('savedBy')) if blockData['state'] == 'suit':
building.becameSuitTime = backup.get('becameSuitTime', time.time()) building.setState('suit')
if (state == 'suit') and simbase.air.wantCogbuildings: elif blockData['state'] == 'cogdo':
building.setState('suit') if simbase.air.wantCogdominiums:
elif (state == 'cogdo') and simbase.air.wantCogdominiums:
building.setState('cogdo') building.setState('cogdo')
else:
building.setState('toon')
else: else:
building.setState('toon') building.setState('toon')
else: else:
@ -181,17 +179,59 @@ class DistributedBuildingMgrAI:
return building return building
def save(self): def save(self):
if self.air.dbConn:
buildings = []
for i in self.__buildings.values():
if isinstance(i, HQBuildingAI.HQBuildingAI):
continue
buildings.append(i.getPickleData())
street = {'ai': self.air.districtId, 'branch': self.branchId}
try:
self.air.dbGlobalCursor.streets.update(street,
{'$setOnInsert': street,
'$set': {'buildings': buildings}},
upsert=True)
except: # Something happened to our DB, but we can reconnect and retry.
taskMgr.doMethodLater(config.GetInt('mongodb-retry-time', 2), self.save, 'retrySave', extraArgs=[])
else:
self.saveDev()
def saveDev(self):
backups = {} backups = {}
for blockNumber in self.getSuitBlocks(): for blockNumber in self.getSuitBlocks():
building = self.getBuilding(blockNumber) building = self.getBuilding(blockNumber)
backup = { backups[blockNumber] = building.getPickleData()
'state': building.fsm.getCurrentState().getName(),
'block': building.block,
'track': building.track,
'difficulty': building.difficulty,
'numFloors': building.numFloors,
'savedBy': building.savedBy,
'becameSuitTime': building.becameSuitTime
}
backups[blockNumber] = backup
simbase.backups.save('block-info', (self.air.districtId, self.branchId), backups) simbase.backups.save('block-info', (self.air.districtId, self.branchId), backups)
def load(self):
if self.air.dbConn:
blocks = {}
# Ensure that toontown.streets is indexed. Doing this at loading time
# is a fine way to make sure that we won't upset players with a
# lagspike while we wait for the backend to handle the index request.
self.air.dbGlobalCursor.streets.ensure_index([('ai', 1),
('branch', 1)])
street = {'ai': self.air.districtId, 'branch': self.branchId}
try:
doc = self.air.dbGlobalCursor.streets.find_one(street)
except: # We're failing over - normally we'd wait to retry, but this is on AI startup so we might want to retry (or refactor the bldgMgr so we can sanely retry).
return blocks
if not doc:
return blocks
for building in doc.get('buildings', []):
blocks[int(building['block'])] = building
return blocks
else:
blocks = simbase.backups.load('block-info', (self.air.districtId, self.branchId), default={})
return blocks

View file

@ -11,7 +11,7 @@ class DistributedBuildingQueryMgrAI(DistributedObjectAI.DistributedObjectAI):
def isSuit(self, context, zoneId): def isSuit(self, context, zoneId):
avId = self.air.getAvatarIdFromSender() avId = self.air.getAvatarIdFromSender()
building = self.buildings.get(zoneId) if zoneId not in self.buildings:
if building is None: self.sendUpdateToAvatarId(avId, 'response', [context, False])
return else:
self.sendUpdateToAvatarId(avId, 'response', [context, building.isSuitBlock()]) self.sendUpdateToAvatarId(avId, 'response', [context, self.buildings[zoneId].isSuitBlock()])

View file

@ -233,9 +233,9 @@ class DistributedDoor(DistributedObject.DistributedObject, DelayDeletable):
self.setupNametag() self.setupNametag()
def getBuilding(self): def getBuilding(self):
if not hasattr(self, 'building'): if not hasattr(self, 'building') or not self.building:
if self.doorType == DoorTypes.INT_STANDARD: if self.doorType == DoorTypes.INT_STANDARD:
door = render.find('**/leftDoor;+s') door = render.find('**/*leftDoor*')
self.building = door.getParent() self.building = door.getParent()
elif self.doorType == DoorTypes.INT_HQ: elif self.doorType == DoorTypes.INT_HQ:
door = render.find('**/door_0') door = render.find('**/door_0')

View file

@ -59,8 +59,8 @@ class ToonInterior(Place.Place):
State.State('NPCFAReject', self.enterNPCFAReject, self.exitNPCFAReject, ['walk']), State.State('NPCFAReject', self.enterNPCFAReject, self.exitNPCFAReject, ['walk']),
State.State('HFA', self.enterHFA, self.exitHFA, ['HFAReject', 'teleportOut', 'tunnelOut']), State.State('HFA', self.enterHFA, self.exitHFA, ['HFAReject', 'teleportOut', 'tunnelOut']),
State.State('HFAReject', self.enterHFAReject, self.exitHFAReject, ['walk']), State.State('HFAReject', self.enterHFAReject, self.exitHFAReject, ['walk']),
State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk']), State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk', 'stopped']),
State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk']), State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk', 'stopped']),
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']), State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']),
State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn']), State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn']),
State.State('quest', self.enterQuest, self.exitQuest, ['walk', 'doorOut']), State.State('quest', self.enterQuest, self.exitQuest, ['walk', 'doorOut']),
@ -176,7 +176,9 @@ class ToonInterior(Place.Place):
def enterTeleportIn(self, requestStatus): def enterTeleportIn(self, requestStatus):
modelType = DistributedToonInterior.DistributedToonInterior(base.cr).getModelType(self.getZoneId()) modelType = DistributedToonInterior.DistributedToonInterior(base.cr).getModelType(self.getZoneId())
if ZoneUtil.isPetshop(self.zoneId): if ZoneUtil.isHQ(self.zoneId):
base.localAvatar.setPosHpr(-5.5, -1.5, ToontownGlobals.FloorOffset, 0.0, 0.0, 0.0)
elif ZoneUtil.isPetshop(self.zoneId):
base.localAvatar.setPosHpr(0, 0, ToontownGlobals.FloorOffset, 45.0, 0.0, 0.0) base.localAvatar.setPosHpr(0, 0, ToontownGlobals.FloorOffset, 45.0, 0.0, 0.0)
else: else:
if modelType in InteriorTypes: if modelType in InteriorTypes:

View file

@ -20,17 +20,17 @@ class ToontownChatManager(ChatManager.ChatManager):
self.openScSfx.setVolume(0.6) self.openScSfx.setVolume(0.6)
self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=TTLocalizer.TCMscButtonPos, parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName), text_scale=TTLocalizer.TCMscButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__scButtonPressed, clickSound=self.openScSfx) self.scButton = DirectButton(image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=TTLocalizer.TCMscButtonPos, parent=base.a2dTopLeft, scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('', OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName), text_scale=TTLocalizer.TCMscButton, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, sortOrder=DGG.FOREGROUND_SORT_INDEX, command=self.__scButtonPressed, clickSound=self.openScSfx)
self.scButton.hide() self.scButton.hide()
self.whisperFrame = DirectFrame(parent=base.a2dTopLeft, relief=None, image=DGG.getDefaultDialogGeom(), image_scale=(0.45, 0.45, 0.45), image_color=OTPGlobals.GlobalDialogColor, pos=(1.25, 0, -0.269), text=OTPLocalizer.ChatManagerWhisperTo, text_wordwrap=7.0, text_scale=TTLocalizer.TCMwhisperFrame, text_fg=Vec4(0, 0, 0, 1), text_pos=(0, 0.14), textMayChange=1, sortOrder=DGG.FOREGROUND_SORT_INDEX) self.whisperFrame = DirectFrame(parent=base.a2dTopLeft, relief=None, image=DGG.getDefaultDialogGeom(), image_scale=(0.77, 0.70, 0.20), image_color=OTPGlobals.GlobalDialogColor, pos=(0.40, 0, -0.105), text=OTPLocalizer.ChatManagerWhisperTo, text_wordwrap=6.5, text_scale=TTLocalizer.TCMwhisperFrame, text_fg=Vec4(0, 0, 0, 1), text_pos=(0.18, 0.01), textMayChange=1, sortOrder=DGG.FOREGROUND_SORT_INDEX)
self.whisperFrame.hide() self.whisperFrame.hide()
self.whisperButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(-0.125, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('', self.whisperButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(-0.33, 0, 0.033), scale=1.179, relief=None, image_color=Vec4(1, 1, 1, 1), text=('',
OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat,
OTPLocalizer.ChatManagerChat, OTPLocalizer.ChatManagerChat,
''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperButtonPressed) ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperButtonPressed)
self.whisperScButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(0.0, 0, -0.1), scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('', self.whisperScButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/ChtBx_ChtBtn_UP'), gui.find('**/ChtBx_ChtBtn_DN'), gui.find('**/ChtBx_ChtBtn_RLVR')), pos=(-0.195, 0, 0.033), scale=1.179, relief=None, image_color=Vec4(0.75, 1, 0.6, 1), text=('',
OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName,
OTPLocalizer.GlobalSpeedChatName, OTPLocalizer.GlobalSpeedChatName,
''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperScButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperScButtonPressed) ''), image3_color=Vec4(0.6, 0.6, 0.6, 0.6), text_scale=TTLocalizer.TCMwhisperScButton, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperScButtonPressed)
self.whisperCancelButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr')), pos=(0.125, 0, -0.1), scale=1.179, relief=None, text=('', OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel), text_scale=0.05, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperCancelPressed) self.whisperCancelButton = DirectButton(parent=self.whisperFrame, image=(gui.find('**/CloseBtn_UP'), gui.find('**/CloseBtn_DN'), gui.find('**/CloseBtn_Rllvr')), pos=(-0.06, 0, 0.033), scale=1.179, relief=None, text=('', OTPLocalizer.ChatManagerCancel, OTPLocalizer.ChatManagerCancel), text_scale=0.05, text_fg=(0, 0, 0, 1), text_pos=(0, -0.09), textMayChange=0, command=self.__whisperCancelPressed)
gui.removeNode() gui.removeNode()
ChatManager.ChatManager.__init__(self, cr, localAvatar) ChatManager.ChatManager.__init__(self, cr, localAvatar)
self.chatInputSpeedChat = TTChatInputSpeedChat(self) self.chatInputSpeedChat = TTChatInputSpeedChat(self)
@ -45,7 +45,6 @@ class ToontownChatManager(ChatManager.ChatManager):
self.chatInputWhiteList.setPos(self.speedChatPlusPos) self.chatInputWhiteList.setPos(self.speedChatPlusPos)
self.chatInputWhiteList.reparentTo(base.a2dTopLeft) self.chatInputWhiteList.reparentTo(base.a2dTopLeft)
self.chatInputWhiteList.desc = 'chatInputWhiteList' self.chatInputWhiteList.desc = 'chatInputWhiteList'
return
def delete(self): def delete(self):
ChatManager.ChatManager.delete(self) ChatManager.ChatManager.delete(self)
@ -111,7 +110,7 @@ class ToontownChatManager(ChatManager.ChatManager):
if base.config.GetBool('want-qa-regression', 0): if base.config.GetBool('want-qa-regression', 0):
self.notify.info('QA-REGRESSION: CHAT: Speedchat Plus') self.notify.info('QA-REGRESSION: CHAT: Speedchat Plus')
messenger.send('wakeup') messenger.send('wakeup')
if not settings['trueFriends'] and not settings['speedchatPlus']: if not base.cr.wantTypedChat():
self.fsm.request('noSpeedchatPlus') self.fsm.request('noSpeedchatPlus')
return return
self.fsm.request('normalChat') self.fsm.request('normalChat')
@ -125,7 +124,7 @@ class ToontownChatManager(ChatManager.ChatManager):
def __whisperButtonPressed(self, avatarName, avatarId): def __whisperButtonPressed(self, avatarName, avatarId):
messenger.send('wakeup') messenger.send('wakeup')
if not settings['trueFriends'] and not settings['speedchatPlus']: if not base.cr.wantTypedChat():
self.fsm.request('noSpeedchatPlus') self.fsm.request('noSpeedchatPlus')
return return
if avatarId: if avatarId:
@ -134,7 +133,7 @@ class ToontownChatManager(ChatManager.ChatManager):
return return
def enterNormalChat(self): def enterNormalChat(self):
if not settings['trueFriends'] and not settings['speedchatPlus']: if not base.cr.wantTypedChat():
self.fsm.request('mainMenu') self.fsm.request('mainMenu')
return return
result = ChatManager.ChatManager.enterNormalChat(self) result = ChatManager.ChatManager.enterNormalChat(self)
@ -143,11 +142,10 @@ class ToontownChatManager(ChatManager.ChatManager):
self.fsm.request('mainMenu') self.fsm.request('mainMenu')
def enterWhisperChat(self, avatarName, avatarId): def enterWhisperChat(self, avatarName, avatarId):
if not settings['trueFriends'] and not settings['speedchatPlus']: if not base.cr.wantTypedChat():
self.fsm.request('mainMenu') self.fsm.request('mainMenu')
return return
result = ChatManager.ChatManager.enterWhisperChat(self, avatarName, avatarId) result = ChatManager.ChatManager.enterWhisperChat(self, avatarName, avatarId)
self.chatInputNormal.reparentTo(base.a2dTopCenter)
self.chatInputNormal.setPos(self.whisperPos) self.chatInputNormal.setPos(self.whisperPos)
if result == None: if result == None:
self.notify.warning('something went wrong in enterWhisperChat, falling back to main menu') self.notify.warning('something went wrong in enterWhisperChat, falling back to main menu')

View file

@ -22,8 +22,8 @@ class CogHQLobby(Place.Place):
'doorOut', 'doorOut',
'stopped']), 'stopped']),
State.State('stopped', self.enterStopped, self.exitStopped, ['walk', 'teleportOut', 'elevator']), State.State('stopped', self.enterStopped, self.exitStopped, ['walk', 'teleportOut', 'elevator']),
State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk']), State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk', 'stopped']),
State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk']), State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk', 'stopped']),
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']), State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']),
State.State('elevator', self.enterElevator, self.exitElevator, ['walk', 'stopped']), State.State('elevator', self.enterElevator, self.exitElevator, ['walk', 'stopped']),
State.State('final', self.enterFinal, self.exitFinal, ['start'])], 'start', 'final') State.State('final', self.enterFinal, self.exitFinal, ['start'])], 'start', 'final')

View file

@ -29,7 +29,7 @@ class DistributedBattleFactoryAI(DistributedLevelBattleAI.DistributedLevelBattle
self.toonItems[toon.doId][1].extend(notRecovered) self.toonItems[toon.doId][1].extend(notRecovered)
meritArray = self.air.promotionMgr.recoverMerits( meritArray = self.air.promotionMgr.recoverMerits(
toon, self.suitsKilled, self.getTaskZoneId(), toon, self.suitsKilled, self.getTaskZoneId(),
getFactoryMeritMultiplier(self.getTaskZoneId())) getFactoryMeritMultiplier(self.getTaskZoneId()) * 2.0, addInvasion=False)
if toon.doId in self.helpfulToons: if toon.doId in self.helpfulToons:
self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray)
else: else:

View file

@ -34,7 +34,7 @@ class DistributedCountryClubBattleAI(DistributedLevelBattleAI.DistributedLevelBa
recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId()) recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId())
self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][0].extend(recovered)
self.toonItems[toon.doId][1].extend(notRecovered) self.toonItems[toon.doId][1].extend(notRecovered)
meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getCountryClubCreditMultiplier(self.getTaskZoneId()), extraMerits=extraMerits) meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getCountryClubCreditMultiplier(self.getTaskZoneId()) * 2.0, extraMerits=extraMerits, addInvasion=False)
if toon.doId in self.helpfulToons: if toon.doId in self.helpfulToons:
self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray)
else: else:

View file

@ -33,7 +33,7 @@ class DistributedMintBattleAI(DistributedLevelBattleAI.DistributedLevelBattleAI)
recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId()) recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId())
self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][0].extend(recovered)
self.toonItems[toon.doId][1].extend(notRecovered) self.toonItems[toon.doId][1].extend(notRecovered)
meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getMintCreditMultiplier(self.getTaskZoneId()), extraMerits=extraMerits) meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getMintCreditMultiplier(self.getTaskZoneId()) * 2.0, extraMerits=extraMerits, addInvasion=False)
if toon.doId in self.helpfulToons: if toon.doId in self.helpfulToons:
self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray)
else: else:

View file

@ -301,6 +301,6 @@ class DistributedStage(DistributedObject.DistributedObject):
self.titleText.setText('') self.titleText.setText('')
def elevatorAlert(self, avId): def elevatorAlert(self, avId):
if base.localAvatar.doId != avId: if base.localAvatar.doId != avId and avId in base.cr.doId2do:
name = base.cr.doId2do[avId].getName() name = base.cr.doId2do[avId].getName()
self.showInfoText(TTLocalizer.stageToonEnterElevator % name) self.showInfoText(TTLocalizer.StageToonEnterElevator % name)

View file

@ -41,7 +41,7 @@ class DistributedStageBattleAI(DistributedLevelBattleAI.DistributedLevelBattleAI
recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId()) recovered, notRecovered = self.air.questManager.recoverItems(toon, self.suitsKilled, self.getTaskZoneId())
self.toonItems[toon.doId][0].extend(recovered) self.toonItems[toon.doId][0].extend(recovered)
self.toonItems[toon.doId][1].extend(notRecovered) self.toonItems[toon.doId][1].extend(notRecovered)
meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getStageCreditMultiplier(self.level.getFloorNum()), extraMerits=extraMerits) meritArray = self.air.promotionMgr.recoverMerits(toon, self.suitsKilled, self.getTaskZoneId(), getStageCreditMultiplier(self.level.getFloorNum()) * 2.0, extraMerits=extraMerits, addInvasion=False)
if toon.doId in self.helpfulToons: if toon.doId in self.helpfulToons:
self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray) self.toonMerits[toon.doId] = addListsByValue(self.toonMerits[toon.doId], meritArray)
else: else:

View file

@ -43,8 +43,8 @@ class FactoryExterior(BattlePlace.BattlePlace):
State.State('battle', self.enterBattle, self.exitBattle, ['walk', 'teleportOut', 'died']), State.State('battle', self.enterBattle, self.exitBattle, ['walk', 'teleportOut', 'died']),
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']), State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']),
State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn', 'final', 'WaitForBattle']), State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn', 'final', 'WaitForBattle']),
State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk']), State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk', 'stopped']),
State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk']), State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk', 'stopped']),
State.State('died', self.enterDied, self.exitDied, ['quietZone']), State.State('died', self.enterDied, self.exitDied, ['quietZone']),
State.State('tunnelIn', self.enterTunnelIn, self.exitTunnelIn, ['walk']), State.State('tunnelIn', self.enterTunnelIn, self.exitTunnelIn, ['walk']),
State.State('tunnelOut', self.enterTunnelOut, self.exitTunnelOut, ['final']), State.State('tunnelOut', self.enterTunnelOut, self.exitTunnelOut, ['final']),

View file

@ -637,15 +637,13 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
if doId in self.friendsMap: if doId in self.friendsMap:
teleportNotify.debug('friend %s in friendsMap' % doId) teleportNotify.debug('friend %s in friendsMap' % doId)
return self.friendsMap[doId] return self.friendsMap[doId]
avatar = None
if doId in self.doId2do: if doId in self.doId2do:
teleportNotify.debug('found friend %s in doId2do' % doId) teleportNotify.debug('found friend %s in doId2do' % doId)
avatar = self.doId2do[doId] return self.doId2do[doId]
elif self.cache.contains(doId): elif self.cache.contains(doId):
teleportNotify.debug('found friend %s in cache' % doId) teleportNotify.debug('found friend %s in cache' % doId)
avatar = self.cache.dict[doId] return self.cache.dict[doId]
self.notify.warning("Don't know who friend %s is." % doId) self.notify.warning("Don't know who friend %s is." % doId)
return
def identifyAvatar(self, doId): def identifyAvatar(self, doId):
if doId in self.doId2do: if doId in self.doId2do:
@ -661,6 +659,7 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
if base.wantPets and base.localAvatar.hasPet(): if base.wantPets and base.localAvatar.hasPet():
if base.localAvatar.getPetId() not in self.friendsMap: if base.localAvatar.getPetId() not in self.friendsMap:
return 0 return 0
return 1 return 1
def removeFriend(self, avatarId): def removeFriend(self, avatarId):
@ -736,16 +735,14 @@ class ToontownClientRepository(OTPClientRepository.OTPClientRepository):
def handleFriendOnline(self, doId): def handleFriendOnline(self, doId):
self.notify.debug('Friend %d now online.' % doId) self.notify.debug('Friend %d now online.' % doId)
if doId not in self.friendsOnline: if doId not in self.friendsOnline:
self.friendsOnline[doId] = self.identifyFriend(doId) self.friendsOnline[doId] = self.identifyAvatar(doId)
messenger.send('friendOnline', [doId]) messenger.send('friendOnline', [doId])
def handleFriendOffline(self, doId): def handleFriendOffline(self, doId):
self.notify.debug('Friend %d now offline.' % doId) self.notify.debug('Friend %d now offline.' % doId)
try: if doId in self.friendsOnline:
del self.friendsOnline[doId] del self.friendsOnline[doId]
messenger.send('friendOffline', [doId]) messenger.send('friendOffline', [doId])
except:
pass
def handleGenerateWithRequiredOtherOwner(self, di): def handleGenerateWithRequiredOtherOwner(self, di):
# Toontown only makes use of OwnerViews for LocalToon. # Toontown only makes use of OwnerViews for LocalToon.

View file

@ -14,10 +14,12 @@ class ToontownInternalRepository(AstronInternalRepository):
AstronInternalRepository.__init__( AstronInternalRepository.__init__(
self, baseChannel, serverId=serverId, dcFileNames=dcFileNames, self, baseChannel, serverId=serverId, dcFileNames=dcFileNames,
dcSuffix=dcSuffix, connectMethod=connectMethod, threadedNet=threadedNet) dcSuffix=dcSuffix, connectMethod=connectMethod, threadedNet=threadedNet)
self.wantMongo = config.GetBool('want-mongo', False)
def handleConnected(self): def handleConnected(self):
self.__messenger = ToontownNetMessengerAI(self) self.__messenger = ToontownNetMessengerAI(self)
if config.GetBool('want-mongo', False): if self.wantMongo:
import pymongo import pymongo
self.dbConn = pymongo.MongoClient(config.GetString('mongodb-url', 'localhost')) self.dbConn = pymongo.MongoClient(config.GetString('mongodb-url', 'localhost'))
self.dbGlobalCursor = self.dbConn.toontownstride self.dbGlobalCursor = self.dbConn.toontownstride

View file

@ -5,11 +5,10 @@ import HouseGlobals
import time, random import time, random
from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI
from toontown.fishing.DistributedPondBingoManagerAI import DistributedPondBingoManagerAI
from toontown.fishing import FishingTargetGlobals, FishGlobals from toontown.fishing import FishingTargetGlobals, FishGlobals
from toontown.safezone import TreasureGlobals from toontown.safezone import TreasureGlobals
from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI
from toontown.safezone import DistributedTreasureAI from toontown.safezone import DistributedEFlyingTreasureAI
from toontown.safezone import ButterflyGlobals from toontown.safezone import ButterflyGlobals
from toontown.safezone import DistributedButterflyAI from toontown.safezone import DistributedButterflyAI
from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI
@ -432,7 +431,7 @@ class CannonRental(Rental):
for i in xrange(20): for i in xrange(20):
x = random.randint(100, 300) - 200 x = random.randint(100, 300) - 200
y = random.randint(100, 300) - 200 y = random.randint(100, 300) - 200
treasure = DistributedTreasureAI.DistributedTreasureAI(self.estate.air, self, 7, x, y, z) treasure = DistributedEFlyingTreasureAI.DistributedEFlyingTreasureAI(self.estate.air, self, 7, x, y, z)
treasure.generateWithRequired(self.estate.zoneId) treasure.generateWithRequired(self.estate.zoneId)
self.objects.add(treasure) self.objects.add(treasure)
doIds.append(treasure.doId) doIds.append(treasure.doId)
@ -506,11 +505,6 @@ class DistributedEstateAI(DistributedObjectAI):
self.pond.generateWithRequired(self.zoneId) self.pond.generateWithRequired(self.zoneId)
self.pond.start() self.pond.start()
self.pond.bingoMgr = DistributedPondBingoManagerAI(simbase.air)
self.pond.bingoMgr.setPondDoId(self.pond.getDoId())
self.pond.bingoMgr.generateWithRequired(self.zoneId)
self.pond.bingoMgr.initTasks()
treasureType, healAmount, spawnPoints, spawnRate, maxTreasures = TreasureGlobals.SafeZoneTreasureSpawns[ToontownGlobals.MyEstate] treasureType, healAmount, spawnPoints, spawnRate, maxTreasures = TreasureGlobals.SafeZoneTreasureSpawns[ToontownGlobals.MyEstate]
self.treasurePlanner = SZTreasurePlannerAI(self.zoneId, treasureType, healAmount, spawnPoints, spawnRate, maxTreasures) self.treasurePlanner = SZTreasurePlannerAI(self.zoneId, treasureType, healAmount, spawnPoints, spawnRate, maxTreasures)
self.treasurePlanner.start() self.treasurePlanner.start()

View file

@ -84,14 +84,21 @@ class DistributedTV(DistributedFurnitureItem):
base.localAvatar.setSystemMessage(0, TTLocalizer.TVUnknownVideoPack % pack if pack else TTLocalizer.TVUnknownVideo) base.localAvatar.setSystemMessage(0, TTLocalizer.TVUnknownVideoPack % pack if pack else TTLocalizer.TVUnknownVideo)
self.resetScreen() self.resetScreen()
return return
start = time.time() - startTime
movie = loader.loadTexture(video) movie = loader.loadTexture(video)
self.sound = loader.loadSfx(video) self.sound = loader.loadSfx(video)
length = self.sound.length()
if start >= length:
start -= int(start / length) * length
movie.synchronizeTo(self.sound) movie.synchronizeTo(self.sound)
self.screen.setColor(1, 1, 1, 1) self.screen.setColor(1, 1, 1, 1)
self.screen.setTexture(movie) self.screen.setTexture(movie)
self.screen.setTexScale(TextureStage.getDefault(), movie.getTexScale()) self.screen.setTexScale(TextureStage.getDefault(), movie.getTexScale())
self.sound.setTime(min(self.sound.length(), int(time.time() - startTime))) self.sound.setTime(start)
self.sound.setLoop(True)
self.sound.play() self.sound.play()
def __enterSphere(self, collisionEntry): def __enterSphere(self, collisionEntry):

View file

@ -62,8 +62,8 @@ class Estate(Place.Place):
'activity']), 'activity']),
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk', 'petTutorial']), State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk', 'petTutorial']),
State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn', 'walk', 'final']), State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn', 'walk', 'final']),
State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk']), State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk', 'stopped']),
State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['final', 'walk']), State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['final', 'walk', 'stopped']),
State.State('final', self.enterFinal, self.exitFinal, ['teleportIn']), State.State('final', self.enterFinal, self.exitFinal, ['teleportIn']),
State.State('quest', self.enterQuest, self.exitQuest, ['walk']), State.State('quest', self.enterQuest, self.exitQuest, ['walk']),
State.State('activity', self.enterActivity, self.exitActivity, ['walk', 'stopped']), State.State('activity', self.enterActivity, self.exitActivity, ['walk', 'stopped']),

View file

@ -43,8 +43,8 @@ class House(Place.Place):
'banking', 'banking',
'phone', 'phone',
'stopped']), 'stopped']),
State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk']), State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk', 'stopped']),
State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk']), State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk', 'stopped']),
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']), State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk']),
State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn']), State.State('teleportOut', self.enterTeleportOut, self.exitTeleportOut, ['teleportIn']),
State.State('quest', self.enterQuest, self.exitQuest, ['walk', 'doorOut']), State.State('quest', self.enterQuest, self.exitQuest, ['walk', 'doorOut']),

View file

@ -156,11 +156,6 @@ class BingoCardGui(DirectFrame):
elif self.game.getGameState() & 1 << index: elif self.game.getGameState() & 1 << index:
self.cellGuiList[index].disable() self.cellGuiList[index].disable()
def disableCard(self):
self.stopCellBlinking()
for index in xrange(self.game.getCardSize()):
self.cellGuiList[index].disable()
def enableCard(self, callback = None): def enableCard(self, callback = None):
self.notify.info('enable Bingo card') self.notify.info('enable Bingo card')
self.stopCellBlinking() self.stopCellBlinking()

View file

@ -1,8 +1,9 @@
from direct.directnotify.DirectNotifyGlobal import * from direct.directnotify.DirectNotifyGlobal import *
from direct.distributed.DistributedObjectAI import DistributedObjectAI from direct.distributed.DistributedObjectAI import DistributedObjectAI
from toontown.fishing import FishingTargetGlobals from toontown.toonbase import ToontownGlobals
from toontown.fishing.DistributedFishingTargetAI import DistributedFishingTargetAI from DistributedFishingTargetAI import DistributedFishingTargetAI
from DistributedPondBingoManagerAI import DistributedPondBingoManagerAI
import FishingTargetGlobals
class DistributedFishingPondAI(DistributedObjectAI): class DistributedFishingPondAI(DistributedObjectAI):
notify = directNotify.newCategory("DistributedFishingPondAI") notify = directNotify.newCategory("DistributedFishingPondAI")
@ -14,12 +15,42 @@ class DistributedFishingPondAI(DistributedObjectAI):
self.targets = {} self.targets = {}
self.spots = {} self.spots = {}
self.bingoMgr = None self.bingoMgr = None
def announceGenerate(self):
if self.air.newsManager.isHolidayRunning(ToontownGlobals.FISH_BINGO, ToontownGlobals.SILLY_SATURDAY):
self.startBingo()
self.accept('startBingo', self.startBingo)
self.accept('stopBingo', self.stopBingo)
DistributedObjectAI.announceGenerate(self)
def delete(self):
self.ignoreAll()
DistributedObjectAI.delete(self)
def start(self): def start(self):
for _ in xrange(FishingTargetGlobals.getNumTargets(self.area)): for _ in xrange(FishingTargetGlobals.getNumTargets(self.area)):
fishingTarget = DistributedFishingTargetAI(simbase.air) fishingTarget = DistributedFishingTargetAI(simbase.air)
fishingTarget.setPondDoId(self.doId) fishingTarget.setPondDoId(self.doId)
fishingTarget.generateWithRequired(self.zoneId) fishingTarget.generateWithRequired(self.zoneId)
def startBingo(self):
if self.bingoMgr:
self.notify.warning('Tried to start bingo while already started!')
return
self.bingoMgr = DistributedPondBingoManagerAI(self.air)
self.bingoMgr.setPondDoId(self.getDoId())
self.bingoMgr.generateWithRequired(self.zoneId)
self.bingoMgr.createGame()
def stopBingo(self):
if not self.bingoMgr:
self.notify.warning('Tried to stop bingo but not started!')
return
self.bingoMgr.requestDelete()
self.bingoMgr = None
def hitTarget(self, target): def hitTarget(self, target):
avId = self.air.getAvatarIdFromSender() avId = self.air.getAvatarIdFromSender()

View file

@ -49,6 +49,7 @@ class DistributedPondBingoManager(DistributedObject.DistributedObject, FSM.FSM):
self.notify.debug('generate: DistributedPondBingoManager') self.notify.debug('generate: DistributedPondBingoManager')
def delete(self): def delete(self):
self.pond.resetSpotGui()
del self.pond.pondBingoMgr del self.pond.pondBingoMgr
self.pond.pondBingoMgr = None self.pond.pondBingoMgr = None
del self.pond del self.pond
@ -58,7 +59,6 @@ class DistributedPondBingoManager(DistributedObject.DistributedObject, FSM.FSM):
del self.card del self.card
self.notify.debug('delete: Deleting Local PondManager %s' % self.doId) self.notify.debug('delete: Deleting Local PondManager %s' % self.doId)
DistributedObject.DistributedObject.delete(self) DistributedObject.DistributedObject.delete(self)
return
def d_cardUpdate(self, cellId, genus, species): def d_cardUpdate(self, cellId, genus, species):
self.sendUpdate('cardUpdate', [self.cardId, self.sendUpdate('cardUpdate', [self.cardId,
@ -121,7 +121,7 @@ class DistributedPondBingoManager(DistributedObject.DistributedObject, FSM.FSM):
self.card.hide() self.card.hide()
def showCard(self): def showCard(self):
if (self.state != 'Off' or self.state != 'CloseEvent') and self.card.getGame(): if self.state != 'Off' and self.card.getGame() != None:
self.card.loadCard() self.card.loadCard()
self.card.show() self.card.show()
elif self.state == 'GameOver': elif self.state == 'GameOver':
@ -283,8 +283,6 @@ class DistributedPondBingoManager(DistributedObject.DistributedObject, FSM.FSM):
return (request, args) return (request, args)
elif request == 'Intermission': elif request == 'Intermission':
return (request, args) return (request, args)
elif request == 'CloseEvent':
return 'CloseEvent'
elif request == 'Off': elif request == 'Off':
return 'Off' return 'Off'
else: else:
@ -305,8 +303,6 @@ class DistributedPondBingoManager(DistributedObject.DistributedObject, FSM.FSM):
return (request, args) return (request, args)
elif request == 'Intermission': elif request == 'Intermission':
return (request, args) return (request, args)
elif request == 'CloseEvent':
return 'CloseEvent'
elif request == 'Off': elif request == 'Off':
return 'Off' return 'Off'
else: else:
@ -338,17 +334,3 @@ class DistributedPondBingoManager(DistributedObject.DistributedObject, FSM.FSM):
def exitIntermission(self): def exitIntermission(self):
self.notify.debug('enterIntermission: Exit Intermission State') self.notify.debug('enterIntermission: Exit Intermission State')
def enterCloseEvent(self, timestamp):
self.notify.debug('enterCloseEvent: Enter CloseEvent State')
self.card.hide()
self.pond.resetSpotGui()
def filterCloseEvent(self, request, args):
if request == 'Off':
return 'Off'
else:
self.notify.warning('filterOff: Invalid State Transition from GameOver to %s' % request)
def exitCloseEvent(self):
self.notify.debug('exitCloseEvent: Exit CloseEvent State')

View file

@ -1,18 +1,16 @@
from direct.directnotify import DirectNotifyGlobal from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI from direct.distributed.DistributedObjectAI import DistributedObjectAI
from direct.distributed.ClockDelta import *
from toontown.fishing import BingoGlobals from toontown.fishing import BingoGlobals
from toontown.fishing import FishGlobals from toontown.fishing import FishGlobals
from toontown.toonbase import ToontownGlobals
from toontown.fishing.NormalBingo import NormalBingo from toontown.fishing.NormalBingo import NormalBingo
from toontown.fishing.ThreewayBingo import ThreewayBingo from toontown.fishing.ThreewayBingo import ThreewayBingo
from toontown.fishing.DiagonalBingo import DiagonalBingo from toontown.fishing.DiagonalBingo import DiagonalBingo
from toontown.fishing.BlockoutBingo import BlockoutBingo from toontown.fishing.BlockoutBingo import BlockoutBingo
from toontown.fishing.FourCornerBingo import FourCornerBingo from toontown.fishing.FourCornerBingo import FourCornerBingo
from direct.task import Task import random
from direct.distributed.ClockDelta import *
import random, datetime
RequestCard = {}
RequestCard = {}
class DistributedPondBingoManagerAI(DistributedObjectAI): class DistributedPondBingoManagerAI(DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPondBingoManagerAI") notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPondBingoManagerAI")
@ -26,35 +24,14 @@ class DistributedPondBingoManagerAI(DistributedObjectAI):
self.state = 'Off' self.state = 'Off'
self.pond = None self.pond = None
self.canCall = False self.canCall = False
self.shouldStop = False
self.lastUpdate = globalClockDelta.getRealNetworkTime() self.lastUpdate = globalClockDelta.getRealNetworkTime()
self.cardId = 0 self.cardId = 0
def initTasks(self): def delete(self):
now = datetime.datetime.now() taskMgr.remove(self.uniqueName('startWait'))
weekday = now.weekday() taskMgr.remove(self.uniqueName('createGame'))
targetday = 2 # Wednesday taskMgr.remove(self.uniqueName('finishGame'))
if weekday in (3, 4): DistributedObjectAI.delete(self)
targetday = 5
togo = targetday - weekday
if togo < 0:
togo += 7
s = now + datetime.timedelta(days=togo)
start = datetime.datetime(s.year, s.month, s.day)
secs = max(0, (start - now).total_seconds())
self.notify.debug('Today it\'s %d, so we wait for %d, togo: %d %d' % (weekday, targetday, togo, secs))
taskMgr.doMethodLater(secs, DistributedPondBingoManagerAI.startTask, self.taskName('start'), extraArgs=[self])
def startTask(self):
self.notify.debug('Starting game')
def stop(task):
self.notify.debug('Stopping game')
self.shouldStop = True
return task.done
taskMgr.doMethodLater(24 * 60 * 60, stop, self.taskName('stop'))
self.createGame()
def setPondDoId(self, pondId): def setPondDoId(self, pondId):
self.pond = self.air.doId2do[pondId] self.pond = self.air.doId2do[pondId]
@ -87,12 +64,16 @@ class DistributedPondBingoManagerAI(DistributedObjectAI):
elif result == BingoGlobals.UPDATE: elif result == BingoGlobals.UPDATE:
self.sendGameStateUpdate(cellId) self.sendGameStateUpdate(cellId)
def d_enableBingo(self):
self.sendUpdate('enableBingo', [])
def handleBingoCall(self, cardId): def handleBingoCall(self, cardId):
avId = self.air.getAvatarIdFromSender() avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do.get(avId)
if not av:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to call bingo while not on district!')
return
spot = self.pond.hasToon(avId) spot = self.pond.hasToon(avId)
if not spot: if not spot:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to call bingo while not fishing!') self.air.writeServerEvent('suspicious', avId, 'Toon tried to call bingo while not fishing!')
return return
@ -102,7 +83,7 @@ class DistributedPondBingoManagerAI(DistributedObjectAI):
if cardId != self.cardId: if cardId != self.cardId:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to call bingo with an expired cardId!') self.air.writeServerEvent('suspicious', avId, 'Toon tried to call bingo with an expired cardId!')
return return
av = self.air.doId2do[avId]
av.d_announceBingo() av.d_announceBingo()
self.rewardAll() self.rewardAll()
@ -158,40 +139,25 @@ class DistributedPondBingoManagerAI(DistributedObjectAI):
continue continue
av = self.air.doId2do[self.pond.spots[spot].avId] av = self.air.doId2do[self.pond.spots[spot].avId]
av.addMoney(self.jackpot) av.addMoney(self.jackpot)
if self.shouldStop: taskMgr.doMethodLater(5, self.startWait, self.uniqueName('startWait'))
self.stopGame() taskMgr.remove(self.uniqueName('finishGame'))
return
taskMgr.doMethodLater(5, DistributedPondBingoManagerAI.startWait, 'startWait%d' % self.getDoId(), [self])
taskMgr.remove('finishGame%d' % self.getDoId())
def finishGame(self): def finishGame(self, task=None):
self.state = 'GameOver' self.state = 'GameOver'
self.sendStateUpdate() self.sendStateUpdate()
if self.shouldStop: taskMgr.doMethodLater(5, self.startWait, self.uniqueName('startWait'))
self.stopGame()
return
taskMgr.doMethodLater(5, DistributedPondBingoManagerAI.startWait, 'startWait%d' % self.getDoId(), [self])
def stopGame(self):
self.state = 'CloseEvent'
self.sendStateUpdate()
taskMgr.doMethodLater(10, DistributedPondBingoManagerAI.turnOff, 'turnOff%d' % self.getDoId(), [self])
def turnOff(self):
self.state = 'Off'
self.sendStateUpdate()
def startIntermission(self): def startIntermission(self):
self.state = 'Intermission' self.state = 'Intermission'
self.sendStateUpdate() self.sendStateUpdate()
taskMgr.doMethodLater(300, DistributedPondBingoManagerAI.startWait, 'startWait%d' % self.getDoId(), [self]) taskMgr.doMethodLater(300, self.startWait, self.uniqueName('startWait'))
def startWait(self): def startWait(self, task=None):
self.state = 'WaitCountdown' self.state = 'WaitCountdown'
self.sendStateUpdate() self.sendStateUpdate()
taskMgr.doMethodLater(15, DistributedPondBingoManagerAI.createGame, 'createGame%d' % self.getDoId(), [self]) taskMgr.doMethodLater(15, self.createGame, self.uniqueName('createGame'))
def createGame(self): def createGame(self, task=None):
self.canCall = False self.canCall = False
self.tileSeed = None self.tileSeed = None
self.typeId = None self.typeId = None
@ -223,4 +189,4 @@ class DistributedPondBingoManagerAI(DistributedObjectAI):
self.b_setJackpot(BingoGlobals.getJackpot(self.typeId)) self.b_setJackpot(BingoGlobals.getJackpot(self.typeId))
self.state = 'Playing' self.state = 'Playing'
self.sendStateUpdate() self.sendStateUpdate()
taskMgr.doMethodLater(BingoGlobals.getGameTime(self.typeId), DistributedPondBingoManagerAI.finishGame, 'finishGame%d' % self.getDoId(), [self]) taskMgr.doMethodLater(BingoGlobals.getGameTime(self.typeId), self.finishGame, self.uniqueName('finishGame'))

View file

@ -33,7 +33,7 @@ Rod2JellybeanDict = {0: 10,
HealAmount = 1 HealAmount = 1
JellybeanFishingHolidayScoreMultiplier = 2 JellybeanFishingHolidayScoreMultiplier = 2
MAX_RARITY = 10 MAX_RARITY = 10
GlobalRarityDialBase = 4.3 GlobalRarityDialBase = 3.8
FishingAngleMax = 50.0 FishingAngleMax = 50.0
OVERALL_VALUE_SCALE = 15 OVERALL_VALUE_SCALE = 15
RARITY_VALUE_SCALE = 0.2 RARITY_VALUE_SCALE = 0.2
@ -334,19 +334,19 @@ __fishDict = {0: ((1,
(Anywhere,)), (Anywhere,)),
(1, (1,
1, 1,
3, 4,
(TTG.ToontownCentral, Anywhere)), (TTG.ToontownCentral, Anywhere)),
(3, (3,
5, 5,
4, 5,
(TTG.PunchlinePlace, TTG.TheBrrrgh)), (TTG.PunchlinePlace, TTG.TheBrrrgh)),
(3, (3,
5, 5,
2, 3,
(TTG.SillyStreet, TTG.DaisyGardens)), (TTG.SillyStreet, TTG.DaisyGardens)),
(1, (1,
5, 5,
1, 2,
(TTG.LoopyLane, TTG.ToontownCentral))), (TTG.LoopyLane, TTG.ToontownCentral))),
2: ((2, 2: ((2,
6, 6,
@ -354,27 +354,27 @@ __fishDict = {0: ((1,
(TTG.DaisyGardens, Anywhere)), (TTG.DaisyGardens, Anywhere)),
(2, (2,
6, 6,
6, 9,
(TTG.ElmStreet, TTG.DaisyGardens)), (TTG.ElmStreet, TTG.DaisyGardens)),
(5, (5,
11, 11,
3, 4,
(TTG.LullabyLane,)), (TTG.LullabyLane, TTG.BedtimeBoulevard)),
(2, (2,
6, 6,
2, 3,
(TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone)), (TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone)),
(5, (5,
11, 11,
1, 2,
(TTG.DonaldsDreamland, TTG.MyEstate, TTG.OutdoorZone, TTG.BedtimeBoulevard))), (TTG.DonaldsDreamland, TTG.MyEstate, TTG.OutdoorZone))),
4: ((2, 4: ((2,
8, 8,
1, 1,
(TTG.ToontownCentral, Anywhere)), (TTG.ToontownCentral, Anywhere)),
(2, (2,
8, 8,
3, 4,
(TTG.ToontownCentral, Anywhere)), (TTG.ToontownCentral, Anywhere)),
(2, (2,
8, 8,
@ -382,7 +382,7 @@ __fishDict = {0: ((1,
(TTG.ToontownCentral, Anywhere)), (TTG.ToontownCentral, Anywhere)),
(2, (2,
8, 8,
5, 6,
(TTG.ToontownCentral, TTG.MinniesMelodyland))), (TTG.ToontownCentral, TTG.MinniesMelodyland))),
6: ((8, 6: ((8,
12, 12,
@ -394,23 +394,23 @@ __fishDict = {0: ((1,
(Anywhere,)), (Anywhere,)),
(2, (2,
6, 6,
1, 2,
(TTG.MinniesMelodyland, Anywhere)), (TTG.MinniesMelodyland, Anywhere)),
(5, (5,
10, 10,
4, 5,
(TTG.MinniesMelodyland, Anywhere)), (TTG.MinniesMelodyland, Anywhere)),
(1, (1,
5, 5,
5, 7,
(TTG.MyEstate, TTG.OutdoorZone, Anywhere)), (TTG.MyEstate, TTG.OutdoorZone, Anywhere)),
(1, (1,
5, 5,
7, 10,
(TTG.MyEstate, TTG.OutdoorZone, Anywhere))), (TTG.MyEstate, TTG.OutdoorZone, Anywhere))),
10: ((6, 10: ((6,
10, 10,
7, 9,
(TTG.MyEstate, TTG.OutdoorZone, Anywhere)),), (TTG.MyEstate, TTG.OutdoorZone, Anywhere)),),
12: ((7, 12: ((7,
15, 15,
@ -418,15 +418,15 @@ __fishDict = {0: ((1,
(TTG.DonaldsDock, Anywhere)), (TTG.DonaldsDock, Anywhere)),
(18, (18,
20, 20,
5, 6,
(TTG.DonaldsDock, TTG.MyEstate, TTG.OutdoorZone)), (TTG.DonaldsDock, TTG.MyEstate, TTG.OutdoorZone)),
(1, (1,
5, 5,
4, 5,
(TTG.DonaldsDock, TTG.MyEstate, TTG.OutdoorZone)), (TTG.DonaldsDock, TTG.MyEstate, TTG.OutdoorZone)),
(3, (3,
7, 7,
3, 4,
(TTG.DonaldsDock, TTG.MyEstate, TTG.OutdoorZone)), (TTG.DonaldsDock, TTG.MyEstate, TTG.OutdoorZone)),
(1, (1,
2, 2,
@ -437,27 +437,27 @@ __fishDict = {0: ((1,
1, 1,
(TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone, Anywhere)), (2, (TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone, Anywhere)), (2,
6, 6,
2, 3,
(TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone))), (TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone))),
16: ((4, 16: ((4,
12, 12,
4, 5,
(TTG.MinniesMelodyland, Anywhere)), (4, (TTG.MinniesMelodyland, Anywhere)), (4,
12, 12,
6, 7,
(TTG.BaritoneBoulevard, TTG.MinniesMelodyland)), (4, (TTG.BaritoneBoulevard, TTG.MinniesMelodyland)), (4,
12, 12,
6, 8,
(TTG.TenorTerrace, TTG.MinniesMelodyland))), (TTG.TenorTerrace, TTG.MinniesMelodyland))),
18: ((2, 18: ((2,
4, 4,
2, 3,
(TTG.DonaldsDock, Anywhere)), (5, (TTG.DonaldsDock, Anywhere)), (5,
8, 8,
6, 7,
(TTG.TheBrrrgh,)), (4, (TTG.TheBrrrgh,)), (4,
6, 6,
6, 8,
(TTG.LighthouseLane,))), (TTG.LighthouseLane,))),
20: ((4, 20: ((4,
6, 6,
@ -465,11 +465,11 @@ __fishDict = {0: ((1,
(TTG.DonaldsDreamland,)), (TTG.DonaldsDreamland,)),
(14, (14,
18, 18,
7, 10,
(TTG.DonaldsDreamland,)), (TTG.DonaldsDreamland,)),
(6, (6,
10, 10,
7, 8,
(TTG.LullabyLane, TTG.BedtimeBoulevard)), (TTG.LullabyLane, TTG.BedtimeBoulevard)),
(1, (1,
1, 1,
@ -477,11 +477,11 @@ __fishDict = {0: ((1,
(TTG.DonaldsDreamland,)), (TTG.DonaldsDreamland,)),
(2, (2,
6, 6,
5, 6,
(TTG.LullabyLane, TTG.BedtimeBoulevard)), (TTG.LullabyLane, TTG.BedtimeBoulevard)),
(10, (10,
14, 14,
3, 4,
(TTG.DonaldsDreamland, TTG.DaisyGardens))), (TTG.DonaldsDreamland, TTG.DaisyGardens))),
22: ((12, 22: ((12,
16, 16,
@ -489,40 +489,36 @@ __fishDict = {0: ((1,
(TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens, Anywhere)), (TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens, Anywhere)),
(14, (14,
18, 18,
2, 3,
(TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens, Anywhere)), (TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens, Anywhere)),
(14, (14,
20, 20,
4, 5,
(TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens)), (TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens)),
(14, (14,
20, 20,
6, 7,
(TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens))), (TTG.MyEstate, TTG.OutdoorZone, TTG.DaisyGardens))),
24: ((9, 24: ((9,
11, 11,
2, 3,
(Anywhere,)), (Anywhere,)),
(8,
12,
4,
(TTG.DaisyGardens, TTG.DonaldsDock)),
(8, (8,
12, 12,
5, 5,
(TTG.DaisyGardens, TTG.DonaldsDock)), (TTG.DaisyGardens, TTG.DonaldsDock)),
(8, (8,
16, 12,
6, 6,
(TTG.DaisyGardens, TTG.DonaldsDock)),
(8,
16,
7,
(TTG.DaisyGardens, TTG.DonaldsDock))), (TTG.DaisyGardens, TTG.DonaldsDock))),
26: ((10, 26: ((10,
18, 18,
2, 2,
(TTG.TheBrrrgh,)), (TTG.TheBrrrgh,)),
(10,
18,
2,
(TTG.TheBrrrgh,)),
(10, (10,
18, 18,
3, 3,
@ -531,51 +527,55 @@ __fishDict = {0: ((1,
18, 18,
4, 4,
(TTG.TheBrrrgh,)), (TTG.TheBrrrgh,)),
(12, (10,
20, 18,
5, 5,
(TTG.TheBrrrgh,)), (TTG.TheBrrrgh,)),
(14, (12,
20, 20,
6, 6,
(TTG.TheBrrrgh,)), (TTG.TheBrrrgh,)),
(14, (14,
20, 20,
6, 7,
(TTG.TheBrrrgh,)),
(14,
20,
8,
(TTG.SleetStreet, TTG.TheBrrrgh)), (TTG.SleetStreet, TTG.TheBrrrgh)),
(16, (16,
20, 20,
8, 10,
(TTG.WalrusWay, TTG.TheBrrrgh))), (TTG.WalrusWay, TTG.TheBrrrgh))),
28: ((2, 28: ((2,
10, 10,
2, 2,
(TTG.DonaldsDock, Anywhere)), (4, (TTG.DonaldsDock, Anywhere)), (4,
10, 10,
5, 6,
(TTG.BarnacleBoulevard, TTG.DonaldsDock)), (4, (TTG.BarnacleBoulevard, TTG.DonaldsDock)), (4,
10, 10,
6, 7,
(TTG.SeaweedStreet, TTG.DonaldsDock))), (TTG.SeaweedStreet, TTG.DonaldsDock))),
30: ((13, 30: ((13,
17, 17,
4, 5,
(TTG.MinniesMelodyland, Anywhere)), (TTG.MinniesMelodyland, Anywhere)),
(16, (16,
20, 20,
8, 10,
(TTG.AltoAvenue, TTG.MinniesMelodyland)), (TTG.AltoAvenue, TTG.MinniesMelodyland)),
(12, (12,
18, 18,
7, 9,
(TTG.TenorTerrace, TTG.MinniesMelodyland)), (TTG.TenorTerrace, TTG.MinniesMelodyland)),
(12, (12,
18, 18,
5, 6,
(TTG.MinniesMelodyland,)), (TTG.MinniesMelodyland,)),
(12, (12,
18, 18,
6, 7,
(TTG.MinniesMelodyland,))), (TTG.MinniesMelodyland,))),
32: ((1, 32: ((1,
5, 5,
@ -587,19 +587,19 @@ __fishDict = {0: ((1,
(TTG.TheBrrrgh, TTG.MyEstate, TTG.OutdoorZone, Anywhere)), (TTG.TheBrrrgh, TTG.MyEstate, TTG.OutdoorZone, Anywhere)),
(1, (1,
5, 5,
3, 4,
(TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone)), (TTG.DaisyGardens, TTG.MyEstate, TTG.OutdoorZone)),
(1, (1,
5, 5,
4, 5,
(TTG.DonaldsDreamland, TTG.MyEstate, TTG.OutdoorZone)), (TTG.DonaldsDreamland, TTG.MyEstate, TTG.OutdoorZone)),
(1, (1,
5, 5,
7, 10,
(TTG.TheBrrrgh, TTG.DonaldsDreamland))), (TTG.TheBrrrgh, TTG.DonaldsDreamland))),
34: ((1, 34: ((1,
20, 20,
7, 10,
(TTG.DonaldsDreamland, Anywhere)),)} (TTG.DonaldsDreamland, Anywhere)),)}
def getSpecies(genus): def getSpecies(genus):

View file

@ -66,8 +66,8 @@ class FriendHandle:
base.cr.ttsFriendsManager.d_teleportGiveup(self.doId) base.cr.ttsFriendsManager.d_teleportGiveup(self.doId)
def isUnderstandable(self): def isUnderstandable(self):
if settings['speedchatPlus']: if base.cr.wantTypedChat():
return 1 return 1
elif settings['trueFriends'] and base.localAvatar.isTrueFriends(self.doId): elif base.localAvatar.isTrueFriends(self.doId):
return 1 return 1
return 0 return 0

View file

@ -6,6 +6,7 @@ from toontown.friends import ToontownFriendSecret
from toontown.toonbase import ToontownGlobals from toontown.toonbase import ToontownGlobals
from toontown.toonbase import TTLocalizer from toontown.toonbase import TTLocalizer
from otp.nametag.NametagGroup import * from otp.nametag.NametagGroup import *
from otp.nametag.NametagConstants import *
from otp.otpbase import OTPGlobals from otp.otpbase import OTPGlobals
FLPPets = 1 FLPPets = 1
FLPOnline = 2 FLPOnline = 2
@ -241,7 +242,6 @@ class FriendsListPanel(DirectFrame, StateData.StateData):
def __updateScrollList(self): def __updateScrollList(self):
petFriends = [] petFriends = []
admins = []
trueFriends = [] trueFriends = []
friends = [] friends = []
@ -257,9 +257,7 @@ class FriendsListPanel(DirectFrame, StateData.StateData):
base.cr.fillUpFriendsMap() base.cr.fillUpFriendsMap()
return return
if handle.isAdmin(): if base.localAvatar.isTrueFriends(friendId):
admins.insert(0, friendId)
elif base.localAvatar.isTrueFriends(friendId):
trueFriends.insert(0, friendId) trueFriends.insert(0, friendId)
else: else:
friends.insert(0, friendId) friends.insert(0, friendId)

View file

@ -21,7 +21,7 @@ class TTSFriendsManager(DistributedObjectGlobal):
def d_getAvatarDetails(self, avId): def d_getAvatarDetails(self, avId):
self.sendUpdate('getAvatarDetails', [avId]) self.sendUpdate('getAvatarDetails', [avId])
def friendDetails(self, avId, inventory, trackAccess, trophies, hp, maxHp, defaultShard, lastHood, dnaString, experience, trackBonusLevel): def friendDetails(self, avId, inventory, trackAccess, hp, maxHp, defaultShard, lastHood, dnaString, experience, trackBonusLevel):
fields = [ fields = [
['setExperience' , experience], ['setExperience' , experience],
['setTrackAccess' , trackAccess], ['setTrackAccess' , trackAccess],

View file

@ -65,7 +65,6 @@ class FriendsListOperation(OperationFSM):
self.demand('Error', 'Friend was not a Toon') self.demand('Error', 'Friend was not a Toon')
return return
friendId = self.friendsList[self.friendIndex] friendId = self.friendsList[self.friendIndex]
self.realFriendsList.append([friendId, fields['setName'][0], self.realFriendsList.append([friendId, fields['setName'][0],
fields['setDNAString'][0], fields['setAdminAccess'][0], fields['setPetId'][0]]) fields['setDNAString'][0], fields['setAdminAccess'][0], fields['setPetId'][0]])
@ -98,8 +97,10 @@ class RemoveFriendOperation(OperationFSM):
self.demand('Retrieved', fields['setFriendsList'][0], fields['setTrueFriends'][0]) self.demand('Retrieved', fields['setFriendsList'][0], fields['setTrueFriends'][0])
def enterRetrieved(self, friendsList, trueFriendsList): def enterRetrieved(self, friendsList, trueFriendsList):
friendsList.remove(self.target) if self.target in friendsList:
trueFriendsList.remove(self.target) friendsList.remove(self.target)
if self.target in trueFriendsList:
trueFriendsList.remove(self.target)
if self.sender in self.mgr.onlineToons: if self.sender in self.mgr.onlineToons:
dg = self.air.dclassesByName['DistributedToonUD'].aiFormatUpdate( dg = self.air.dclassesByName['DistributedToonUD'].aiFormatUpdate(
'setFriendsList', self.sender, self.sender, 'setFriendsList', self.sender, self.sender,
@ -115,7 +116,7 @@ class RemoveFriendOperation(OperationFSM):
self.air.dbInterface.updateObject(self.air.dbId, self.sender, self.air.dbInterface.updateObject(self.air.dbId, self.sender,
self.air.dclassesByName['DistributedToonUD'], self.air.dclassesByName['DistributedToonUD'],
{'setFriendsList' : [friendsList], 'setTrueFriends' : [trueFriendsList]}) {'setFriendsList' : [friendsList], 'setTrueFriends': [trueFriendsList]})
self.demand('Off') self.demand('Off')
# -- Clear List -- # -- Clear List --
@ -190,7 +191,6 @@ class TTSFriendsManagerUD(DistributedObjectGlobalUD):
return return
inventory = fields['setInventory'][0] inventory = fields['setInventory'][0]
trackAccess = fields['setTrackAccess'][0] trackAccess = fields['setTrackAccess'][0]
trophies = 0 # fields['setTrophyScore'][0] is not db
hp = fields['setHp'][0] hp = fields['setHp'][0]
maxHp = fields['setMaxHp'][0] maxHp = fields['setMaxHp'][0]
defaultShard = fields['setDefaultShard'][0] defaultShard = fields['setDefaultShard'][0]
@ -199,9 +199,9 @@ class TTSFriendsManagerUD(DistributedObjectGlobalUD):
experience = fields['setExperience'][0] experience = fields['setExperience'][0]
trackBonusLevel = fields['setTrackBonusLevel'][0] trackBonusLevel = fields['setTrackBonusLevel'][0]
self.sendUpdateToAvatarId(senderId, 'friendDetails', [avId, inventory, trackAccess, trophies, hp, maxHp, defaultShard, lastHood, dnaString, experience, trackBonusLevel]) self.sendUpdateToAvatarId(senderId, 'friendDetails', [avId, inventory, trackAccess, hp, maxHp, defaultShard, lastHood, dnaString, experience, trackBonusLevel])
self.air.dbInterface.queryObject(self.air.dbId, avId, handleToon) self.air.dbInterface.queryObject(self.air.dbId, avId, handleToon)
def getPetDetails(self, avId): def getPetDetails(self, avId):
senderId = self.air.getAvatarIdFromSender() senderId = self.air.getAvatarIdFromSender()
def handlePet(dclass, fields): def handlePet(dclass, fields):
@ -235,9 +235,10 @@ class TTSFriendsManagerUD(DistributedObjectGlobalUD):
self.air.send(dg) self.air.send(dg)
for friend in friendsList: for friend in friendsList:
if friend[0] in self.onlineToons: friendId = friend[0]
self.sendUpdateToAvatarId(doId, 'friendOnline', [friend[0]]) if friendId in self.onlineToons:
self.sendUpdateToAvatarId(friend[0], 'friendOnline', [doId]) self.sendUpdateToAvatarId(doId, 'friendOnline', [friendId])
self.sendUpdateToAvatarId(friendId, 'friendOnline', [doId])
def goingOffline(self, avId): def goingOffline(self, avId):
self.toonOffline(avId) self.toonOffline(avId)
@ -249,9 +250,9 @@ class TTSFriendsManagerUD(DistributedObjectGlobalUD):
if dclass != self.air.dclassesByName['DistributedToonUD']: if dclass != self.air.dclassesByName['DistributedToonUD']:
return return
friendsList = fields['setFriendsList'][0] friendsList = fields['setFriendsList'][0]
for friendId in friendsList: for friend in friendsList:
if friendId in self.onlineToons: if friend in self.onlineToons:
self.sendUpdateToAvatarId(friendId, 'friendOffline', [doId]) self.sendUpdateToAvatarId(friend, 'friendOffline', [doId])
if doId in self.onlineToons: if doId in self.onlineToons:
self.onlineToons.remove(doId) self.onlineToons.remove(doId)
if doId in self.toon2data: if doId in self.toon2data:

View file

@ -8,7 +8,7 @@ globalFriendSecret = None
def showFriendSecret(): def showFriendSecret():
global globalFriendSecret global globalFriendSecret
if not settings['trueFriends']: if not base.cr.wantTrueFriends():
chatMgr = base.localAvatar.chatMgr chatMgr = base.localAvatar.chatMgr
chatMgr.fsm.request('noTrueFriends') chatMgr.fsm.request('noTrueFriends')
else: else:

View file

@ -5,7 +5,6 @@ from toontown.fishing.DistributedFishingPondAI import DistributedFishingPondAI
from toontown.hood import ZoneUtil from toontown.hood import ZoneUtil
from toontown.safezone import TreasureGlobals from toontown.safezone import TreasureGlobals
from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI from toontown.safezone.DistributedFishingSpotAI import DistributedFishingSpotAI
from toontown.fishing.DistributedPondBingoManagerAI import DistributedPondBingoManagerAI
from toontown.safezone.DistributedPartyGateAI import DistributedPartyGateAI from toontown.safezone.DistributedPartyGateAI import DistributedPartyGateAI
from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI from toontown.safezone.SZTreasurePlannerAI import SZTreasurePlannerAI
from toontown.suit import DistributedSuitPlannerAI from toontown.suit import DistributedSuitPlannerAI
@ -90,12 +89,6 @@ class HoodAI:
fishingPond.setArea(area) fishingPond.setArea(area)
fishingPond.generateWithRequired(zoneId) fishingPond.generateWithRequired(zoneId)
fishingPond.start() fishingPond.start()
fishingPond.bingoMgr = DistributedPondBingoManagerAI(simbase.air)
fishingPond.bingoMgr.setPondDoId(fishingPond.getDoId())
fishingPond.bingoMgr.generateWithRequired(zoneId)
fishingPond.bingoMgr.initTasks()
fishingPonds.append(fishingPond) fishingPonds.append(fishingPond)
elif isinstance(dnaGroup, DNAVisGroup): elif isinstance(dnaGroup, DNAVisGroup):
zoneId = int(dnaGroup.getName().split(':')[0]) zoneId = int(dnaGroup.getName().split(':')[0])

View file

@ -18,7 +18,6 @@ class BodyShop(StateData.StateData):
self.legChoice = 0 self.legChoice = 0
self.headChoice = 0 self.headChoice = 0
self.speciesChoice = 0 self.speciesChoice = 0
return
def enter(self, toon, shopsVisited = []): def enter(self, toon, shopsVisited = []):
base.disableMouse() base.disableMouse()

View file

@ -7,6 +7,7 @@ from toontown.toonbase import TTLocalizer, ToontownGlobals
import ShuffleButton import ShuffleButton
import random, colorsys import random, colorsys
from direct.directnotify import DirectNotifyGlobal from direct.directnotify import DirectNotifyGlobal
from direct.task import Task
class ColorShop(StateData.StateData): class ColorShop(StateData.StateData):
notify = DirectNotifyGlobal.directNotify.newCategory('ColorShop') notify = DirectNotifyGlobal.directNotify.newCategory('ColorShop')
@ -15,7 +16,6 @@ class ColorShop(StateData.StateData):
StateData.StateData.__init__(self, doneEvent) StateData.StateData.__init__(self, doneEvent)
self.toon = None self.toon = None
self.colorAll = 1 self.colorAll = 1
return
def getColorList(self): def getColorList(self):
return ToonDNA.allColorsList return ToonDNA.allColorsList
@ -28,6 +28,7 @@ class ColorShop(StateData.StateData):
self.allParts = (TTLocalizer.ColorAll, TTLocalizer.ColorShopHead, TTLocalizer.ColorShopBody, TTLocalizer.ColorShopGloves, TTLocalizer.ColorShopLegs) self.allParts = (TTLocalizer.ColorAll, TTLocalizer.ColorShopHead, TTLocalizer.ColorShopBody, TTLocalizer.ColorShopGloves, TTLocalizer.ColorShopLegs)
if not hasattr(self, 'headChoice'): if not hasattr(self, 'headChoice'):
self.headChoice = colorList.index(self.dna.headColor) self.headChoice = colorList.index(self.dna.headColor)
self.allChoice = self.headChoice
self.armChoice = colorList.index(self.dna.armColor) self.armChoice = colorList.index(self.dna.armColor)
self.gloveChoice = colorList.index(self.dna.gloveColor) self.gloveChoice = colorList.index(self.dna.gloveColor)
self.legChoice = colorList.index(self.dna.legColor) self.legChoice = colorList.index(self.dna.legColor)
@ -59,6 +60,7 @@ class ColorShop(StateData.StateData):
print 'ColorShop: toon not found' print 'ColorShop: toon not found'
self.hideButtons() self.hideButtons()
taskMgr.remove('colorDragTask')
def load(self): def load(self):
self.gui = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_mainGui') self.gui = loader.loadModel('phase_3/models/gui/tt_m_gui_mat_mainGui')
@ -94,7 +96,8 @@ class ColorShop(StateData.StateData):
self.pickImage = PNMImage(int((ToontownGlobals.COLOR_SATURATION_MAX - ToontownGlobals.COLOR_SATURATION_MIN) * 100), int((ToontownGlobals.COLOR_VALUE_MAX - ToontownGlobals.COLOR_VALUE_MIN) * 100)) self.pickImage = PNMImage(int((ToontownGlobals.COLOR_SATURATION_MAX - ToontownGlobals.COLOR_SATURATION_MIN) * 100), int((ToontownGlobals.COLOR_VALUE_MAX - ToontownGlobals.COLOR_VALUE_MIN) * 100))
self.hueSlider = DirectSlider(parent=self.advancedFrame, relief=None, image='phase_3/maps/color_picker_hue.jpg', scale=0.3, pos=(-0.05, 0, -0.43), image_scale=(0.1, 1.0, 1.0), pageSize=5, orientation=DGG.VERTICAL, command=self.__chooseHue) self.hueSlider = DirectSlider(parent=self.advancedFrame, relief=None, image='phase_3/maps/color_picker_hue.jpg', scale=0.3, pos=(-0.05, 0, -0.43), image_scale=(0.1, 1.0, 1.0), pageSize=5, orientation=DGG.VERTICAL, command=self.__chooseHue)
self.pickButton = DirectButton(parent=self.advancedFrame, relief=None, image='phase_3/maps/color_picker_empty.png', scale=0.3, pos=(-0.45, 0, -0.43), frameColor=(1, 1, 1, 0.1), pressEffect=0) self.pickButton = DirectButton(parent=self.advancedFrame, relief=None, image='phase_3/maps/color_picker_empty.png', scale=0.3, pos=(-0.45, 0, -0.43), frameColor=(1, 1, 1, 0.1), pressEffect=0)
self.pickButton.bind(DGG.B1CLICK, self.__pickColor) self.pickButton.bind(DGG.B1PRESS, self.__startPickColor)
self.pickButton.bind(DGG.B1RELEASE, self.__stopPickColor)
self.partsFrame = DirectFrame(parent=self.advancedFrame, image=shuffleFrame, image_scale=halfButtonInvertScale, relief=None, pos=(-0.395, 0, -0.85), hpr=(0, 0, -2), scale=0.9, frameColor=(1, 1, 1, 1), text=TTLocalizer.ColorAll, text_scale=0.0625, text_pos=(-0.001, -0.015), text_fg=(1, 1, 1, 1)) self.partsFrame = DirectFrame(parent=self.advancedFrame, image=shuffleFrame, image_scale=halfButtonInvertScale, relief=None, pos=(-0.395, 0, -0.85), hpr=(0, 0, -2), scale=0.9, frameColor=(1, 1, 1, 1), text=TTLocalizer.ColorAll, text_scale=0.0625, text_pos=(-0.001, -0.015), text_fg=(1, 1, 1, 1))
self.partLButton = DirectButton(parent=self.partsFrame, relief=None, image=shuffleImage, image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(-0.2, 0, 0), state=DGG.DISABLED, command=self.__swapPart, extraArgs=[-1]) self.partLButton = DirectButton(parent=self.partsFrame, relief=None, image=shuffleImage, image_scale=halfButtonScale, image1_scale=halfButtonHoverScale, image2_scale=halfButtonHoverScale, pos=(-0.2, 0, 0), state=DGG.DISABLED, command=self.__swapPart, extraArgs=[-1])
self.partRButton = DirectButton(parent=self.partsFrame, relief=None, image=shuffleImage, image_scale=halfButtonInvertScale, image1_scale=halfButtonInvertHoverScale, image2_scale=halfButtonInvertHoverScale, pos=(0.2, 0, 0), command=self.__swapPart, extraArgs=[1]) self.partRButton = DirectButton(parent=self.partsFrame, relief=None, image=shuffleImage, image_scale=halfButtonInvertScale, image1_scale=halfButtonInvertHoverScale, image2_scale=halfButtonInvertHoverScale, pos=(0.2, 0, 0), command=self.__swapPart, extraArgs=[1])
@ -183,8 +186,9 @@ class ColorShop(StateData.StateData):
texture.load(self.pickImage) texture.load(self.pickImage)
self.pickButton['image'] = texture self.pickButton['image'] = texture
def __pickColor(self, pos): def __pickColor(self, task=None):
x, y = pos.getMouse() x = base.mouseWatcherNode.getMouseX()
y = base.mouseWatcherNode.getMouseY()
win_w, win_h = base.win.getSize() win_w, win_h = base.win.getSize()
if win_w < win_h: if win_w < win_h:
@ -197,7 +201,15 @@ class ColorShop(StateData.StateData):
image_scale = self.pickButton['image_scale'] image_scale = self.pickButton['image_scale']
x = (.5 + x / (2. * self.pickButton.getSx(aspect2d) * image_scale[0])) x = (.5 + x / (2. * self.pickButton.getSx(aspect2d) * image_scale[0]))
y = (.5 + y / -(2. * self.pickButton.getSz(aspect2d) * image_scale[2])) y = (.5 + y / -(2. * self.pickButton.getSz(aspect2d) * image_scale[2]))
rgb = colorsys.hsv_to_rgb(self.hueSlider['value'], self.calcRelative(x, 0.0, 1.0, 0.36, 0.7), self.calcRelative(y, 0.0, 1.0, 0.5, 0.8)) + (1,)
if not (0.0 <= x <= 1.0 and 0.0 <= y <= 1.0):
return Task.cont
x = self.calcRelative(x, 0.0, 1.0, ToontownGlobals.COLOR_SATURATION_MIN, ToontownGlobals.COLOR_SATURATION_MAX)
y = self.calcRelative(y, 0.0, 1.0, ToontownGlobals.COLOR_VALUE_MIN, ToontownGlobals.COLOR_VALUE_MAX)
rgb = colorsys.hsv_to_rgb(self.hueSlider['value'], x, y) + (1,)
rgb = tuple([float('%.2f' % x) for x in rgb])
if self.partChoice in (0, 1): if self.partChoice in (0, 1):
self.dna.headColor = rgb self.dna.headColor = rgb
if self.partChoice in (0, 2): if self.partChoice in (0, 2):
@ -206,7 +218,16 @@ class ColorShop(StateData.StateData):
self.dna.gloveColor = rgb self.dna.gloveColor = rgb
if self.partChoice in (0, 4): if self.partChoice in (0, 4):
self.dna.legColor = rgb self.dna.legColor = rgb
self.toon.swapToonColor(self.dna) self.toon.swapToonColor(self.dna)
return Task.cont
def __startPickColor(self, extra):
self.__stopPickColor(extra)
taskMgr.add(self.__pickColor, 'colorDragTask')
def __stopPickColor(self, extra):
taskMgr.remove('colorDragTask')
def __swapPart(self, offset): def __swapPart(self, offset):
self.partChoice += offset self.partChoice += offset
@ -217,15 +238,18 @@ class ColorShop(StateData.StateData):
def __swapAllColor(self, offset): def __swapAllColor(self, offset):
colorList = self.getColorList() colorList = self.getColorList()
length = len(colorList) length = len(colorList)
choice = (self.headChoice + offset) % length self.allChoice = (self.allChoice + offset) % length
self.__updateScrollButtons(choice, length, self.allLButton, self.allRButton) self.__updateScrollButtons(self.allChoice, length, self.allLButton, self.allRButton)
self.__swapHeadColor(offset) self.__updateScrollButtons(self.allChoice, length, self.headLButton, self.headRButton)
oldArmColorIndex = colorList.index(self.toon.style.armColor) self.__updateScrollButtons(self.allChoice, length, self.armLButton, self.armRButton)
oldGloveColorIndex = colorList.index(self.toon.style.gloveColor) self.__updateScrollButtons(self.allChoice, length, self.gloveLButton, self.gloveRButton)
oldLegColorIndex = colorList.index(self.toon.style.legColor) self.__updateScrollButtons(self.allChoice, length, self.legLButton, self.legRButton)
self.__swapArmColor(choice - oldArmColorIndex) newColor = colorList[self.allChoice]
self.__swapGloveColor(choice - oldGloveColorIndex) self.dna.headColor = newColor
self.__swapLegColor(choice - oldLegColorIndex) self.dna.armColor = newColor
self.dna.gloveColor = newColor
self.dna.legColor = newColor
self.toon.swapToonColor(self.dna)
def __swapHeadColor(self, offset): def __swapHeadColor(self, offset):
colorList = self.getColorList() colorList = self.getColorList()

View file

@ -51,7 +51,6 @@ class ShuffleButton:
self.incBtnShowLerp = LerpColorInterval(self.incBtn, self.lerpDuration, Vec4(1, 1, 1, 1), Vec4(1, 1, 1, 0)) self.incBtnShowLerp = LerpColorInterval(self.incBtn, self.lerpDuration, Vec4(1, 1, 1, 1), Vec4(1, 1, 1, 0))
self.decBtnShowLerp = LerpColorInterval(self.decBtn, self.lerpDuration, Vec4(1, 1, 1, 1), Vec4(1, 1, 1, 0)) self.decBtnShowLerp = LerpColorInterval(self.decBtn, self.lerpDuration, Vec4(1, 1, 1, 1), Vec4(1, 1, 1, 0))
self.__updateArrows() self.__updateArrows()
return
def unload(self): def unload(self):
if self.showLerp: if self.showLerp:

View file

@ -38,6 +38,11 @@ class BlinkingArrows:
self.stopArrowsFlashing() self.stopArrowsFlashing()
self.arrow1.reparentTo(hidden) self.arrow1.reparentTo(hidden)
self.arrow2.reparentTo(hidden) self.arrow2.reparentTo(hidden)
def reparentTo(self, parent):
self.parent = parent
self.arrow1.reparentTo(self.parent)
self.arrow2.reparentTo(self.parent)
def startArrowsFlashing(self): def startArrowsFlashing(self):
onColor = Vec4(1, 1, 1, 1) onColor = Vec4(1, 1, 1, 1)

View file

@ -21,6 +21,9 @@ def init():
'camera': camera, 'camera': camera,
'hidden': hidden, 'hidden': hidden,
'aspect2d': aspect2d, 'aspect2d': aspect2d,
'topLeft': base.a2dTopLeft,
'bottomLeft': base.a2dBottomLeft,
'bottomRight': base.a2dBottomRight,
'localToon': base.localAvatar, 'localToon': base.localAvatar,
'laffMeter': base.localAvatar.laffMeter, 'laffMeter': base.localAvatar.laffMeter,
'inventory': base.localAvatar.inventory, 'inventory': base.localAvatar.inventory,
@ -137,7 +140,7 @@ class NPCMoviePlayer(DirectObject.DirectObject):
elif varName in globalVarDict: elif varName in globalVarDict:
return globalVarDict[varName] return globalVarDict[varName]
elif varName.find('tomDialogue') > -1 or varName.find('harryDialogue') > -1: elif varName.find('tomDialogue') > -1 or varName.find('harryDialogue') > -1:
notify.warning('%s getting referenced. Tutorial Ack: %d Place: %s' % (varName, base.localAvatar.tutorialAck, base.cr.playGame.hood)) notify.warning('%s getting referenced. Tutorial Ack: %d Place: %s' % (varName, base.localAvatar.tutorialAck, base.cr.playGame.hood))
return None return None
else: else:
notify.error('Variable not defined: %s' % varName) notify.error('Variable not defined: %s' % varName)

View file

@ -70,7 +70,7 @@ class QuestPoster(DirectFrame):
self.questProgress.hide() self.questProgress.hide()
self.funQuest = DirectLabel(parent=self.questFrame, relief=None, text=TTLocalizer.QuestPosterFun, text_fg=(0.0, 0.439, 1.0, 1.0), text_shadow=(0, 0, 0, 1), pos=(0, 0, -0.125), scale=0.04) self.funQuest = DirectLabel(parent=self.questFrame, relief=None, text=TTLocalizer.QuestPosterFun, text_fg=(0.0, 0.439, 1.0, 1.0), text_shadow=(0, 0, 0, 1), pos=(0, 0, -0.125), scale=0.04)
self.funQuest.hide() self.funQuest.hide()
self.teleportButton = DirectButton(parent=self.questFrame, relief=None, image=circleModel, text="Teleport", text_scale=0.035, text_pos=(-0.0025, -0.015), pos=(0.175, 0, 0.125), scale=0.75) #, text_bg=(0, 0.75, 1, 1) self.teleportButton = DirectButton(parent=self.questFrame, relief=None, image=circleModel, text=TTLocalizer.TeleportButton, text_scale=0.035, text_pos=(-0.0025, -0.015), pos=(0.175, 0, 0.125), scale=0.75) #, text_bg=(0, 0.75, 1, 1)
self.teleportButton.hide() self.teleportButton.hide()
self.laffMeter = None self.laffMeter = None
return return
@ -172,31 +172,28 @@ class QuestPoster(DirectFrame):
suitDoorOrigin = building.find('**/*_door_origin') suitDoorOrigin = building.find('**/*_door_origin')
elevatorNodePath.reparentTo(suitDoorOrigin) elevatorNodePath.reparentTo(suitDoorOrigin)
elevatorNodePath.setPosHpr(0, 0, 0, 0, 0, 0) elevatorNodePath.setPosHpr(0, 0, 0, 0, 0, 0)
return
def teleportToShop(self, npcId): def teleportToShop(self, npcId):
npcZone = NPCToons.getNPCZone(npcId) npcZone = NPCToons.getNPCZone(npcId)
npcHood = ZoneUtil.getCanonicalHoodId(npcZone) npcHood = ZoneUtil.getCanonicalHoodId(npcZone)
avZone = base.localAvatar.getZoneId()
avHood = ZoneUtil.getCanonicalHoodId(avZone)
avShard = base.localAvatar.defaultShard
avPlace = base.cr.playGame.getPlace()
hqZone = {2000:2520, 1000:1507, 3000:3508, 4000:4504, 5000:5502, 7000:7503, 9000:9505} hqZone = {2000:2520, 1000:1507, 3000:3508, 4000:4504, 5000:5502, 7000:7503, 9000:9505}
def callback(flag):
if flag: if npcZone in (-1, 0, None):
npcZone = None zoneId = base.localAvatar.getZoneId()
base.cr.buildingQueryMgr.d_isSuit(npcZone, callback) if ZoneUtil.isDynamicZone(zoneId) or ZoneUtil.isCogHQZone(zoneId):
if avShard not in base.cr.activeDistrictMap: zoneId = 2000
npcHood = ZoneUtil.getCanonicalHoodId(zoneId)
npcZone = hqZone.get(npcHood, 2520)
base.cr.buildingQueryMgr.d_isSuit(npcZone, lambda isSuit: self.teleportToShopCallback(npcZone, npcHood, isSuit))
def teleportToShopCallback(self, npcZone, npcHood, flag):
if flag:
self.teleportButton.setColorScale(0.3, 0.3, 0.3, 1.0)
return return
if npcZone in [-1, 0, None]:
return self.teleportButton.setColorScale(1.0, 1.0, 1.0, 1.0)
if not ZoneUtil.isInterior(npcZone): base.cr.playGame.getPlace().requestTeleport(npcHood, npcZone, base.localAvatar.defaultShard, -1)
return
if ZoneUtil.isHQ(npcZone):
args = (avHood, hqZone[avHood], avShard, -1)
else:
args = (npcHood, npcZone, avShard, -1)
avPlace.requestTeleport(*args)
def fitGeometry(self, geom, fFlip = 0, dimension = 0.8): def fitGeometry(self, geom, fFlip = 0, dimension = 0.8):
p1 = Point3() p1 = Point3()
@ -231,7 +228,6 @@ class QuestPoster(DirectFrame):
self.rPictureFrame.hide() self.rPictureFrame.hide()
self.questProgress.hide() self.questProgress.hide()
self.teleportButton.hide() self.teleportButton.hide()
self.teleportButton.setPos(0.175, 0, -0.125)
if hasattr(self, 'chooseButton'): if hasattr(self, 'chooseButton'):
self.chooseButton.destroy() self.chooseButton.destroy()
del self.chooseButton del self.chooseButton
@ -305,30 +301,17 @@ class QuestPoster(DirectFrame):
fComplete = quest.getCompletionStatus(base.localAvatar, questDesc) == Quests.COMPLETE fComplete = quest.getCompletionStatus(base.localAvatar, questDesc) == Quests.COMPLETE
if Quests.isQuestJustForFun(questId, rewardId):
if fComplete:
self.funQuest.hide()
self.teleportButton.show()
else:
self.teleportButton.hide()
if toNpcId == Quests.ToonHQ: if toNpcId == Quests.ToonHQ:
self.teleportButton.show()
self.teleportButton.setPos(0.285, 0, -0.15)
toNpcName = TTLocalizer.QuestPosterHQOfficer toNpcName = TTLocalizer.QuestPosterHQOfficer
toNpcBuildingName = TTLocalizer.QuestPosterHQBuildingName toNpcBuildingName = TTLocalizer.QuestPosterHQBuildingName
toNpcStreetName = TTLocalizer.QuestPosterHQStreetName toNpcStreetName = TTLocalizer.QuestPosterHQStreetName
toNpcLocationName = TTLocalizer.QuestPosterHQLocationName toNpcLocationName = TTLocalizer.QuestPosterHQLocationName
elif toNpcId == Quests.ToonTailor: elif toNpcId == Quests.ToonTailor:
self.teleportButton.show()
self.teleportButton.setPos(0.285, 0, -0.15)
toNpcName = TTLocalizer.QuestPosterTailor toNpcName = TTLocalizer.QuestPosterTailor
toNpcBuildingName = TTLocalizer.QuestPosterTailorBuildingName toNpcBuildingName = TTLocalizer.QuestPosterTailorBuildingName
toNpcStreetName = TTLocalizer.QuestPosterTailorStreetName toNpcStreetName = TTLocalizer.QuestPosterTailorStreetName
toNpcLocationName = TTLocalizer.QuestPosterTailorLocationName toNpcLocationName = TTLocalizer.QuestPosterTailorLocationName
else: else:
self.teleportButton.show()
self.teleportButton.setPos(0.285, 0, -0.15)
toNpcName = NPCToons.getNPCName(toNpcId) toNpcName = NPCToons.getNPCName(toNpcId)
toNpcZone = NPCToons.getNPCZone(toNpcId) toNpcZone = NPCToons.getNPCZone(toNpcId)
toNpcHoodId = ZoneUtil.getCanonicalHoodId(toNpcZone) toNpcHoodId = ZoneUtil.getCanonicalHoodId(toNpcZone)
@ -349,8 +332,13 @@ class QuestPoster(DirectFrame):
objectiveStrings = quest.getObjectiveStrings() objectiveStrings = quest.getObjectiveStrings()
captions = map(string.capwords, quest.getObjectiveStrings()) captions = map(string.capwords, quest.getObjectiveStrings())
imageColor = Vec4(*self.colors['white']) imageColor = Vec4(*self.colors['white'])
self.teleportButton.hide()
if base.localAvatar.tutorialAck and (fComplete or quest.getType() in (Quests.DeliverGagQuest, Quests.DeliverItemQuest, Quests.VisitQuest, Quests.TrackChoiceQuest)):
self.teleportButton.show()
self.teleportButton.setPos(0.3, 0, -0.15)
if isinstance(quest, Quests.TexturedQuest) and quest.hasFrame(): if isinstance(quest, Quests.TexturedQuest) and quest.hasFrame():
self.teleportButton.hide()
frame = quest.getFrame() frame = quest.getFrame()
frameBgColor = frame[1] frameBgColor = frame[1]
lIconGeom = frame[0] lIconGeom = frame[0]
@ -361,9 +349,6 @@ class QuestPoster(DirectFrame):
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
elif quest.getType() == Quests.DeliverGagQuest or quest.getType() == Quests.DeliverItemQuest: elif quest.getType() == Quests.DeliverGagQuest or quest.getType() == Quests.DeliverItemQuest:
frameBgColor = 'red' frameBgColor = 'red'
if fComplete:
self.teleportButton.show()
self.teleportButton.setPos(0.175, 0, -0.125)
if quest.getType() == Quests.DeliverGagQuest: if quest.getType() == Quests.DeliverGagQuest:
invModel = loader.loadModel('phase_3.5/models/gui/inventory_icons') invModel = loader.loadModel('phase_3.5/models/gui/inventory_icons')
track, item = quest.getGagType() track, item = quest.getGagType()
@ -382,7 +367,6 @@ class QuestPoster(DirectFrame):
infoText = TTLocalizer.QuestPageDestination % (toNpcBuildingName, toNpcStreetName, toNpcLocationName) infoText = TTLocalizer.QuestPageDestination % (toNpcBuildingName, toNpcStreetName, toNpcLocationName)
rIconGeom = self.createNpcToonHead(toNpcId) rIconGeom = self.createNpcToonHead(toNpcId)
rIconGeomScale = IMAGE_SCALE_SMALL rIconGeomScale = IMAGE_SCALE_SMALL
self.teleportButton.setPos(0.285, 0, -0.15)
elif quest.getType() == Quests.RecoverItemQuest: elif quest.getType() == Quests.RecoverItemQuest:
frameBgColor = 'green' frameBgColor = 'green'
bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
@ -425,10 +409,7 @@ class QuestPoster(DirectFrame):
infoText = quest.getLocationName() infoText = quest.getLocationName()
if infoText == '': if infoText == '':
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
else:
self.teleportButton.show()
elif quest.getType() == Quests.VisitQuest: elif quest.getType() == Quests.VisitQuest:
self.teleportButton.show()
frameBgColor = 'brown' frameBgColor = 'brown'
captions[0] = '%s' % toNpcName captions[0] = '%s' % toNpcName
lIconGeom = self.createNpcToonHead(toNpcId) lIconGeom = self.createNpcToonHead(toNpcId)
@ -436,7 +417,6 @@ class QuestPoster(DirectFrame):
if not fComplete: if not fComplete:
infoText = TTLocalizer.QuestPageDestination % (toNpcBuildingName, toNpcStreetName, toNpcLocationName) infoText = TTLocalizer.QuestPageDestination % (toNpcBuildingName, toNpcStreetName, toNpcLocationName)
elif quest.getType() == Quests.TrackChoiceQuest: elif quest.getType() == Quests.TrackChoiceQuest:
self.teleportButton.hide()
frameBgColor = 'green' frameBgColor = 'green'
invModel = loader.loadModel('phase_3.5/models/gui/inventory_icons') invModel = loader.loadModel('phase_3.5/models/gui/inventory_icons')
track1, track2 = quest.getChoices(base.localAvatar) track1, track2 = quest.getChoices(base.localAvatar)
@ -455,7 +435,6 @@ class QuestPoster(DirectFrame):
infoZ = -0.02 infoZ = -0.02
invModel.removeNode() invModel.removeNode()
elif quest.getType() == Quests.BuildingQuest: elif quest.getType() == Quests.BuildingQuest:
self.teleportButton.hide()
frameBgColor = 'blue' frameBgColor = 'blue'
track = quest.getBuildingTrack() track = quest.getBuildingTrack()
numFloors = quest.getNumFloors() numFloors = quest.getNumFloors()
@ -483,7 +462,6 @@ class QuestPoster(DirectFrame):
if infoText == '': if infoText == '':
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
elif quest.getType() == Quests.FactoryQuest: elif quest.getType() == Quests.FactoryQuest:
self.teleportButton.hide()
frameBgColor = 'blue' frameBgColor = 'blue'
bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
lIconGeom = bookModel.find('**/factoryIcon2') lIconGeom = bookModel.find('**/factoryIcon2')
@ -494,7 +472,6 @@ class QuestPoster(DirectFrame):
if infoText == '': if infoText == '':
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
elif quest.getType() == Quests.MintQuest: elif quest.getType() == Quests.MintQuest:
self.teleportButton.hide()
frameBgColor = 'blue' frameBgColor = 'blue'
bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
lIconGeom = bookModel.find('**/CashBotMint') lIconGeom = bookModel.find('**/CashBotMint')
@ -505,7 +482,6 @@ class QuestPoster(DirectFrame):
if infoText == '': if infoText == '':
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
elif quest.getType() == Quests.CogPartQuest: elif quest.getType() == Quests.CogPartQuest:
self.teleportButton.hide()
frameBgColor = 'green' frameBgColor = 'green'
bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
lIconGeom = bookModel.find('**/CogArmIcon2') lIconGeom = bookModel.find('**/CogArmIcon2')
@ -516,7 +492,6 @@ class QuestPoster(DirectFrame):
if infoText == '': if infoText == '':
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
elif quest.getType() == Quests.ForemanQuest or quest.getType() == Quests.SupervisorQuest: elif quest.getType() == Quests.ForemanQuest or quest.getType() == Quests.SupervisorQuest:
self.teleportButton.hide()
frameBgColor = 'blue' frameBgColor = 'blue'
bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
lIconGeom = bookModel.find('**/skelecog5') lIconGeom = bookModel.find('**/skelecog5')
@ -527,13 +502,11 @@ class QuestPoster(DirectFrame):
if infoText == '': if infoText == '':
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
elif quest.getType() == Quests.RescueQuest: elif quest.getType() == Quests.RescueQuest:
self.teleportButton.hide()
frameBgColor = 'blue' frameBgColor = 'blue'
lIconGeom = self.createNpcToonHead(random.choice(NPCToons.HQnpcFriends.keys())) lIconGeom = self.createNpcToonHead(random.choice(NPCToons.HQnpcFriends.keys()))
lIconGeomScale = 0.13 lIconGeomScale = 0.13
infoText = quest.getLocationName().strip() infoText = quest.getLocationName().strip()
elif quest.getType() == Quests.FriendQuest: elif quest.getType() == Quests.FriendQuest:
self.teleportButton.hide()
frameBgColor = 'brown' frameBgColor = 'brown'
gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui') gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui')
lIconGeom = gui.find('**/FriendsBox_Closed') lIconGeom = gui.find('**/FriendsBox_Closed')
@ -541,7 +514,6 @@ class QuestPoster(DirectFrame):
gui.removeNode() gui.removeNode()
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
elif quest.getType() == Quests.TrolleyQuest: elif quest.getType() == Quests.TrolleyQuest:
self.teleportButton.hide()
frameBgColor = 'lightBlue' frameBgColor = 'lightBlue'
gui = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') gui = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
lIconGeom = gui.find('**/trolley') lIconGeom = gui.find('**/trolley')
@ -549,7 +521,6 @@ class QuestPoster(DirectFrame):
gui.removeNode() gui.removeNode()
infoText = TTLocalizer.QuestPosterPlayground infoText = TTLocalizer.QuestPosterPlayground
elif quest.getType() == Quests.MailboxQuest: elif quest.getType() == Quests.MailboxQuest:
self.teleportButton.hide()
frameBgColor = 'lightBlue' frameBgColor = 'lightBlue'
bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
lIconGeom = bookModel.find('**/package') lIconGeom = bookModel.find('**/package')
@ -557,7 +528,6 @@ class QuestPoster(DirectFrame):
bookModel.removeNode() bookModel.removeNode()
infoText = TTLocalizer.QuestPosterAtHome infoText = TTLocalizer.QuestPosterAtHome
elif quest.getType() == Quests.PhoneQuest: elif quest.getType() == Quests.PhoneQuest:
self.teleportButton.hide()
frameBgColor = 'lightBlue' frameBgColor = 'lightBlue'
bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui') bookModel = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
lIconGeom = bookModel.find('**/clarabelleCow') lIconGeom = bookModel.find('**/clarabelleCow')
@ -565,7 +535,6 @@ class QuestPoster(DirectFrame):
bookModel.removeNode() bookModel.removeNode()
infoText = TTLocalizer.QuestPosterOnPhone infoText = TTLocalizer.QuestPosterOnPhone
else: else:
self.teleportButton.hide()
frameBgColor = 'blue' frameBgColor = 'blue'
if quest.getType() == Quests.CogTrackQuest: if quest.getType() == Quests.CogTrackQuest:
dept = quest.getCogTrack() dept = quest.getCogTrack()
@ -619,7 +588,6 @@ class QuestPoster(DirectFrame):
if infoText == '': if infoText == '':
infoText = TTLocalizer.QuestPosterAnywhere infoText = TTLocalizer.QuestPosterAnywhere
if fComplete: if fComplete:
self.teleportButton.show()
textColor = (0, 0.3, 0, 1) textColor = (0, 0.3, 0, 1)
imageColor = Vec4(*self.colors['lightGreen']) imageColor = Vec4(*self.colors['lightGreen'])
lPos.setX(-0.18) lPos.setX(-0.18)
@ -694,8 +662,6 @@ class QuestPoster(DirectFrame):
self.questInfo['text'] = infoText self.questInfo['text'] = infoText
self.questInfo.setZ(infoZ) self.questInfo.setZ(infoZ)
self.fitLabel(self.questInfo) self.fitLabel(self.questInfo)
if not Quests.QuestDict[questId][0] >= 11:
self.teleportButton.hide()
return return
def unbindMouseEnter(self): def unbindMouseEnter(self):

View file

@ -11,9 +11,8 @@ POSHPRSCALE toonBuilding -1.05 7 0 0 0 0 1.875 1.875 1.875
POSHPRSCALE cogBuilding -1.05 7 0 0 0 0 1.875 1.875 1.875 POSHPRSCALE cogBuilding -1.05 7 0 0 0 0 1.875 1.875 1.875
POSHPRSCALE squirt1 -1.05 7 0 0 0 0 1.875 1.875 1.875 POSHPRSCALE squirt1 -1.05 7 0 0 0 0 1.875 1.875 1.875
POSHPRSCALE squirt2 -1.05 7 0 0 0 0 1.875 1.875 1.875 POSHPRSCALE squirt2 -1.05 7 0 0 0 0 1.875 1.875 1.875
REPARENTTO camera npc WRTREPARENTTO camera npc
POS camera -2.2 5.2 3.3 LERP_POSHPRSCALE camera 2.8 0.0 3.5 35 5 0 1 1 1 1.5
HPR camera 215 5 0
WRTREPARENTTO camera localToon WRTREPARENTTO camera localToon
PLAY_ANIM npc "right-hand-start" 1 PLAY_ANIM npc "right-hand-start" 1
WAIT 1 WAIT 1
@ -46,11 +45,13 @@ WAIT 0.5
REPARENTTO squirt2 hidden REPARENTTO squirt2 hidden
OBSCURE_LAFFMETER 0 OBSCURE_LAFFMETER 0
SHOW laffMeter SHOW laffMeter
POS laffMeter 0 0 0 POS laffMeter 0.153 0.0 0.13
SCALE laffMeter 0.075 0.075 0.075 SCALE laffMeter 0.0 0.0 0.0
LERP_POS laffMeter 1.7 0 0.87 1 WRTREPARENTTO laffMeter aspect2d
LERP_POS laffMeter -0.25 0 -0.15 1
LERP_SCALE laffMeter 0.2 0.2 0.2 0.6 LERP_SCALE laffMeter 0.2 0.2 0.2 0.6
WAIT 1.0833 WAIT 1.0833
LOOP_ANIM npc "right-hand"
LOCAL_CHAT_CONFIRM npc QuestScript101_8 "CFReversed" LOCAL_CHAT_CONFIRM npc QuestScript101_8 "CFReversed"
LOCAL_CHAT_CONFIRM npc QuestScript101_9 "CFReversed" LOCAL_CHAT_CONFIRM npc QuestScript101_9 "CFReversed"
FUNCTION npc "sadEyes" FUNCTION npc "sadEyes"
@ -90,9 +91,10 @@ LOCAL_CHAT_CONFIRM npc QuestScript101_10 "CFReversed"
FUNCTION npc "normalEyes" FUNCTION npc "normalEyes"
FUNCTION npc "blinkEyes" FUNCTION npc "blinkEyes"
LAFFMETER 15 15 LAFFMETER 15 15
WRTREPARENTTO laffMeter bottomLeft
WAIT 0.5 WAIT 0.5
LERP_POS laffMeter 0.15 0.15 0.15 1 LERP_POS laffMeter 0.153 0.0 0.13 0.6
LERP_SCALE laffMeter 0.085 0.085 0.085 0.6 LERP_SCALE laffMeter 0.075 0.075 0.075 0.6
PLAY_ANIM npc "right-hand-start" -2 PLAY_ANIM npc "right-hand-start" -2
WAIT 1.0625 WAIT 1.0625
LOOP_ANIM npc "neutral" LOOP_ANIM npc "neutral"
@ -125,20 +127,30 @@ UPON_TIMEOUT FUNCTION squirt1 "removeNode"
UPON_TIMEOUT FUNCTION squirt2 "removeNode" UPON_TIMEOUT FUNCTION squirt2 "removeNode"
UPON_TIMEOUT LOOP_ANIM npc "neutral" UPON_TIMEOUT LOOP_ANIM npc "neutral"
UPON_TIMEOUT SHOW laffMeter UPON_TIMEOUT SHOW laffMeter
UPON_TIMEOUT POS laffMeter 0.15 0.15 0.15 UPON_TIMEOUT REPARENTTO laffMeter bottomLeft
UPON_TIMEOUT SCALE laffMeter 0.085 0.085 0.085 UPON_TIMEOUT POS laffMeter 0.15 0 0.13
UPON_TIMEOUT SCALE laffMeter 0.075 0.075 0.075
POS localToon 0.776 14.6 0 POS localToon 0.776 14.6 0
HPR localToon 47.5 0 0 HPR localToon 47.5 0 0
FINISH_QUEST_MOVIE FINISH_QUEST_MOVIE
ID quest_incomplete_110 ID quest_incomplete_110
DEBUG "quest assign 110"
LOCAL_CHAT_CONFIRM npc QuestScript110_1 LOCAL_CHAT_CONFIRM npc QuestScript110_1
OBSCURE_BOOK 0 OBSCURE_BOOK 0
REPARENTTO bookOpenButton aspect2d
SHOW bookOpenButton SHOW bookOpenButton
POS bookOpenButton 0 0 0
SCALE bookOpenButton 0.5 0.5 0.5
LERP_COLOR_SCALE bookOpenButton 1 1 1 0 1 1 1 1 0.5
WRTREPARENTTO bookOpenButton bottomRight
WAIT 1.5
LERP_POS bookOpenButton -0.158 0 0.17 1
LERP_SCALE bookOpenButton 0.305 0.305 0.305 1
WAIT 1
LOCAL_CHAT_CONFIRM npc QuestScript110_2 LOCAL_CHAT_CONFIRM npc QuestScript110_2
ARROWS_ON 1.364477 -0.89 0 1.664477 -0.64 90 REPARENTTO arrows bottomRight
ARROWS_ON -0.41 0.11 0 -0.11 0.36 90
LOCAL_CHAT_PERSIST npc QuestScript110_3 LOCAL_CHAT_PERSIST npc QuestScript110_3
WAIT_EVENT "enterStickerBook" WAIT_EVENT "enterStickerBook"
ARROWS_OFF ARROWS_OFF
@ -149,6 +161,7 @@ CLEAR_CHAT npc
WAIT 0.5 WAIT 0.5
TOON_HEAD npc -0.2 -0.45 1 TOON_HEAD npc -0.2 -0.45 1
LOCAL_CHAT_CONFIRM npc QuestScript110_4 LOCAL_CHAT_CONFIRM npc QuestScript110_4
REPARENTTO arrows aspect2d
ARROWS_ON 0.85 -0.75 -90 0.85 -0.75 -90 ARROWS_ON 0.85 -0.75 -90 0.85 -0.75 -90
SHOW bookNextArrow SHOW bookNextArrow
LOCAL_CHAT_PERSIST npc QuestScript110_5 LOCAL_CHAT_PERSIST npc QuestScript110_5
@ -171,7 +184,8 @@ LOCAL_CHAT_CONFIRM npc QuestScript110_8
LOCAL_CHAT_CONFIRM npc QuestScript110_9 LOCAL_CHAT_CONFIRM npc QuestScript110_9
LOCAL_CHAT_PERSIST npc QuestScript110_10 LOCAL_CHAT_PERSIST npc QuestScript110_10
ENABLE_CLOSE_BOOK ENABLE_CLOSE_BOOK
ARROWS_ON 1.364477 -0.89 0 1.664477 -0.64 90 REPARENTTO arrows bottomRight
ARROWS_ON -0.41 0.11 0 -0.11 0.36 90
WAIT_EVENT "exitStickerBook" WAIT_EVENT "exitStickerBook"
ARROWS_OFF ARROWS_OFF
TOON_HEAD npc 0 0 0 TOON_HEAD npc 0 0 0
@ -180,8 +194,11 @@ HIDE bookOpenButton
LOCAL_CHAT_CONFIRM npc QuestScript110_11 1 LOCAL_CHAT_CONFIRM npc QuestScript110_11 1
UPON_TIMEOUT OBSCURE_BOOK 0 UPON_TIMEOUT OBSCURE_BOOK 0
UPON_TIMEOUT ARROWS_OFF UPON_TIMEOUT ARROWS_OFF
UPON_TIMEOUT REPARENTTO arrows aspect2d
UPON_TIMEOUT HIDE_BOOK UPON_TIMEOUT HIDE_BOOK
UPON_TIMEOUT COLOR_SCALE bookOpenButton 1 1 1 1 UPON_TIMEOUT COLOR_SCALE bookOpenButton 1 1 1 1
UPON_TIMEOUT POS bookOpenButton -0.158 0 0.17
UPON_TIMEOUT SCALE bookOpenButton 0.305 0.305 0.305
UPON_TIMEOUT TOON_HEAD npc 0 0 0 UPON_TIMEOUT TOON_HEAD npc 0 0 0
UPON_TIMEOUT SHOW bookOpenButton UPON_TIMEOUT SHOW bookOpenButton
FINISH_QUEST_MOVIE FINISH_QUEST_MOVIE
@ -193,9 +210,9 @@ FUNCTION npc "stopLookAround"
POS camera 0.0 6.0 4.0 POS camera 0.0 6.0 4.0
HPR camera 180.0 0.0 0.0 HPR camera 180.0 0.0 0.0
LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_1 LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_1
WAIT 0.8 WAIT 0.8
LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_2 LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_2
WAIT 0.8 WAIT 0.8
POS camera -5.0 -9.0 6.0 POS camera -5.0 -9.0 6.0
HPR camera -25.0 -10.0 0.0 HPR camera -25.0 -10.0 0.0
POS localToon 203.8 18.64 -0.475 POS localToon 203.8 18.64 -0.475
@ -203,9 +220,18 @@ HPR localToon -90.0 0.0 0.0
SHOW localToon SHOW localToon
LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_3 LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_3
OBSCURE_CHAT 1 0 OBSCURE_CHAT 1 0
REPARENTTO chatScButton aspect2d
SHOW chatScButton SHOW chatScButton
WAIT 0.6 POS chatScButton -0.3 0 -0.1
ARROWS_ON -1.3644 0.91 180 -1.5644 0.74 -90 SCALE chatScButton 2.0 2.0 2.0
LERP_COLOR_SCALE chatScButton 1 1 1 0 1 1 1 1 0.5
WRTREPARENTTO chatScButton topLeft
WAIT 0.5
LERP_POS chatScButton 0.204 0 -0.072 0.6
LERP_SCALE chatScButton 1.179 1.179 1.179 0.6
WAIT 0.6
REPARENTTO arrows topLeft
ARROWS_ON 0.41 -0.09 180 0.21 -0.26 -90
LOCAL_CHAT_PERSIST npc QuestScriptTutorialBlocker_4 LOCAL_CHAT_PERSIST npc QuestScriptTutorialBlocker_4
WAIT_EVENT "enterSpeedChat" WAIT_EVENT "enterSpeedChat"
ARROWS_OFF ARROWS_OFF
@ -218,16 +244,24 @@ REPARENTTO camera localToon
LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_5 "CFReversed" LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_5 "CFReversed"
LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_6 "CFReversed" LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_6 "CFReversed"
OBSCURE_CHAT 0 0 OBSCURE_CHAT 0 0
REPARENTTO chatNormalButton aspect2d
SHOW chatNormalButton SHOW chatNormalButton
WAIT 0.6 POS chatNormalButton -0.3 0 -0.1
SCALE chatNormalButton 2.0 2.0 2.0
LERP_COLOR_SCALE chatNormalButton 1 1 1 0 1 1 1 1 0.5
WAIT 0.5
WRTREPARENTTO chatNormalButton topLeft
LERP_POS chatNormalButton 0.068 0 -0.072 0.6
LERP_SCALE chatNormalButton 1.179 1.179 1.179 0.6
WAIT 0.6
LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_7 "CFReversed" LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_7 "CFReversed"
LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_8 1 "CFReversed" LOCAL_CHAT_CONFIRM npc QuestScriptTutorialBlocker_8 1 "CFReversed"
LOOP_ANIM npc "walk" LOOP_ANIM npc "walk"
LERP_HPR npc 270 0 0 0.5 LERP_HPR npc 270 0 0 0.5
WAIT 0.5 WAIT 0.5
LOOP_ANIM npc "run" LOOP_ANIM npc "run"
LERP_POS npc 217.4 18.81 -0.475 0.75 LERP_POS npc 217.4 18.81 -0.475 0.75
LERP_HPR npc 240 0 0 0.75 LERP_HPR npc 240 0 0 0.75
WAIT 0.75 WAIT 0.75
LERP_POS npc 222.4 15.0 -0.475 0.35 LERP_POS npc 222.4 15.0 -0.475 0.35
LERP_HPR npc 180 0 0 0.35 LERP_HPR npc 180 0 0 0.35
@ -237,7 +271,12 @@ WAIT 0.75
REPARENTTO npc hidden REPARENTTO npc hidden
FREE_LOCALTOON FREE_LOCALTOON
UPON_TIMEOUT ARROWS_OFF UPON_TIMEOUT ARROWS_OFF
UPON_TIMEOUT OBSCURE_CHAT 0 0 UPON_TIMEOUT REPARENTTO arrows aspect2d
UPON_TIMEOUT POS chatScButton 0.204 0 -0.072
UPON_TIMEOUT SCALE chatScButton 1.179 1.179 1.179
UPON_TIMEOUT POS chatNormalButton 0.068 0 -0.072
UPON_TIMEOUT SCALE chatNormalButton 1.179 1.179 1.179
UPON_TIMEOUT OBSCURE_CHAT 0 0
UPON_TIMEOUT REPARENTTO camera localToon UPON_TIMEOUT REPARENTTO camera localToon
FINISH_QUEST_MOVIE FINISH_QUEST_MOVIE
@ -250,13 +289,15 @@ WAIT 0.1
LOCAL_CHAT_CONFIRM npc QuestScriptGagShop_1 LOCAL_CHAT_CONFIRM npc QuestScriptGagShop_1
LERP_POS npcToonHead -0.64 0 -0.74 0.7 LERP_POS npcToonHead -0.64 0 -0.74 0.7
LERP_SCALE npcToonHead 0.82 0.82 0.82 0.7 LERP_SCALE npcToonHead 0.82 0.82 0.82 0.7
LERP_COLOR_SCALE purchaseBg 1 1 1 1 0.6 0.6 0.6 1 0.7 LERP_COLOR_SCALE purchaseBg 1 1 1 1 0.6 0.6 0.6 1 0.7
WAIT 0.7 WAIT 0.7
SHOW inventory SHOW inventory
LOCAL_CHAT_CONFIRM npc QuestScriptGagShop_1a LOCAL_CHAT_CONFIRM npc QuestScriptGagShop_1a
ARROWS_ON -0.19 0.04 180 -0.4 0.26 90
LOCAL_CHAT_PERSIST npc QuestScriptGagShop_3 LOCAL_CHAT_PERSIST npc QuestScriptGagShop_3
SEND_EVENT "enableGagPanel" SEND_EVENT "enableGagPanel"
WAIT_EVENT "inventory-selection" WAIT_EVENT "inventory-selection"
ARROWS_OFF
CLEAR_CHAT npc CLEAR_CHAT npc
WAIT 0.5 WAIT 0.5
LOCAL_CHAT_CONFIRM npc QuestScriptGagShop_4 LOCAL_CHAT_CONFIRM npc QuestScriptGagShop_4
@ -299,6 +340,7 @@ LERP_COLOR_SCALE purchaseBg 0.6 0.6 0.6 1 1 1 1 1 0.5
WAIT 0.5 WAIT 0.5
SEND_EVENT "enableBackToPlayground" SEND_EVENT "enableBackToPlayground"
UPON_TIMEOUT TOON_HEAD npc 0 0 0 UPON_TIMEOUT TOON_HEAD npc 0 0 0
UPON_TIMEOUT ARROWS_OFF
UPON_TIMEOUT SHOW inventory UPON_TIMEOUT SHOW inventory
UPON_TIMEOUT SEND_EVENT "enableGagPanel" UPON_TIMEOUT SEND_EVENT "enableGagPanel"
UPON_TIMEOUT SEND_EVENT "enableBackToPlayground" UPON_TIMEOUT SEND_EVENT "enableBackToPlayground"
@ -320,10 +362,9 @@ CHAT_CONFIRM npc QuestScript145_2 1
UPON_TIMEOUT FUNCTION frame "removeNode" UPON_TIMEOUT FUNCTION frame "removeNode"
FINISH_QUEST_MOVIE FINISH_QUEST_MOVIE
ID quest_incomplete_150 ID quest_incomplete_150
CHAT_CONFIRM npc QuestScript150_1 CHAT_CONFIRM npc QuestScript150_1
ARROWS_ON 1.65 0.51 -120 1.65 0.51 -120 ARROWS_ON 1.05 0.51 -120 1.05 0.51 -120
SHOW_FRIENDS_LIST SHOW_FRIENDS_LIST
CHAT_CONFIRM npc QuestScript150_2 CHAT_CONFIRM npc QuestScript150_2
ARROWS_OFF ARROWS_OFF
@ -334,4 +375,4 @@ CHAT_CONFIRM npc QuestScript150_4 1
UPON_TIMEOUT HIDE_FRIENDS_LIST UPON_TIMEOUT HIDE_FRIENDS_LIST
UPON_TIMEOUT ARROWS_OFF UPON_TIMEOUT ARROWS_OFF
FINISH_QUEST_MOVIE FINISH_QUEST_MOVIE
''' '''

View file

@ -6,13 +6,30 @@ class LeaderboardMgrAI:
def __init__(self, air): def __init__(self, air):
self.air = air self.air = air
self.database = simbase.backups.load('leaderboard', (self.air.districtId,), default=({})) if self.air.dbConn:
self.air.dbGlobalCursor.leaderboards.ensure_index([('ai', 1)])
shard = {'ai': self.air.districtId}
doc = self.air.dbGlobalCursor.leaderboards.find_one(shard)
if not doc:
self.database = ({})
else:
self.database = doc.get('database', ({}))
else:
self.database = simbase.backups.load('leaderboard', (self.air.districtId,), default=({}))
def getDatabase(self): def getDatabase(self):
return self.database return self.database
def saveDatabase(self): def saveDatabase(self):
simbase.backups.save('leaderboard', (self.air.districtId,), self.database) if self.air.dbConn:
shard = {'ai': self.air.districtId}
self.air.dbGlobalCursor.leaderboards.update(shard,
{'$setOnInsert': shard,
'$set': {'database': self.database}},
upsert = True)
else:
simbase.backups.save('leaderboard', (self.air.districtId,), self.database)
messenger.send('goofyLeaderboardChange') messenger.send('goofyLeaderboardChange')
def trimList(self, list): def trimList(self, list):

View file

@ -773,3 +773,22 @@ class ToontownRPCHandler(ToontownRPCHandlerBase):
oldFields = {'setWishNameState': 'PENDING'} oldFields = {'setWishNameState': 'PENDING'}
return self.rpc_updateObject( return self.rpc_updateObject(
avId, 'DistributedToonUD', newFields, oldFields=oldFields) avId, 'DistributedToonUD', newFields, oldFields=oldFields)
@rpcmethod(accessLevel=MODERATOR)
def rpc_setChatSettings(self, accId, chatSettings):
"""
Summary:
Sets the chat settings of the account associated with the provided
[accId].
Parameters:
[int accId] = The ID of the account whose chat settings
are to be changed.
[uint8[sp+, tf]] = The chat settings - SpeedChat Plus and
True Friends
Example response:
On success: True
On failure: False
"""
return self.rpc_updateObject(accId, 'AccountUD', {'CHAT_SETTINGS': chatSettings})

View file

@ -1,42 +1,26 @@
from panda3d.core import * from DistributedTreasure import DistributedTreasure
from toontown.toonbase.ToonBaseGlobal import * import math, random
import DistributedSZTreasure
from direct.task.Task import Task
import math
import random
class DistributedEFlyingTreasure(DistributedSZTreasure.DistributedSZTreasure): class DistributedEFlyingTreasure(DistributedTreasure):
def __init__(self, cr): def __init__(self, cr):
DistributedSZTreasure.DistributedSZTreasure.__init__(self, cr) DistributedTreasure.__init__(self, cr)
self.modelPath = 'phase_5.5/models/props/popsicle_treasure'
self.grabSoundPath = 'phase_4/audio/sfx/SZ_DD_treasure.ogg'
self.scale = 2 self.scale = 2
self.delT = math.pi * 2.0 * random.random() self.delT = math.pi * 2.0 * random.random()
self.shadow = 0 self.shadow = 0
def disable(self): def disable(self):
DistributedSZTreasure.DistributedSZTreasure.disable(self) DistributedTreasure.disable(self)
taskMgr.remove(self.taskName('flying-treasure')) taskMgr.remove(self.taskName('flying-treasure'))
def generateInit(self):
DistributedSZTreasure.DistributedSZTreasure.generateInit(self)
def setPosition(self, x, y, z): def setPosition(self, x, y, z):
DistributedSZTreasure.DistributedSZTreasure.setPosition(self, x, y, z) DistributedTreasure.setPosition(self, x, y, z)
self.initPos = self.nodePath.getPos() self.initPos = self.nodePath.getPos()
self.pos = self.nodePath.getPos()
def startAnimation(self):
taskMgr.add(self.animateTask, self.taskName('flying-treasure')) taskMgr.add(self.animateTask, self.taskName('flying-treasure'))
def animateTask(self, task): def animateTask(self, task):
pos = self.initPos pos = self.initPos
t = 0.5 * math.pi * globalClock.getFrameTime() t = 0.5 * math.pi * globalClock.getFrameTime()
dZ = 5.0 * math.sin(t + self.delT) dZ = 5.0 * math.sin(t + self.delT)
dY = 2.0 * math.cos(t + self.delT)
self.nodePath.setPos(pos[0], pos[1], pos[2] + dZ) self.nodePath.setPos(pos[0], pos[1], pos[2] + dZ)
if self.pos: return task.cont
del self.pos
self.pos = self.nodePath.getPos()
return Task.cont

View file

@ -0,0 +1,4 @@
import DistributedTreasureAI
class DistributedEFlyingTreasureAI(DistributedTreasureAI.DistributedTreasureAI):
pass

View file

@ -661,6 +661,8 @@ class DistributedFishingSpot(DistributedObject.DistributedObject):
jar.setPos(0, 0, 0) jar.setPos(0, 0, 0)
def resetCastGui(self): def resetCastGui(self):
if not self.castGui:
return
self.notify.debug('resetCastGui: Bingo Night Ends - resetting Gui') self.notify.debug('resetCastGui: Bingo Night Ends - resetting Gui')
bucket = self.castGui.find('**/bucket') bucket = self.castGui.find('**/bucket')
jar = self.castGui.find('**/jar') jar = self.castGui.find('**/jar')

View file

@ -75,11 +75,13 @@ class Playground(Place.Place):
State.State('doorIn', State.State('doorIn',
self.enterDoorIn, self.enterDoorIn,
self.exitDoorIn, [ self.exitDoorIn, [
'walk']), 'walk',
'stopped']),
State.State('doorOut', State.State('doorOut',
self.enterDoorOut, self.enterDoorOut,
self.exitDoorOut, [ self.exitDoorOut, [
'walk']), 'walk',
'stopped']),
State.State('NPCFA', State.State('NPCFA',
self.enterNPCFA, self.enterNPCFA,
self.exitNPCFA, [ self.exitNPCFA, [

View file

@ -729,31 +729,25 @@ class ExtraOptionsTabPage(DirectFrame):
button_image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')) button_image = (guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR'))
self.speed_chat_scale = 0.055 self.speed_chat_scale = 0.055
self.fov_label = DirectLabel(parent=self, relief=None, text=TTLocalizer.FieldOfViewLabel, text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight)) self.fov_label = DirectLabel(parent=self, relief=None, text=TTLocalizer.FieldOfViewLabel, text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight))
self.speedchatPlus_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - textRowHeight)) self.cogInterface_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - textRowHeight))
self.trueFriends_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 2 * textRowHeight)) self.tpTransition_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 2 * textRowHeight))
self.cogInterface_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 3 * textRowHeight))
self.tpTransition_label = DirectLabel(parent=self, relief=None, text='', text_align=TextNode.ALeft, text_scale=options_text_scale, text_wordwrap=16, pos=(leftMargin, 0, textStartHeight - 4 * textRowHeight))
self.fov_slider = DirectSlider(parent=self, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord), self.fov_slider = DirectSlider(parent=self, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord),
value=settings['fov'], pageSize=5, range=(ToontownGlobals.DefaultCameraFov, ToontownGlobals.MaxCameraFov), command=self.__doFov, value=settings['fov'], pageSize=5, range=(ToontownGlobals.DefaultCameraFov, ToontownGlobals.MaxCameraFov), command=self.__doFov,
thumb_geom=(circleModel.find('**/tt_t_gui_mat_namePanelCircle')), thumb_relief=None, thumb_geom_scale=2) thumb_geom=(circleModel.find('**/tt_t_gui_mat_namePanelCircle')), thumb_relief=None, thumb_geom_scale=2)
self.fov_slider.setScale(0.25) self.fov_slider.setScale(0.25)
self.speedchatPlus_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight), command=self.__doToggleSpeedchatPlus) self.cogInterface_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - textRowHeight), command=self.__doToggleCogInterface)
self.trueFriends_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - 2 * textRowHeight), command=self.__doToggleTrueFriends) self.tpTransition_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - 2 * textRowHeight), command=self.__doToggleTpTransition)
self.cogInterface_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - 3 * textRowHeight), command=self.__doToggleCogInterface)
self.tpTransition_toggleButton = DirectButton(parent=self, relief=None, image=button_image, image_scale=button_image_scale, text='', text_scale=options_text_scale, text_pos=button_textpos, pos=(buttonbase_xcoord, 0.0, buttonbase_ycoord - 4 * textRowHeight), command=self.__doToggleTpTransition)
self.bugReportButton = DirectButton(parent=self, relief=None, text=TTLocalizer.BugReportButton, image=button_image, image_scale=button_image_scale, text_pos=(0, -0.01), text_fg=(0, 0, 0, 1), self.bugReportButton = DirectButton(parent=self, relief=None, text=TTLocalizer.BugReportButton, image=button_image, image_scale=button_image_scale, text_pos=(0, -0.01), text_fg=(0, 0, 0, 1),
command=self.showReportNotice, pos=(0.0, 0.0, -0.6), text_scale=(0.045)) command=self.showReportNotice, pos=(0.0, 0.0, -0.6), text_scale=(0.045))
guiButton.removeNode() guiButton.removeNode()
circleModel.removeNode() circleModel.removeNode()
self.optionChoosers['pole'] = OptionChooser.OptionChooser(self, TTLocalizer.FishingPoleLabel, 5, self.__updateFishingPole, [False], self.__applyFishingPole) self.optionChoosers['pole'] = OptionChooser.OptionChooser(self, TTLocalizer.FishingPoleLabel, 3, self.__updateFishingPole, [False], self.__applyFishingPole)
self.optionChoosers['nametag_style'] = OptionChooser.OptionChooser(self, TTLocalizer.NametagStyleLabel, 6, self.__updateNametagStyle, [False], self.__applyNametagStyle) self.optionChoosers['nametag_style'] = OptionChooser.OptionChooser(self, TTLocalizer.NametagStyleLabel, 4, self.__updateNametagStyle, [False], self.__applyNametagStyle)
def enter(self): def enter(self):
self.show() self.show()
self.settingsChanged = 0 self.settingsChanged = 0
self.__setSpeedchatPlusButton()
self.__setTrueFriendsButton()
self.__setCogInterfaceButton() self.__setCogInterfaceButton()
self.__setTpTransitionButton() self.__setTpTransitionButton()
self.__updateNametagStyle() self.__updateNametagStyle()
@ -774,18 +768,14 @@ class ExtraOptionsTabPage(DirectFrame):
del self.fov_label del self.fov_label
self.fov_slider.destroy() self.fov_slider.destroy()
del self.fov_slider del self.fov_slider
self.speedchatPlus_label.destroy()
del self.speedchatPlus_label
self.trueFriends_label.destroy()
del self.trueFriends_label
self.cogInterface_label.destroy() self.cogInterface_label.destroy()
del self.cogInterface_label del self.cogInterface_label
self.speedchatPlus_toggleButton.destroy()
del speedchatPlus_toggleButton
self.trueFriends_toggleButton.destroy()
del self.trueFriends_toggleButton
self.cogInterface_toggleButton.destroy() self.cogInterface_toggleButton.destroy()
del self.cogInterface_toggleButton del self.cogInterface_label
self.tpTransition_label.destroy()
del self.tpTransition_label
self.tpTransition_toggleButton.destroy()
del self.tpTransition_toggleButton
self.bugReportButton.destroy() self.bugReportButton.destroy()
del self.bugReportButton del self.bugReportButton
self.destroyReportNotice() self.destroyReportNotice()
@ -808,28 +798,6 @@ class ExtraOptionsTabPage(DirectFrame):
self.cogInterface_label['text'] = TTLocalizer.CogInterfaceLabelOn if settings['cogInterface'] else TTLocalizer.CogInterfaceLabelOff self.cogInterface_label['text'] = TTLocalizer.CogInterfaceLabelOn if settings['cogInterface'] else TTLocalizer.CogInterfaceLabelOff
self.cogInterface_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['cogInterface'] else TTLocalizer.OptionsPageToggleOn self.cogInterface_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['cogInterface'] else TTLocalizer.OptionsPageToggleOn
def __doToggleSpeedchatPlus(self):
messenger.send('wakeup')
settings['speedchatPlus'] = not settings['speedchatPlus']
Toon.reconsiderAllToonsUnderstandable()
self.settingsChanged = 1
self.__setSpeedchatPlusButton()
def __setSpeedchatPlusButton(self):
self.speedchatPlus_label['text'] = TTLocalizer.SpeedchatPlusLabelOn if settings['speedchatPlus'] else TTLocalizer.SpeedchatPlusLabelOff
self.speedchatPlus_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['speedchatPlus'] else TTLocalizer.OptionsPageToggleOn
def __doToggleTrueFriends(self):
messenger.send('wakeup')
settings['trueFriends'] = not settings['trueFriends']
Toon.reconsiderAllToonsUnderstandable()
self.settingsChanged = 1
self.__setTrueFriendsButton()
def __setTrueFriendsButton(self):
self.trueFriends_label['text'] = TTLocalizer.TrueFriendsLabelOn if settings['trueFriends'] else TTLocalizer.TrueFriendsLabelOff
self.trueFriends_toggleButton['text'] = TTLocalizer.OptionsPageToggleOff if settings['trueFriends'] else TTLocalizer.OptionsPageToggleOn
def __doToggleTpTransition(self): def __doToggleTpTransition(self):
messenger.send('wakeup') messenger.send('wakeup')
settings['tpTransition'] = not settings['tpTransition'] settings['tpTransition'] = not settings['tpTransition']

View file

@ -1,23 +1,16 @@
from panda3d.core import *
from direct.actor import Actor from direct.actor import Actor
from direct.directnotify import DirectNotifyGlobal from direct.directnotify import DirectNotifyGlobal
from direct.fsm import FSM from direct.fsm import FSM
from direct.fsm import State
from direct.interval.IntervalGlobal import * from direct.interval.IntervalGlobal import *
from direct.showbase.PythonUtil import Functor
from direct.task.Task import Task from direct.task.Task import Task
from panda3d.core import *
import types
import random
import Suit
import SuitDNA
from otp.avatar import Avatar from otp.avatar import Avatar
from toontown.battle import BattleParticles
from toontown.battle import BattleProps
from otp.nametag.NametagGroup import NametagGroup from otp.nametag.NametagGroup import NametagGroup
from otp.nametag.NametagConstants import * from otp.nametag.NametagConstants import *
from toontown.toonbase import TTLocalizer from toontown.battle import BattleParticles, BattleProps
from toontown.toonbase import ToontownGlobals from toontown.toonbase import TTLocalizer, ToontownGlobals
import Suit, SuitDNA, SuitHealthBar
import types, random
GenericModel = 'phase_9/models/char/bossCog' GenericModel = 'phase_9/models/char/bossCog'
ModelDict = {'s': 'phase_9/models/char/sellbotBoss', ModelDict = {'s': 'phase_9/models/char/sellbotBoss',
@ -28,8 +21,6 @@ AnimList = ('Ff_speech', 'ltTurn2Wave', 'wave', 'Ff_lookRt', 'turn2Fb', 'Ff_neut
class BossCog(Avatar.Avatar): class BossCog(Avatar.Avatar):
notify = DirectNotifyGlobal.directNotify.newCategory('BossCog') notify = DirectNotifyGlobal.directNotify.newCategory('BossCog')
healthColors = Suit.Suit.healthColors
healthGlowColors = Suit.Suit.healthGlowColors
def __init__(self): def __init__(self):
Avatar.Avatar.__init__(self) Avatar.Avatar.__init__(self)
@ -52,15 +43,14 @@ class BossCog(Avatar.Avatar):
self.queuedAnimIvals = [] self.queuedAnimIvals = []
self.treadsLeftPos = 0 self.treadsLeftPos = 0
self.treadsRightPos = 0 self.treadsRightPos = 0
self.healthBar = None self.healthBar = SuitHealthBar.SuitHealthBar()
self.healthCondition = 0
self.animDoneEvent = 'BossCogAnimDone' self.animDoneEvent = 'BossCogAnimDone'
self.animIvalName = 'BossCogAnimIval' self.animIvalName = 'BossCogAnimIval'
self.warningSfx = loader.loadSfx('phase_9/audio/sfx/CHQ_GOON_tractor_beam_alarmed.ogg') self.warningSfx = loader.loadSfx('phase_9/audio/sfx/CHQ_GOON_tractor_beam_alarmed.ogg')
def delete(self): def delete(self):
Avatar.Avatar.delete(self) Avatar.Avatar.delete(self)
self.removeHealthBar() self.healthBar.delete()
self.setDizzy(0) self.setDizzy(0)
self.stopAnimate() self.stopAnimate()
if self.doorA: if self.doorA:
@ -155,92 +145,17 @@ class BossCog(Avatar.Avatar):
self.collNode.setCollideMask(self.collNode.getIntoCollideMask() | ToontownGlobals.PieBitmask) self.collNode.setCollideMask(self.collNode.getIntoCollideMask() | ToontownGlobals.PieBitmask)
def generateHealthBar(self): def generateHealthBar(self):
self.removeHealthBar() self.healthBar.generate()
chestNull = self.find('**/joint_lifeMeter') self.healthBar.geom.reparentTo(self.find('**/joint_lifeMeter'))
if chestNull.isEmpty(): self.healthBar.geom.setScale(6.0)
return self.healthBar.geom.setHpr(0, -20, 0)
model = loader.loadModel('phase_3.5/models/gui/matching_game_gui') self.healthBar.geom.show()
button = model.find('**/minnieCircle')
button.setScale(6.0)
button.setP(-20)
button.setColor(self.healthColors[0])
button.reparentTo(chestNull)
self.healthBar = button
glow = BattleProps.globalPropPool.getProp('glow')
glow.reparentTo(self.healthBar)
glow.setScale(0.28)
glow.setPos(-0.005, 0.01, 0.015)
glow.setColor(self.healthGlowColors[0])
button.flattenLight()
self.healthBarGlow = glow
self.healthCondition = 0
def updateHealthBar(self): def updateHealthBar(self):
if self.healthBar == None:
return
health = 1.0 - float(self.bossDamage) / float(self.bossMaxDamage)
if health > 0.95:
condition = 0
elif health > 0.9:
condition = 1
elif health > 0.8:
condition = 2
elif health > 0.7:
condition = 3#Yellow
elif health > 0.6:
condition = 4
elif health > 0.5:
condition = 5
elif health > 0.3:
condition = 6#Orange
elif health > 0.15:
condition = 7
elif health > 0.05:
condition = 8#Red
elif health > 0.0:
condition = 9#Blinking Red
else:
condition = 10
if self.healthCondition != condition:
if condition == 9:
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75), Task(self.__blinkGray), Task.pause(0.1))
taskMgr.add(blinkTask, self.uniqueName('blink-task'))
elif condition == 10:
if self.healthCondition == 9:
taskMgr.remove(self.uniqueName('blink-task'))
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.25), Task(self.__blinkGray), Task.pause(0.1))
taskMgr.add(blinkTask, self.uniqueName('blink-task'))
else:
self.healthBar.setColor(self.healthColors[condition], 1)
self.healthBarGlow.setColor(self.healthGlowColors[condition], 1)
self.healthCondition = condition
def __blinkRed(self, task):
if not self.healthBar: if not self.healthBar:
return return
self.healthBar.setColor(self.healthColors[8], 1)
self.healthBarGlow.setColor(self.healthGlowColors[8], 1) self.healthBar.update(1.0 - float(self.bossDamage) / float(self.bossMaxDamage))
if self.healthCondition == 10:
self.healthBar.setScale(1.17)
return Task.done
def __blinkGray(self, task):
if not self.healthBar:
return
self.healthBar.setColor(self.healthColors[9], 1)
self.healthBarGlow.setColor(self.healthGlowColors[9], 1)
if self.healthCondition == 10:
self.healthBar.setScale(1.0)
return Task.done
def removeHealthBar(self):
if self.healthBar:
self.healthBar.removeNode()
self.healthBar = None
if self.healthCondition == 9 or self.healthCondition == 10:
taskMgr.remove(self.uniqueName('blink-task'))
self.healthCondition = 0
return
def reverseHead(self): def reverseHead(self):
self.neck.setHpr(self.neckReversedHpr) self.neck.setHpr(self.neckReversedHpr)

View file

@ -18,8 +18,7 @@ from toontown.effects import DustCloud
from toontown.suit import DistributedBossCog from toontown.suit import DistributedBossCog
from toontown.suit import Suit from toontown.suit import Suit
from toontown.suit import SuitDNA from toontown.suit import SuitDNA
from toontown.toon import Toon from toontown.toon import Toon, NPCToons
from toontown.toon import ToonDNA
from toontown.toonbase import TTLocalizer from toontown.toonbase import TTLocalizer
from toontown.toonbase import ToontownGlobals from toontown.toonbase import ToontownGlobals
from toontown.toonbase import ToontownTimer from toontown.toonbase import ToontownTimer
@ -197,17 +196,7 @@ class DistributedBossbotBoss(DistributedBossCog.DistributedBossCog, FSM.FSM):
def __makeResistanceToon(self): def __makeResistanceToon(self):
if self.resistanceToon: if self.resistanceToon:
return return
npc = Toon.Toon() self.resistanceToon = NPCToons.createLocalNPC(10002)
npc.setName(TTLocalizer.BossbotResistanceToonName)
npc.setPickable(0)
npc.setPlayerType(NametagGroup.CCNonPlayer)
dna = ToonDNA.ToonDNA()
dna.newToonRandom(11237, 'm', 1)
dna.head = 'sls'
npc.setDNAString(dna.makeNetString())
npc.animFSM.request('neutral')
npc.loop('neutral')
self.resistanceToon = npc
self.resistanceToon.setPosHpr(*ToontownGlobals.BossbotRTIntroStartPosHpr) self.resistanceToon.setPosHpr(*ToontownGlobals.BossbotRTIntroStartPosHpr)
state = random.getstate() state = random.getstate()
random.seed(self.doId) random.seed(self.doId)

View file

@ -19,8 +19,7 @@ from toontown.building import ElevatorUtils
from toontown.chat import ResistanceChat from toontown.chat import ResistanceChat
from toontown.coghq import CogDisguiseGlobals from toontown.coghq import CogDisguiseGlobals
from toontown.distributed import DelayDelete from toontown.distributed import DelayDelete
from toontown.toon import Toon from toontown.toon import Toon, NPCToons
from toontown.toon import ToonDNA
from toontown.toonbase import TTLocalizer from toontown.toonbase import TTLocalizer
from toontown.toonbase import ToontownGlobals from toontown.toonbase import ToontownGlobals
from otp.nametag import NametagGroup from otp.nametag import NametagGroup
@ -38,7 +37,7 @@ class DistributedCashbotBoss(DistributedBossCog.DistributedBossCog, FSM.FSM):
def __init__(self, cr): def __init__(self, cr):
DistributedBossCog.DistributedBossCog.__init__(self, cr) DistributedBossCog.DistributedBossCog.__init__(self, cr)
FSM.FSM.__init__(self, 'DistributedSellbotBoss') FSM.FSM.__init__(self, 'DistributedCashbotBoss')
self.resistanceToon = None self.resistanceToon = None
self.resistanceToonOnstage = 0 self.resistanceToonOnstage = 0
self.cranes = {} self.cranes = {}
@ -104,16 +103,7 @@ class DistributedCashbotBoss(DistributedBossCog.DistributedBossCog, FSM.FSM):
def __makeResistanceToon(self): def __makeResistanceToon(self):
if self.resistanceToon: if self.resistanceToon:
return return
npc = Toon.Toon() self.resistanceToon = NPCToons.createLocalNPC(12002)
npc.setName(TTLocalizer.ResistanceToonName)
npc.setPickable(0)
npc.setPlayerType(NametagGroup.CCNonPlayer)
dna = ToonDNA.ToonDNA()
dna.newToonRandom(11237, 'f', 1)
dna.head = 'pls'
npc.setDNAString(dna.makeNetString())
npc.animFSM.request('neutral')
self.resistanceToon = npc
self.resistanceToon.setPosHpr(*ToontownGlobals.CashbotRTBattleOneStartPosHpr) self.resistanceToon.setPosHpr(*ToontownGlobals.CashbotRTBattleOneStartPosHpr)
state = random.getstate() state = random.getstate()
random.seed(self.doId) random.seed(self.doId)
@ -700,7 +690,6 @@ class DistributedCashbotBoss(DistributedBossCog.DistributedBossCog, FSM.FSM):
self.endVault.unstash() self.endVault.unstash()
self.evWalls.stash() self.evWalls.stash()
self.midVault.unstash() self.midVault.unstash()
self.__showResistanceToon(True)
base.playMusic(self.stingMusic, looping=1, volume=0.9) base.playMusic(self.stingMusic, looping=1, volume=0.9)
DistributedBossCog.DistributedBossCog.enterIntroduction(self) DistributedBossCog.DistributedBossCog.enterIntroduction(self)
@ -784,7 +773,7 @@ class DistributedCashbotBoss(DistributedBossCog.DistributedBossCog, FSM.FSM):
self.stopAnimate() self.stopAnimate()
self.cleanupAttacks() self.cleanupAttacks()
self.setDizzy(0) self.setDizzy(0)
self.removeHealthBar() self.healthBar.delete()
localAvatar.setCameraFov(ToontownGlobals.CogHQCameraFov) localAvatar.setCameraFov(ToontownGlobals.CogHQCameraFov)
if self.newState != 'Victory': if self.newState != 'Victory':
self.battleThreeMusic.stop() self.battleThreeMusic.stop()

View file

@ -403,18 +403,32 @@ class DistributedSellbotBossAI(DistributedBossCogAI.DistributedBossCogAI, FSM.FS
def enterReward(self): def enterReward(self):
DistributedBossCogAI.DistributedBossCogAI.enterReward(self) DistributedBossCogAI.DistributedBossCogAI.enterReward(self)
def getVP(invoker):
for do in simbase.air.doId2do.values():
if isinstance(do, DistributedSellbotBossAI):
if invoker.doId in do.involvedToons:
return do
@magicWord(category=CATEGORY_ADMINISTRATOR)
def secondVP():
"""
Skips to the second round of the VP.
"""
invoker = spellbook.getInvoker()
boss = getVP(invoker)
if not boss:
return "You aren't in a VP!"
boss.exitIntroduction()
boss.b_setState('RollToBattleTwo')
return 'Skipping to the second round...'
@magicWord(category=CATEGORY_ADMINISTRATOR) @magicWord(category=CATEGORY_ADMINISTRATOR)
def skipVP(): def skipVP():
""" """
Skips to the final round of the VP. Skips to the final round of the VP.
""" """
invoker = spellbook.getInvoker() invoker = spellbook.getInvoker()
boss = None boss = getVP(invoker)
for do in simbase.air.doId2do.values():
if isinstance(do, DistributedSellbotBossAI):
if invoker.doId in do.involvedToons:
boss = do
break
if not boss: if not boss:
return "You aren't in a VP!" return "You aren't in a VP!"
if boss.state in ('PrepareBattleThree', 'BattleThree'): if boss.state in ('PrepareBattleThree', 'BattleThree'):
@ -429,12 +443,7 @@ def killVP():
Kills the VP. Kills the VP.
""" """
invoker = spellbook.getInvoker() invoker = spellbook.getInvoker()
boss = None boss = getVP(invoker)
for do in simbase.air.doId2do.values():
if isinstance(do, DistributedSellbotBossAI):
if invoker.doId in do.involvedToons:
boss = do
break
if not boss: if not boss:
return "You aren't in a VP!" return "You aren't in a VP!"
boss.b_setState('Victory') boss.b_setState('Victory')

View file

@ -326,12 +326,12 @@ class DistributedSuitBase(DistributedAvatar.DistributedAvatar, Suit.Suit, SuitBa
self.loop('neutral', 0) self.loop('neutral', 0)
self.disableBattleDetect() self.disableBattleDetect()
self.corpMedallion.hide() self.corpMedallion.hide()
self.healthBar.show() self.healthBar.geom.show()
if self.currHP < self.maxHP: if self.currHP < self.maxHP:
self.updateHealthBar(0, 1) self.updateHealthBar(0, 1)
def exitBattle(self): def exitBattle(self):
self.healthBar.hide() self.healthBar.geom.hide()
self.corpMedallion.show() self.corpMedallion.show()
self.currHP = self.maxHP self.currHP = self.maxHP
self.interactivePropTrackBonus = -1 self.interactivePropTrackBonus = -1

View file

@ -2,11 +2,11 @@ from panda3d.core import *
from direct.actor import Actor from direct.actor import Actor
from direct.task.Task import Task from direct.task.Task import Task
from otp.avatar import Avatar from otp.avatar import Avatar
from toontown.battle import BattleProps, SuitBattleGlobals from toontown.battle import SuitBattleGlobals
from otp.nametag.NametagGroup import NametagGroup from otp.nametag.NametagGroup import NametagGroup
from toontown.toonbase import TTLocalizer, ToontownGlobals from toontown.toonbase import TTLocalizer, ToontownGlobals
from toontown.suit import SuitGlobals from toontown.suit import SuitGlobals
import SuitDNA, string import SuitDNA, SuitHealthBar, string
aSize = 6.06 aSize = 6.06
bSize = 5.29 bSize = 5.29
@ -299,26 +299,6 @@ def attachSuitHead(node, suitName):
class Suit(Avatar.Avatar): class Suit(Avatar.Avatar):
__module__ = __name__ __module__ = __name__
healthColors = (Vec4(0, 1, 0, 1),# 0 Green
Vec4(0.5, 1, 0, 1),#1 Green-Yellow
Vec4(0.75, 1, 0, 1),#2 Yellow-Green
Vec4(1, 1, 0, 1),#3 Yellow
Vec4(1, 0.866, 0, 1),#4 Yellow-Orange
Vec4(1, 0.6, 0, 1),#5 Orange-Yellow
Vec4(1, 0.5, 0, 1),#6 Orange
Vec4(1, 0.25, 0, 1.0),#7 Red-Orange
Vec4(1, 0, 0, 1),#8 Red
Vec4(0.3, 0.3, 0.3, 1))#9 Grey
healthGlowColors = (Vec4(0.25, 1, 0.25, 0.5),#Green
Vec4(0.5, 1, 0.25, .5),#1 Green-Yellow
Vec4(0.75, 1, 0.25, .5),#2 Yellow-Green
Vec4(1, 1, 0.25, 0.5),#Yellow
Vec4(1, 0.866, 0.25, .5),#4 Yellow-Orange
Vec4(1, 0.6, 0.25, .5),#5 Orange-Yellow
Vec4(1, 0.5, 0.25, 0.5),#6 Orange
Vec4(1, 0.25, 0.25, 0.5),#7 Red-Orange
Vec4(1, 0.25, 0.25, 0.5),#8 Red
Vec4(0.3, 0.3, 0.3, 0))#9 Grey
medallionColors = {'c': Vec4(0.863, 0.776, 0.769, 1.0), medallionColors = {'c': Vec4(0.863, 0.776, 0.769, 1.0),
's': Vec4(0.843, 0.745, 0.745, 1.0), 's': Vec4(0.843, 0.745, 0.745, 1.0),
'l': Vec4(0.749, 0.776, 0.824, 1.0), 'l': Vec4(0.749, 0.776, 0.824, 1.0),
@ -341,8 +321,7 @@ class Suit(Avatar.Avatar):
self.shadowJoint = None self.shadowJoint = None
self.nametagJoint = None self.nametagJoint = None
self.headParts = [] self.headParts = []
self.healthBar = None self.healthBar = SuitHealthBar.SuitHealthBar()
self.healthCondition = 0
self.isDisguised = 0 self.isDisguised = 0
self.isWaiter = 0 self.isWaiter = 0
self.isRental = 0 self.isRental = 0
@ -368,7 +347,7 @@ class Suit(Avatar.Avatar):
part.removeNode() part.removeNode()
self.headParts = [] self.headParts = []
self.removeHealthBar() self.healthBar.delete()
Avatar.Avatar.delete(self) Avatar.Avatar.delete(self)
def setHeight(self, height): def setHeight(self, height):
@ -585,97 +564,18 @@ class Suit(Avatar.Avatar):
icons.removeNode() icons.removeNode()
def generateHealthBar(self): def generateHealthBar(self):
self.removeHealthBar() self.healthBar.generate()
model = loader.loadModel('phase_3.5/models/gui/matching_game_gui') self.healthBar.geom.reparentTo(self.find('**/joint_attachMeter'))
button = model.find('**/minnieCircle') self.healthBar.geom.setScale(3.0)
model.removeNode()
button.setScale(3.0)
button.setH(180.0)
button.setColor(self.healthColors[0])
chestNull = self.find('**/joint_attachMeter')
button.reparentTo(chestNull)
self.healthBar = button
glow = BattleProps.globalPropPool.getProp('glow')
glow.reparentTo(self.healthBar)
glow.setScale(0.28)
glow.setPos(-0.005, 0.01, 0.015)
glow.setColor(self.healthGlowColors[0])
button.flattenLight()
self.healthBarGlow = glow
self.healthBar.hide()
self.healthCondition = 0
def resetHealthBarForSkele(self): def resetHealthBarForSkele(self):
self.healthBar.setPos(0.0, 0.1, 0.0) self.healthBar.geom.setPos(0.0, 0.1, 0.0)
def updateHealthBar(self, hp, forceUpdate = 0): def updateHealthBar(self, hp, forceUpdate = 0):
if hp > self.currHP: if hp > self.currHP:
hp = self.currHP hp = self.currHP
self.currHP -= hp self.currHP -= hp
health = float(self.currHP) / float(self.maxHP) self.healthBar.update(float(self.currHP) / float(self.maxHP))
if health > 0.95:
condition = 0
elif health > 0.9:
condition = 1
elif health > 0.8:
condition = 2
elif health > 0.7:
condition = 3#Yellow
elif health > 0.6:
condition = 4
elif health > 0.5:
condition = 5
elif health > 0.3:
condition = 6#Orange
elif health > 0.15:
condition = 7
elif health > 0.05:
condition = 8#Red
elif health > 0.0:
condition = 9#Blinking Red
else:
condition = 10
if self.healthCondition != condition or forceUpdate:
if condition == 9:
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75), Task(self.__blinkGray), Task.pause(0.1))
taskMgr.add(blinkTask, self.uniqueName('blink-task'))
elif condition == 10:
if self.healthCondition == 9:
taskMgr.remove(self.uniqueName('blink-task'))
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.25), Task(self.__blinkGray), Task.pause(0.1))
taskMgr.add(blinkTask, self.uniqueName('blink-task'))
else:
self.healthBar.setColor(self.healthColors[condition], 1)
self.healthBarGlow.setColor(self.healthGlowColors[condition], 1)
self.healthCondition = condition
def __blinkRed(self, task):
if not self.healthBar:
return Task.done
self.healthBar.setColor(self.healthColors[8], 1)
self.healthBarGlow.setColor(self.healthGlowColors[8], 1)
if self.healthCondition == 7:
self.healthBar.setScale(1.17)
return Task.done
def __blinkGray(self, task):
if not self.healthBar:
return Task.done
self.healthBar.setColor(self.healthColors[9], 1)
self.healthBarGlow.setColor(self.healthGlowColors[9], 1)
if self.healthCondition == 10:
self.healthBar.setScale(1.0)
return Task.done
def removeHealthBar(self):
if self.healthBar:
self.healthBar.removeNode()
self.healthBar = None
if self.healthCondition == 9 or self.healthCondition == 10:
taskMgr.remove(self.uniqueName('blink-task'))
self.healthCondition = 0
return
def getLoseActor(self): def getLoseActor(self):
if self.loseActor == None: if self.loseActor == None:
@ -773,3 +673,14 @@ class Suit(Avatar.Avatar):
return SkelSuitDialogArray return SkelSuitDialogArray
else: else:
return SuitDialogArray return SuitDialogArray
def getTypeText(self):
if self.virtual:
return TTLocalizer.CogPanelVirtual
elif self.isWaiter:
return TTLocalizer.CogPanelWaiter
elif self.skeleRevives:
return TTLocalizer.CogPanelRevives % (self.skeleRevives + 1)
elif self.isSkelecog:
return TTLocalizer.CogPanelSkeleton
return ''

View file

@ -0,0 +1,115 @@
from direct.task.Task import Task
from toontown.battle import BattleProps
HEALTH_COLORS = (
(0, 1, 0, 1),
(0.5, 1, 0, 1),
(0.75, 1, 0, 1),
(1, 1, 0, 1),
(1, 0.86, 0, 1),
(1, 0.6, 0, 1),
(1, 0.5, 0, 1),
(1, 0.25, 0, 1.0),
(1, 0, 0, 1),
(0.3, 0.3, 0.3, 1)
)
HEALTH_GLOW_COLORS = (
(0.25, 1, 0.25, 0.5),
(0.5, 1, 0.25, .5),
(0.75, 1, 0.25, .5),
(1, 1, 0.25, 0.5),
(1, 0.866, 0.25, .5),
(1, 0.6, 0.25, .5),
(1, 0.5, 0.25, 0.5),
(1, 0.25, 0.25, 0.5),
(1, 0.25, 0.25, 0.5),
(0.3, 0.3, 0.3, 0))
class SuitHealthBar:
def __init__(self):
self.geom = None
self.geomGlow = None
self.healthCondition = 0
def delete(self):
if self.geom:
self.geom.removeNode()
self.geom = None
self.geomGlow = None
taskMgr.remove('blink-task-%s' % id(self))
self.healthCondition = 0
def generate(self):
self.delete()
model = loader.loadModel('phase_3.5/models/gui/matching_game_gui')
button = model.find('**/minnieCircle')
model.removeNode()
button.setH(180.0)
button.setColor(HEALTH_COLORS[0])
self.geom = button
glow = BattleProps.globalPropPool.getProp('glow')
glow.reparentTo(self.geom)
glow.setScale(0.28)
glow.setPos(-0.005, 0.01, 0.015)
glow.setColor(HEALTH_GLOW_COLORS[0])
button.flattenLight()
self.geomGlow = glow
self.geom.hide()
self.healthCondition = 0
def getHealthCondition(self, health):
if health > 0.95:
return 0
elif health > 0.9:
return 1
elif health > 0.8:
return 2
elif health > 0.7:
return 3
elif health > 0.6:
return 4
elif health > 0.5:
return 5
elif health > 0.3:
return 6
elif health > 0.15:
return 7
elif health > 0.05:
return 8
elif health > 0.0:
return 9
return 10
def update(self, hp, forceUpdate = 0):
if not self.geom:
return
condition = self.getHealthCondition(hp)
if self.healthCondition != condition or forceUpdate:
taskMgr.remove('blink-task-%s' % id(self))
if condition in (9, 10):
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75 if condition == 9 else 0.25), Task(self.__blinkGray), Task.pause(0.1))
taskMgr.add(blinkTask, 'blink-task-%s' % id(self))
else:
self.geom.setColor(HEALTH_COLORS[condition], 1)
self.geomGlow.setColor(HEALTH_GLOW_COLORS[condition], 1)
self.healthCondition = condition
def __blink(self, color):
if not self.geom:
return
self.geom.setColor(HEALTH_COLORS[color], 1)
self.geomGlow.setColor(HEALTH_GLOW_COLORS[color], 1)
def __blinkRed(self, task):
self.__blink(8)
def __blinkGray(self, task):
self.__blink(9)

View file

@ -61,3 +61,6 @@ class DistributedNPCToonBaseAI(DistributedToonAI.DistributedToonAI):
def getPositionIndex(self): def getPositionIndex(self):
return self.posIndex return self.posIndex
def getStartAnimState(self):
return 'neutral'

View file

@ -2382,13 +2382,19 @@ class DistributedToon(DistributedPlayer.DistributedPlayer, Toon.Toon, Distribute
def addReport(self, doId): def addReport(self, doId):
if not self.isReported(doId): if not self.isReported(doId):
self.reported.append(doId) self.reported.append(doId)
def setFriendsList(self, friendsList):
DistributedPlayer.DistributedPlayer.setFriendsList(self, friendsList)
messenger.send('friendsListChanged')
Toon.reconsiderAllToonsUnderstandable()
def setTrueFriends(self, trueFriends): def setTrueFriends(self, trueFriends):
Toon.reconsiderAllToonsUnderstandable()
self.trueFriends = trueFriends self.trueFriends = trueFriends
Toon.reconsiderAllToonsUnderstandable()
messenger.send('friendsListChanged')
def isTrueFriends(self, doId): def isTrueFriends(self, doId):
return doId in self.trueFriends return base.cr.wantTrueFriends() and doId in self.trueFriends
def applyBuffs(self): def applyBuffs(self):
for id, timestamp in enumerate(self.buffs): for id, timestamp in enumerate(self.buffs):

View file

@ -4878,18 +4878,20 @@ def givePies(pieType, numPies=0):
else: else:
target.b_setNumPies(ToontownGlobals.FullPies) target.b_setNumPies(ToontownGlobals.FullPies)
@magicWord(category=CATEGORY_PROGRAMMER, types=[int]) @magicWord(category=CATEGORY_PROGRAMMER, types=[int, int])
def trackBonus(trackIndex): def trackBonus(trackIndex, level):
""" """
Modify the invoker's track bonus level. Modify the invoker's track bonus level.
""" """
invoker = spellbook.getInvoker() invoker = spellbook.getInvoker()
if not 0 <= trackIndex < 7: if not 0 <= trackIndex < 7:
return 'Invalid track index!' return 'Invalid track index!'
if not -1 <= level <= 6:
return 'Invalid level!'
trackBonusLevel = [0] * 7 trackBonusLevel = [0] * 7
trackBonusLevel[trackIndex] = 1 trackBonusLevel[trackIndex] = level
invoker.b_setTrackBonusLevel(trackBonusLevel) invoker.b_setTrackBonusLevel(trackBonusLevel)
return 'Your track bonus level has been set!' return 'Your track bonus level has been set to %s!' % level
@magicWord(category=CATEGORY_PROGRAMMER, types=[str, str, int]) @magicWord(category=CATEGORY_PROGRAMMER, types=[str, str, int])
def track(command, track, value=None): def track(command, track, value=None):

View file

@ -773,7 +773,7 @@ class InventoryNew(InventoryBase.InventoryBase, DirectFrame):
self.sosButton.show() self.sosButton.show()
self.passButton.show() self.passButton.show()
self.fireButton.show() self.fireButton.show()
if localAvatar.getPinkSlips() > 0: if localAvatar.getPinkSlips():
self.fireButton['state'] = DGG.NORMAL self.fireButton['state'] = DGG.NORMAL
self.fireButton['image_color'] = Vec4(0, 0.6, 1, 1) self.fireButton['image_color'] = Vec4(0, 0.6, 1, 1)
else: else:

View file

@ -66,7 +66,7 @@ class NPCFriendPanel(DirectFrame):
self.update() self.update()
def update(self): def update(self):
friendList = self.friendDict.keys() friendList = sorted(self.friendDict.keys(), reverse=True, key=lambda id: NPCToons.getNPCTrackLevelHpRarity(id)[3])
cardNum = 0 cardNum = 0
for i in xrange(self.pos, self.pos + 16): for i in xrange(self.pos, self.pos + 16):

File diff suppressed because it is too large Load diff

View file

@ -526,8 +526,14 @@ class ToonAvatarPanel(AvatarPanelBase.AvatarPanelBase):
def __handleCastDialog(self): def __handleCastDialog(self):
self.cleanupDialog() self.cleanupDialog()
base.cr.playGame.getPlace().setState('stopped') base.cr.playGame.getPlace().setState('stopped')
self.dialog = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.AvatarPanelCastInfo % self.avatar.getName(), text_wordwrap=20, command=self.cleanupDialogAndWalk) self.dialog = TTDialog.TTDialog(style=TTDialog.Acknowledge, text=TTLocalizer.AvatarPanelCastInfo % self.avatar.getName(), text_wordwrap=20, command=self.__cleanupDialogAndWalk)
self.dialog.show() self.dialog.show()
def __cleanupDialogAndWalk(self, extra=None):
if self.dialog:
self.dialog.destroy()
self.dialog = None
base.cr.playGame.getPlace().fsm.request('walk')
def __makeBoardingGui(self): def __makeBoardingGui(self):
self.confirmKickOutDialog = None self.confirmKickOutDialog = None

View file

@ -4288,7 +4288,7 @@ HeadingToFactoryTitle = '%s'
ForemanConfrontedMsg = '%s is battling the ' + Foreman + '!' ForemanConfrontedMsg = '%s is battling the ' + Foreman + '!'
MintBossConfrontedMsg = '%s is battling the Supervisor!' MintBossConfrontedMsg = '%s is battling the Supervisor!'
StageBossConfrontedMsg = '%s is battling the District Attorney!' StageBossConfrontedMsg = '%s is battling the District Attorney!'
stageToonEnterElevator = '%s \nhas entered the elevator' StageToonEnterElevator = '%s\nhas entered the elevator!'
ForcedLeaveStageAckMsg = 'The Law Clerk was defeated before you could reach him. You did not recover any Jury Notices.' ForcedLeaveStageAckMsg = 'The Law Clerk was defeated before you could reach him. You did not recover any Jury Notices.'
MinigameWaitingForOtherToons = 'Waiting for other toons to join...' MinigameWaitingForOtherToons = 'Waiting for other toons to join...'
MinigamePleaseWait = 'Please wait...' MinigamePleaseWait = 'Please wait...'
@ -4701,7 +4701,7 @@ LawbotBossName = 'Chief Justice'
BossbotBossName = 'C. E. O.' BossbotBossName = 'C. E. O.'
BossCogNameWithDept = '%(name)s\n%(dept)s' BossCogNameWithDept = '%(name)s\n%(dept)s'
BossCogPromoteDoobers = 'You are hereby promoted to full-fledged %s. Congratulations!' BossCogPromoteDoobers = 'You are hereby promoted to full-fledged %s. Congratulations!'
BossCogDoobersAway = {'s': 'Go! And make that sale!'} BossCogDoobersAway = {'s': 'Go! And make that sale!'}
BossCogWelcomeToons = 'Welcome, new Cogs!' BossCogWelcomeToons = 'Welcome, new Cogs!'
BossCogPromoteToons = 'You are hereby promoted to full-fledged %s. Congratu--' BossCogPromoteToons = 'You are hereby promoted to full-fledged %s. Congratu--'
CagedToonInterruptBoss = 'Hey! Hiya! Hey over there!' CagedToonInterruptBoss = 'Hey! Hiya! Hey over there!'
@ -4741,7 +4741,6 @@ CagedToonBattleThreeMaxTouchCage = 21
CagedToonBattleThreeMaxAdvice = 106 CagedToonBattleThreeMaxAdvice = 106
CashbotBossHadEnough = "That's it. I've had enough of these pesky Toons!" CashbotBossHadEnough = "That's it. I've had enough of these pesky Toons!"
CashbotBossOuttaHere = "I've got a train to catch!" CashbotBossOuttaHere = "I've got a train to catch!"
ResistanceToonName = 'Mata Hairy'
ResistanceToonCongratulations = "You did it! Congratulations!\x07You're an asset to the Resistance!\x07Here's a special phrase you can use in a tight spot:\x07%s\x07When you say it, %s.\x07But you can only use it once, so choose that time well!" ResistanceToonCongratulations = "You did it! Congratulations!\x07You're an asset to the Resistance!\x07Here's a special phrase you can use in a tight spot:\x07%s\x07When you say it, %s.\x07But you can only use it once, so choose that time well!"
ResistanceToonToonupInstructions = 'all the Toons near you will gain %s Laff points' ResistanceToonToonupInstructions = 'all the Toons near you will gain %s Laff points'
ResistanceToonToonupAllInstructions = 'all the Toons near you will gain full Laff points' ResistanceToonToonupAllInstructions = 'all the Toons near you will gain full Laff points'
@ -6241,6 +6240,9 @@ NPCToonNames = {20000: 'Tutorial Tom',
9319: 'Psyche', 9319: 'Psyche',
9320: 'Toony Bob', 9320: 'Toony Bob',
9321: 'Sir Biscuit', 9321: 'Sir Biscuit',
9322: 'Glower',
9323: 'Zedd',
9324: 'Nacib',
7001: 'N. Prisoned', 7001: 'N. Prisoned',
7002: 'R.E. Leaseme', 7002: 'R.E. Leaseme',
7003: 'Lemmy Owte', 7003: 'Lemmy Owte',
@ -6265,8 +6267,10 @@ NPCToonNames = {20000: 'Tutorial Tom',
7022: 'Dee Version', 7022: 'Dee Version',
7023: 'Bo Nanapeel', 7023: 'Bo Nanapeel',
10001: 'Healer Sara', 10001: 'Healer Sara',
10002: "Good ol' Gil Giggles",
11001: 'Healer Gabriel', 11001: 'Healer Gabriel',
12001: 'Healer Bill', 12001: 'Healer Bill',
12002: 'Mata Hairy',
13001: 'Healer Clover'} 13001: 'Healer Clover'}
zone2TitleDict = {2513: ('Toon Hall', ''), zone2TitleDict = {2513: ('Toon Hall', ''),
2514: ('Toontown Bank', ''), 2514: ('Toontown Bank', ''),
@ -6806,6 +6810,7 @@ zone2TitleDict = {2513: ('Toon Hall', ''),
3830: ('Wait and See Goggle Defogging', ''), 3830: ('Wait and See Goggle Defogging', ''),
9802: ("Barbra's Bohemian Art Supplies", ''), 9802: ("Barbra's Bohemian Art Supplies", ''),
9804: ("Angry Dan's Garden Sprinklers", ''), 9804: ("Angry Dan's Garden Sprinklers", ''),
9806: ("Nacib Niri", ''),
9808: ("Ori-O's Creamery and Dairy", ''), 9808: ("Ori-O's Creamery and Dairy", ''),
9809: ('Rave of the Forks', ''), 9809: ('Rave of the Forks', ''),
9812: ('Louds Silent-Shop', ''), 9812: ('Louds Silent-Shop', ''),
@ -6816,6 +6821,8 @@ zone2TitleDict = {2513: ('Toon Hall', ''),
9817: ('The Psyche-Ologist', ''), 9817: ('The Psyche-Ologist', ''),
9819: ("Toony Bob's Fluffy Pillows", ''), 9819: ("Toony Bob's Fluffy Pillows", ''),
9820: ("Batty's Bat Supply", ''), 9820: ("Batty's Bat Supply", ''),
9821: ("Milk or Sugar? Tea Shop", ''),
9822: ("Zedd's Pasta", ''),
9824: ("Joe's Burnt Biscuits", ''), 9824: ("Joe's Burnt Biscuits", ''),
9826: ("Juste-A-Cote Taxi Service", ''), 9826: ("Juste-A-Cote Taxi Service", ''),
9827: ("Frekly Fred's Storage Shack", ''), 9827: ("Frekly Fred's Storage Shack", ''),
@ -8124,7 +8131,6 @@ BossbotBossPreTwo1 = "What's taking so long?"
BossbotBossPreTwo2 = 'Get cracking and serve my banquet!' BossbotBossPreTwo2 = 'Get cracking and serve my banquet!'
BossbotRTServeFood1 = 'Hehe, serve the food I place on these conveyor belts.' BossbotRTServeFood1 = 'Hehe, serve the food I place on these conveyor belts.'
BossbotRTServeFood2 = 'If you serve a cog three times in a row it will explode.' BossbotRTServeFood2 = 'If you serve a cog three times in a row it will explode.'
BossbotResistanceToonName = "Good ol' Gil Giggles"
BossbotPhase3Speech1 = "What's happening here?!" BossbotPhase3Speech1 = "What's happening here?!"
BossbotPhase3Speech2 = 'These waiters are toons!' BossbotPhase3Speech2 = 'These waiters are toons!'
BossbotPhase3Speech3 = 'Get them!!!' BossbotPhase3Speech3 = 'Get them!!!'
@ -8528,10 +8534,6 @@ BugReportNotice = 'Attention!\n\nThis button will open a browser which will send
CodeRedemptionWarning = 'NOTICE: All codes can only be entered once!' CodeRedemptionWarning = 'NOTICE: All codes can only be entered once!'
CogInterfaceLabelOn = 'The cog battle interface is on.' CogInterfaceLabelOn = 'The cog battle interface is on.'
CogInterfaceLabelOff = 'The cog battle interface is off.' CogInterfaceLabelOff = 'The cog battle interface is off.'
SpeedchatPlusLabelOn = 'Speedchat Plus is on.'
SpeedchatPlusLabelOff = 'Speedchat Plus is off.'
TrueFriendsLabelOn = 'True Friends is on.'
TrueFriendsLabelOff = 'True Friends is off.'
TpTransitionLabelOn = 'The teleport transition is on.' TpTransitionLabelOn = 'The teleport transition is on.'
TpTransitionLabelOff = 'The teleport transition is off.' TpTransitionLabelOff = 'The teleport transition is off.'
FieldOfViewLabel = 'Field of View:' FieldOfViewLabel = 'Field of View:'
@ -8723,6 +8725,8 @@ ShardPagePreferred = 'Preferred'
ShardPageShardTitle = '%s Population: %s' ShardPageShardTitle = '%s Population: %s'
ShardPageTeleport = 'Teleport to\n%s' ShardPageTeleport = 'Teleport to\n%s'
TeleportButton = 'Teleport'
Blacklist = [ Blacklist = [
"$1ut", "$1ut",
"$h1t", "$h1t",

View file

@ -177,7 +177,7 @@ CarryLimits = (((10,
(15, (15,
15, 15,
10, 10,
5, 7,
3, 3,
0, 0,
0), 0),
@ -185,15 +185,15 @@ CarryLimits = (((10,
15, 15,
15, 15,
10, 10,
5, 7,
2, 3,
0), 0),
(20, (20,
15, 15,
15, 15,
10, 10,
5, 7,
2, 3,
1)), 1)),
((10, ((10,
0, 0,

View file

@ -1687,7 +1687,7 @@ TV_NOT_OWNER = 0
TV_INVALID_VIDEO = 1 TV_INVALID_VIDEO = 1
TV_OK = 2 TV_OK = 2
COLOR_SATURATION_MIN = 0.36 COLOR_SATURATION_MIN = 0.5
COLOR_SATURATION_MAX = 0.8 COLOR_SATURATION_MAX = 0.8
COLOR_VALUE_MIN = 0.5 COLOR_VALUE_MIN = 0.5
COLOR_VALUE_MAX = 0.9 COLOR_VALUE_MAX = 0.8

View file

@ -98,10 +98,6 @@ if 'language' not in settings:
settings['language'] = 'English' settings['language'] = 'English'
if 'cogInterface' not in settings: if 'cogInterface' not in settings:
settings['cogInterface'] = True settings['cogInterface'] = True
if 'speedchatPlus' not in settings:
settings['speedchatPlus'] = True
if 'trueFriends' not in settings:
settings['trueFriends'] = True
if 'tpTransition' not in settings: if 'tpTransition' not in settings:
settings['tpTransition'] = True settings['tpTransition'] = True
if 'fov' not in settings: if 'fov' not in settings:

View file

@ -67,8 +67,8 @@ class Street(BattlePlace.BattlePlace):
'purchase']), 'purchase']),
State.State('WaitForBattle', self.enterWaitForBattle, self.exitWaitForBattle, ['battle', 'walk']), State.State('WaitForBattle', self.enterWaitForBattle, self.exitWaitForBattle, ['battle', 'walk']),
State.State('battle', self.enterBattle, self.exitBattle, ['walk', 'teleportOut', 'died']), State.State('battle', self.enterBattle, self.exitBattle, ['walk', 'teleportOut', 'died']),
State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk']), State.State('doorIn', self.enterDoorIn, self.exitDoorIn, ['walk', 'stopped']),
State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk']), State.State('doorOut', self.enterDoorOut, self.exitDoorOut, ['walk', 'stopped']),
State.State('elevatorIn', self.enterElevatorIn, self.exitElevatorIn, ['walk']), State.State('elevatorIn', self.enterElevatorIn, self.exitElevatorIn, ['walk']),
State.State('elevator', self.enterElevator, self.exitElevator, ['walk']), State.State('elevator', self.enterElevator, self.exitElevator, ['walk']),
State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk', State.State('teleportIn', self.enterTeleportIn, self.exitTeleportIn, ['walk',

View file

@ -122,23 +122,12 @@ class TownBattle(StateData.StateData):
self.SOSPetInfoPanel = TownBattleSOSPetInfoPanel.TownBattleSOSPetInfoPanel(self.SOSPetInfoPanelDoneEvent) self.SOSPetInfoPanel = TownBattleSOSPetInfoPanel.TownBattleSOSPetInfoPanel(self.SOSPetInfoPanelDoneEvent)
self.fireCogPanelDoneEvent = 'fire-cog-panel-done' self.fireCogPanelDoneEvent = 'fire-cog-panel-done'
self.FireCogPanel = FireCogPanel.FireCogPanel(self.fireCogPanelDoneEvent) self.FireCogPanel = FireCogPanel.FireCogPanel(self.fireCogPanelDoneEvent)
self.cogFireCosts = [None, self.toonPanels = [TownBattleToonPanel.TownBattleToonPanel(i) for i in xrange(4)]
None, self.cogPanels = [TownBattleCogPanel.TownBattleCogPanel(i) for i in xrange(4)]
None,
None]
self.toonPanels = (TownBattleToonPanel.TownBattleToonPanel(0),
TownBattleToonPanel.TownBattleToonPanel(1),
TownBattleToonPanel.TownBattleToonPanel(2),
TownBattleToonPanel.TownBattleToonPanel(3))
self.cogPanels = (TownBattleCogPanel.TownBattleCogPanel(0),
TownBattleCogPanel.TownBattleCogPanel(1),
TownBattleCogPanel.TownBattleCogPanel(2),
TownBattleCogPanel.TownBattleCogPanel(3))
self.timer = ToontownTimer.ToontownTimer() self.timer = ToontownTimer.ToontownTimer()
self.timer.posInTopRightCorner() self.timer.posInTopRightCorner()
self.timer.setScale(0.4) self.timer.setScale(0.4)
self.timer.hide() self.timer.hide()
return
def cleanup(self): def cleanup(self):
self.ignore(self.attackPanelDoneEvent) self.ignore(self.attackPanelDoneEvent)
@ -154,11 +143,9 @@ class TownBattle(StateData.StateData):
del self.FireCogPanel del self.FireCogPanel
del self.SOSPetSearchPanel del self.SOSPetSearchPanel
del self.SOSPetInfoPanel del self.SOSPetInfoPanel
for toonPanel in self.toonPanels:
toonPanel.cleanup()
for cogPanel in self.cogPanels: for panel in self.toonPanels + self.cogPanels:
cogPanel.cleanup() panel.cleanup()
del self.toonPanels del self.toonPanels
del self.cogPanels del self.cogPanels
@ -171,7 +158,6 @@ class TownBattle(StateData.StateData):
self.parentFSMState.addChild(self.fsm) self.parentFSMState.addChild(self.fsm)
if not self.isLoaded: if not self.isLoaded:
self.load() self.load()
print 'Battle Event %s' % event
self.battleEvent = event self.battleEvent = event
self.fsm.enterInitialState() self.fsm.enterInitialState()
base.localAvatar.laffMeter.start() base.localAvatar.laffMeter.start()
@ -186,7 +172,6 @@ class TownBattle(StateData.StateData):
base.localAvatar.inventory.setBattleCreditMultiplier(self.creditMultiplier) base.localAvatar.inventory.setBattleCreditMultiplier(self.creditMultiplier)
base.localAvatar.inventory.setActivateMode('battle', heal=0, bldg=bldg, tutorialFlag=tutorialFlag) base.localAvatar.inventory.setActivateMode('battle', heal=0, bldg=bldg, tutorialFlag=tutorialFlag)
self.SOSPanel.bldg = bldg self.SOSPanel.bldg = bldg
return
def exit(self): def exit(self):
base.localAvatar.laffMeter.stop() base.localAvatar.laffMeter.stop()
@ -235,44 +220,21 @@ class TownBattle(StateData.StateData):
for toonPanel in self.toonPanels: for toonPanel in self.toonPanels:
toonPanel.hide() toonPanel.hide()
toonPanel.setPos(0, 0, -0.9) toonPanel.setPos(0, 0, -0.9)
if num == 1: self.positionPanels(num, self.toonPanels)
self.toonPanels[0].setX(self.oddPos[1])
self.toonPanels[0].show()
elif num == 2:
self.toonPanels[0].setX(self.evenPos[1])
self.toonPanels[0].show()
self.toonPanels[1].setX(self.evenPos[2])
self.toonPanels[1].show()
elif num == 3:
self.toonPanels[0].setX(self.oddPos[0])
self.toonPanels[0].show()
self.toonPanels[1].setX(self.oddPos[1])
self.toonPanels[1].show()
self.toonPanels[2].setX(self.oddPos[2])
self.toonPanels[2].show()
elif num == 4:
self.toonPanels[0].setX(self.evenPos[0])
self.toonPanels[0].show()
self.toonPanels[1].setX(self.evenPos[1])
self.toonPanels[1].show()
self.toonPanels[2].setX(self.evenPos[2])
self.toonPanels[2].show()
self.toonPanels[3].setX(self.evenPos[3])
self.toonPanels[3].show()
else:
self.notify.error('Bad number of toons: %s' % num)
return None
def __enterCogPanels(self, num): def __enterCogPanels(self, num):
for cogPanel in self.cogPanels: for cogPanel in self.cogPanels:
cogPanel.hide() cogPanel.hide()
cogPanel.updateHealthBar() cogPanel.updateHealthBar()
cogPanel.setPos(0, 0, 0.62) cogPanel.setPos(0, 0, 0.62)
self.positionPanels(num, self.cogPanels)
def positionPanels(self, num, panels):
pos = self.evenPos if num % 2 == 0 else self.oddPos pos = self.evenPos if num % 2 == 0 else self.oddPos
for i, panel in enumerate(self.cogPanels): for i, panel in enumerate(panels):
if num > i: if num > i:
panel.setX(pos[i if num >= 3 else i + 1]) panel.setX(pos[i if num >= 3 else i + 1])
panel.show() panel.show()
@ -460,25 +422,11 @@ class TownBattle(StateData.StateData):
toonIds = map(lambda toon: toon.doId, toons) toonIds = map(lambda toon: toon.doId, toons)
self.notify.debug('adjustCogsAndToons() toonIds: %s self.toons: %s' % (toonIds, self.toons)) self.notify.debug('adjustCogsAndToons() toonIds: %s self.toons: %s' % (toonIds, self.toons))
maxSuitLevel = 0 maxSuitLevel = 0
cogFireCostIndex = 0
for cog in cogs: for cog in cogs:
maxSuitLevel = max(maxSuitLevel, cog.getActualLevel()) maxSuitLevel = max(maxSuitLevel, cog.getActualLevel())
self.cogFireCosts[cogFireCostIndex] = 1
cogFireCostIndex += 1
creditLevel = maxSuitLevel creditLevel = maxSuitLevel
resetActivateMode = 0 resetActivateMode = numCogs != self.numCogs or creditLevel != self.creditLevel or luredIndices != self.luredIndices or trappedIndices != self.trappedIndices or toonIds != self.toons
if numCogs == self.numCogs and creditLevel == self.creditLevel and luredIndices == self.luredIndices and trappedIndices == self.trappedIndices and toonIds == self.toons:
for i in xrange(len(cogs)):
if cogs[i].getHP() == self.cogPanels[i].getDisplayedCurrHp():
if cogs[i].getMaxHP() == self.cogPanels[i].getDisplayedMaxHp():
if cogs[i] == self.cogPanels[i].getSuit():
continue
else:
resetActivateMode = 1
break
else:
resetActivateMode = 1
self.notify.debug('adjustCogsAndToons() resetActivateMode: %s' % resetActivateMode) self.notify.debug('adjustCogsAndToons() resetActivateMode: %s' % resetActivateMode)
self.numCogs = numCogs self.numCogs = numCogs
self.creditLevel = creditLevel self.creditLevel = creditLevel
@ -603,7 +551,7 @@ class TownBattle(StateData.StateData):
def enterFire(self): def enterFire(self):
canHeal, canTrap, canLure = self.checkHealTrapLure() canHeal, canTrap, canLure = self.checkHealTrapLure()
self.FireCogPanel.enter(self.numCogs, luredIndices=self.luredIndices, trappedIndices=self.trappedIndices, track=self.track, fireCosts=self.cogFireCosts) self.FireCogPanel.enter(self.numCogs, luredIndices=self.luredIndices, trappedIndices=self.trappedIndices, track=self.track)
self.accept(self.fireCogPanelDoneEvent, self.__handleCogFireDone) self.accept(self.fireCogPanelDoneEvent, self.__handleCogFireDone)
return None return None

View file

@ -1,228 +1,66 @@
from panda3d.core import *
from toontown.battle import BattleProps
from toontown.toonbase import ToontownGlobals
from toontown.toonbase.ToontownBattleGlobals import *
from direct.directnotify import DirectNotifyGlobal
import string
from toontown.suit import Suit
from direct.gui.DirectGui import * from direct.gui.DirectGui import *
from toontown.suit import Suit, SuitHealthBar
from toontown.toonbase import TTLocalizer from toontown.toonbase import TTLocalizer
from direct.task.Task import Task
class TownBattleCogPanel(DirectFrame): class TownBattleCogPanel(DirectFrame):
notify = DirectNotifyGlobal.directNotify.newCategory('TownBattleCogPanel')
healthColors = (Vec4(0, 1, 0, 1),# 0 Green
Vec4(0.5, 1, 0, 1),#1 Green-Yellow
Vec4(0.75, 1, 0, 1),#2 Yellow-Green
Vec4(1, 1, 0, 1),#3 Yellow
Vec4(1, 0.866, 0, 1),#4 Yellow-Orange
Vec4(1, 0.6, 0, 1),#5 Orange-Yellow
Vec4(1, 0.5, 0, 1),#6 Orange
Vec4(1, 0.25, 0, 1.0),#7 Red-Orange
Vec4(1, 0, 0, 1),#8 Red
Vec4(0.3, 0.3, 0.3, 1))#9 Grey
healthGlowColors = (Vec4(0.25, 1, 0.25, 0.5),#Green
Vec4(0.5, 1, 0.25, .5),#1 Green-Yellow
Vec4(0.75, 1, 0.25, .5),#2 Yellow-Green
Vec4(1, 1, 0.25, 0.5),#Yellow
Vec4(1, 0.866, 0.25, .5),#4 Yellow-Orange
Vec4(1, 0.6, 0.25, .5),#5 Orange-Yellow
Vec4(1, 0.5, 0.25, 0.5),#6 Orange
Vec4(1, 0.25, 0.25, 0.5),#7 Red-Orange
Vec4(1, 0.25, 0.25, 0.5),#8 Red
Vec4(0.3, 0.3, 0.3, 0))#9 Grey
def __init__(self, id): def __init__(self, id):
gui = loader.loadModel('phase_3.5/models/gui/battle_gui') gui = loader.loadModel('phase_3.5/models/gui/battle_gui')
DirectFrame.__init__(self, relief=None, image=gui.find('**/ToonBtl_Status_BG'), image_color=Vec4(0.86, 0.86, 0.86, 0.7)) DirectFrame.__init__(self, relief=None, image=gui.find('**/ToonBtl_Status_BG'), image_color=(0.86, 0.86, 0.86, 0.7), scale=0.8)
self.setScale(0.8)
self.initialiseoptions(TownBattleCogPanel) self.initialiseoptions(TownBattleCogPanel)
self.levelText = DirectLabel(parent=self, text='', pos=(-0.06, 0, -0.075), text_scale=0.055) self.levelText = DirectLabel(parent=self, text='', pos=(-0.06, 0, -0.075), text_scale=0.055)
self.suitType = DirectLabel(parent=self, text='', pos=(0.12, 0, -0.075), text_scale=0.045) self.typeText = DirectLabel(parent=self, text='', pos=(0.12, 0, -0.075), text_scale=0.045)
self.healthBar = None self.healthBar = SuitHealthBar.SuitHealthBar()
self.healthBarGlow = None
self.hpChangeEvent = None
self.blinkTask = None
self.suit = None
self.head = None
self.maxHP = None
self.currHP = None
self.hpChangeEvent = None
self.generateHealthBar() self.generateHealthBar()
self.suit = None
self.suitHead = None
self.hide() self.hide()
gui.removeNode() gui.removeNode()
return
def cleanup(self):
self.ignoreAll()
self.cleanupHead()
self.levelText.removeNode()
self.typeText.removeNode()
self.healthBar.delete()
del self.levelText
del self.typeText
del self.healthBar
DirectFrame.destroy(self)
def cleanupHead(self):
if self.suitHead:
self.suitHead.removeNode()
del self.suitHead
def setSuit(self, suit): def setSuit(self, suit):
if self.suit == suit: if self.suit == suit:
messenger.send(self.suit.uniqueName('hpChange')) messenger.send(self.suit.uniqueName('hpChange'))
return return
self.ignoreAll()
self.cleanupHead()
self.suit = suit self.suit = suit
self.setLevelText(self.suit.getActualLevel()) self.generateSuitHead(suit.getStyleName())
if self.head:
self.head.removeNode()
self.setSuitHead(self.suit.getStyleName())
self.setMaxHp(self.suit.getMaxHP())
self.setHp(self.suit.getHP())
self.hpChangeEvent = self.suit.uniqueName('hpChange')
if self.blinkTask:
taskMgr.remove(self.blinkTask)
self.blinkTask = None
self.accept(self.hpChangeEvent, self.updateHealthBar)
self.updateHealthBar() self.updateHealthBar()
self.healthBar.show() self.levelText['text'] = TTLocalizer.CogPanelLevel % suit.getActualLevel()
if self.suit.virtual: self.typeText['text'] = suit.getTypeText()
self.setTypeText(TTLocalizer.CogPanelVirtual) self.accept(suit.uniqueName('hpChange'), self.updateHealthBar)
elif self.suit.isWaiter:
self.setTypeText(TTLocalizer.CogPanelWaiter)
elif self.suit.skeleRevives:
self.setTypeText(TTLocalizer.CogPanelRevives % (self.suit.skeleRevives + 1))
elif self.suit.isSkelecog:
self.setTypeText(TTLocalizer.CogPanelSkeleton)
else:
self.setTypeText('')
def getSuit(self, suit):
return self.suit
def setLevelText(self, level):
self.levelText['text'] = TTLocalizer.CogPanelLevel % level
def setTypeText(self, suitType):
self.suitType['text'] = suitType
def setSuitHead(self, suitName):
self.head = Suit.attachSuitHead(self, suitName)
self.head.setX(0.1)
self.head.setZ(0.01)
self.head.setScale(0.05)
def generateSuitHead(self, name):
self.suitHead = Suit.attachSuitHead(self, name)
self.suitHead.setScale(0.05)
self.suitHead.setPos(0.1, 0, 0.01)
def generateHealthBar(self): def generateHealthBar(self):
model = loader.loadModel('phase_3.5/models/gui/matching_game_gui') self.healthBar.generate()
button = model.find('**/minnieCircle') self.healthBar.geom.reparentTo(self)
model.removeNode() self.healthBar.geom.setScale(0.5)
button.setScale(0.5) self.healthBar.geom.setPos(-0.065, 0, 0.05)
button.setH(180.0) self.healthBar.geom.show()
button.setColor(self.healthColors[0])
button.reparentTo(self)
button.setX(-0.065)
button.setZ(0.05)
self.healthBar = button
glow = BattleProps.globalPropPool.getProp('glow')
glow.reparentTo(self.healthBar)
glow.setScale(0.28)
glow.setPos(-0.005, 0.01, 0.015)
glow.setColor(self.healthGlowColors[0])
button.flattenLight()
self.healthBarGlow = glow
self.healthBar.hide()
self.healthCondition = 0
def updateHealthBar(self): def updateHealthBar(self):
if not self.suit: if not self.suit:
return return
self.setHp(self.suit.getHP())
health = float(self.currHP) / float(self.maxHP)
if health > 0.95:
condition = 0
elif health > 0.9:
condition = 1
elif health > 0.8:
condition = 2
elif health > 0.7:
condition = 3#Yellow
elif health > 0.6:
condition = 4
elif health > 0.5:
condition = 5
elif health > 0.3:
condition = 6#Orange
elif health > 0.15:
condition = 7
elif health > 0.05:
condition = 8#Red
elif health > 0.0:
condition = 9#Blinking Red
else:
condition = 10
if self.healthCondition != condition:
if condition == 9:
self.blinkTask = self.uniqueName('blink-task')
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.75), Task(self.__blinkGray), Task.pause(0.1))
taskMgr.add(blinkTask, self.blinkTask)
elif condition == 10:
if self.healthCondition == 9:
self.blinkTask = self.uniqueName('blink-task')
taskMgr.remove(self.blinkTask)
self.blinkTask = None
blinkTask = Task.loop(Task(self.__blinkRed), Task.pause(0.25), Task(self.__blinkGray), Task.pause(0.1))
taskMgr.add(blinkTask, self.blinkTask)
else:
if self.blinkTask:
taskMgr.remove(self.blinkTask)
self.blinkTask = None
self.healthBar.setColor(self.healthColors[condition], 1)
self.healthBarGlow.setColor(self.healthGlowColors[condition], 1)
self.healthCondition = condition
def __blinkRed(self, task): self.healthBar.update(float(self.suit.getHP()) / float(self.suit.getMaxHP()))
if not self.blinkTask or not self.healthBar:
return Task.done
self.healthBar.setColor(self.healthColors[8], 1)
self.healthBarGlow.setColor(self.healthGlowColors[8], 1)
if self.healthCondition == 7:
self.healthBar.setScale(1.17)
return Task.done
def __blinkGray(self, task):
if not self.blinkTask or not self.healthBar:
return Task.done
self.healthBar.setColor(self.healthColors[9], 1)
self.healthBarGlow.setColor(self.healthGlowColors[9], 1)
if self.healthCondition == 10:
self.healthBar.setScale(1.0)
return Task.done
def removeHealthBar(self):
if self.healthCondition == 9 or self.healthCondition == 10:
if self.blinkTask:
taskMgr.remove(self.blinkTask)
self.blinkTask = None
if self.healthBar:
self.healthBar.removeNode()
self.healthBar = None
self.healthCondition = 0
return
def getDisplayedCurrHp(self):
return self.currHP
def getDisplayedMaxHp(self):
return self.maxHP
def setMaxHp(self, hp):
self.maxHP = hp
def setHp(self, hp):
self.currHP = hp
def show(self):
DirectFrame.show(self)
def cleanup(self):
self.ignoreAll()
self.removeHealthBar()
if self.head is not None:
self.head.removeNode()
del self.head
self.levelText.destroy()
del self.levelText
del self.suitType
del self.healthBar
if self.healthBarGlow is not None:
self.healthBarGlow.removeNode()
del self.healthBarGlow
del self.suit
del self.maxHP
del self.currHP
DirectFrame.destroy(self)

View file

@ -126,6 +126,8 @@ class TownBattleToonPanel(DirectFrame):
self.gag.setScale(0.8) self.gag.setScale(0.8)
self.gag.setPos(0, 0, 0.02) self.gag.setPos(0, 0, 0.02)
self.hasGag = 1 self.hasGag = 1
if self.avatar is not None and self.avatar.checkGagBonus(track, level):
self.gag.setColor((1, 0, 0, 1) if track == 1 and level == 5 else (0, 1, 0, 1))
if numTargets is not None and targetIndex is not None and localNum is not None: if numTargets is not None and targetIndex is not None and localNum is not None:
self.whichText.show() self.whichText.show()
self.whichText['text'] = self.determineWhichText(numTargets, targetIndex, localNum, index) self.whichText['text'] = self.determineWhichText(numTargets, targetIndex, localNum, index)

View file

@ -35,7 +35,7 @@ class ClientServicesManager(DistributedObjectGlobal):
def requestAvatars(self): def requestAvatars(self):
self.sendUpdate('requestAvatars') self.sendUpdate('requestAvatars')
def setAvatars(self, avatars): def setAvatars(self, chatSettings, avatars):
avList = [] avList = []
for avNum, avName, avDNA, avPosition, nameState in avatars: for avNum, avName, avDNA, avPosition, nameState in avatars:
nameOpen = int(nameState == 1) nameOpen = int(nameState == 1)
@ -48,6 +48,7 @@ class ClientServicesManager(DistributedObjectGlobal):
names[3] = avName names[3] = avName
avList.append(PotentialAvatar(avNum, names, avDNA, avPosition, nameOpen)) avList.append(PotentialAvatar(avNum, names, avDNA, avPosition, nameOpen))
self.cr.handleChatSettings(chatSettings)
self.cr.handleAvatarsList(avList) self.cr.handleAvatarsList(avList)
# --- AVATAR CREATION/DELETION --- # --- AVATAR CREATION/DELETION ---

View file

@ -333,7 +333,8 @@ class LoginAccountFSM(OperationFSM):
'LAST_LOGIN': time.ctime(), 'LAST_LOGIN': time.ctime(),
'LAST_LOGIN_TS': time.time(), 'LAST_LOGIN_TS': time.time(),
'ACCOUNT_ID': str(self.userId), 'ACCOUNT_ID': str(self.userId),
'ACCESS_LEVEL': self.accessLevel 'ACCESS_LEVEL': self.accessLevel,
'CHAT_SETTINGS': [1, 1]
} }
self.csm.air.dbInterface.createObject( self.csm.air.dbInterface.createObject(
self.csm.air.dbId, self.csm.air.dbId,
@ -645,7 +646,7 @@ class GetAvatarsFSM(AvatarOperationFSM):
potentialAvs.append([avId, name, fields['setDNAString'][0], potentialAvs.append([avId, name, fields['setDNAString'][0],
index, nameState]) index, nameState])
self.csm.sendUpdateToAccountId(self.target, 'setAvatars', [potentialAvs]) self.csm.sendUpdateToAccountId(self.target, 'setAvatars', [self.account['CHAT_SETTINGS'], potentialAvs])
self.demand('Off') self.demand('Off')
def enterQueryNameState(self): def enterQueryNameState(self):