Exemple #1
0
class ScreenDecorationManager:
    def __init__(self):
        self.tex_judgements = {}
        
        for i in ["PERFECT","GOOD","OK","BAD","MISS"]:
            self.tex_judgements[i] = loader.loadTexture("image/j_%s.png" % i.lower())
        
        ## Judgement message
        self.image_judgement = OnscreenImage(image=self.tex_judgements["OK"],pos=(0, 0, 0), scale=(256.0/base.win.getXSize(),1,32.0/base.win.getYSize()), parent=render2d)
        self.image_judgement.setTransparency(TransparencyAttrib.MAlpha)
        #self.image_judgement.setPos(-0.7, 1, 0.6)
        self.image_judgement.setAlphaScale(0)
        
        interval_pos = LerpPosInterval(self.image_judgement, duration=0.1, startPos=VBase3(-1.2, 1, 0.5), pos=VBase3(-0.7, 1, 0.5), blendType='easeOut')
        interval_alpha = LerpFunc(self.image_judgement.setAlphaScale, duration=0.1, blendType='easeOut')
        interval_fade = LerpFunc(self.image_judgement.setAlphaScale, fromData=1, toData=0, duration=1.0, blendType='easeOut')
        
        self.judgement_enters = Sequence(Parallel(interval_pos, interval_alpha), Wait(1.0), interval_fade)

        ## Chain message
        text_node = TextNode('chain_msg')
        text_node.setAlign(TextNode.ACenter)
        text_node.setFont(babelfish_font)

        text_node.setTextColor(1, 1, 0.16, .9)
        text_node.setShadow(0.05, 0.05)
        text_node.setShadowColor(0.05, 0, 0.43, .9)
        
        self.chain_msg = aspect2d.attachNewNode(text_node)
        self.chain_msg.setPos(-.9, 1, 0.35)
        self.chain_msg.setScale(0.11)
        
        
    def judgement_msg(self, msg, chain):
        if self.judgement_enters.isPlaying():
            self.judgement_enters.clearToInitial()
        
        self.image_judgement.setTexture(self.tex_judgements[msg])
        self.judgement_enters.start()
        
        if chain > 1:
            self.chain_msg.node().setText("%d CHAIN" % chain)
        
        taskMgr.add(self.task_ClearJudgementTask, "clear-judgement")
        
    def task_ClearJudgementTask(self, task):
        if task.time < 1.5:
            return Task.cont
            
        self.chain_msg.node().clearText()
    
    def __del__(self):
        self.judgement_enters.finish()
        self.image_judgement.destroy()
        self.chain_msg.removeNode()
Exemple #2
0
class Minimap(object):
    def __init__(self, lrtb, track_img, handle_img, col_dct, cars, player_car):
        self.lrtb = lrtb
        self.minimap = OnscreenImage(track_img,
                                     pos=(-.25, 1, .25),
                                     scale=.2,
                                     parent=eng.base.a2dBottomRight)
        self.minimap.setTransparency(True)
        self.minimap.setAlphaScale(.64)
        self.car_handles = {}
        cars = cars[:]
        cars.remove(player_car)
        cars += [player_car]
        for car_name in cars:
            scale = .015 if car_name == player_car else .01
            self.car_handles[car_name] = OnscreenImage(
                handle_img,
                pos=(-.25, 1, .25),
                scale=scale,
                parent=eng.base.a2dBottomRight)
            col = col_dct[car_name]
            self.car_handles[car_name].set_color_scale(col)
        map(lambda car: car.setTransparency(True), self.car_handles.values())
        self.width = self.minimap.getScale()[0] * 2.0
        self.height = self.minimap.getScale()[2] * 2.0
        center_x, center_y = self.minimap.getX(), self.minimap.getZ()
        self.left_img = center_x - self.width / 2.0
        self.bottom_img = center_y - self.height / 2.0

    def update(self, car_info):
        left, right, top, bottom = self.lrtb
        for car_i in car_info:
            car_name, car_pos = car_i
            pos_x_norm = (car_pos.getX() - left) / (right - left)
            pos_y_norm = (car_pos.getY() - bottom) / (top - bottom)
            pos_x = self.left_img + pos_x_norm * self.width
            pos_y = self.bottom_img + pos_y_norm * self.height
            self.car_handles[car_name].set_pos(pos_x, 1, pos_y)

    def destroy(self):
        des = lambda wdg: wdg.destroy()
        map(des, [self.minimap] + self.car_handles.values())
Exemple #3
0
class IntroScene(Scene):
	'''
	A subclass of the Scene class to handle the main menu
	and all of it's required tasks + events
	'''
	def __init__(self, app):
		'''
		Initialise and run any events BEFORE loading the scene
		'''
		self.app = app
		self.isPlayerControlled = False
		self.models = {}
		self.loader = app.loader
		self.renderTree = deepcopy(app.emptyRenderTree)

		# Add the ground model
		self.addObject("ground.bam", scale=(3.6,3.6,2), key="ground")

		# Add the barn
		barnModel = self.addObject("barn.bam", scale=(1, 1, 1))

		# Create a corn model and add it in the bottom corner
		self.addObject("corn.egg", pos=(-62, -62, 0), scale=(1, 1, 1.3), key="corn")

		# Iterate a 25x25 square for the corn
		for x in range(25):
			for z in range(25):
				# Use basic maths to create a 'lollypop' shape cutout
				if (x-12)**2+(z-12)**2 > 25 and (abs(x-12) > 1 or z > 12):
					# Add a corn instance to the scene
					self.addObject("corn.egg", (x*5, z*5, 0), instanceTo="corn")

		# Add the AI World
		self.AIworld = AIWorld(self.renderTree)

		# Add generic linear fog on super-low quality mode
		if app.quality == 'super-low':
			fog = Fog("corn_fog")
			# Set the fog colour
			fog.setColor(0.8,0.8, 0.8)
			# Set the density of the fog
			fog.setExpDensity(0.005)
			# Add the fog to the scene
			self.renderTree.setFog(fog)
			# Set the scene's background colour
			base.setBackgroundColor(0.635, 0.454, 0.494)
			# Create an empty ambient light
			alight = AmbientLight('alight')
			# Set the colour
			alight.setColor(VBase4(0.2, 0.2, 0.2, 0.2))
			# Attach the node to the render tree
			alnp = render.attachNewNode(alight)
			# Set the light to illuminate the scene
			render.setLight(alnp)

		# Add the two chickens and set the maximum velocity (force) on them
		self.chickenOne = Chicken(self, (20, -50, 0))
		self.chickenOne.aiChar.setMaxForce(70)
		self.chickenTwo = Chicken(self, (-20, -40, 0))
		self.chickenTwo.aiChar.setMaxForce(70)

		# Add them to the AI World
		self.AIworld.addAiChar(self.chickenOne.aiChar)
		self.AIworld.addAiChar(self.chickenTwo.aiChar)

		# Enable the pursue behaviour
		self.chickenOne.aiBehaviour.pursue(self.app.camera)
		self.chickenTwo.aiBehaviour.pursue(self.app.camera)

	def eventRun(self, task):
		'''
		Run any constant events for the scene
		'''
		# If the movement controller has finished its path then
		if self.app.controller and self.app.controller.clock_obj.get_frame_time() > self.app.controller.curve_time_end:
			# delete the motion controller
			self.app.controller = None
			# Load the first scene of the gameplay
			self.app.sceneMgr.loadScene(SceneOne(self.app))
		# Update the AI world
		self.AIworld.update()
		return Task.cont

	def initScene(self):
		'''
		Set up the movement controller and begin the motion path.
		'''
		# Make the motion path
		motionPath = (
			(Vec3(0, -63, 4), Vec3(0, 0, 0)),
			(Vec3(0, -63, 4), Vec3(0, 0, 0)),
			(Vec3(0, -63, 4), Vec3(0, 0, 0)),
			(Vec3(0, -56, 4), Vec3(-90, -10, 0)),
			(Vec3(0, -52, 4), Vec3(0, -70, 0)),
			(Vec3(0, -46, 4), Vec3(90, 0, 20)),
			(Vec3(0, -40, 4), Vec3(0, 0, 0)),
			(Vec3(0, -30, 4), Vec3(0, 0, 0)),
			(Vec3(0, -20, 4), Vec3(0, 0, 0)),
			(Vec3(5, -10, 4), Vec3(-40, 0, -5)),
			(Vec3(5, -9, 4), Vec3(-190, 0, 0)),
			(Vec3(5, -4, 4), Vec3(-190, 0, -5)),
			(Vec3(4, 0, 0.5), Vec3(-190, 80, 0))
			)
		# Create the controller for movement
		self.app.controller = MovementController(self.app)
		# Set the initial position
		self.app.controller.set_initial_position(Vec3(0, -63, 4), Vec3(0, 0, 0))
		# Run the setup on the movement controller
		self.app.controller.update_task = self.app.addTask(nullTask, 'meh')
		# Play the pre-defined motion path
		self.app.controller.play_motion_path(motionPath, 0.8)
		# Remove the player movement controls
		self.app.taskMgr.remove(self.app.controller.update_task)

		# Unhide the 2d overlay.
		self.app.aspect2d.show()
		self.app.render2d.show()

		# set up the black image
		self.fadeQuad = OnscreenImage(image='resources/generic/fade.png',pos=(-0.5, 0, 0), scale=(2, 1, 1))
		self.fadeQuad.setTransparency(TransparencyAttrib.MAlpha)

		# Add the fadein transition
		self.app.taskMgr.add(self.fadeIn, 'fade-task')

	def fadeIn(self, task):
		'''
		Fade in the scene by fading a black rectangle
		'''
		# If more than 4 seconds have passed then finish the task
		if task.time > 4:
			self.fadeQuad.destroy()
			return
		# Get the alpha of the square
		alpha = task.time / 4
		# set the alpha level on the rectangle
		self.fadeQuad.setAlphaScale(1-alpha)
		return Task.cont
