def loadAttack(self):
     self.phone = loader.loadModel('phase_3.5/models/props/phone.bam')
     self.phone.setHpr(0, 0, 180)
     if self.suit.type == 'B':
         self.phone.setPos(0.7, 0.15, 0)
     else:
         if self.suit.type == 'C':
             self.phone.setPos(0.25, 0, 0)
     self.receiver = loader.loadModel('phase_3.5/models/props/receiver.bam')
     self.receiver.reparentTo(self.phone)
     self.cord = Rope()
     self.cord.ropeNode.setUseVertexColor(1)
     self.cord.ropeNode.setUseVertexThickness(1)
     self.cord.setup(3, ({'node': self.phone, 'point': (0.8, 0, 0.2), 'color': (0, 0, 0, 1), 'thickness': 1000}, {'node': self.phone, 'point': (2, 0, 0), 'color': (0, 0, 0, 1), 'thickness': 1000}, {'node': self.receiver, 'point': (1.1, 0.25, 0.5), 'color': (0, 0, 0, 1), 'thickness': 1000}), [])
     self.cord.setH(180)
     self.phoneSfx = base.audio3d.loadSfx('phase_3.5/audio/sfx/SA_hangup.ogg')
     base.audio3d.attachSoundToObject(self.phoneSfx, self.phone)
     self.hangupSfx = base.audio3d.loadSfx('phase_3.5/audio/sfx/SA_hangup_place_down.ogg')
     base.audio3d.attachSoundToObject(self.hangupSfx, self.phone)
     collSphere = CollisionSphere(0, 0, 0, 2)
     collSphere.setTangible(0)
     collNode = CollisionNode('phone_shootout')
     collNode.addSolid(collSphere)
     collNode.setCollideMask(CIGlobals.WallBitmask)
     self.collNP = self.phone.attachNewNode(collNode)
 def loadModels(self):
     self.playArea = loader.loadModel('phase_13/models/parties/partyTugOfWar')
     self.playArea.reparentTo(self.root)
     self.sign.reparentTo(self.playArea.find('**/TugOfWar_sign_locator'))
     self.dockPositions = [
         [],
         []]
     for i in range(4):
         self.dockPositions[0].append(Point3(-(PartyGlobals.TugOfWarInitialToonPositionsXOffset) - PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ))
     
     for i in range(4):
         self.dockPositions[1].append(Point3(PartyGlobals.TugOfWarInitialToonPositionsXOffset + PartyGlobals.TugOfWarToonPositionXSeparation * i, 0.0, PartyGlobals.TugOfWarToonPositionZ))
     
     self.hopOffPositions = [
         [],
         []]
     for i in range(1, 5):
         self.hopOffPositions[PartyGlobals.TeamActivityTeams.LeftTeam].append(self.playArea.find('**/leftTeamHopOff%d_locator' % i).getPos())
         self.hopOffPositions[PartyGlobals.TeamActivityTeams.RightTeam].append(self.playArea.find('**/rightTeamHopOff%d_locator' % i).getPos())
     
     for i in range(1, 5):
         pos = self.playArea.find('**/fallenToon%d_locator' % i).getPos()
         self.fallenPositions.append(pos)
     
     self.joinCollision = []
     self.joinCollisionNodePaths = []
     for i in range(len(PartyGlobals.TeamActivityTeams)):
         collShape = CollisionTube(PartyGlobals.TugOfWarJoinCollisionEndPoints[0], PartyGlobals.TugOfWarJoinCollisionEndPoints[1], PartyGlobals.TugOfWarJoinCollisionRadius)
         collShape.setTangible(True)
         self.joinCollision.append(CollisionNode('TugOfWarJoinCollision%d' % i))
         self.joinCollision[i].addSolid(collShape)
         tubeNp = self.playArea.attachNewNode(self.joinCollision[i])
         tubeNp.node().setCollideMask(ToontownGlobals.WallBitmask)
         self.joinCollisionNodePaths.append(tubeNp)
         self.joinCollisionNodePaths[i].setPos(PartyGlobals.TugOfWarJoinCollisionPositions[i])
     
     self._DistributedPartyTugOfWarActivity__enableCollisions()
     ropeModel = loader.loadModel('phase_4/models/minigames/tug_of_war_rope')
     self.ropeTexture = ropeModel.findTexture('*')
     ropeModel.removeNode()
     for i in range(PartyGlobals.TugOfWarMaximumPlayersPerTeam * 2 - 1):
         rope = Rope(self.uniqueName('TugRope%d' % i))
         if rope.showRope:
             rope.ropeNode.setRenderMode(RopeNode.RMBillboard)
             rope.ropeNode.setThickness(0.20000000000000001)
             rope.setTexture(self.ropeTexture)
             rope.ropeNode.setUvMode(RopeNode.UVDistance)
             rope.ropeNode.setUvDirection(1)
             rope.setTransparency(1)
             rope.setColor(0.89000000000000001, 0.89000000000000001, 0.59999999999999998, 1.0)
             rope.reparentTo(self.root)
             rope.stash()
         
         self.tugRopes.append(rope)
     
     self.splash = Splash.Splash(self.root)
     self.splash.setScale(2.0, 4.0, 1.0)
     pos = self.fallenPositions[0]
     self.splash.setPos(pos[0], pos[1], PartyGlobals.TugOfWarSplashZOffset)
     self.splash.hide()
