示例#1
0
class DistributedMickey(DistributedSmoothNode):
    def __init__(self, cr):
        self.cr = cr
        DistributedSmoothNode.__init__(self, cr)
        NodePath.__init__(self, 'Mickey')
        self.name = "Mickey"
        self.anim = ""
        self.chat = ""

        self.mickey = Actor(
            "phase_3/models/char/mickey-1200.bam", {
                "neutral": "phase_3/models/char/mickey-wait.bam",
                "walk": "phase_3/models/char/mickey-walk.bam",
                "run": "phase_3/models/char/mickey-run.bam",
                "left-start": "phase_3.5/models/char/mickey-left-start.bam",
                "left": "phase_3.5/models/char/mickey-left.bam",
                "right-start": "phase_3.5/models/char/mickey-right-start.bam",
                "right": "phase_3.5/models/char/mickey-right.bam"
            })
        self.mickeyEye = self.mickey.controlJoint(None, "modelRoot",
                                                  "joint_pupilR")
        self.mickeyEye.setY(0.025)
        self.mickey.reparentTo(self)
        self.mickey.setScale(1.25)

        for bundle in self.mickey.getPartBundleDict().values():
            bundle = bundle['modelRoot'].getBundle()
            earNull = bundle.findChild('sphere3')
            if not earNull:
                earNull = bundle.findChild('*sphere3')
            earNull.clearNetTransforms()

        for bundle in self.mickey.getPartBundleDict().values():
            charNodepath = bundle['modelRoot'].partBundleNP
            bundle = bundle['modelRoot'].getBundle()
            earNull = bundle.findChild('sphere3')
            if not earNull:
                earNull = bundle.findChild('*sphere3')
            ears = charNodepath.find('**/sphere3')
            if ears.isEmpty():
                ears = charNodepath.find('**/*sphere3')
            ears.clearEffect(CharacterJointEffect.getClassType())
            earRoot = charNodepath.attachNewNode('earRoot')
            earPitch = earRoot.attachNewNode('earPitch')
            earPitch.setP(40.0)
            ears.reparentTo(earPitch)
            earNull.addNetTransform(earRoot.node())
            ears.clearMat()
            ears.node().setPreserveTransform(ModelNode.PTNone)
            ears.setP(-40.0)
            ears.flattenMedium()
            ears.setBillboardAxis()

        self.shadow = loader.loadModel("phase_3/models/props/drop_shadow.bam")
        self.shadow.setScale(0.55)
        self.shadow.flattenMedium()
        self.shadow.setBillboardAxis(4)
        try:
            self.shadowPlacer = ShadowPlacer(base.cTrav, self.shadow,
                                             base.wall_mask, base.floor_mask)
            self.shadowPlacer.on()
        except:
            pass
        self.shadow.reparentTo(self)

        cs = CollisionSphere(0, 0, 0, 2)
        cnode = CollisionNode('mickeyCNode')
        cnode.addSolid(cs)
        rs = CollisionRay(0, 0, 2, 0, 0, -1)
        rnode = CollisionNode('mickeyRNode')
        rnode.addSolid(rs)
        self.cnp = self.attachNewNode(cnode)
        self.cnp.setZ(0.75)
        self.rnp = self.attachNewNode(rnode)

    def mickeyCollisions(self):
        self.cnp.setCollideMask(BitMask32(0))
        self.cnp.node().setFromCollideMask(CIGlobals.WallBitmask)
        self.rnp.setCollideMask(BitMask32(0))
        self.rnp.node().setFromCollideMask(CIGlobals.FloorBitmask)

        ss = CollisionSphere(0, 0, 0, 10)
        snode = CollisionNode('mickeySNode')
        snode.addSolid(ss)
        self.snp = self.attachNewNode(snode)
        self.snp.setZ(0.75)
        self.snp.setCollideMask(BitMask32(0))
        self.snp.node().setFromCollideMask(CIGlobals.EventBitmask)

        pusher = CollisionHandlerPusher()
        pusher.setInPattern("%in")
        pusher.addCollider(self.cnp, self)
        floor = CollisionHandlerFloor()
        floor.setInPattern("%in")
        floor.addCollider(self.rnp, self)
        event = CollisionHandlerEvent()
        event.setInPattern("%fn-into")
        event.setOutPattern("%fn-out")
        base.cTrav.addCollider(self.cnp, pusher)
        base.cTrav.addCollider(self.rnp, floor)
        base.cTrav.addCollider(self.snp, event)

    def setName(self, name):
        self.name = name
        if name == "":
            return
        elif self.name == "minnie":
            self.name = "Minnie"
        try:
            self.nameTag.remove()
            del self.nameTag
        except:
            pass
        self.it = loader.loadFont("phase_3/models/fonts/ImpressBT.ttf")
        self.nameTag = DirectLabel(text=self.name,
                                   text_fg=(0.992188, 0.480469, 0.167969, 1.0),
                                   text_bg=(0.75, 0.75, 0.75, 0.5),
                                   text_wordwrap=8,
                                   text_decal=True,
                                   relief=None,
                                   parent=self)
        self.nameTag.setPos(0, 0, 5)
        self.nameTag.setBillboardPointEye()
        LS = LabelScaler()
        LS.resize(self.nameTag)

    def b_setName(self, name):
        self.d_setName(name)
        self.setName(name)

    def d_setName(self, name):
        self.sendUpdate("setName", [name])

    def setChat(self, chat):
        if chat == "":
            return
        self.nameTag.hide()
        try:
            self.bubble.remove()
            taskMgr.remove("RemoveMickeyChat-" + str(self.random_taskid))
        except:
            pass
        self.chat = chat
        self.it = loader.loadFont(CIGlobals.ToonFont,
                                  lineHeight=CIGlobals.ToonFontLineHeight)
        b = loader.loadTexture("phase_3/maps/chatbubble.jpg",
                               "phase_3/maps/chatbubble_a.rgb")

        self.balloon_sfx = loader.loadSfx(
            "phase_3/audio/sfx/GUI_balloon_popup.mp3")
        self.balloon_sfx.play()

        self.dial = loader.loadSfx("phase_3/audio/dial/mickey.wav")

        self.dial.play()

        self.box = loader.loadModel(CIGlobals.ChatBubble)
        self.ChatBalloon = ChatBalloon(self.box)
        LS = LabelScaler()
        self.bubble = self.ChatBalloon.generate(chat, self.it)
        LS.resize(self.bubble)
        self.bubble.reparentTo(self)
        self.bubble.setZ(self.nameTag.getZ() - 0.3)
        self.bubble.setBillboardPointEye()
        self.random_taskid = random.randint(
            0,
            10000000000000000000000000000000000000000000000000000000000000000000000
        )
        taskMgr.doMethodLater(7, self.delChat,
                              "RemoveMickeyChat-" + str(self.random_taskid))

    def delChat(self, task):
        self.chat = ""
        self.nameTag.show()
        self.bubble.remove()
        return task.done

    def b_setChat(self, chat):
        self.d_setChat(chat)
        self.setChat(chat)

    def d_setChat(self, chat):
        self.sendUpdate("setChat", [chat])

    def getChat(self):
        return self.chat

    def setAnimState(self, anim):
        self.anim = anim
        if "start" in anim:
            self.mickey.play(anim)
        self.mickey.loop(anim)

    def b_setAnimState(self, anim):
        self.d_setAnimState(anim)
        self.setAnimState(anim)

    def d_setAnimState(self, anim):
        self.sendUpdate("setAnimState", [anim])

    def getAnimState(self):
        return self.anim

    def announceGenerate(self):
        DistributedSmoothNode.announceGenerate(self)

        self.reparentTo(render)

    def generate(self):
        DistributedSmoothNode.generate(self)

        self.activateSmoothing(True, False)
        self.startSmooth()

    def disable(self):
        self.stopSmooth()
        self.detachNode()
        DistributedSmoothNode.disable(self)

    def delete(self):
        self.mickey = None
        DistributedSmoothNode.delete(self)