Exemple #4
0
class RightMenu:
    """
    Add comment.
    """
    def __init__(self):

        self.visible_x_np = None
        self.visible_y_np = None
        self.visible_z_np = None

        self.filter_label_np = None
        self.dims_parent_np = None

        # Dictionary for the tagset/dims
        self.dimensionCards = {}

        # Member variable for dimension/filter context menu.
        self.selected_tagset_id = None
        self.selected_hierarchy_id = None
        self.selected_filter_id = None

        # Create nodepath for the menu.
        self.right_menu_node_path = camera.attachNewNode(
            'right_menu_node_path')
        self.right_menu_node_path.setY(3)

        # Flag for right menu visability.
        self.is_visable = True

        # Create background for the menu.
        self.bg = OnscreenImage(image='static/images/box.tif')
        self.bg.setTransparency(TransparencyAttrib.MAlpha)
        self.bg.setAlphaScale(0.24)
        self.bg.setScale(1, 2, 2)

        # start the placement task for menu placement.
        base.taskMgr.add(self.__placement, 'menuplacement_left_panel')

        # Collections of cards. Used for card highlighting.
        self.cards = dict()

        # How many dimensions should we show in the dimension list?
        self.max_dimension_visable_in_menu = 10

        # Member variable for the dimensions scrollbar if needed.
        self.dimension_scrollbar = None

        # Create all the objects for this menu.
        self.__initalize_objects()
        self.__createTagsetAndHierarchyLabels()
        self.__register_view_menu_messages()

        # Create instance of filter menu.
        self.filter_menu = FilterMenu(np=self.right_menu_node_path,
                                      begin_pos=self.last_dim_pos)

        # Events that we are interested in.
        base.accept(CUBE_MENU_RELOAD_FILTERS, self.reload_filter2)
        base.accept(TAGSET_BTN_CLICK, self.btn_dimensions)
        base.accept(HIERARCHY_BTN_CLICK, self.btn_hierarchy)
        base.accept(SEARCH_BTN_CLICK, self.btn_search)
        base.accept(FILTER_BTN_CLICK, self.btn_filters)
        base.accept(CUBE_MENU_OVERVIEW_X_BUTTON_CLICK, self.btn_x_view)
        base.accept(CUBE_MENU_OVERVIEW_Y_BUTTON_CLICK, self.btn_y_view)
        base.accept(CUBE_MENU_OVERVIEW_Z_BUTTON_CLICK, self.btn_z_view)
        base.accept(CUBE_MENU_RELOAD_DIMENSIONS, self.reloadDimensionLabels)

    def reloadDimensionLabels(self):
        """
        Function for reloading the tagset/hir list.
        This function is called when tagset/hir is changed
        or new are added.
        """
        self.__createTagsetAndHierarchyLabels()
        #self.reload()

    def __createTagsetAndHierarchyLabels(self):
        if self.dims_parent_np is not None:
            self.dims_parent_np.remove()

        if self.dimension_scrollbar is not None:
            self.dimension_scrollbar.remove()

        # Create labels for each tagset and hirs.
        card_pos = -1.1
        index = 0

        # List that contains the dimension cards. Used for scrolling the cards.
        self.dimension_list = []

        #self.cards = dict()

        self.dims_parent_np = self.right_menu_node_path.attachNewNode(
            'parent_dim_np')

        for tagset in photocube.objectcube.objectCubeService.getAllTagsets():
            if (tagset.typeId == 1 or tagset.typeId == 5) and (
                    tagset.name[:5] != 'Rank:' and tagset.name[:5] != 'Dist:'
            ):  #FOR MASTER PRESENTATION, NOT SHOWING SEARCH DIMENSION
                #print 'tagset.name: ' + tagset.name + 'tagset.typeId: ' + str(tagset.typeId)
                dim_np = self.dims_parent_np.attachNewNode('dim;tagset;' +
                                                           str(tagset.id))

                # Create a card to make the dimension clickable
                card_np = dim_np.attachNewNode('card-tagset-' + tagset.name)
                card_np = card_np.attachNewNode('card-x-label-np')
                card_np.setPos(1, 1.5, 1.5)
                cm = CardMaker('card')
                card = card_np.attachNewNode(cm.generate())
                card.setScale(0.50, 1, 0.050)
                card.setPos(-2.045, -1.3, card_pos)
                card.setTwoSided(True)
                card.setColor(0, 0, 0)

                # Make the tagset cards clickable.
                base.accept(
                    photocube.devices.mouse_handler.makeNPPickableRight(
                        dim_np), self.on_tagset_right_click)
                base.accept(
                    photocube.devices.mouse_handler.makeNPPickableLeft(dim_np),
                    self.on_tagset_right_click)

                # Create a new node for the text label.
                t_node = card.attachNewNode('card-label' + tagset.name)
                t_node.setY(-0.001)
                t_node.setZ(1.35)
                t_node.setX(0.03)

                t = OnscreenText(text=tagset.name[0:43] + ' (tagset)',
                                 fg=(1, 1, 1, 1),
                                 parent=t_node,
                                 pos=(0, -1, -4),
                                 scale=(0.075, 0.73),
                                 align=TextNode.ALeft)

                # Make the dim button mouse over enabled.
                if dim_np.__str__() not in self.cards.keys():
                    self.cards[dim_np.__str__()] = card

                self.dimension_list.append(dim_np)
                messageHover, messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable(
                    dim_np)

                # When created, the menu is hided.
                dim_np.hide()

                # Accept the hover messages.
                base.accept(messageLeave, self.mouse_leave)
                base.accept(messageHover, self.mouse_over)
            """
            dim_np = self.dims_parent_np.attachNewNode('dim;tagset;' + str(tagset.id))
          
            # Create a card to make the dimension clickable
            card_np = dim_np.attachNewNode('card-tagset-'+ tagset.name)
            card_np = card_np.attachNewNode('card-x-label-np')
            card_np.setPos(1,1.5,1.5)
            cm = CardMaker('card')
            card = card_np.attachNewNode(cm.generate())
            card.setScale(0.50, 1, 0.050)
            card.setPos(-2.045, -1.3, card_pos)
            card.setTwoSided(True)
            card.setColor(0,0,0)
            
            # Make the tagset cards clickable.
            base.accept(photocube.devices.mouse_handler.makeNPPickableRight(dim_np), self.on_tagset_right_click)
            base.accept(photocube.devices.mouse_handler.makeNPPickableLeft(dim_np), self.on_tagset_right_click)
            
            # Create a new node for the text label.
            t_node = card.attachNewNode( 'card-label' + tagset.name )
            t_node.setY(-0.001)
            t_node.setZ(1.35)
            t_node.setX(0.03)
            
            t = OnscreenText(text=tagset.name[0:43] + ' (tagset)', fg=(1,1,1,1), parent=t_node, pos=(0, -1, -4), scale=(0.075, 0.73), align=TextNode.ALeft)

            # Make the dim button mouse over enabled.
            if dim_np.__str__() not in self.cards.keys():
                self.cards[ dim_np.__str__() ] = card
            
            self.dimension_list.append( dim_np )
            messageHover,messageLeave  = photocube.devices.mouse_handler.makeNPMouseHoverable( dim_np )

            
            # When created, the menu is hided.
            dim_np.hide()
            
            # Accept the hover messages.
            base.accept(messageLeave, self.mouse_leave)
            base.accept(messageHover, self.mouse_over)
            """
            # show the hir
            if tagset.name[:5] != 'Rank:' and tagset.name[:5] != 'Dist:':  #FOR MASTER PRESENTATION, NOT SHOWING SEARCH DIMENSION
                for hir in tagset.getPersistentDimensions():

                    hir_np = self.dims_parent_np.attachNewNode('dim;hir;' +
                                                               tagset.name +
                                                               ';' +
                                                               str(hir.id) +
                                                               ';' +
                                                               str(tagset.id))

                    # Create a card to make the dimension clickable
                    card_np = hir_np.attachNewNode('card-tagset-' +
                                                   tagset.name)
                    card_np = card_np.attachNewNode('card-x-label-np')
                    card_np.setPos(1, 1.5, 1.5)
                    cm = CardMaker('card-hir')
                    card = card_np.attachNewNode(cm.generate())
                    card.setScale(0.50, 1, 0.050)
                    card.setPos(-2.045, -1.3, card_pos)
                    card.setTwoSided(True)
                    card.setColor(0, 0, 0)

                    # Make the hierachy card clickable.
                    base.accept(
                        photocube.devices.mouse_handler.makeNPPickableRight(
                            hir_np), self.on_hierarchy_right_click)
                    base.accept(
                        photocube.devices.mouse_handler.makeNPPickableLeft(
                            hir_np), self.on_hierarchy_right_click)

                    # Make the hierachy card hoverable.
                    messageHover, messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable(
                        hir_np)
                    base.accept(messageHover, self.mouse_over)
                    base.accept(messageLeave, self.mouse_leave)

                    # Create a new node for the text label.
                    t_node = card.attachNewNode('card-label' + tagset.name)
                    t_node.setY(-0.001)
                    t_node.setZ(1.35)
                    t_node.setX(0.03)

                    t = OnscreenText(text=hir.getRoot().name + ' (hierarchy)',
                                     fg=(1, 1, 1, 1),
                                     parent=t_node,
                                     pos=(0, -1, -4),
                                     scale=(0.075, 0.73),
                                     align=TextNode.ALeft)

                    # Make the dim button mouse over enabled.
                    if hir_np.__str__() not in self.cards.keys():
                        self.cards[hir_np.__str__()] = card

                    self.dimension_list.append(hir_np)
                    photocube.devices.mouse_handler.makeNPMouseHoverable(
                        hir_np)

        # Create label for filters
        if len(self.dimension_list) < self.max_dimension_visable_in_menu:
            self.last_dim_pos = -0.025 * len(self.dimension_list)

        else:
            self.last_dim_pos = -0.25
            self.dimension_scrollbar = DirectScrollBar(
                range=(0, math.ceil(len(self.dimension_list))),
                orientation=DGG.VERTICAL,
                command=self.on_dimension_scroll_change,
                scrollSize=5,
                pageSize=len(self.dimension_list) / 5,
                value=0)

            self.dimension_scrollbar.setScale(0.5, 1, 0.69)
            self.dimension_scrollbar['frameColor'] = (0.6, 0.6, 0.6, 0.8)

            # disable the click sound for the scrollbar.
            self.dimension_scrollbar[
                'incButton_clickSound'] = button_mouseclick_sound
            self.dimension_scrollbar['incButton_rolloverSound'] = None
            self.dimension_scrollbar[
                'decButton_clickSound'] = button_mouseclick_sound
            self.dimension_scrollbar['decButton_rolloverSound'] = None
            self.dimension_scrollbar['thumb_clickSound'] = None
            self.dimension_scrollbar['thumb_rolloverSound'] = None
            self.dimension_scrollbar['incButton_relief'] = None
            self.dimension_scrollbar['decButton_relief'] = None
            self.dimension_scrollbar['decButton_text'] = '-'
            self.dimension_scrollbar['decButton_text_scale'] = 0.07
            self.dimension_scrollbar['incButton_text'] = '+'
            self.dimension_scrollbar['incButton_text_scale'] = (0.07, 0.05)
            self.dimension_scrollbar['incButton_text_pos'] = (-0.005, -0.02)
            self.dimension_scrollbar['decButton_text_pos'] = (-0.005, -0.02)
            self.dimension_scrollbar['thumb_frameColor'] = (0, 0, 0, 0.2)
            self.dimenion_scroll_value = self.dimension_scrollbar['value']

        self.text_dims = OnscreenText(mayChange=True,
                                      text='Filters:',
                                      fg=(1, 1, 1, 1),
                                      parent=self.right_menu_node_path,
                                      pos=(-1.10, self.last_dim_pos, -10),
                                      scale=(0.040),
                                      align=TextNode.ALeft)

        # create nodepath for the filter labels
        self.filter_label_np = self.right_menu_node_path.attachNewNode(
            'filter-label-np')

        self.current_dimension_index_left = 0
        self.current_dimension_index_right = self.max_dimension_visable_in_menu - 1
        self.show_dimension_tabs()

    def __initalize_objects(self):
        # refactored from the function for dims labels reload
        self.text_dims = OnscreenText(text='Dimensions:',
                                      fg=(1, 1, 1, 1),
                                      parent=self.right_menu_node_path,
                                      pos=(-1.10, 0.45, -10),
                                      scale=0.040,
                                      align=TextNode.ALeft)

        # Create a label for the menu.
        self.text_dims = OnscreenText(mayChange=True,
                                      text='Visible:',
                                      fg=(1, 1, 1, 1),
                                      parent=self.right_menu_node_path,
                                      pos=(-1.10, 0.74, -10),
                                      scale=(0.040),
                                      align=TextNode.ALeft)

        self.visible_x_np = self.right_menu_node_path.attachNewNode(
            'np_visiable_x')
        self.visible_x_np.setPos(-0.50, 0, 0.85)
        self.visible_x_np.setScale(0.6)

        self.text_x = OnscreenText(mayChange=True,
                                   text=EMPTY_ON_FRONT,
                                   fg=(1, 1, 1, 1),
                                   parent=self.visible_x_np,
                                   align=TextNode.ALeft,
                                   pos=(-0.95, -0.29, -0.21),
                                   scale=0.075)

        # Create clicable card for x.
        card_np = self.visible_x_np.attachNewNode(
            'card-x-label-np').attachNewNode('card-x-label-np')
        card_np.setPos(1, 1.5, 1.5)
        cm = CardMaker('card-x')
        card = card_np.attachNewNode(cm.generate())
        card.setScale(0.8, 1, 0.1)
        card.setPos(-1.93, -1.3, -1.78)
        card.setTwoSided(True)
        card.setColor(0, 0, 0)

        # Make the x view nodepath clickable.
        self.curXDimRightClickMessage = mouse_handler.makeNPPickableRight(
            self.visible_x_np)
        self.curXDimLeftClickMessage = mouse_handler.makeNPPickableLeft(
            self.visible_x_np)

        # Make the x view nodepath mouseoverable and save the nodepath for making it glow.
        self.cards[self.visible_x_np.__str__()] = card
        leavemessage, hoverMessage = photocube.devices.mouse_handler.makeNPMouseHoverable(
            self.visible_x_np)
        base.accept(hoverMessage, self.mouse_leave)
        base.accept(leavemessage, self.mouse_over)

        # Create notepath for y
        self.visible_y_np = self.right_menu_node_path.attachNewNode(
            'np_visiable_y')
        self.visible_y_np.setPos(-0.50, 0, 0.78)
        self.visible_y_np.setScale(0.6)

        self.text_y = OnscreenText(mayChange=True,
                                   text=EMPTY_ON_IN,
                                   fg=(1, 1, 1, 1),
                                   parent=self.visible_y_np,
                                   align=TextNode.ALeft,
                                   pos=(-0.95, -0.29, 0.21),
                                   scale=0.075)

        # Create clicable card for y.
        card_np = self.visible_y_np.attachNewNode(
            'card-y-label-np').attachNewNode('card-y-label-np')
        card_np.setPos(1, 1.5, 1.5)
        cm = CardMaker('card-y')
        card = card_np.attachNewNode(cm.generate())
        card.setScale(0.8, 1, 0.1)
        card.setPos(-1.93, -1.3, -1.78)
        card.setTwoSided(True)
        card.setColor(0, 0, 0)
        card.setTransparency(TransparencyAttrib.MAlpha)

        self.curYDimRightClickMessage = mouse_handler.makeNPPickableRight(
            self.visible_y_np)
        self.curYDimLeftClickMessage = mouse_handler.makeNPPickableLeft(
            self.visible_y_np)

        # Make the y view nodepath mouseoverable.
        self.cards[self.visible_y_np.__str__()] = card
        #TODO: Here is a good place to refactor.
        photocube.devices.mouse_handler.makeNPMouseHoverable(self.visible_y_np)
        base.accept('zoomout_render/camera/right_menu_node_path/np_visiable_y',
                    self.mouse_leave)
        base.accept('zoomin_render/camera/right_menu_node_path/np_visiable_y',
                    self.mouse_over)

        # Create notepath for z
        self.visible_z_np = self.right_menu_node_path.attachNewNode(
            'np_visiable_z')
        self.visible_z_np.setPos(-0.50, 0, 0.71)
        self.visible_z_np.setScale(0.6)

        self.text_z = OnscreenText(mayChange=True,
                                   text=EMPTY_ON_UP,
                                   fg=(1, 1, 1, 1),
                                   parent=self.visible_z_np,
                                   align=TextNode.ALeft,
                                   pos=(-0.95, -0.28, 0.21),
                                   scale=0.075)

        # Create clicable card for y.
        card_np = self.visible_z_np.attachNewNode(
            'card-z-label-np').attachNewNode('card-z-label-np')
        card_np.setPos(1, 1.5, 1.5)
        cm = CardMaker('card-z')
        card = card_np.attachNewNode(cm.generate())
        card.setScale(0.8, 1, 0.1)
        card.setPos(-1.93, -1.3, -1.78)
        card.setTwoSided(True)
        card.setColor(0, 0, 0)
        card.setTransparency(TransparencyAttrib.MAlpha)
        self.curZDimRightClickMessage = mouse_handler.makeNPPickableRight(
            self.visible_z_np)
        self.curZDimLeftClickMessage = mouse_handler.makeNPPickableLeft(
            self.visible_z_np)

        # Make the z view nodepath mouseoverable.
        self.cards[self.visible_z_np.__str__()] = card
        photocube.devices.mouse_handler.makeNPMouseHoverable(self.visible_z_np)
        base.accept('zoomout_render/camera/right_menu_node_path/np_visiable_z',
                    self.mouse_leave)
        base.accept('zoomin_render/camera/right_menu_node_path/np_visiable_z',
                    self.mouse_over)

    def on_dimension_scroll_change(self):
        val = int(self.dimension_scrollbar['value'])
        #print 'val', val

        if val == self.dimenion_scroll_value:
            return

        elif val < self.dimenion_scroll_value:
            for n in range(self.dimenion_scroll_value - val):
                self.dim_menu_move_up()

        else:
            for n in range(val - self.dimenion_scroll_value):
                self.dim_menu_move_down()

        #self.dimenion_scroll_value = self.dimension_scrollbar['value']
        self.dimenion_scroll_value = val

    def show_dimension_tabs(self):
        card_pos = 0
        i = 0
        for card in self.dimension_list:
            card.hide()
            card.setX(100)

        for r in range(self.current_dimension_index_left,
                       len(self.dimension_list)):
            self.dimension_list[r].show()
            self.dimension_list[r].setZ(card_pos)
            self.dimension_list[r].setX(0)
            card_pos -= 0.06
            i += 1
            if i is self.max_dimension_visable_in_menu:
                break

    def dim_menu_move_down(self):
        r = len(self.dimension_list) - self.current_dimension_index_right
        if r > 1:
            self.current_dimension_index_left += 1
            self.current_dimension_index_right += 1
            self.show_dimension_tabs()

    def dim_menu_move_up(self):
        if self.current_dimension_index_left > 0:
            self.current_dimension_index_left -= 1
            self.current_dimension_index_right -= 1
            self.show_dimension_tabs()

    def btn_filters(self, index):
        self.filter_menu.btn_filters(index)

    def mouse_over(self, p):
        if not photocube.ui.coremenu.context_menu_handler.has_open_context():
            #print 'here', p
            c = self.cards[p.__str__()]
            #print c
            self.current_glowing_card = c
            c.setColor(0.15, 0.15, 0.15)

    def mouse_leave(self, p):
        if not photocube.ui.coremenu.context_menu_handler.has_open_context():
            c = self.cards[p.__str__()]
            c.setColor(0, 0, 0)
            self.current_glowing_card = None

    def clear_glow(self, f=None):
        if not photocube.ui.coremenu.context_menu_handler.has_open_context():
            #print 'clear'
            self.clear_all_glowings()

    def clear_all_glowings(self):
        for key in self.cards.keys():
            card = self.cards[key]
            card.setColor(0, 0, 0)

        self.current_glowing_card = None

    def btn_x_view(self, index):
        self.clear_glow()

        if index == 'view up':
            x = photocube.cube.cubeService.coordinate.get_x()
            if x is not None:
                messenger.send('dim_move_to_axis', [X_AXIS, Z_AXIS])
                action = ActionAxis(ACTION_MOVE, X_AXIS, Z_AXIS)
                actionManager.addAction(action)

        if index == 'view in':
            x = photocube.cube.cubeService.coordinate.get_x()
            if x is not None:
                messenger.send('dim_move_to_axis', [X_AXIS, Y_AXIS])
                action = ActionAxis(ACTION_MOVE, X_AXIS, Y_AXIS)
                actionManager.addAction(action)

        if index == "swap with up":
            messenger.send('x_dim_action_swap', [Z_AXIS])
            # create action for the swap.
            action = ActionAxis(ACTION_SWAP, X_AXIS, Z_AXIS)
            actionManager.addAction(action)

        if index == "swap with in":
            messenger.send('x_dim_action_swap', [Y_AXIS])
            # create action for the swap.
            action = ActionAxis(ACTION_SWAP, X_AXIS, Y_AXIS)
            actionManager.addAction(action)

        if index is 'clear':
            messenger.send('dim_action_clear', [X_AXIS])
            action = ActionAxis(ACTION_CLEAR, X_AXIS)
            actionManager.addAction(action)

    def btn_y_view(self, index):
        """
        This function is called when we select buttons
        in the view y context menu.
        """
        self.clear_glow()

        if index == 'clear':
            messenger.send('dim_action_clear', [Y_AXIS])
            action = ActionAxis(ACTION_CLEAR, Y_AXIS)
            actionManager.addAction(action)

        if index == 'view front':
            y = photocube.cube.cubeService.coordinate.get_y()

            if y is not None:
                messenger.send('dim_move_to_axis', [Y_AXIS, X_AXIS])
                action = ActionAxis(ACTION_MOVE, Y_AXIS, X_AXIS)
                actionManager.addAction(action)

        if index == 'view up':
            y = photocube.cube.cubeService.coordinate.get_y()

            if y is not None:
                messenger.send('dim_move_to_axis', [Y_AXIS, Z_AXIS])
                action = ActionAxis(ACTION_MOVE, Y_AXIS, Z_AXIS)
                actionManager.addAction(action)

        if index == "swap with front":
            messenger.send('y_dim_action_swap', [X_AXIS])
            action = ActionAxis(ACTION_SWAP, Y_AXIS, X_AXIS)
            actionManager.addAction(action)

        if index == "swap with up":
            messenger.send('y_dim_action_swap', [Z_AXIS])
            action = ActionAxis(ACTION_SWAP, Y_AXIS, Z_AXIS)
            actionManager.addAction(action)

    def btn_z_view(self, index):
        self.clear_glow()

        if index == 'clear':
            messenger.send('dim_action_clear', [Z_AXIS])
            action = ActionAxis(ACTION_CLEAR, Z_AXIS)
            actionManager.addAction(action)

        if index == 'view front':
            z = photocube.cube.cubeService.coordinate.get_z()

            if z is not None:
                messenger.send('dim_move_to_axis', [Z_AXIS, X_AXIS])
                action = ActionAxis(ACTION_MOVE, Z_AXIS, X_AXIS)
                actionManager.addAction(action)

        if index == 'view in':
            z = photocube.cube.cubeService.coordinate.get_z()

            if z is not None:
                messenger.send('dim_move_to_axis', [Z_AXIS, Y_AXIS])
                action = ActionAxis(ACTION_MOVE, Z_AXIS, Y_AXIS)
                actionManager.addAction(action)

        if index == "swap with front":
            messenger.send('z_dim_action_swap', [X_AXIS])
            action = ActionAxis(ACTION_SWAP, Z_AXIS, X_AXIS)
            actionManager.addAction(action)

        if index == "swap with in":
            messenger.send('z_dim_action_swap', [Y_AXIS])
            action = ActionAxis(ACTION_SWAP, Z_AXIS, Y_AXIS)
            actionManager.addAction(action)

    def btn_dimensions(self, index):
        self.clear_glow()
        tagset = photocube.objectcube.objectCubeService.get_tagset_by_id(
            self.selected_tagset_id)

        if index == 'view front':
            action = ActionTagset(ACTION_SET, tagset.id, X_AXIS)
            actionManager.addAction(action)
            messenger.send('dim_view_tagset', [X_AXIS, tagset])

        if index == 'view in':
            action = ActionTagset(ACTION_SET, tagset.id, Y_AXIS)
            actionManager.addAction(action)
            messenger.send('dim_view_tagset', [Y_AXIS, tagset])

        if index == 'view up':
            action = ActionTagset(ACTION_SET, tagset.id, Z_AXIS)
            actionManager.addAction(action)
            messenger.send('dim_view_tagset', [Z_AXIS, tagset])

        if index == 'add dimension filter':
            dim_filter = ObjectCubePython.DimensionFilter(
                tagset.getDefaultDimension().getRoot(), tagset.id)
            filterManager.add_filter(dim_filter, True)

            # add action
            action = ActionFilter(ACTION_DIMENSIONFILTER,
                                  ACTION_ADD,
                                  tagsetId=tagset.id)
            actionManager.addAction(action)

            # reload filters menu.
            self.reload_filter2()

        if index == 'add tag filter':
            photocube.dialogs.dialogService.open_add_tagfilter(tagset)

        if index == 'add range filter':
            if tagset.typeId == 3:
                photocube.dialogs.dialogService.open_add_date_range(tagset)

            elif tagset.typeId == 4:
                photocube.dialogs.dialogService.open_add_time_range(tagset)

            else:
                photocube.dialogs.dialogService.open_add_numerical_range(
                    tagset)

        if index == 'edit':
            photocube.dialogs.dialogService.openCreateNewTagsetDialog(tagset)

    def btn_hierarchy(self, index):
        # Get the tagset that the hir belongs to.
        tagset = photocube.objectcube.objectCubeService.get_tagset_by_id(
            self.selected_tagset_id)
        print 'selected_hierarchy_id: ' + str(self.selected_hierarchy_id)
        # Get the hirarchy from the tagset.
        dim = tagset.getDimension(int(self.selected_hierarchy_id))
        print 'Dimension click'
        if index == 'view front':
            print 'DimId: ' + str(dim.id)
            print 'TagSetId: ' + str(tagset.id)
            print index + ': Begin'
            print 'ACTION_SET'
            print ACTION_SET
            print 'X_AXIS'
            print X_AXIS
            action = ActionHierachy(ACTION_SET, tagset.id, dim.id, X_AXIS)
            actionManager.addAction(action)
            print 'action'
            print action
            messenger.send('dim_view_hierarchy', [X_AXIS, dim])
            print index + ': End'

        elif index == 'view in':
            action = ActionHierachy(ACTION_SET, tagset.id, dim.id, Y_AXIS)
            actionManager.addAction(action)
            messenger.send('dim_view_hierarchy', [Y_AXIS, dim])

        elif index == 'view up':
            action = ActionHierachy(ACTION_SET, tagset.id, dim.id, Z_AXIS)
            actionManager.addAction(action)
            messenger.send('dim_view_hierarchy', [Z_AXIS, dim])

        elif index == 'add dimension filter':
            dim_filter = ObjectCubePython.DimensionFilter(
                dim.getRoot(), tagset.id)
            filterManager.add_filter(dim_filter, True)

            # add action
            action = ActionFilter(ACTION_DIMENSIONFILTER,
                                  ACTION_ADD,
                                  tagsetId=tagset.id,
                                  hirarchyId=int(self.selected_hierarchy_id))
            actionManager.addAction(action)
            self.reload_filter2()

        else:
            raise Exception('btn_hierarchy: unknown index: ' + index)

    def btn_search(self, index):
        tagset = photocube.objectcube.objectCubeService.get_tagset_by_id(
            self.selected_tagset_id)
        if index == 'search':
            print 'Vuubidu'
            photocube.dialogs.dialogService.openSearchDialogWithTagSet(tagset)

    def reload_filter2(self):
        self.filter_menu.reload()

    def on_x_view_right_click(self, f):
        photocube.ui.coremenu.context_menu_handler.open_x_view_context()

    def open_context_view_y(self, f):
        photocube.ui.coremenu.context_menu_handler.open_y_view_context()

    def open_context_view_z(self, f):
        photocube.ui.coremenu.context_menu_handler.open_z_view_context()

    def on_hierarchy_right_click(self, f):
        split_list = f.__str__().split(';')
        self.selected_hierarchy_id = int(split_list[3])
        self.selected_tagset_id = int(split_list[4])
        photocube.ui.coremenu.context_menu_handler.open_context_hierarchy()

    def on_tagset_right_click(self, f):
        """
        Function for opening dimension context.       
        """
        split_list = f.__str__().split(';')
        self.selected_tagset_id = int(split_list[len(split_list) - 1])

        t_id = photocube.objectcube.objectCubeService.get_tagset_by_id(
            self.selected_tagset_id).typeId
        print 't_id' + str(t_id)
        if t_id == photocube.objectcube.framework.TagSet.TYPE.ALPHANUMERICAL:
            print 'ALPHANUMERICAL'
            photocube.ui.coremenu.context_menu_handler.open_context_tagset_search_alphanumerical(
            )
        elif t_id == photocube.objectcube.framework.TagSet.TYPE.RGB:
            print 'RGB'
            photocube.ui.coremenu.context_menu_handler.open_context_tagset_search_rgb(
            )
        '''
        if t_id == photocube.objectcube.framework.TagSet.TYPE.ALPHANUMERICAL:
            photocube.ui.coremenu.context_menu_handler.open_context_tagset_alphanumerical()
        else:
            photocube.ui.coremenu.context_menu_handler.open_context_tagset_numerical()
        '''

    def hide(self):
        #self.right_menu_node_path.hide()

        if self.dimension_scrollbar is not None:
            self.dimension_scrollbar.hide()

        self.filter_menu.hide()

        # hide the background image
        self.bg.hide()
        self.is_visable = False

    def show(self):
        #self.right_menu_node_path.show()

        if self.dimension_scrollbar is not None:
            self.dimension_scrollbar.show()

        #self.filter_menu.show()

        # hide the background image
        #self.bg.show()
        self.is_visable = True

    def setXViewText(self, text):
        self.text_x.setText('front: ' + text)

    def setYViewText(self, text):
        self.text_y.setText('in: ' + text)

    def setZViewText(self, text):
        self.text_z.setText('up: ' + text)

    def __register_view_menu_messages(self):
        # Click messages for dimensions.
        base.accept(self.curXDimRightClickMessage, self.on_x_view_right_click)
        base.accept(self.curXDimLeftClickMessage, self.on_x_view_right_click)
        base.accept(self.curYDimRightClickMessage, self.open_context_view_y)
        base.accept(self.curYDimLeftClickMessage, self.open_context_view_y)
        base.accept(self.curZDimRightClickMessage, self.open_context_view_z)
        base.accept(self.curZDimLeftClickMessage, self.open_context_view_z)
        base.accept('clear_glow', self.clear_glow)
        base.accept('zoomout_none', self.clear_glow)

    def __placement(self, task):
        """
        Called to fix the size, location of object when the aspect changes.
        """
        if self.is_visable:
            base.camLens.setAspectRatio(base.getAspectRatio())
            wp = base.win.getProperties()
            base.camLens.setAspectRatio(
                (wp.getXSize() + 0.0) / (wp.getYSize() + 0.0))
            self.right_menu_node_path.show()

            self.right_menu_node_path.setX(
                (base.getAspectRatio() + (0.40 / base.getAspectRatio())))

            # Fix the position of the menu background image.
            self.bg.setX(0.32 + base.getAspectRatio())

            if self.dimension_scrollbar is not None:
                self.dimension_scrollbar.setX(base.getAspectRatio() - 0.04)
                self.dimension_scrollbar.setZ(0.18)

        else:
            # set the position for the dimensino buttons
            base.camLens.setAspectRatio(base.getAspectRatio())
            wp = base.win.getProperties()
            base.camLens.setAspectRatio(
                (wp.getXSize() + 0.0) / (wp.getYSize() + 0.0))
            #self.right_menu_node_path.setX( (base.getAspectRatio()+(0.3/base.getAspectRatio())) )
            self.right_menu_node_path.hide()
            self.right_menu_node_path.setX(500)

            #THIS IS NOT ALLOWD, CLOSES CLUSTER MENUS AS WELL!
            #messenger.send('CLOSE_ALL_CONTEXT')

            # Fix the position of the menu background image.
            self.bg.setX(0.95 + base.getAspectRatio())
            self.bg.show()

        return task.cont