Example #3
0
    def setup(self):
        # Setting the background to 'water'
        # .self refers back to class(linking it) ensuring it's not just global
        self.showbaseMain.setBackgroundColor((0, 0, 0, 1))
        self.bg = self.showbaseMain.loadObject("water.jpg",
                                               scale=146,
                                               depth=200,
                                               transparency=False)

        # creating & positioning the green buoy
        self.gbuoy = self.showbaseMain.loadObject("Green_buoy.png",
                                                  scale=4,
                                                  depth=50)
        self.gbuoy.setPos(-7, 50, 7)

        # Second green buoy
        self.sgbuoy = self.showbaseMain.loadObject("Green_buoy.png",
                                                   scale=4,
                                                   depth=50)
        self.sgbuoy.setPos(9, 50, 3)

        # creating & positioning the red buoy
        self.rbuoy = self.showbaseMain.loadObject("Red_buoy.png",
                                                  scale=4,
                                                  depth=50)
        self.rbuoy.setPos(2.5, 50, -6)

        # Importing land
        self.sland = self.showbaseMain.loadObject("land.png",
                                                  scale=16,
                                                  depth=50)
        self.sland.setPos(3, 50, 9)
        self.sland.setR(180)

        self.land = self.showbaseMain.loadObject("land.png",
                                                 scale=16,
                                                 depth=50)
        self.land.setPos(-5, 50, -9)

        self.Finflag = self.showbaseMain.loadObject("Finflag.png",
                                                    scale=4,
                                                    depth=50)
        self.Finflag.setPos(15, 50, -10)

        # the 'rope' is the white line that is the
        # sailing course the user must follow
        r = Rope()
        r.setup(4, [(None, (-18, 0, 0)), (None, (-8, 0, -20)),
                    (None, (-15, 0, 15)), (None, (0, 0, 10)),
                    (None, (0, 0, -25)), (None, (10, 0, 10)),
                    (None, (10, 0, 10)), (None, (15, 0, -10))])
        r.ropeNode.setThickness(10)
        r.setPos(0, 55, 0)
        r.reparentTo(camera)

        self.curve = r.ropeNode.getCurve()
        self.curvePoints = r.getPoints(50)
        print(self.curvePoints)
Example #4
0
 def _smooth_path(self, path, smooth_factor=0.5):
     if len(path)<4 or smooth_factor <0.01:
         return path
     r=Rope()
     verts=[(None, point) for point in path]
     r.setup(order=4, verts=verts, knots = None)
     #r.ropeNode.setThickness(2.0)
     #r.reparentTo(render)
     #r.setColor(1,0,1, 1)
     #r.setZ(0.5)
     return r.getPoints(int(len(path)*smooth_factor))