class cat:
    def __init__(self):
        self.button_img = loader.loadModel(
            "phase_3/models/gui/quit_button.bam")
        self.music = loader.loadSfx(
            "phase_7/audio/bgm/encntr_suit_winning_indoor.mid")
        self.music.setVolume(1)
        self.music.setLoop(True)
        self.music.play()
        base.disableMouse()
        camera.setPos(-0.3, -45.6, 15.9)
        camera.setHpr(0, 0, 0)
        #self.get_pos_button = DirectButton(text="GetPos", command=self.give_pos, scale=0.08, pos=(1, 0, 0))
        #self.get_hpr_button = DirectButton(text="GetHpr", command=self.give_hpr, scale=0.08, pos=(-1, 0, 0))

        self.vp_torso = Actor(
            "phase_9/models/char/sellbotBoss-torso-zero.bam", {
                "torso-stand-angry":
                "phase_9/models/char/bossCog-torso-Fb_neutral.bam",
                "torso-stand-happy":
                "phase_9/models/char/bossCog-torso-Ff_neutral.bam",
                "torso-jump":
                "phase_9/models/char/bossCog-torso-Fb_jump.bam",
                "torso-throw":
                "phase_9/models/char/bossCog-torso-Fb_UpThrow.bam",
                "torso-fall":
                "phase_9/models/char/bossCog-torso-Fb_firstHit.bam",
                "torso-up":
                "phase_9/models/char/bossCog-torso-Fb_down2Up.bam",
                "torso-dn_neutral":
                "phase_9/models/char/bossCog-torso-Fb_downNeutral.bam",
                "torso-dn_throw":
                "phase_9/models/char/bossCog-torso-Fb_DownThrow.bam",
                "torso-speech":
                "phase_9/models/char/bossCog-torso-Ff_speech.bam",
                "torso-wave":
                "phase_9/models/char/bossCog-torso-wave.bam",
                "torso-downhit":
                "phase_9/models/char/bossCog-torso-Fb_firstHit.bam"
            })

        self.vp_head_joint = self.vp_torso.find('**/joint34')
        self.vp_hand_joint = self.vp_torso.find('**/joint_pelvis')
        gear_1.reparentTo(self.vp_torso)
        gear_1.setScale(0.5)
        gear_1.setY(-2)
        gear_1.setZ(5)
        gear_1.hide()

        self.vp_head = Actor(
            "phase_9/models/char/sellbotBoss-head-zero.bam", {
                "head-stand-angry":
                "phase_9/models/char/bossCog-head-Fb_neutral.bam",
                "head-stand-happy":
                "phase_9/models/char/bossCog-head-Ff_neutral.bam",
                "head-jump": "phase_9/models/char/bossCog-head-Fb_jump.bam",
                "head-throw":
                "phase_9/models/char/bossCog-head-Fb_UpThrow.bam",
                "head-fall":
                "phase_9/models/char/bossCog-head-Fb_firstHit.bam",
                "head-up": "phase_9/models/char/bossCog-head-Fb_down2Up.bam",
                "head-dn_neutral":
                "phase_9/models/char/bossCog-head-Fb_downNeutral.bam",
                "head-dn_throw":
                "phase_9/models/char/bossCog-head-Fb_DownThrow.bam",
                "head-speech":
                "phase_9/models/char/bossCog-head-Ff_speech.bam",
                "head-wave": "phase_9/models/char/bossCog-head-wave.bam",
                "head-downhit":
                "phase_9/models/char/bossCog-head-Fb_firstHit.bam"
            })
        self.vp_head.reparentTo(self.vp_head_joint)

        self.vp_legs = Actor(
            "phase_9/models/char/bossCog-legs-zero.bam", {
                "legs-stand-angry":
                "phase_9/models/char/bossCog-legs-Fb_neutral.bam",
                "legs-stand-happy":
                "phase_9/models/char/bossCog-legs-Ff_neutral.bam",
                "legs-jump": "phase_9/models/char/bossCog-legs-Fb_jump.bam",
                "legs-throw":
                "phase_9/models/char/bossCog-legs-Fb_UpThrow.bam",
                "legs-fall":
                "phase_9/models/char/bossCog-legs-Fb_firstHit.bam",
                "legs-up": "phase_9/models/char/bossCog-legs-Fb_down2Up.bam",
                "legs-dn_neutral":
                "phase_9/models/char/bossCog-legs-Fb_downNeutral.bam",
                "legs-dn_throw":
                "phase_9/models/char/bossCog-legs-Fb_DownThrow.bam",
                "legs-speech":
                "phase_9/models/char/bossCog-legs-Ff_speech.bam",
                "legs-wave": "phase_9/models/char/bossCog-legs-wave.bam",
                "legs-downhit":
                "phase_9/models/char/bossCog-legs-Fb_firstHit.bam"
            })
        self.vp_legs.reparentTo(render)

        self.vp_legs_joint = self.vp_legs.find('**/joint_legs')

        self.vp_torso.reparentTo(self.vp_legs_joint)
        self.emote = 'angry'
        self.vp_head.loop("head-stand-angry")
        self.vp_legs.loop("legs-stand-angry")
        self.vp_torso.loop("torso-stand-angry")

        self.btn_happy = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Happy",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(1, 0.8, 0.8),
            command=self.goto_happy)
        self.btn_angry = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Angry",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(1, 0.7, 0.7),
            command=self.goto_angry)
        self.btn_jump = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Jump",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(-1, 0.8, 0.8),
            command=self.goto_jump)
        self.btn_throw = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Throw",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(-1, 0.7, 0.7),
            command=self.vp_throw)
        self.btn_collapse = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Down",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(-1, 0.6, 0.6),
            command=self.vp_collapse)
        self.btn_up = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Up",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(-1, 0.5, 0.5),
            command=self.goto_up)
        self.btn_speech = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Speech",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(-1, 0.4, 0.4),
            command=self.goto_speech)

        self.btn_wave = DirectButton(
            geom=(self.button_img.find('**/QuitBtn_UP'),
                  self.button_img.find('**/QuitBtn_DN'),
                  self.button_img.find('**/QuitBtn_RLVR')),
            relief=None,
            clickSound=click,
            rolloverSound=rollover,
            scale=1,
            text="Wave",
            text_font=impress_bt,
            text_scale=0.059999999999999998,
            text_pos=(0, -0.015),
            pos=(-1, 0.3, 0.3),
            command=self.goto_wave)
        self.slider_turn = DirectSlider(range=(-150, 150),
                                        value=0,
                                        pageSize=20,
                                        command=self.turn_vp,
                                        scale=0.7,
                                        orientation=DGG.VERTICAL,
                                        pos=(1, -0.2, -0.2))
        self.find = self.vp_torso.findAllMatches('**')
        print self.find

    def goto_happy(self):
        taskMgr.add(self.vp_happy, "VP HAPPY")

    def goto_angry(self):
        taskMgr.add(self.vp_angry, "VP ANGRY")

    def goto_jump(self):
        taskMgr.add(self.vp_jump, "VP JUMP1")

    def goto_speech(self):
        taskMgr.add(self.vp_speech, "VP SPEECH")

    def goto_wave(self):
        taskMgr.add(self.vp_wave, "VP WAVE")

    def goto_up(self):
        taskMgr.add(self.vp_up, "VP WAVE")

    def turn_vp(self):
        self.vp_torso.setH(self.slider_turn['value'])

    def vp_happy(self, task):
        self.btn_happy.show()
        self.btn_angry.show()
        self.btn_jump.show()
        self.btn_throw.show()
        self.btn_collapse.show()
        self.btn_up.show()
        self.btn_speech.show()
        self.btn_wave.show()
        try:
            self.btn_stop_speech.remove()
        except:
            print("button does not exist")
        try:
            self.btn_stop_wave.remove()
        except:
            print("button does not exist")
        self.emote = 'happy'
        print self.emote
        self.vp_head.loop("head-stand-happy")
        self.vp_legs.loop("legs-stand-happy")
        self.vp_torso.loop("torso-stand-happy")
        try:
            if self.position == 'down':
                self.vp_head.loop("head-dn_neutral")
                self.vp_torso.loop("torso-dn_neutral")
                self.vp_legs.loop("legs-dn_neutral")
        except:
            print("var not set")
        return task.done

    def vp_angry(self, task):
        self.btn_happy.show()
        self.btn_wave.show()
        self.btn_angry.show()
        self.btn_jump.show()
        self.btn_throw.show()
        self.btn_collapse.show()
        self.btn_up.show()
        self.btn_speech.show()
        try:
            self.btn_stop_speech.remove()
        except:
            print("button does not exist")
        try:
            self.btn_stop_wave.remove()
        except:
            print("button does not exist")
        self.emote = 'angry'
        print self.emote
        self.vp_head.loop("head-stand-angry")
        self.vp_legs.loop("legs-stand-angry")
        self.vp_torso.loop("torso-stand-angry")
        try:
            if self.position == 'down':
                self.vp_head.loop("head-dn_neutral")
                self.vp_torso.loop("torso-dn_neutral")
                self.vp_legs.loop("legs-dn_neutral")
        except:
            print("var not set")
        return task.done

    def gear_hide(self, task):
        gear_1.hide()
        return task.done

    def vp_jump(self, task):
        try:
            if self.position == 'down':
                self.direction = 'jump'
                self.goto_up()
                return
        except:
            print("var not set")
        self.btn_happy.hide()
        self.btn_angry.hide()
        self.btn_wave.hide()
        self.btn_jump.hide()
        self.btn_throw.hide()
        self.btn_collapse.hide()
        self.btn_up.hide()
        self.btn_speech.hide()
        self.action = 'jump'
        print self.action
        self.position = 'up'
        self.vp_head.play("head-jump")
        self.vp_legs.play("legs-jump")
        self.vp_torso.play("torso-jump")
        jump_start.play()
        taskMgr.doMethodLater(1.2, self.vp_jump_end, "end sound")
        if self.emote == 'happy':
            taskMgr.doMethodLater(3, self.vp_happy, "Happy VP")
        if self.emote == 'angry':
            taskMgr.doMethodLater(3, self.vp_angry, "Angry VP")
        return task.done

    def vp_speech(self, task):
        self.btn_speech.hide()
        try:
            if self.position == 'down':
                self.direction = 'speech'
                self.goto_up()
                return
        except:
            print("var not set")
        self.btn_happy.hide()
        self.btn_angry.hide()
        self.btn_jump.hide()
        self.btn_throw.hide()
        self.btn_collapse.hide()
        self.btn_up.hide()
        self.btn_wave.hide()
        self.action = 'speech'
        print self.action
        self.vp_head.loop("head-speech")
        self.vp_legs.loop("legs-speech")
        self.vp_torso.loop("torso-speech")
        self.OK_ButtonImage = loader.loadModel(
            "phase_3/models/gui/dialog_box_buttons_gui.bam")
        self.btn_stop_speech = DirectButton(
            geom=(self.OK_ButtonImage.find('**/CloseBtn_UP'),
                  self.OK_ButtonImage.find('**/CloseBtn_DN'),
                  self.OK_ButtonImage.find('**/CloseBtn_Rllvr')),
            rolloverSound=rollover,
            clickSound=click,
            relief=None,
            scale=1.5,
            pos=(-1, 0.4, 0.4),
            text="Stop",
            text_scale=0.05,
            text_font=impress_bt,
            text_pos=(0, -0.1, -0.1),
            command=self.stop_speech)
        return task.done

    def vp_wave(self, task):
        self.btn_speech.hide()
        self.btn_wave.hide()
        try:
            if self.position == 'down':
                self.direction = 'wave'
                self.goto_up()
                return
        except:
            print("var not set")
        self.btn_happy.hide()
        self.btn_angry.hide()
        self.btn_jump.hide()
        self.btn_throw.hide()
        self.btn_collapse.hide()
        self.btn_up.hide()
        self.action = 'wave'
        print self.action
        self.vp_head.loop("head-wave")
        self.vp_legs.loop("legs-wave")
        self.vp_torso.loop("torso-wave")
        self.OK_ButtonImage = loader.loadModel(
            "phase_3/models/gui/dialog_box_buttons_gui.bam")
        self.btn_stop_wave = DirectButton(
            geom=(self.OK_ButtonImage.find('**/CloseBtn_UP'),
                  self.OK_ButtonImage.find('**/CloseBtn_DN'),
                  self.OK_ButtonImage.find('**/CloseBtn_Rllvr')),
            rolloverSound=rollover,
            clickSound=click,
            relief=None,
            scale=1.5,
            pos=(-1, 0.3, 0.3),
            text="Stop",
            text_scale=0.05,
            text_font=impress_bt,
            text_pos=(0, -0.1, -0.1),
            command=self.stop_wave)
        return task.done

    def stop_speech(self):
        if self.emote == 'happy':
            taskMgr.add(self.vp_happy, "VP HAPPY1")
        if self.emote == 'angry':
            taskMgr.add(self.vp_angry, "VP ANGRY1")

    def stop_wave(self):
        if self.emote == 'happy':
            taskMgr.add(self.vp_happy, "VP HAPPY2")
        if self.emote == 'angry':
            taskMgr.add(self.vp_angry, "VP ANGRY2")

    def vp_collapse(self):
        self.btn_happy.hide()
        self.btn_angry.hide()
        self.btn_jump.hide()
        self.btn_throw.hide()
        self.btn_collapse.hide()
        self.btn_up.hide()
        self.btn_speech.hide()
        self.btn_wave.hide()
        self.position = 'down'
        print self.position
        self.vp_head.play("head-fall")
        self.vp_torso.play("torso-fall")
        self.vp_legs.play("legs-fall")
        vp_down.play()
        if self.emote == 'happy':
            taskMgr.doMethodLater(3, self.vp_happy, "Happy VP")
        if self.emote == 'angry':
            taskMgr.doMethodLater(3, self.vp_angry, "Angry VP")

    def vp_up(self, task):
        try:
            if self.direction == 'jump':
                self.direction = None
                self.vp_head.play("head-up")
                self.vp_torso.play("torso-up")
                self.vp_legs.play("legs-up")
                taskMgr.doMethodLater(2.6, self.vp_jump, "VP JUMP")
        except:
            print("var not set")
        try:
            if self.direction == 'speech':
                self.direction = None
                self.vp_head.play("head-up")
                self.vp_torso.play("torso-up")
                self.vp_legs.play("legs-up")
                taskMgr.doMethodLater(2.6, self.vp_speech, "VP SPEECH")
        except:
            print("var not set")
        try:
            if self.direction == 'wave':
                self.direction = None
                self.vp_head.play("head-up")
                self.vp_torso.play("torso-up")
                self.vp_legs.play("legs-up")
                taskMgr.doMethodLater(2.6, self.vp_wave, "VP WAVE")
        except:
            print("var not set")
        self.btn_happy.hide()
        self.btn_angry.hide()
        self.btn_jump.hide()
        self.btn_wave.hide()
        self.btn_throw.hide()
        self.btn_collapse.hide()
        self.btn_up.hide()
        self.btn_speech.hide()
        self.position = 'up'
        print self.position
        self.vp_head.play("head-up")
        self.vp_torso.play("torso-up")
        self.vp_legs.play("legs-up")
        vp_up.play()
        if self.emote == 'happy':
            taskMgr.doMethodLater(2.6, self.vp_happy, "Happy VP")
        if self.emote == 'angry':
            taskMgr.doMethodLater(2.6, self.vp_angry, "Angry VP")
        return task.done

    def vp_throw(self):
        self.btn_speech.hide()
        self.btn_happy.hide()
        self.btn_collapse.hide()
        self.btn_angry.hide()
        self.btn_jump.hide()
        self.btn_wave.hide()
        self.btn_throw.hide()
        self.btn_up.hide()
        gear_1.show()
        gear_1_interval = gear_1.posInterval(2,
                                             Point3(0, -200, 5),
                                             startPos=Point3(0, -2, 5))
        gear_1_move = Sequence(gear_1_interval, name="gear_1_throw")
        gear_1_move.start()
        taskMgr.doMethodLater(2, self.gear_hide, "Hide Gear")
        self.action = 'throw'
        print self.action
        gear_throw.play()
        self.vp_head.play("head-throw")
        self.vp_legs.play("legs-throw")
        self.vp_torso.play("torso-throw")
        try:
            if self.position == 'down':
                self.vp_head.play("head-dn_throw")
                self.vp_torso.play("torso-dn_throw")
                self.vp_legs.play("legs-dn_throw")
        except:
            print("var not set")
        if self.emote == 'happy':
            taskMgr.doMethodLater(0.9, self.vp_happy, "Happy VP")
        if self.emote == 'angry':
            taskMgr.doMethodLater(0.9, self.vp_angry, "Angry VP")

    def vp_jump_end(self, task):
        jump_end.play()

    def give_pos(self):
        print camera.getPos()

    def give_hpr(self):
        print camera.getHpr()