Exemple #5
0
class AbstractDialog():
    def __init__(self, np):

        self.close_message = 'dialog_closing'

        # Set the np for the dialog
        self.np = np
        self.np.setPos(0, 0, 0)

        # Load sounds for dialogs.
        self.mouseclick_sound = loader.loadSfx("static/sounds/mouseclick.wav")
        self.mouseover_sound = loader.loadSfx("static/sounds/mouseover.wav")

        # Load the background image for dialogs.
        self.bg = OnscreenImage(image='static/images/box.tif', parent=self.np)
        self.bg.setTransparency(TransparencyAttrib.MAlpha)
        self.bg.setAlphaScale(0.85)

        # Member variables
        self.btn_ok = None
        self.btn_cancel = None

    def create_ok_cancel_buttons(self,
                                 ok_caption='ok',
                                 cancel_caption='cancel'):
        # Create the ok button.
        self.btn_ok = DirectButton(text_fg=(1, 1, 1, 1),
                                   frameColor=(0.5, 0.5, 0.5, 1),
                                   relief=DGG.RAISED,
                                   text=(ok_caption, ok_caption, ok_caption,
                                         ok_caption),
                                   pressEffect=1,
                                   scale=0.030,
                                   frameSize=(-2, 2, -0.5, 1.0),
                                   parent=self.np,
                                   rolloverSound=None,
                                   clickSound=None,
                                   command=self.click_ok_button)

        self.btn_cancel = DirectButton(
            text_fg=(1, 1, 1, 1),
            frameColor=(0.5, 0.5, 0.5, 1),
            #borderWidth=(0.0,0.0),
            relief=DGG.RAISED,
            text=(cancel_caption, cancel_caption, cancel_caption,
                  cancel_caption),
            pressEffect=1,
            scale=0.030,
            frameSize=(-2, 2, -0.5, 1.0),
            command=self.click_cancel_button,
            parent=self.np,
            rolloverSound=None,
            clickSound=None)

    def create_ok_button(self):
        self.btn_ok = DirectButton(
            text_fg=(1, 1, 1, 1),
            frameColor=(0.5, 0.5, 0.5, 1),
            #borderWidth=(0.0,0.0),
            relief=DGG.RAISED,
            text=('ok', 'ok', 'ok', 'ok'),
            pressEffect=1,
            scale=0.030,
            frameSize=(-2, 2, -0.5, 1.0),
            parent=self.np,
            rolloverSound=None,
            clickSound=None,
            command=self.click_ok_button)

    def set_ok_button_pos(self, pos):
        self.btn_ok.setPos(pos)

    def set_cancel_button_pos(self, pos):
        self.btn_cancel.setPos(pos)

    def click_ok_button(self):
        print 'CALLING BASE VERSION!'
        self.np.remove()
        messenger.send('dialog_closing')

    def click_cancel_button(self):
        self.np.remove()
        messenger.send('dialog_closing')
