def load(self):
        self.notify.debug('load')
        DistributedMinigame.load(self)
        self.sky = loader.loadModel('phase_3.5/models/props/TT_sky')
        self.ground = loader.loadModel('phase_4/models/minigames/toon_cannon_gameground')
        self.tower = loader.loadModel('phase_4/models/minigames/toon_cannon_water_tower')
        self.cannon = loader.loadModel('phase_4/models/minigames/toon_cannon')
        self.dropShadow = loader.loadModel('phase_3/models/props/drop_shadow')
        self.hill = loader.loadModel('phase_4/models/minigames/cannon_hill')
        self.sky.setScale(WORLD_SCALE)
        self.ground.setScale(GROUND_SCALE)
        self.cannon.setScale(CANNON_SCALE)
        self.dropShadow.setColor(0, 0, 0, 0.5)
        self.ground.setColor(0.84999999999999998, 0.84999999999999998, 0.84999999999999998, 1.0)
        self.hill.setScale(1, 1, CANNON_Z / 20.0)
        self.dropShadow.setBin('fixed', 0, 1)
        self.splash = Splash.Splash(render)
        self.dustCloud = DustCloud.DustCloud(render)
        purchaseModels = loader.loadModel('phase_4/models/gui/purchase_gui')
        self.jarImage = purchaseModels.find('**/Jar')
        self.jarImage.reparentTo(hidden)
        self.rewardPanel = DirectLabel(parent = hidden, relief = None, pos = (1.1599999999999999, 0.0, 0.45000000000000001), scale = 0.65000000000000002, text = '', text_scale = 0.20000000000000001, text_fg = (0.94999999999999996, 0.94999999999999996, 0, 1), text_pos = (0, -0.13), text_font = ToontownGlobals.getSignFont(), image = self.jarImage)
        self.rewardPanelTitle = DirectLabel(parent = self.rewardPanel, relief = None, pos = (0, 0, 0.059999999999999998), scale = 0.080000000000000002, text = Localizer.CannonGameReward, text_fg = (0.94999999999999996, 0.94999999999999996, 0, 1), text_shadow = (0, 0, 0, 1))
        self.music = base.loadMusic('phase_4/audio/bgm/MG_cannon_game.mid')
        self.sndCannonMove = base.loadSfx('phase_4/audio/sfx/MG_cannon_adjust.mp3')
        self.sndCannonFire = base.loadSfx('phase_4/audio/sfx/MG_cannon_fire_alt.mp3')
        self.sndHitGround = base.loadSfx('phase_4/audio/sfx/MG_cannon_hit_dirt.mp3')
        self.sndHitTower = base.loadSfx('phase_4/audio/sfx/MG_cannon_hit_tower.mp3')
        self.sndHitWater = base.loadSfx('phase_4/audio/sfx/MG_cannon_splash.mp3')
        self.sndWhizz = base.loadSfx('phase_4/audio/sfx/MG_cannon_whizz.mp3')
        self.sndWin = base.loadSfx('phase_4/audio/sfx/MG_win.mp3')
        self.sndRewardTick = base.loadSfx('phase_3.5/audio/sfx/tick_counter.mp3')
        guiModel = 'phase_4/models/gui/cannon_game_gui'
        cannonGui = loader.loadModel(guiModel)
        self.aimPad = DirectFrame(image = cannonGui.find('**/CannonFire_PAD'), relief = None, pos = (0.69999999999999996, 0, -0.55333299999999996), scale = 0.80000000000000004)
        cannonGui.removeNode()
        self.aimPad.hide()
        self.fireButton = DirectButton(parent = self.aimPad, image = ((guiModel, '**/Fire_Btn_UP'), (guiModel, '**/Fire_Btn_DN'), (guiModel, '**/Fire_Btn_RLVR')), relief = None, pos = (0.0115741, 0, 0.0050505100000000002), scale = 1.0, command = self._DistributedCannonGame__firePressed)
        self.upButton = DirectButton(parent = self.aimPad, image = ((guiModel, '**/Cannon_Arrow_UP'), (guiModel, '**/Cannon_Arrow_DN'), (guiModel, '**/Cannon_Arrow_RLVR')), relief = None, pos = (0.0115741, 0, 0.221717))
        self.downButton = DirectButton(parent = self.aimPad, image = ((guiModel, '**/Cannon_Arrow_UP'), (guiModel, '**/Cannon_Arrow_DN'), (guiModel, '**/Cannon_Arrow_RLVR')), relief = None, pos = (0.0136112, 0, -0.21010100000000001), image_hpr = (0, 0, 180))
        self.leftButton = DirectButton(parent = self.aimPad, image = ((guiModel, '**/Cannon_Arrow_UP'), (guiModel, '**/Cannon_Arrow_DN'), (guiModel, '**/Cannon_Arrow_RLVR')), relief = None, pos = (-0.199352, 0, -0.00050526900000000003), image_hpr = (0, 0, 90))
        self.rightButton = DirectButton(parent = self.aimPad, image = ((guiModel, '**/Cannon_Arrow_UP'), (guiModel, '**/Cannon_Arrow_DN'), (guiModel, '**/Cannon_Arrow_RLVR')), relief = None, pos = (0.219167, 0, -0.0010102399999999999), image_hpr = (0, 0, -90))
        self.aimPad.setColor(1, 1, 1, 0.90000000000000002)
        
        def bindButton(button, upHandler, downHandler):
            button.bind(B1PRESS, lambda x, handler = upHandler: handler())
            button.bind(B1RELEASE, lambda x, handler = downHandler: handler())

        bindButton(self.upButton, self._DistributedCannonGame__upPressed, self._DistributedCannonGame__upReleased)
        bindButton(self.downButton, self._DistributedCannonGame__downPressed, self._DistributedCannonGame__downReleased)
        bindButton(self.leftButton, self._DistributedCannonGame__leftPressed, self._DistributedCannonGame__leftReleased)
        bindButton(self.rightButton, self._DistributedCannonGame__rightPressed, self._DistributedCannonGame__rightReleased)
        self.timer = ToontownTimer.ToontownTimer()
        self.timer.posInTopRightCorner()
        self.timer.hide()
        self.DEBUG_TOWER_RANGE = 0
        self.DEBUG_CANNON_FAR_LEFT = 0
        self.DEBUG_TOWER_NEAR = 1
        self.DEBUG_TOWER_FAR_LEFT = 1
        self.cheat = config.GetBool('cannon-game-cheat', 0)
 def __init__(self, node):
     AnimatedProp.AnimatedProp.__init__(self, node)
     self.fish = Actor.Actor()
     self.fish.reparentTo(self.node.getParent())
     self.fish.setTransform(self.node.getTransform())
     self.node.clearMat()
     self.fish.prepareBundle(self.node)
     self.fish.loadAnims({
         'jump': 'phase_4/models/props/SZ_fish-jump',
         'swim': 'phase_4/models/props/SZ_fish-swim'
     })
     self.splashSfxList = (
         loader.loadSfx('phase_4/audio/sfx/TT_splash1.mp3'),
         loader.loadSfx('phase_4/audio/sfx/TT_splash2.mp3'))
     self.node = self.fish
     self.geom = self.fish.getGeomNode()
     self.exitRipples = Ripples(self.geom)
     self.exitRipples.setBin('fixed', 25, 1)
     self.exitRipples.setPosHprScale(-0.3, 0.0, 1.24, 0.0, 0.0, 0.0, 0.7,
                                     0.7, 0.7)
     self.splash = Splash(self.geom)
     self.splash.setPosHprScale(-1, 0.0, 1.23, 0.0, 0.0, 0.0, 0.7, 0.7, 0.7)
     randomSplash = random.choice(self.splashSfxList)
     self.track = Sequence(FunctionInterval(self.randomizePosition),
                           Parallel(
                               self.fish.actorInterval('jump'),
                               Sequence(Wait(0.25),
                                        Func(self.exitRipples.play, 0.75)),
                               Sequence(
                                   Wait(1.14), Func(self.splash.play),
                                   SoundInterval(randomSplash,
                                                 volume=0.8,
                                                 node=self.node))),
                           Wait(5 + 10 * random.random()),
                           name=self.uniqueName('Fish'))
 def playSplashEffect(self, x, y, z):
     import Splash
     if self.splash == None:
         self.splash = Splash.Splash(render)
     
     self.splash.setPos(x, y, z)
     self.splash.setScale(2)
     self.splash.play()
     place = toonbase.tcr.playGame.getPlace()
     base.playSfx(place.loader.submergeSound)