Example #5
0
 def getRope(self, thickness=0.14999999999999999):
     rope = Rope()
     rope.ropeNode.setRenderMode(RopeNode.RMTube)
     rope.ropeNode.setNumSlices(10)
     rope.ropeNode.setUvMode(RopeNode.UVDistance)
     rope.ropeNode.setUvDirection(1)
     rope.ropeNode.setUvScale(0.25)
     rope.ropeNode.setThickness(thickness)
     ropePile = loader.loadModel('models/char/rope_high')
     ropeTex = ropePile.findTexture('rope_single_omit')
     ropePile.removeNode()
     rope.setTexture(ropeTex)
     rope.setLightOff()
     rope.setColorScale(0.5, 0.5, 0.5, 1)
     return rope
    def announceGenerate(self):
        DistributedNode.announceGenerate(self)
        self.kart = loader.loadModel('phase_6/models/karting/Kart3_Final.bam')
        self.kart.find('**/decals').removeNode()
        self.kart.reparentTo(self)
        self.pod = loader.loadModel('phase_4/models/minigames/pods_truck.egg')
        self.pod.reparentTo(self)
        self.pod.setScale(0.2)
        self.pod.setY(8.5)
        self.pod.setH(180)
        self.pod.find('**/metal_ramp').setBin('ground', 18)
        self.pod.find('**/metal_ramp_coll').setCollideMask(
            CIGlobals.FloorBitmask)
        self.rope = Rope()
        self.rope.ropeNode.setUseVertexColor(1)
        self.rope.setup(3, ({
            'node': self.kart,
            'point': (0, 1.5, 0.7),
            'color': (0, 0, 0, 1),
            'thickness': 1000
        }, {
            'node': self.kart,
            'point': (0, 1.5, 0.7),
            'color': (0, 0, 0, 1),
            'thickness': 1000
        }, {
            'node': self.pod,
            'point': (0, 31, 5),
            'color': (0, 0, 0, 1),
            'thickness': 1000
        }), [])
        self.rope.setH(180)
        self.rope.reparentTo(self)
        sphere = CollisionSphere(0, 0, 0, 2)
        sphere.setTangible(0)
        node = CollisionNode(self.uniqueName('truck_trigger'))
        node.addSolid(sphere)
        node.setCollideMask(CIGlobals.WallBitmask)
        self.triggerNP = self.attachNewNode(node)
        self.triggerNP.setPos(0, 8.0, 2.0)
        self.setScale(2.0)

        self.accept('enter' + self.triggerNP.node().getName(),
                    self.__handleTruckTrigger)