Exemple #6
0
class ScreenDecorationManager:
    def __init__(self):
        self.tex_judgements = {}

        for i in ["PERFECT", "GOOD", "OK", "BAD", "MISS"]:
            self.tex_judgements[i] = loader.loadTexture("image/j_%s.png" %
                                                        i.lower())

        ## Judgement message
        self.image_judgement = OnscreenImage(
            image=self.tex_judgements["OK"],
            pos=(0, 0, 0),
            scale=(256.0 / base.win.getXSize(), 1, 32.0 / base.win.getYSize()),
            parent=render2d)
        self.image_judgement.setTransparency(TransparencyAttrib.MAlpha)
        #self.image_judgement.setPos(-0.7, 1, 0.6)
        self.image_judgement.setAlphaScale(0)

        interval_pos = LerpPosInterval(self.image_judgement,
                                       duration=0.1,
                                       startPos=VBase3(-1.2, 1, 0.5),
                                       pos=VBase3(-0.7, 1, 0.5),
                                       blendType='easeOut')
        interval_alpha = LerpFunc(self.image_judgement.setAlphaScale,
                                  duration=0.1,
                                  blendType='easeOut')
        interval_fade = LerpFunc(self.image_judgement.setAlphaScale,
                                 fromData=1,
                                 toData=0,
                                 duration=1.0,
                                 blendType='easeOut')

        self.judgement_enters = Sequence(
            Parallel(interval_pos, interval_alpha), Wait(1.0), interval_fade)

        ## Chain message
        text_node = TextNode('chain_msg')
        text_node.setAlign(TextNode.ACenter)
        text_node.setFont(babelfish_font)

        text_node.setTextColor(1, 1, 0.16, .9)
        text_node.setShadow(0.05, 0.05)
        text_node.setShadowColor(0.05, 0, 0.43, .9)

        self.chain_msg = aspect2d.attachNewNode(text_node)
        self.chain_msg.setPos(-.9, 1, 0.35)
        self.chain_msg.setScale(0.11)

    def judgement_msg(self, msg, chain):
        if self.judgement_enters.isPlaying():
            self.judgement_enters.clearToInitial()

        self.image_judgement.setTexture(self.tex_judgements[msg])
        self.judgement_enters.start()

        if chain > 1:
            self.chain_msg.node().setText("%d CHAIN" % chain)

        taskMgr.add(self.task_ClearJudgementTask, "clear-judgement")

    def task_ClearJudgementTask(self, task):
        if task.time < 1.5:
            return Task.cont

        self.chain_msg.node().clearText()

    def __del__(self):
        self.judgement_enters.finish()
        self.image_judgement.destroy()
        self.chain_msg.removeNode()