class Pies:
    notify = DirectNotify().newCategory("Pies")

    def __init__(self):
        self.models = {
            1: "phase_3.5/models/props/tart.bam",
            0: "phase_5/models/props/birthday-cake-mod.bam",
            2: "phase_5/models/props/cream-pie-slice.bam"
        }
        self.hitsounds = {
            1: "phase_4/audio/sfx/AA_wholepie_only.ogg",
            0: "phase_4/audio/sfx/AA_wholepie_only.ogg",
            2: "phase_3.5/audio/sfx/AA_tart_only.ogg"
        }
        self.splatcolors = {
            1: VBase4(1, 1, 0, 1),
            0: VBase4(1, 0, 1, 1),
            2: VBase4(1, 1, 0, 1)
        }
        self.playrates = {1: 1.0, 0: 1.0, 2: 1.0}
        self.damage = {1: 36, 0: 75, 2: 17}
        self.max_ammo = {1: 7, 0: 3, 2: 15}
        self.current_ammo = {1: 7, 0: 3, 2: 15}
        self.avatar = None
        self.splat = None
        self.pie = None
        self.woosh = None
        self.pie_type = 1  # Default pie is the wholecream pie.
        self.pie_state = "start"
        return

    def delete(self):
        self.avatar = None
        if self.splat is not None:
            self.splat.cleanup()
            self.splat = None
        if self.pie is not None:
            self.deletePie()
        self.pie_type = None
        self.pie_state = None
        self.current_ammo = None
        self.max_ammo = None
        self.damage = None
        self.playrates = None
        self.splatcolors = None
        self.hitsounds = None
        self.models = None
        return

    def setAvatar(self, avatar):
        self.avatar = avatar

    def getAvatar(self):
        return self.avatar

    def setPieType(self, pietype):
        self.pie_type = pietype

    def getPieType(self):
        return self.pie_type

    def setAmmo(self, ammo, pietype=None):
        if pietype is None:
            pietype = self.getPieType()
        self.current_ammo[pietype] = ammo

    def getAmmo(self, pietype=None):
        if pietype is None:
            pietype = self.getPieType()
        return self.current_ammo[pietype]

    def getDamage(self):
        return self.damage[self.pie_type]

    def deletePie(self):
        try:
            self.trajectory.pause()
        except:
            pass
        if self.pie:
            self.pie.removeNode()
            self.pie = None

    def pieStart(self):
        self.pie = Pie(self, self.avatar, self.pie_type)
        self.pie.load()

        self.avatar.setPlayRate(self.playrates[self.pie_type], "pie")
        self.avatar.play("pie", fromFrame=0, toFrame=45)

    def pieThrow(self):
        self.avatar.play("pie", fromFrame=45, toFrame=90)

    def pieRelease(self):
        if self.pie is None:
            return
        self.pie.throw()
        self.setAmmo(self.getAmmo() - 1)

    def handlePieSplat(self):
        if self.splat:
            self.splat.cleanup()
            self.splat = None

        self.splat = Actor("phase_3.5/models/props/splat-mod.bam",
                           {"chan": "phase_3.5/models/props/splat-chan.bam"})
        self.splat_sfx = audio3d.loadSfx(self.hitsounds[self.pie_type])
        audio3d.attachSoundToObject(self.splat_sfx, self.splat)
        self.splat_sfx.play()
        self.splat.reparentTo(render)
        self.splat.setBillboardPointEye()
        self.splat.setColor(self.splatcolors[self.pie_type])
        if self.pie and self.splat:
            self.splat.setPos(self.pie.getPos(render))
            self.splat.play("chan")

        if self.woosh:
            self.woosh.stop()
            self.woosh = None
        try:
            self.trajectory.pause()
        except:
            pass
        if self.pie:
            self.pie.removeNode()
            self.pie = None
        taskMgr.doMethodLater(0.5, self.delSplat, "delSplat")

    def delSplat(self, task):
        if self.splat:
            self.splat.cleanup()
            self.splat = None
        return task.done