Example #7
0
    def loadModels(self):
        # load the tug of war play area
        self.playArea = loader.loadModel(
            "phase_13/models/parties/partyTugOfWar")
        # reparent to the party ground root
        self.playArea.reparentTo(self.root)

        # place the activity sign
        self.sign.reparentTo(self.playArea.find("**/TugOfWar_sign_locator"))

        # define initial positions, with index 0 being closest to the other team
        self.dockPositions = [
            [],  # left team positions
            [],  # right team positions
        ]
        for i in range(4):
            self.dockPositions[0].append(
                Point3(
                    -PartyGlobals.TugOfWarInitialToonPositionsXOffset -
                    PartyGlobals.TugOfWarToonPositionXSeparation * i,
                    0.0,
                    PartyGlobals.TugOfWarToonPositionZ,
                ))
        for i in range(4):
            self.dockPositions[1].append(
                Point3(
                    PartyGlobals.TugOfWarInitialToonPositionsXOffset +
                    PartyGlobals.TugOfWarToonPositionXSeparation * i,
                    0.0,
                    PartyGlobals.TugOfWarToonPositionZ,
                ))
        self.hopOffPositions = [
            [],  # left team positions
            [],  # right team positions
        ]
        for i in range(1, 5):
            self.hopOffPositions[
                PartyGlobals.TeamActivityTeams.LeftTeam].append(
                    self.playArea.find("**/leftTeamHopOff%d_locator" %
                                       i).getPos())
            self.hopOffPositions[
                PartyGlobals.TeamActivityTeams.RightTeam].append(
                    self.playArea.find("**/rightTeamHopOff%d_locator" %
                                       i).getPos())

        # load positions for when toons fall into the water
        for i in range(1, 5):
            pos = self.playArea.find("**/fallenToon%d_locator" % i).getPos()
            self.fallenPositions.append(pos)

        # load collision that allows toons to play the game
        # create one for each dock that lets toons join a particular team
        self.joinCollision = []
        self.joinCollisionNodePaths = []
        for i in range(len(PartyGlobals.TeamActivityTeams)):
            collShape = CollisionTube(
                PartyGlobals.TugOfWarJoinCollisionEndPoints[0],
                PartyGlobals.TugOfWarJoinCollisionEndPoints[1],
                PartyGlobals.TugOfWarJoinCollisionRadius)
            collShape.setTangible(True)

            self.joinCollision.append(
                CollisionNode("TugOfWarJoinCollision%d" % i))
            self.joinCollision[i].addSolid(collShape)
            tubeNp = self.playArea.attachNewNode(self.joinCollision[i])
            tubeNp.node().setCollideMask(ToontownGlobals.WallBitmask)
            self.joinCollisionNodePaths.append(tubeNp)
            self.joinCollisionNodePaths[i].setPos(
                PartyGlobals.TugOfWarJoinCollisionPositions[i])
        self.__enableCollisions()

        # Get the rope texture by extracting it from its model.
        ropeModel = loader.loadModel(
            "phase_4/models/minigames/tug_of_war_rope")
        self.ropeTexture = ropeModel.findTexture("*")
        ropeModel.removeNode()

        # create as many ropes as we will ever need
        for i in range(PartyGlobals.TugOfWarMaximumPlayersPerTeam * 2 - 1):
            rope = Rope(self.uniqueName("TugRope%d" % i))
            if rope.showRope:
                rope.ropeNode.setRenderMode(RopeNode.RMBillboard)
                rope.ropeNode.setThickness(0.2)
                rope.setTexture(self.ropeTexture)
                rope.ropeNode.setUvMode(RopeNode.UVDistance)
                rope.ropeNode.setUvDirection(1)
                rope.setTransparency(1)
                rope.setColor(0.89, 0.89, 0.6, 1.0)
                rope.reparentTo(self.root)
                rope.stash()
            self.tugRopes.append(rope)

        # Splash object for when toon hits the water
        self.splash = Splash.Splash(self.root)
        self.splash.setScale(2.0, 4.0, 1.0)
        pos = self.fallenPositions[0]
        self.splash.setPos(pos[0], pos[1], PartyGlobals.TugOfWarSplashZOffset)
        self.splash.hide()
Example #8
0
 def ropeUpdate(self, curve):
     self.currentRope = Rope()
     self.currentRope.setup(self.degree, curve)
     self.currentRope.reparentTo(render)