Exemple #7
0
class GuiButton2:
    def __init__(self, hugpos, offset, aspect, plane, name):
        self.enabled = True
        self.name = name
        
        self.frame = DirectFrame(   relief = DGG.FLAT
                                  , frameColor = (0, 0, 0, 0)
                                  , scale = 1
                                  , frameSize = (-0.3, 0.3, -0.3, 0.3) ) #32/600=0.05333
        self.frame.setScale(0.0533)
        
        self.imageObject = OnscreenImage(image = name+".png", pos = (0, 0, 0))
        self.imageObject.setTransparency(TransparencyAttrib.MAlpha)
        self.imageObject.setAlphaScale(1) 
        self.imageObject.reparentTo(self.frame)
        
        self.hugpos = hugpos
        self.offset = offset
        self.redraw(aspect)

    def redraw(self, aspect, flag="wide"):
        if self.hugpos == "top":
            p = base.a2dTopLeft.getPos()#@UndefinedVariable
            p.setX(p.getX() + self.offset.getX() + 0.05)
            p.setZ(p.getZ() + self.offset.getZ() - GUI_TOP_OFFSET - 0.05)
        elif self.hugpos == "bottom":
            p = base.a2dBottomLeft.getPos()#@UndefinedVariable
            p.setX(p.getX() + self.offset.getX() + 0.05)
            p.setZ(p.getZ() + self.offset.getZ() + GUI_BOTTOM_OFFSET - 0.05)
        elif self.hugpos == "right":
            p = base.a2dBottomRight.getPos()#@UndefinedVariable
            p.setX(p.getX() + self.offset.getX() + 0.05)
            p.setZ(p.getZ() + self.offset.getZ() + GUI_BOTTOM_OFFSET - 0.05)
        self.frame.setPos(p)
        if flag == "wide":
            posx, posy = self.frame.getTightBounds()
            self.pos_min_x = posx.getX() / aspect
            self.pos_min_y = posx.getZ()
            self.pos_max_x = posy.getX() / aspect
            self.pos_max_y = posy.getZ()
        elif flag == "tall":
            posx, posy = self.frame.getTightBounds()
            self.pos_min_x = posx.getX()
            self.pos_min_y = posx.getZ() / aspect
            self.pos_max_x = posy.getX()
            self.pos_max_y = posy.getZ() / aspect
            
    def turnOn(self):
        self.imageObject.setImage(self.name+"_on.png")#@UndefinedVariable
        self.imageObject.setTransparency(TransparencyAttrib.MAlpha)
        
    def turnOff(self):
        self.imageObject.setImage(self.name+".png")#@UndefinedVariable
        self.imageObject.setTransparency(TransparencyAttrib.MAlpha)    
            
    def enable(self):
        self.imageObject.setImage(self.name+".png")#@UndefinedVariable
        self.imageObject.setTransparency(TransparencyAttrib.MAlpha)
        self.enabled = True
        
    def disable(self):
        self.imageObject.setImage("empty.png")#@UndefinedVariable
        self.imageObject.setTransparency(TransparencyAttrib.MAlpha)
        self.enabled = False
            
    def removeNode(self):
        self.frame.removeNode()   
        
    def setAbility(self, ability):
        self.name = ability
        self.imageObject.setImage(self.name+".png")
        self.imageObject.setTransparency(TransparencyAttrib.MAlpha)
        self.imageObject.setAlphaScale(1) 