示例#4
0
class Pies:
    notify = DirectNotify().newCategory("Pies")

    def __init__(self):
        self.models = {
            1: "phase_3.5/models/props/tart.bam",
            0: "phase_5/models/props/birthday-cake-mod.bam",
            2: "phase_5/models/props/cream-pie-slice.bam"
        }
        self.hitsounds = {
            1: "phase_4/audio/sfx/AA_wholepie_only.mp3",
            0: "phase_4/audio/sfx/AA_wholepie_only.mp3",
            2: "phase_3.5/audio/sfx/AA_tart_only.mp3"
        }
        self.splatcolors = {
            1: VBase4(1, 1, 0, 1),
            0: VBase4(1, 0, 1, 1),
            2: VBase4(1, 1, 0, 1)
        }
        self.playrates = {1: 1.0, 0: 1.0, 2: 1.0, 3: 1.0}
        self.damage = {1: 36, 0: 75, 2: 17, 3: 180}
        self.health = {1: 5, 0: 10, 2: 2}
        self.max_ammo = {1: 7, 0: 3, 2: 15, 3: 2}
        self.current_ammo = {1: 7, 0: 3, 2: 15, 3: 0}
        self.weapon_id_2_weapon = {0: "cake", 1: "tart", 2: "slice", 3: "tnt"}
        self.avatar = None
        self.splat = None
        self.pie = None
        self.tnt = None
        self.tntSparks = None
        self.tntTrajectory = None
        self.tntExplosion = None
        self.woosh = None
        self.dynamiteSfx = None
        self.pie_type = 1  # Default pie is the wholecream pie.
        self.pie_state = "start"
        self.tnt_state = "ready"
        return

    def getPieTypeName(self):
        return self.weapon_id_2_weapon.get(self.pie_type, None)

    def attachTNT(self):
        self.detachTNT()
        self.tnt = Actor("phase_5/models/props/tnt-mod.bam",
                         {"chan": "phase_5/models/props/tnt-chan.bam"})
        self.tnt.reparentTo(self.avatar.find('**/def_joint_right_hold'))
        self.tntSparks = ParticleEffect()
        self.tntSparks.loadConfig("phase_5/etc/tnt.ptf")
        #self.tntSparks.start(parent = self.tnt.find('**/joint_attachEmitter'),
        #	renderParent = self.tnt.find('**/joint_attachEmitter'))

    def detachTNT(self):
        if self.tntTrajectory:
            self.tntTrajectory.pause()
            self.tntTrajectory = None
        if self.tnt is not None:
            self.tnt.cleanup()
            self.tnt = None
        if self.tntSparks is not None:
            self.tntSparks.cleanup()
            self.tntSparks = None

    def delete(self):
        self.avatar = None
        if self.splat is not None:
            self.splat.cleanup()
            self.splat = None
        self.detachTNT()
        self.tnt = None
        self.tnt_state = None
        self.tntSparks = None
        if self.tntExplosion:
            self.tntExplosion.cleanup()
            self.tntExplosion = None
        if self.dynamiteSfx:
            self.dynamiteSfx.stop()
            self.dynamiteSfx = None
        if self.pie is not None:
            self.deletePie()
        self.pie_type = None
        self.pie_state = None
        self.current_ammo = None
        self.max_ammo = None
        self.damage = None
        self.playrates = None
        self.splatcolors = None
        self.hitsounds = None
        self.models = None
        return

    def setAvatar(self, avatar):
        self.avatar = avatar

    def getAvatar(self):
        return self.avatar

    def setPieType(self, pietype):
        self.pie_type = pietype
        weaponType = None
        if pietype in [0, 1, 2]:
            weaponType = "pie"
        elif pietype == 3:
            weaponType = "tnt"
        if hasattr(self.avatar, 'setWeaponType'):
            self.avatar.setWeaponType(weaponType)

    def getPieType(self):
        return self.pie_type

    def setAmmo(self, ammo, pietype=None):
        if pietype is None:
            pietype = self.getPieType()
        self.current_ammo[pietype] = ammo

    def getAmmo(self, pietype=None):
        if pietype is None:
            pietype = self.getPieType()
        return self.current_ammo[pietype]

    def getDamage(self, weapon_id=None):
        if weapon_id is None:
            return self.damage[self.pie_type]
        else:
            return self.damage[weapon_id]

    def getHealth(self, weapon_id=None):
        if weapon_id is None:
            return self.health[self.pie_type]
        else:
            return self.health[weapon_id]

    def deletePie(self):
        try:
            self.trajectory.pause()
        except:
            pass
        if self.pie:
            self.pie.removeNode()
            self.pie = None

    def pieStart(self):
        try:
            audio3d.detachSound(self.woosh)
            self.trajectory.pause()
            self.pie.remove()
            self.pie = None
        except:
            pass
        self.pie_state = 'start'
        self.pie = loader.loadModel(self.models[self.pie_type])
        self.pie.reparentTo(
            self.avatar.getPart('torso').find('**/def_joint_right_hold'))

        self.avatar.setPlayRate(self.playrates[self.pie_type], "pie")
        self.avatar.play("pie", fromFrame=0, toFrame=45)

    def tntStart(self):
        self.avatar.play("toss", fromFrame=22)
        self.tnt_state = "start"

    def tntRelease(self):
        if self.tnt is None:
            return

        tntNp = self.avatar.attachNewNode('tntNp')
        tntNp.setScale(render, 1.0)
        tntNp.setPos(0, 160, -120)
        tntNp.setHpr(0, 90, 0)

        self.tntTrajectory = ProjectileInterval(
            self.tnt,
            startPos=(self.avatar.getPart('torso').find(
                '**/def_joint_right_hold').getPos(render)),
            endPos=tntNp.getPos(render),
            gravityMult=0.9,
            duration=3)
        self.tnt.setHpr(tntNp.getHpr(render))
        self.tntTrajectory.start()
        self.tnt.reparentTo(render)
        self.tnt_state = "released"
        self.setAmmo(self.getAmmo() - 1)

    def handleTntHitGround(self):
        if not self.tnt:
            return

        self.tntSparks.start(
            parent=self.tnt.find('**/joint_attachEmitter'),
            renderParent=self.tnt.find('**/joint_attachEmitter'))

        self.dynamiteSfx = audio3d.loadSfx("phase_5/audio/sfx/TL_dynamite.mp3")
        audio3d.attachSoundToObject(self.dynamiteSfx, self.tnt)
        self.dynamiteSfx.play()

        self.tnt.play("chan")

        if self.tntTrajectory:
            self.tntTrajectory.pause()
            self.tntTrajectory = None

    def tntExplode(self):
        if not self.tnt:
            return

        self.tntExplosion = Actor(
            "phase_5/models/props/kapow-mod.bam",
            {"chan": "phase_5/models/props/kapow-chan.bam"})
        self.tntExplosion.reparentTo(render)
        self.tntExplosion.setBillboardPointEye()
        self.tntExplosion.setPos(self.tnt.getPos(render) + (0, 0, 4))
        self.tntExplosion.setScale(0.5)
        self.tntExplosion.play("chan")
        if self.dynamiteSfx:
            self.dynamiteSfx.stop()
            self.dynamiteSfx = None
        explosionSfx = audio3d.loadSfx(
            "phase_3.5/audio/sfx/ENC_cogfall_apart.mp3")
        audio3d.attachSoundToObject(explosionSfx, self.tntExplosion)
        SoundInterval(explosionSfx).start()
        if self.tntSparks:
            self.tntSparks.cleanup()
            self.tntSparks = None
        if self.tnt:
            self.tnt.cleanup()
            self.tnt = None
        self.tnt_state = "ready"
        if self.getAmmo(3) > 0 and self.getPieType() == 3:
            self.attachTNT()
            if hasattr(self.avatar, "enablePieKeys"):
                # This must be the local avatar
                self.avatar.enablePieKeys()
        taskMgr.doMethodLater(0.5, self.delTntExplosion, "delTntExplosion")

    def delTntExplosion(self, task):
        if self.tntExplosion:
            self.tntExplosion.cleanup()
            self.tntExplosion = None
        return task.done

    def tntCollisions(self):
        if not self.tnt:
            return
        tss = CollisionSphere(0, 0, 0, 1)
        tsNode = CollisionNode('tntSensor')
        tsNode.add_solid(tss)
        self.tsNp = self.tnt.attach_new_node(tsNode)
        self.tsNp.set_scale(0.75, 0.8, 0.75)
        self.tsNp.set_pos(0.0, 0.1, 0.5)
        self.tsNp.set_collide_mask(BitMask32(0))
        self.tsNp.node().set_from_collide_mask(CIGlobals.FloorBitmask)

        event = CollisionHandlerEvent()
        event.set_in_pattern("%fn-into")
        event.set_out_pattern("%fn-out")
        base.cTrav.add_collider(self.tsNp, event)

    def setTntPos(self, pos):
        if self.tnt:
            self.tnt.setPos(pos)

    def pieCollisions(self):
        pss = CollisionSphere(0, 0, 0, 1)
        psnode = CollisionNode('pieSensor')
        psnode.add_solid(pss)
        self.psnp = self.pie.attach_new_node(psnode)
        self.psnp.set_collide_mask(BitMask32(0))
        self.psnp.node().set_from_collide_mask(CIGlobals.WallBitmask
                                               | CIGlobals.FloorBitmask)

        event = CollisionHandlerEvent()
        event.set_in_pattern("%fn-into")
        event.set_out_pattern("%fn-out")
        base.cTrav.add_collider(self.psnp, event)

    def pieThrow(self):
        self.avatar.play("pie", fromFrame=45, toFrame=90)

    def pieRelease(self):
        if self.pie is None:
            return

        self.woosh = audio3d.loadSfx(
            "phase_3.5/audio/sfx/AA_pie_throw_only.mp3")
        audio3d.attachSoundToObject(self.woosh, self.pie)
        self.woosh.play()

        self.pieNp = NodePath("PieNp")
        self.pieNp.reparentTo(self.avatar)
        self.pieNp.setScale(render, 1.0)
        self.pieNp.setPos(0, 160, -90)
        self.pieNp.setHpr(90, -90, 90)

        self.pie.setScale(self.pie.getScale(render))
        self.pie.reparentTo(render)
        self.pie.setHpr(self.pieNp.getHpr(render))

        self.trajectory = ProjectileInterval(
            self.pie,
            startPos=(self.avatar.getPart('torso').find(
                '**/def_joint_right_hold').getPos(render)),
            endPos=self.pieNp.getPos(render),
            gravityMult=0.9,
            duration=3)
        self.trajectory.start()
        self.pie_state = 'released'
        self.setAmmo(self.getAmmo() - 1)

    def handlePieSplat(self):
        if self.splat:
            self.splat.cleanup()
            self.splat = None

        if self.pie_type == 3:
            # Not sure why I get a KeyError: 3 crash, but just for now
            # return if the pie type is tnt (3).
            return

        self.splat = Actor("phase_3.5/models/props/splat-mod.bam",
                           {"chan": "phase_3.5/models/props/splat-chan.bam"})
        self.splat_sfx = audio3d.loadSfx(self.hitsounds[self.pie_type])
        audio3d.attachSoundToObject(self.splat_sfx, self.splat)
        self.splat_sfx.play()
        pietype2splatscale = {0: 0.6, 1: 0.5, 2: 0.35}
        self.splat.setScale(pietype2splatscale[self.pie_type])
        self.splat.reparentTo(render)
        self.splat.setBillboardPointEye()
        self.splat.setColor(self.splatcolors[self.pie_type])
        if self.pie and self.splat:
            self.splat.setPos(self.pie.getPos(render))
            self.splat.play("chan")

        if self.woosh:
            self.woosh.stop()
            self.woosh = None
        try:
            self.trajectory.pause()
        except:
            pass
        if self.pie:
            self.pie.removeNode()
            self.pie = None
        taskMgr.doMethodLater(0.5, self.delSplat, "delSplat")
        del pietype2splatscale

    def delSplat(self, task):
        if self.splat:
            self.splat.cleanup()
            self.splat = None
        return task.done