Example #9
0
    def __init__(self, golog, simplex, **kwargs):
        self.simplex = simplex
        self.golog = golog
        self.messenger = self.golog.base.messenger
        self.listener = DirectObject(
        )  # might let Graphics_Data Inherit from Direct_Object
        self.graphics_kwargs = dict(
        )  # keeping track of information needed to re-create graphics_data

        #things to clean self for deletion:
        self.node_list = []
        self.listeners = [self.listener]

        if simplex.level == 0:
            self.NP = golog.render.attachNewNode(simplex.label)
            self.node_list.append(self.NP)
            self.NP.setTag(
                'level',
                '0')  # to tell mode_heads what type of simplex this is
            golog.sphere.instanceTo(self.NP)
            self.collision = self.NP.attachNewNode(
                CollisionNode('sphereColNode'))
            self.collision.node().addSolid(CollisionSphere(0, 0, 0, 1))
            self.messenger_names = {'node': str(id(self.NP))}

            #detail parents
            self.parents = (
            )  #need to give no parents for a unified update function

            self.parent_pos_convolution = lambda *x: golog.render.getPos(
            )  # function of parent's [node] positions to detail offset (0-simlex it's just render location)
            #listener for parental updates, pass arguemnts through extraKwargs to detail what kind of update to perform
            for parent in self.parents:
                self.listener.accept(self.parents.messenger_names['node'],
                                     self.update)

            #set position
            if 'pos' in kwargs.keys(): self.update({'pos': kwargs['pos']})
            else: self.update({'pos': LPoint3f(0, 0, 0)})

        elif simplex.level == 1:
            self.NP = golog.render.attachNewNode(simplex.label)
            self.node_list.append(self.NP)
            self.NP.setTag('level', '1')
            self.golog.cone.instanceTo(self.NP)
            self.collision = self.NP.attachNewNode(
                CollisionNode('coneColNode'))
            self.collision.node().addSolid(CollisionSphere(0, 0, 0, 1))
            self.messenger_names = {'node': str(id(simplex))}
            self.graphics = (Rope(), Rope())  #two ropes :)
            for rope in self.graphics:
                self.node_list.append(rope)

            #set up parents
            self.parents = tuple(golog.Simplex_to_Graphics[face]
                                 for face in self.simplex.faces)

            def tuple_avg(tuples):
                b = LPoint3f(0, 0, 0)
                for a in tuples:
                    b = b + a
                return b / len(tuples)

            self.parent_pos_convolution = lambda *x: tuple_avg(
                tuple(parent.NP.getPos() for parent in self.parents))
            for parent in self.parents:
                self.listener.accept(parent.messenger_names['node'],
                                     self.update)

            if 'pos' in kwargs.keys():
                if isinstance(kwargs['pos'], tuple):
                    pos = LPoint3f(*kwargs['pos'])
                else:
                    pos = kwargs['pos']
            else:
                pos = LPoint3f(0, 0, 0)
            self.graphics_kwargs['pos'] = pos

            #create shitty control nodes for rope module (I know, this is not pretty)
            self.control_nodes = (
                self.golog.render.attachNewNode(simplex.label +
                                                '_control_node0'),
                self.golog.render.attachNewNode(simplex.label +
                                                '_control_node1'))
            for node in self.control_nodes:
                self.node_list.append(node)
            control_listener = DirectObject()
            self.listeners.append(control_listener)

            def control_updator(*x):
                for i in [0, 1]:
                    self.control_nodes[i].setPos(self.graphics_kwargs['pos'] +
                                                 self.parents[i].NP.getPos())

            control_updator()
            control_listener.accept(self.messenger_names['node'],
                                    control_updator)

            self.update({'pos': None})

            #set up rope graphics
            self.graphics[0].setup(3, [(self.NP, (0, 0, 0)),
                                       (self.control_nodes[0], (0, 0, 0)),
                                       (self.parents[0].NP, (0, 0, 0))])
            self.graphics[1].setup(3, [(self.parents[1].NP, (0, 0, 0)),
                                       (self.control_nodes[1], (0, 0, 0)),
                                       (self.NP, (0, 0, 0))])
            for rope in self.graphics:
                rope.reparentTo(golog.render)

        #set up dictionary references
        self.golog.Simplex_to_Graphics[simplex] = self
        self.golog.Graphics_to_Simplex[self] = simplex
        self.golog.NP_to_Graphics[self.NP] = self
        #create an invisible textNode that can be shown if called
        text = TextNode(self.simplex.label + '_text_node')
        #? make this wrap if too long
        text.setText(self.simplex.label)
        text.setCardDecal(True)
        text.setCardColor(.5, 1, .5, 1)
        text.setCardAsMargin(0, 0, 0, 0)
        text.setTextColor(0, 0, 0, 1)
        self.textNP = self.NP.attachNewNode(text)
        #? make this update to always be in front of camera
        # - Either get it into 2d plane, or make a z axis that always faces the camera and attach to that
        self.textNP.setPos(0, -1, 0)
        self.textNP.show()
        self.node_list.append(self.textNP)