Exemple #8
0
class LevelSelectScreen:
    def __init__(self, game_opts):
        self.ITEM_SPACING = 1.7
        
        self.game_opts = game_opts
        
        self.title = OnscreenText(text = 'Select Level', pos = (0.0, 0.7), scale = 0.3, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))
        self.bg = OnscreenImage(image='./image/bg.png', pos = (0.0, -1.0, 0.0), parent=render2d)
        self.bg.setTransparency(TransparencyAttrib.MAlpha)
        
        self.curr_option = 0
        self.levels = []
        
        self.arrow_left =  OnscreenImage(image='./image/arrow_left.png', scale=(64.0/base.win.getXSize(), 1 ,64.0/base.win.getYSize()), pos = (-.8, -3.0, 0.0), parent=aspect2d)
        self.arrow_left.setTransparency(TransparencyAttrib.MAlpha)
        
        self.arrow_right = OnscreenImage(image='./image/arrow_right.png', scale=(64.0/base.win.getXSize(), 1 ,64.0/base.win.getYSize()), pos = (.8, -3.0, 0.0), parent=aspect2d)
        self.arrow_right.setTransparency(TransparencyAttrib.MAlpha)
        
        level_list = parse.level_list()
        level_list.sort()
        
        self.item_list_node = aspect2d.attachNewNode("ItemList")
        self.initial_x = self.item_list_node.getX()
        
        for i, lvl in enumerate(level_list):
            header = parse.level_header(lvl)
            
            level_item = self.make_level_item(header)
            level_item.setX(self.ITEM_SPACING*i)
            level_item.setZ(-0.1)
            level_item.setScale(.8)
            
            level_item.reparentTo(self.item_list_node)
            self.levels.append(header['NAME'])
    
        self.cur_interval = None
        self.update()
    
    def create_cur_interval(self):
        return Sequence(LerpScaleInterval(self.item_list_node.getChild(self.curr_option), duration=0.4, startScale=.8, scale=.85), 
                                    LerpScaleInterval(self.item_list_node.getChild(self.curr_option), duration=0.4, startScale=.85, scale=.8))
    
    def option_changed(self, command):
        changed = False
        
        if command=='left' and self.curr_option > 0:
            self.curr_option = (self.curr_option - 1)
            changed = True
            
        elif command=='right' and self.curr_option < len(self.levels)-1:
            self.curr_option = (self.curr_option + 1)
            changed = True
        
        if changed:
            interval = Parallel(LerpPosInterval(self.item_list_node, duration=.2, startPos=VBase3(self.item_list_node.getX(),.0,.0), pos=VBase3(-self.ITEM_SPACING*self.curr_option,.0,.0)), SoundInterval(menuSfx))
            interval.start()
            self.update()
    
    def update(self):
        if self.curr_option < 1:
            self.arrow_left.setAlphaScale(.0)
        else:
            self.arrow_left.setAlphaScale(1)
    
        if self.curr_option >= len(self.levels)-1:
            self.arrow_right.setAlphaScale(.0)
        else:
            self.arrow_right.setAlphaScale(1)
        
        if self.cur_interval:
            self.cur_interval.finish()
            del self.cur_interval
        
        self.cur_interval = self.create_cur_interval()
        self.cur_interval.loop()
    
    def option_pressed(self):
        return self.levels[self.curr_option]
                                                
    def clear(self):
        self.bg.destroy()
        self.arrow_left.destroy()
        self.arrow_right.destroy()
        self.title.destroy()
        self.item_list_node.removeNode()
            
    def make_level_item(self, level_header):
        level_name = level_header['NAME']
        
        level_item = aspect2d.attachNewNode(level_name)
        level_img = OnscreenImage(image='./levels/%s/image.png' % level_name, 
                scale=(512.0/base.win.getXSize(), 1 ,362.0/base.win.getYSize()), pos = (0.0, 0.0, 0.3), parent=level_item)
                
        level_img.setTransparency(TransparencyAttrib.MAlpha)
        level_img.reparentTo(level_item)
        
        if level_header.has_key("TITLE"):
            title_str = "%s" % level_header["TITLE"]
        else:
            title_str = "%s" % level_header["NAME"]
        
        artist_str = ""
        if level_header.has_key("ARTIST"):
            artist_str = "by %s" %  level_header["ARTIST"]
            
        
        title_text = OnscreenText(text = title_str, pos = (0.0, 0.-0.3), scale = 0.2, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))
        title_text.reparentTo(level_item)
        
        next_y = -0.50
        
        if artist_str:
            next_y -= 0.05
            artist_text = OnscreenText(text = artist_str, pos = (0.0, 0.-0.4), scale = 0.15, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))
            artist_text.reparentTo(level_item)
            
            
        bpm_text = OnscreenText(text = "BPM %.2f" % level_header["BPM"], pos = (0.0, next_y), scale = 0.18, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))
        bpm_text.reparentTo(level_item)
        
        if self.game_opts.has_option('hiscores', level_name):
            his = self.game_opts.get('hiscores', level_name).split(',')            
            maxrank = OnscreenText(text = "max rank %s" % his[0].upper(), 
                pos = (0.0, next_y-0.15), scale = 0.18, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))
                
            hiscore = OnscreenText(text = "hiscore %s" % his[1], 
                pos = (0.0, next_y-0.25), scale = 0.18, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1))

            maxrank.reparentTo(level_item)
            hiscore.reparentTo(level_item)
        
        return level_item