示例#5
0
class TTCHood:
    
    def __init__(self, cr):
        self.cr = cr
        self.dnaStore = DNAStorage()
        self.isLoaded = 0
        self.suitEffectEnabled = False
        self.amblight = None
        self.ambNode = None
        self.sky = None
        self.skyTrack = None
        self.skySeq = None
        self.lightTrack = None
        self.skyUtil = SkyUtil()
        
    def createHood(self, loadStorage = 1, AI = 0):
        if loadStorage:
            loadDNAFile(self.dnaStore, "phase_4/dna/storage.dna")
            loadDNAFile(self.dnaStore, "phase_4/dna/storage_TT.dna")
            loadDNAFile(self.dnaStore, "phase_4/dna/storage_TT_sz.dna")
            loadDNAFile(self.dnaStore, "phase_5/dna/storage_town.dna")
            loadDNAFile(self.dnaStore, "phase_5/dna/storage_TT_town.dna")
        self.node = loadDNAFile(self.dnaStore, "phase_4/dna/toontown_central_sz.dna")
        if self.node.getNumParents() == 1:
            self.geom = NodePath(self.node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('toontown_central')
        
        self.geom.find('**/hill').setTransparency(TransparencyAttrib.MBinary, 1)
        self.createSky("tt")
        base.hoodBGM = base.loadMusic("phase_4/audio/bgm/TC_nbrhood.ogg")
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        
        self.clerk_node = render.attach_new_node('clerk_node')
        self.clerk_node.set_pos(-80, -85.57, 0.5)
        self.clerk_node.set_h(165.07)
        
        self.geom.find('**/toontown_central').setCollideMask(BitMask32.allOff())
        self.geom.find('**/coll_sidewalk').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/collision_1').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_mainFoolr').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/left_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/right_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge_floor').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_r_stair').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stair_2').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stairend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_r_satirend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_plaza').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_hedges').node().setIntoCollideMask(CIGlobals.WallBitmask)
        
        self.coll_list = ['coll_sidewalk', 'collision_1', 'coll_mainFoolr', 'left_ear', 'right_ear', 'coll_bridge_floor', 'coll_bridge', 'coll_r_stair',
                        'coll_l_stair_2', 'coll_l_stairend_1', 'coll_r_stairend_1', 'coll_plaza', 'coll_hedges']
        self.geom.reparentTo(render)
        
        self.telescope = Actor(self.geom.find('**/*animated_prop_HQTelescopeAnimatedProp*'),
                            {"chan": "phase_3.5/models/props/HQ_telescope-chan.bam"}, copy=0)
        self.telescope.reparentTo(self.geom.find('**/*toon_landmark_hqTT*'))
        self.createLights(1, 1, 1)
        
        #if AI:
        #    self.createTrolley()
        
        taskMgr.add(self.telescopeTask, "telescopeTask")
        self.isLoaded = 1
        messenger.send("loadedHood")
        
    def createLights(self, r, g, b, startColor=1, fade=0):
        self.deleteLights()
        self.amblight = AmbientLight("amblight")
        self.amblight.setColor(VBase4(r, g, b, 1))
        self.ambNode = render.attachNewNode(self.amblight)
        render.setLight(self.ambNode)
        if fade:
            self.lightTrack = LerpFunc(self.setLightColor,
                                fromData=startColor,
                                toData=r,
                                duration=2.5,
                                blendType="easeInOut")
            self.lightTrack.start()
            self.skyTrack = LerpColorInterval(self.sky,
                                        color=VBase4(r + 0.4, g + 0.4, b + 0.4, 1.0),
                                        startColor=VBase4(startColor, startColor, startColor, 1.0),
                                        duration=1.5)
            self.skyTrack.start()
            sky = "tt"
            if r < 0.6:
                sky = "br"
            self.skySeq = Sequence(Wait(1.5), Func(self.createSky, sky))
            self.skySeq.start()
            
    def createSky(self, sky):
        self.deleteSky()
        skyPath = "phase_3.5/models/props/" + sky.upper() + "_sky.bam"
        self.sky = loader.loadModel(skyPath)
        self.sky.reparentTo(self.geom)
        self.sky.setPos(9.15527e-005, -1.90735e-006, 2.6226e-006)
        self.sky.setH(-90)
        if sky == "tt":
            self.skyUtil.startSky(self.sky)
            
    def deleteSky(self):
        self.skyUtil.stopSky()
        if self.sky:
            self.sky.removeNode()
            self.sky = None
        if self.lightTrack:
            self.lightTrack.pause()
            self.lightTrack = None
        if self.skyTrack:
            self.skyTrack.pause()
            self.skyTrack = None
        if self.skySeq:
            self.skySeq.pause()
            self.skySeq = None
            
    def setLightColor(self, color):
        self.amblight.setColor(VBase4(color, color, color, 1))
        
    def deleteLights(self):
        if self.ambNode:
            render.clearLight(self.ambNode)
            self.ambNode.removeNode()
            self.ambNode = None
        
    def telescopeTask(self, task):
        if not self.isLoaded:
            return task.done
        self.telescope.play("chan")
        task.delayTime = 12
        return task.again
        
    def enableSuitEffect(self, size):
        self.createLights(0.4, 0.4, 0.4, startColor=1, fade=1)
        
        self.fogNode = Fog("fog")
        self.fogNode.setColor(0.3, 0.3, 0.3)
        self.fogNode.setExpDensity(0.0025)
        render.setFog(self.fogNode)
        
        base.hoodBGM.stop()
        song = random.randint(1, 4)
        base.hoodBGM = base.loadMusic("phase_3.5/audio/bgm/encntr_general_bg.ogg")
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        
        self.suitEffectEnabled = True
        
    def bossSpawned(self):
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic("phase_7/audio/bgm/encntr_suit_winning_indoor.ogg")
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        Sequence(Wait(0.5), Func(base.hoodBGM.play)).start()
        
    def disableSuitEffect(self):
        self.createLights(1, 1, 1)
        self.createSky("tt")
        #render.clearFog()
        
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic("phase_4/audio/bgm/TC_nbrhood.ogg")
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        
        self.suitEffectEnabled = False
        
    def unloadHood(self):
        self.isLoaded = 0
        if self.suitEffectEnabled:
            self.disableSuitEffect()
        self.deleteSky()
        self.deleteLights()
        self.geom.remove()
        self.clerk_node.remove_node()
        base.hoodBGM.stop()