Exemple #9
0
class MyApp(ShowBase):
    gameMode = "Intro"

    def __init__(self):
        ShowBase.__init__(self)

        #self.cameraSetup()
        self.setupKeyboard()

        self.initIntro()

    def gameChangeMode(self):
        if base.gameMode == "Intro":
            self.initIntro()
        elif base.gameMode == "Convo":
            self.initConvo()

    def initIntro(self):
        self.fadeAlpha = 0.0
        self.fadeTime = 30.0
        self.fadeInc = 1.0 / self.fadeTime
        self.fadeDir = "up"

        self.sceneImage = OnscreenImage(image="images/scene.png",
                                        scale=(1920.0 / 1080.0, 1, 1))
        self.sceneImage.setTransparency(TransparencyAttrib.MAlpha)
        self.sceneImage.setAlphaScale(self.fadeAlpha)

        self.imageNumber = 0
        self.sceneImageList = ["images/scene.png", "images/image1.jpg"]

        #self.texty = OnscreenText(str(self.fadeAlpha))

        taskMgr.add(self.gameIntroUpdate, "GameIntroUpdate")

    def gameIntroUpdate(self, task):
        self.slideManager()
        if (base.gameMode != "Intro"):
            self.gameChangeMode()
            return Task.done

        return Task.cont

    def cameraSetup(self):
        base.camLens.setAspectRatio(1920.0 / 1080.0)

    def slideManager(self):
        if self.fadeDir == "up" and self.fadeAlpha < 1:
            self.fadeAlpha += self.fadeInc
            self.sceneImage.setAlphaScale(self.fadeAlpha)
            #self.texty.setText(str(self.fadeAlpha))

        if self.fadeDir == "down" and self.fadeAlpha > 0:
            self.fadeAlpha -= self.fadeInc
            self.sceneImage.setAlphaScale(self.fadeAlpha)

        if self.fadeDir == "up" and self.fadeAlpha >= 1:
            self.fadeDir = "down"

        if self.fadeDir == "down" and self.fadeAlpha <= 0:
            if self.imageNumber < 1:
                self.fadeDir = "up"
                self.sceneImage.setImage(self.nextImage())
                self.sceneImage.setTransparency(TransparencyAttrib.MAlpha)
                self.sceneImage.setAlphaScale(self.fadeAlpha)
            else:
                self.fadeDir = "up"
                base.gameMode = "Convo"
                self.sceneImage.setImage(self.sceneImageList[self.imageNumber])
                self.sceneImage.setTransparency(TransparencyAttrib.MAlpha)
                self.sceneImage.setAlphaScale(self.fadeAlpha)

    def nextImage(self):
        self.imageNumber += 1
        return self.sceneImageList[self.imageNumber]

    def initConvo(self):
        self.textToType = "This will be used for talking\nThis is a good conversation box"
        self.textVisible = ""

        self.strOptionA = "Yes"
        self.strOptionB = "No"
        self.strOptionC = "Maybe"

        self.convoResponseSelected = False
        self.convoDepth = "1"

        self.intOptionCount = 3

        #self.txtConvo = OnscreenText(self.textVisible, align = TextNode.ALeft)
        self.txtConvo = TextNode("Texty Bastard")
        self.txtConvo.setText(self.textToType)
        self.txtReply = TextNode("reply")
        self.txtReply.setText("")
        self.intHover = 0

        #self.txtConvo.setFrameColor(0, 0, 1, 1)
        #self.txtConvo.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)

        myFrame = DirectFrame(frameColor=(0.8, 0.8, 0.8, 0.4),
                              frameSize=(-1, 0, -1, 0))
        nodePathConvo = aspect2d.attachNewNode(self.txtConvo)
        nodePathConvo.setScale(0.07)
        nodePathConvo.setPos(-1, 0, -0.1)
        self.i = 0
        self.indent = 0.0
        self.selectedResponse = 0
        self.txtOptionA = OnscreenText(text="",
                                       pos=(-1, -0.6),
                                       align=TextNode.ALeft)
        self.txtOptionB = OnscreenText(text="",
                                       pos=(-1, -0.7),
                                       align=TextNode.ALeft)
        self.txtOptionC = OnscreenText(text="",
                                       pos=(-1, -0.8),
                                       align=TextNode.ALeft)

        taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate")

    def gameConvoUpdate(self, task):

        if (len(self.textVisible) != len(self.textToType)):
            task.delayTime = 0.001
            while (self.i < len(self.textToType)):

                self.textVisible += self.textToType[self.i]
                self.txtConvo.setText(self.textVisible)
                self.i += 1

                return Task.again

        else:
            taskMgr.add(self.gameConvoOptions, "ConvoOptions")
            return Task.done

    def gameConvoOptions(self, task):
        self.txtOptionA.setText(self.strOptionA)
        self.txtOptionB.setText(self.strOptionB)
        self.txtOptionC.setText(self.strOptionC)

        if self.convoResponseSelected == True:
            if self.convoCheckBranch("01", self.convoDepth):
                #self.txtConvo.setText(self.convoGetStrings("01", self.convoDepth))
                self.convoNextDialogue("01", self.convoDepth)
            else:
                #self.txtConvo.setText("It DIDn't worked")
                self.convoDepth = "1"
                self.convoNextDialogue("01", self.convoDepth)
            return Task.done

        elif self.selectedResponse == 0:
            if self.intOptionCount > 0:
                self.txtOptionA.setX(-1 + self.indent)
                self.txtOptionA.setFg(fg=(1, 0, 0, 1))
            if self.intOptionCount > 1:
                self.txtOptionB.setX(-1)
                self.txtOptionB.setFg(fg=(0, 0, 0, 1))
            if self.intOptionCount > 2:
                self.txtOptionC.setX(-1)
                self.txtOptionC.setFg(fg=(0, 0, 0, 1))
            self.indent = self.getIndent(self.indent, 0.01, 0.1)
            return Task.again

        elif self.selectedResponse == 1:
            if self.intOptionCount > 0:
                self.txtOptionA.setX(-1)
                self.txtOptionA.setFg(fg=(0, 0, 0, 1))
            if self.intOptionCount > 1:
                self.txtOptionB.setX(-1 + self.indent)
                self.txtOptionB.setFg(fg=(1, 0, 0, 1))
            if self.intOptionCount > 2:
                self.txtOptionC.setX(-1)
                self.txtOptionC.setFg(fg=(0, 0, 0, 1))
            self.indent = self.getIndent(self.indent, 0.01, 0.1)
            return Task.again

        elif self.selectedResponse == 2:
            if self.intOptionCount > 0:
                self.txtOptionA.setX(-1)
                self.txtOptionA.setFg(fg=(0, 0, 0, 1))
            if self.intOptionCount > 1:
                self.txtOptionB.setX(-1)
                self.txtOptionB.setFg(fg=(0, 0, 0, 1))
            if self.intOptionCount > 2:
                self.txtOptionC.setX(-1 + self.indent)
                self.txtOptionC.setFg(fg=(1, 0, 0, 1))
            self.indent = self.getIndent(self.indent, 0.01, 0.1)
            return Task.again

    def convoGetStrings(self, npcId, depth):
        if self.convoCheckBranch(npcId, depth) != True:
            return "#Error# String Not Found\nLooking for: " + "(" + str(
                npcId) + ")." + depth + ":"
        char = ""
        line = ""
        feed = ""

        path = os.path.abspath(os.getcwd())
        f = open(path + "\\text\\stringsConvo.txt", "r")
        while line != "(" + str(npcId) + ")." + depth + ":":
            while char != ":":
                char = f.readline(1)
                line += char
            feed += "\n" + line
            if line != "(" + str(npcId) + ")." + depth + ":":
                char = ""
                line = ""
                f.readline()
        print(feed + " Selected")
        f.readline(1)
        line = f.readline()
        line = line.replace("##", "\n")
        f.close()
        return line

    def convoCheckBranch(self, npcId, depth):
        path = os.path.abspath(os.getcwd())
        f = open(path + "\\text\\stringsConvo.txt", "r")
        char = ""
        line = ""
        branchFound = False

        while line != "<END>:":
            char = ""
            line = ""
            while char != ":":
                char = f.readline(1)
                line += char
            if line == "<END>:":
                f.close()
                return False
            elif line == "(" + str(npcId) + ")." + str(depth) + ":":
                f.close()
                return True
            else:
                f.readline()

    def convoNextDialogue(self, npcId, depth):
        self.textToType = self.convoGetStrings(npcId, depth)
        self.intOptionCount = self.convoGetOptionCount(npcId, depth)

        if self.intOptionCount == 1:
            self.strOptionA = self.convoGetStrings(npcId, depth + ".A")
            self.strOptionB = ""
            self.strOptionC = ""
        elif self.intOptionCount == 2:
            self.strOptionA = self.convoGetStrings(npcId, depth + ".A")
            self.strOptionB = self.convoGetStrings(npcId, depth + ".B")
            self.strOptionC = ""
        elif self.intOptionCount == 3:
            self.strOptionA = self.convoGetStrings(npcId, depth + ".A")
            self.strOptionB = self.convoGetStrings(npcId, depth + ".B")
            self.strOptionC = self.convoGetStrings(npcId, depth + ".C")
        else:
            self.strOptionA = ""
            self.strOptionB = ""
            self.strOptionC = ""

        self.textVisible = ""
        self.txtOptionA.setText("")
        self.txtOptionB.setText("")
        self.txtOptionC.setText("")
        self.txtConvo.setText(self.textVisible)
        #self.intOptionCount = 2
        self.selectedResponse = 0
        self.i = 0
        self.convoResponseSelected = False
        taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate")

    def convoGetOptionCount(self, npcId, depth):
        if self.convoCheckBranch(
                npcId, depth + ".A") and self.convoCheckBranch(
                    npcId, depth + ".B") and self.convoCheckBranch(
                        npcId, depth + ".C"):
            return 3
        elif self.convoCheckBranch(npcId,
                                   depth + ".A") and self.convoCheckBranch(
                                       npcId, depth + ".B"):
            return 2
        elif self.convoCheckBranch(npcId, depth + ".A"):
            return 1
        else:
            return 0

    def getIndent(self, value, increment, limit):
        if (value + increment >= limit):
            return limit
        else:
            return value + increment

    def setupKeyboard(self):
        self.accept("arrow_down", self.convoOptionDown)
        self.accept("arrow_up", self.convoOptionUp)
        self.accept("enter", self.convoOptionSelect)

    def convoOptionUp(self):
        self.indent = 0.0
        if self.selectedResponse == 0:
            self.selectedResponse = self.intOptionCount - 1
        elif self.selectedResponse > 0:
            self.selectedResponse -= 1

    def convoOptionDown(self):
        self.indent = 0.0
        if self.selectedResponse < self.intOptionCount - 1:
            self.selectedResponse += 1
        elif self.selectedResponse == self.intOptionCount - 1:
            self.selectedResponse = 0

    def convoOptionSelect(self):
        if self.selectedResponse == 0:
            self.convoDepth += ".A.1"
        elif self.selectedResponse == 1:
            self.convoDepth += ".B.1"
        elif self.selectedResponse == 2:
            self.convoDepth += ".C.1"

        self.convoResponseSelected = True