示例#6
0
class TTCHood:

    def __init__(self, cr):
        self.cr = cr
        self.dnaStore = DNAStorage()
        self.isLoaded = 0
        self.suitEffectEnabled = False
        self.amblight = None
        self.ambNode = None
        self.sky = None
        self.skyTrack = None
        self.skySeq = None
        self.lightTrack = None
        self.skyUtil = SkyUtil()
        return

    def createHood(self, loadStorage = 1, AI = 0):
        if loadStorage:
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage.dna')
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage_TT.dna')
            loadDNAFile(self.dnaStore, 'phase_4/dna/storage_TT_sz.dna')
            loadDNAFile(self.dnaStore, 'phase_5/dna/storage_town.dna')
            loadDNAFile(self.dnaStore, 'phase_5/dna/storage_TT_town.dna')
        self.node = loadDNAFile(self.dnaStore, 'phase_4/dna/toontown_central_sz.dna')
        if self.node.getNumParents() == 1:
            self.geom = NodePath(self.node.getParent(0))
            self.geom.reparentTo(hidden)
        else:
            self.geom = hidden.attachNewNode(self.node)
        gsg = base.win.getGsg()
        if gsg:
            self.geom.prepareScene(gsg)
        self.geom.setName('toontown_central')
        self.geom.find('**/hill').setTransparency(TransparencyAttrib.MBinary, 1)
        self.createSky('tt')
        base.hoodBGM = base.loadMusic('phase_4/audio/bgm/TC_nbrhood.ogg')
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        self.clerk_node = render.attach_new_node('clerk_node')
        self.clerk_node.set_pos(-80, -85.57, 0.5)
        self.clerk_node.set_h(165.07)
        self.geom.find('**/toontown_central').setCollideMask(BitMask32.allOff())
        self.geom.find('**/coll_sidewalk').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/collision_1').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_mainFoolr').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/left_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/right_ear').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge_floor').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_bridge').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.geom.find('**/coll_r_stair').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stair_2').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_l_stairend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_r_satirend_1').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_plaza').node().setIntoCollideMask(CIGlobals.FloorBitmask)
        self.geom.find('**/coll_hedges').node().setIntoCollideMask(CIGlobals.WallBitmask)
        self.coll_list = ['coll_sidewalk',
         'collision_1',
         'coll_mainFoolr',
         'left_ear',
         'right_ear',
         'coll_bridge_floor',
         'coll_bridge',
         'coll_r_stair',
         'coll_l_stair_2',
         'coll_l_stairend_1',
         'coll_r_stairend_1',
         'coll_plaza',
         'coll_hedges']
        self.geom.reparentTo(render)
        self.telescope = Actor(self.geom.find('**/*animated_prop_HQTelescopeAnimatedProp*'), {'chan': 'phase_3.5/models/props/HQ_telescope-chan.bam'}, copy=0)
        self.telescope.reparentTo(self.geom.find('**/*toon_landmark_hqTT*'))
        self.createLights(1, 1, 1)
        taskMgr.add(self.telescopeTask, 'telescopeTask')
        self.isLoaded = 1
        messenger.send('loadedHood')

    def createLights(self, r, g, b, startColor = 1, fade = 0):
        self.deleteLights()
        self.amblight = AmbientLight('amblight')
        self.amblight.setColor(VBase4(r, g, b, 1))
        self.ambNode = render.attachNewNode(self.amblight)
        render.setLight(self.ambNode)
        if fade:
            self.lightTrack = LerpFunc(self.setLightColor, fromData=startColor, toData=r, duration=2.5, blendType='easeInOut')
            self.lightTrack.start()
            self.skyTrack = LerpColorInterval(self.sky, color=VBase4(r + 0.4, g + 0.4, b + 0.4, 1.0), startColor=VBase4(startColor, startColor, startColor, 1.0), duration=1.5)
            self.skyTrack.start()
            sky = 'tt'
            if r < 0.6:
                sky = 'br'
            self.skySeq = Sequence(Wait(1.5), Func(self.createSky, sky))
            self.skySeq.start()

    def createSky(self, sky):
        self.deleteSky()
        skyPath = 'phase_3.5/models/props/' + sky.upper() + '_sky.bam'
        self.sky = loader.loadModel(skyPath)
        self.sky.reparentTo(self.geom)
        self.sky.setPos(9.15527e-05, -1.90735e-06, 2.6226e-06)
        self.sky.setH(-90)
        if sky == 'tt':
            self.skyUtil.startSky(self.sky)

    def deleteSky(self):
        self.skyUtil.stopSky()
        if self.sky:
            self.sky.removeNode()
            self.sky = None
        if self.lightTrack:
            self.lightTrack.pause()
            self.lightTrack = None
        if self.skyTrack:
            self.skyTrack.pause()
            self.skyTrack = None
        if self.skySeq:
            self.skySeq.pause()
            self.skySeq = None
        return

    def setLightColor(self, color):
        self.amblight.setColor(VBase4(color, color, color, 1))

    def deleteLights(self):
        if self.ambNode:
            render.clearLight(self.ambNode)
            self.ambNode.removeNode()
            self.ambNode = None
        return

    def telescopeTask(self, task):
        if not self.isLoaded:
            return task.done
        self.telescope.play('chan')
        task.delayTime = 12
        return task.again

    def createTrolley(self):
        self.trolley = TrolleyBase(self.cr)

    def enableSuitEffect(self, size):
        self.createLights(0.4, 0.4, 0.4, startColor=1, fade=1)
        self.fogNode = Fog('fog')
        self.fogNode.setColor(0.3, 0.3, 0.3)
        self.fogNode.setExpDensity(0.0025)
        render.setFog(self.fogNode)
        base.hoodBGM.stop()
        song = random.randint(1, 4)
        base.hoodBGM = base.loadMusic('phase_3.5/audio/bgm/encntr_general_bg.ogg')
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        self.suitEffectEnabled = True

    def bossSpawned(self):
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic('phase_7/audio/bgm/encntr_suit_winning_indoor.ogg')
        base.hoodBGM.setVolume(0.7)
        base.hoodBGM.setLoop(True)
        Sequence(Wait(0.5), Func(base.hoodBGM.play)).start()

    def disableSuitEffect(self):
        self.createLights(1, 1, 1)
        self.createSky('tt')
        base.hoodBGM.stop()
        base.hoodBGM = base.loadMusic('phase_4/audio/bgm/TC_nbrhood.ogg')
        base.hoodBGM.setVolume(0.25)
        base.hoodBGM.setLoop(True)
        base.hoodBGM.play()
        self.suitEffectEnabled = False

    def unloadHood(self):
        self.isLoaded = 0
        if self.suitEffectEnabled:
            self.disableSuitEffect()
        self.deleteSky()
        self.deleteLights()
        self.geom.remove()
        self.clerk_node.remove_node()
        base.hoodBGM.stop()