Exemple #10
0
class MyApp(ShowBase):
    gameMode = "Intro"

    def __init__(self):
        ShowBase.__init__(self)

        #self.cameraSetup()
        self.setupKeyboard()

        self.initIntro()

    def gameChangeMode(self):
        if base.gameMode == "Intro":
            self.initIntro()
        elif base.gameMode == "Convo":
            self.initConvo()

    def initIntro(self):
        self.fadeAlpha = 0.0
        self.fadeTime = 30.0
        self.fadeInc = 1.0/self.fadeTime
        self.fadeDir = "up"

        self.sceneImage = OnscreenImage(image = "images/scene.png", scale = (1920.0/1080.0,1,1))
        self.sceneImage.setTransparency(TransparencyAttrib.MAlpha)
        self.sceneImage.setAlphaScale(self.fadeAlpha)

        self.imageNumber = 0
        self.sceneImageList = ["images/scene.png","images/image1.jpg"]

        #self.texty = OnscreenText(str(self.fadeAlpha))

        taskMgr.add(self.gameIntroUpdate, "GameIntroUpdate")

    def gameIntroUpdate(self, task):
        self.slideManager()
        if (base.gameMode != "Intro"):
            self.gameChangeMode()
            return Task.done

        return Task.cont

    def cameraSetup(self):
        base.camLens.setAspectRatio(1920.0/1080.0)

    def slideManager(self):
        if self.fadeDir == "up" and self.fadeAlpha<1:
            self.fadeAlpha += self.fadeInc
            self.sceneImage.setAlphaScale(self.fadeAlpha)
            #self.texty.setText(str(self.fadeAlpha))

        if self.fadeDir == "down" and self.fadeAlpha > 0:
            self.fadeAlpha -= self.fadeInc
            self.sceneImage.setAlphaScale(self.fadeAlpha)

        if self.fadeDir == "up" and self.fadeAlpha >= 1:
            self.fadeDir = "down"

        if self.fadeDir == "down" and self.fadeAlpha <= 0:
            if self.imageNumber < 1:
                self.fadeDir = "up"
                self.sceneImage.setImage(self.nextImage())
                self.sceneImage.setTransparency(TransparencyAttrib.MAlpha)
                self.sceneImage.setAlphaScale(self.fadeAlpha)
            else:
                self.fadeDir = "up"
                base.gameMode = "Convo"
                self.sceneImage.setImage(self.sceneImageList[self.imageNumber])
                self.sceneImage.setTransparency(TransparencyAttrib.MAlpha)
                self.sceneImage.setAlphaScale(self.fadeAlpha)

    def nextImage(self):
            self.imageNumber += 1
            return self.sceneImageList[self.imageNumber]

    def initConvo(self):
        self.textToType = "This will be used for talking\nThis is a good conversation box"
        self.textVisible = ""

        self.strOptionA = "Yes"
        self.strOptionB = "No"
        self.strOptionC = "Maybe"

        self.convoResponseSelected = False
        self.convoDepth = "1"

        self.intOptionCount = 3

        #self.txtConvo = OnscreenText(self.textVisible, align = TextNode.ALeft)
        self.txtConvo = TextNode("Texty Bastard")
        self.txtConvo.setText(self.textToType)
        self.txtReply = TextNode("reply")
        self.txtReply.setText("")
        self.intHover = 0

        #self.txtConvo.setFrameColor(0, 0, 1, 1)
        #self.txtConvo.setFrameAsMargin(0.2, 0.2, 0.1, 0.1)



        myFrame = DirectFrame(frameColor=(0.8, 0.8, 0.8, 0.4),
                      frameSize=(-1, 0, -1, 0))
        nodePathConvo = aspect2d.attachNewNode(self.txtConvo)
        nodePathConvo.setScale(0.07)
        nodePathConvo.setPos(-1, 0, -0.1)
        self.i = 0
        self.indent = 0.0
        self.selectedResponse = 0
        self.txtOptionA = OnscreenText(text = "", pos = (-1,-0.6), align = TextNode.ALeft)
        self.txtOptionB = OnscreenText(text = "", pos = (-1,-0.7), align = TextNode.ALeft)
        self.txtOptionC = OnscreenText(text = "", pos = (-1,-0.8), align = TextNode.ALeft)

        taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate")

    def gameConvoUpdate(self, task):

        if (len(self.textVisible) != len(self.textToType)):
			task.delayTime = 0.001
			while (self.i < len(self.textToType)):

				self.textVisible += self.textToType[self.i]
				self.txtConvo.setText(self.textVisible)
				self.i += 1

				return Task.again

        else:
            taskMgr.add(self.gameConvoOptions, "ConvoOptions")
            return Task.done

    def gameConvoOptions(self, task):
        self.txtOptionA.setText(self.strOptionA)
        self.txtOptionB.setText(self.strOptionB)
        self.txtOptionC.setText(self.strOptionC)

        if self.convoResponseSelected == True:
            if self.convoCheckBranch("01", self.convoDepth):
                #self.txtConvo.setText(self.convoGetStrings("01", self.convoDepth))
                self.convoNextDialogue("01", self.convoDepth)
            else:
                #self.txtConvo.setText("It DIDn't worked")
                self.convoDepth = "1"
                self.convoNextDialogue("01", self.convoDepth)
            return Task.done

        elif self.selectedResponse == 0:
            if self.intOptionCount > 0:
                self.txtOptionA.setX(-1+self.indent)
                self.txtOptionA.setFg(fg = (1,0,0,1))
            if self.intOptionCount > 1:
                self.txtOptionB.setX(-1)
                self.txtOptionB.setFg(fg = (0,0,0,1))
            if self.intOptionCount > 2:
                self.txtOptionC.setX(-1)
                self.txtOptionC.setFg(fg = (0,0,0,1))
            self.indent = self.getIndent(self.indent,0.01,0.1)
            return Task.again

        elif self.selectedResponse == 1:
            if self.intOptionCount > 0:
                self.txtOptionA.setX(-1)
                self.txtOptionA.setFg(fg = (0,0,0,1))
            if self.intOptionCount > 1:
                self.txtOptionB.setX(-1+self.indent)
                self.txtOptionB.setFg(fg = (1,0,0,1))
            if self.intOptionCount > 2:
                self.txtOptionC.setX(-1)
                self.txtOptionC.setFg(fg = (0,0,0,1))
            self.indent = self.getIndent(self.indent,0.01,0.1)
            return Task.again

        elif self.selectedResponse == 2:
            if self.intOptionCount > 0:
                self.txtOptionA.setX(-1)
                self.txtOptionA.setFg(fg = (0,0,0,1))
            if self.intOptionCount > 1:
                self.txtOptionB.setX(-1)
                self.txtOptionB.setFg(fg = (0,0,0,1))
            if self.intOptionCount > 2:
                self.txtOptionC.setX(-1+self.indent)
                self.txtOptionC.setFg(fg = (1,0,0,1))
            self.indent = self.getIndent(self.indent,0.01,0.1)
            return Task.again

    def convoGetStrings(self,npcId,depth):
        if self.convoCheckBranch(npcId,depth) != True:
            return "#Error# String Not Found\nLooking for: "+"("+str(npcId)+")."+depth+":"
        char = ""
        line = ""
        feed = ""



        path = os.path.abspath(os.getcwd())
        f = open(path+"\\text\\stringsConvo.txt","r")
        while line != "("+str(npcId)+")."+depth+":":
            while char != ":":
                char = f.readline(1)
                line += char
            feed += "\n"+line
            if line != "("+str(npcId)+")."+depth+":":
                char = ""
                line = ""
                f.readline()
        print(feed + " Selected")
        f.readline(1)
        line = f.readline()
        line = line.replace("##", "\n")
        f.close()
        return line

    def convoCheckBranch(self,npcId,depth):
        path = os.path.abspath(os.getcwd())
        f = open(path+"\\text\\stringsConvo.txt","r")
        char = ""
        line = ""
        branchFound = False

        while line != "<END>:":
            char = ""
            line = ""
            while char != ":":
                char = f.readline(1)
                line += char
            if line == "<END>:":
                f.close()
                return False
            elif line == "("+str(npcId)+")."+str(depth)+":":
                f.close()
                return True
            else:
                f.readline()

    def convoNextDialogue(self,npcId,depth):
        self.textToType = self.convoGetStrings(npcId, depth)
        self.intOptionCount = self.convoGetOptionCount(npcId, depth)

        if self.intOptionCount == 1:
            self.strOptionA = self.convoGetStrings(npcId, depth+".A")
            self.strOptionB = ""
            self.strOptionC = ""
        elif self.intOptionCount == 2:
            self.strOptionA = self.convoGetStrings(npcId, depth+".A")
            self.strOptionB = self.convoGetStrings(npcId, depth+".B")
            self.strOptionC = ""
        elif self.intOptionCount == 3:
            self.strOptionA = self.convoGetStrings(npcId, depth+".A")
            self.strOptionB = self.convoGetStrings(npcId, depth+".B")
            self.strOptionC = self.convoGetStrings(npcId, depth+".C")
        else:
            self.strOptionA = ""
            self.strOptionB = ""
            self.strOptionC = ""

        self.textVisible = ""
        self.txtOptionA.setText("")
        self.txtOptionB.setText("")
        self.txtOptionC.setText("")
        self.txtConvo.setText(self.textVisible)
        #self.intOptionCount = 2
        self.selectedResponse = 0
        self.i = 0
        self.convoResponseSelected = False
        taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate")

    def convoGetOptionCount(self,npcId,depth):
        if self.convoCheckBranch(npcId,depth+".A") and self.convoCheckBranch(npcId,depth+".B") and self.convoCheckBranch(npcId,depth+".C"):
            return 3
        elif self.convoCheckBranch(npcId,depth+".A") and self.convoCheckBranch(npcId,depth+".B"):
            return 2
        elif self.convoCheckBranch(npcId,depth+".A"):
            return 1
        else:
            return 0

    def getIndent(self, value, increment, limit):
        if (value + increment >= limit):
            return limit
        else:
            return value+increment

    def setupKeyboard(self):
        self.accept("arrow_down", self.convoOptionDown)
        self.accept("arrow_up", self.convoOptionUp)
        self.accept("enter",self.convoOptionSelect)

    def convoOptionUp(self):
        self.indent = 0.0
        if self.selectedResponse == 0:
            self.selectedResponse = self.intOptionCount-1
        elif self.selectedResponse > 0:
            self.selectedResponse -= 1

    def convoOptionDown(self):
        self.indent = 0.0
        if self.selectedResponse < self.intOptionCount-1:
            self.selectedResponse += 1
        elif self.selectedResponse == self.intOptionCount-1:
            self.selectedResponse = 0

    def convoOptionSelect(self):
        if self.selectedResponse == 0:
            self.convoDepth += ".A.1"
        elif self.selectedResponse == 1:
            self.convoDepth += ".B.1"
        elif self.selectedResponse == 2:
            self.convoDepth += ".C.1"

        self.convoResponseSelected = True