Example #1
0
File: menu.py Project: twchen88/OUT
class Instructions:
    def __init__(self):
        self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight,
                            base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0))
        self.frameMain.setTransparency(1)
        self.content = DirectLabel(scale = 0.1, pos = (0.0, 0.0, base.a2dTop - 0.25),
                            frameColor = (0, 0, 0, 0), text="Place hand above leap motion to control the sword.\nPress 'o' to open chest.\nPress space to open door to next level.\nUse WSAD to control motion.\nTurn left and right using Q and E.\n You can only enter the next level when you have \n killed more than 15 enemies. Good luck!", text_fg=(1,1,1,1))
        self.content.setTransparency(1)
        self.content.reparentTo(self.frameMain)
        self.btnStartGame = self.createButton("Start Game", -0.25, ["Instructions-startGame"])
        self.btnExit = self.createButton("Quit", -0.75, ["Menu-Quit"])
        # background image from https://www.shutterstock.com/it/video/clip-5477162-dark-scary-dungeon-high-definition
        self.frameBackground = DirectFrame(image = ('models/startmenutest.jpg'), sortOrder = (-1),
                frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop))
        self.frameBackground.reparentTo(render2d)
        self.hide()
    
    def createButton(self, text,verticalPos, eventArgs):
        btn = DirectButton(text=text,scale=0.25, pos=(0,0,verticalPos), command=base.messenger.send,
                            extraArgs=eventArgs, rolloverSound=None, clickSound=None)
        btn.reparentTo(self.frameMain)

    def show(self):
        self.frameMain.show()
        self.frameBackground.show()

    def hide(self):
        self.frameMain.hide()
        self.frameBackground.hide()
Example #2
0
File: menu.py Project: twchen88/OUT
class Win:
    def __init__(self):
        self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight,
                            base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0))
        self.frameMain.setTransparency(1)
        self.content = DirectLabel(scale = 0.1, pos = (0.0, 0.0, base.a2dTop - 1),
                            frameColor = (0, 0, 0, 0), text="Congratulations, warrior! \n You successfully got OUT of that ugly place...", text_fg=(1,1,1,1))
        self.content.setTransparency(1)
        self.content.reparentTo(self.frameMain)
        self.btnExit = self.createButton("Leave", -0.75, ["Menu-Quit"])
        # background image from http://ajuntament.barcelona.cat/castelldemontjuic/en/activitats/noticies/we-open-dungeons-castle
        self.frameBackground = DirectFrame(image = ('models/winBackground.jpg'), sortOrder = (-1),
                frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop))
        self.frameBackground.reparentTo(render2d)
        self.hide()
    
    def createButton(self, text,verticalPos, eventArgs):
        btn = DirectButton(text=text,scale=0.15, pos=(0,0,verticalPos), command=base.messenger.send,
                            extraArgs=eventArgs, rolloverSound=None, clickSound=None)
        btn.reparentTo(self.frameMain)

    def show(self):
        self.frameMain.show()
        self.frameBackground.show()

    def hide(self):
        self.frameMain.hide()
        self.frameBackground.hide()
Example #3
0
File: menu.py Project: twchen88/OUT
class EndMenu:
    def __init__(self):
        self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight,
                            base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0))
        self.frameMain.setTransparency(1)
        
        self.title = DirectLabel(scale = 0.25, pos = (0.0, 0.0, base.a2dTop - 0.25),
                            frameColor = (0, 0, 0, 0), text="Unlucky...\nTry next time", text_fg=(1,1,1,1))
        self.title.setTransparency(1)
        self.title.reparentTo(self.frameMain)
        # background image taken from http://www.leagueittous.com/2015/03/12/sorry-you-lose/
        self.frameBackground = DirectFrame(image = ('models/game-over.png'), sortOrder = (-1),
                frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop))
        self.frameBackground.reparentTo(render2d)
        self.btnExit = self.createButton("Quit", -0.75, ["Menu-Quit"])
        self.hide()
    
    def createButton(self, text,verticalPos, eventArgs):
        btn = DirectButton(text=text,scale=0.25, pos=(0,0,verticalPos), command=base.messenger.send,
                            extraArgs=eventArgs, rolloverSound=None, clickSound=None)
        btn.reparentTo(self.frameMain)

    def show(self):
        self.frameMain.show()
        self.frameBackground.show()

    def hide(self):
        self.frameMain.hide()
        self.frameBackground.hide()
Example #4
0
File: menu.py Project: twchen88/OUT
class StartMenu:
    def __init__(self):
        self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight,
                            base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0))
        self.frameMain.setTransparency(1)
        # background image from https://www.shutterstock.com/it/video/clip-5477162-dark-scary-dungeon-high-definition
        self.frameBackground = DirectFrame(image = ('models/startmenutest.jpg'), sortOrder = (-1),
                frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop))
        self.frameBackground.reparentTo(render2d)
        
        self.title = DirectLabel(scale = 0.25, pos = (0.0, 0.0, base.a2dTop - 0.25),
                            frameColor = (0, 0, 0, 0), text="OUT", text_fg=(1,1,1,1))
        self.title.setTransparency(1)
        self.title.reparentTo(self.frameMain)
        self.btnStart = self.createButton("Start", 0.25, ["Menu-Start"])
        self.btnInstr = self.createButton('Instructions', -0.25, ['Menu-Instructions'])
        self.btnExit = self.createButton("Quit", -0.75, ["Menu-Quit"])
        
        self.hide()
    
    # create buttons
    def createButton(self, text,verticalPos, eventArgs):
        btn = DirectButton(text=text,scale=0.25, pos=(0,0,verticalPos), command=base.messenger.send,
                            extraArgs=eventArgs, rolloverSound=None, clickSound=None)
        btn.reparentTo(self.frameMain)

    def show(self):
        self.frameMain.show()
        self.frameBackground.show()

    def hide(self):
        self.frameMain.hide()
        self.frameBackground.hide()
 def getGuestItem(self, name, inviteStatus):
     label = DirectLabel(relief=None, text=name, text_scale=0.045, text_align=TextNode.ALeft, textMayChange=True)
     dot = DirectFrame(relief=None, geom=self.hostingGui.find('**/questionMark'), pos=(0.5, 0.0, 0.01))
     if inviteStatus == PartyGlobals.InviteStatus.Accepted:
         dot['geom'] = (self.hostingGui.find('**/checkmark'),)
     elif inviteStatus == PartyGlobals.InviteStatus.Rejected:
         dot['geom'] = (self.hostingGui.find('**/x'),)
     PartyUtils.truncateTextOfLabelBasedOnWidth(label, name, PartyGlobals.EventsPageGuestNameMaxWidth)
     dot.reparentTo(label)
     return label
Example #6
0
class AlertPopup(DirectObject):
    
    def __init__(self, title, message, okayFunction, cancelFunction):
        self.okayFunction = okayFunction
        self.cancelFunction = cancelFunction
        self.node = aspect2d.attachNewNode('alertPopup')
        self.frame = DirectFrame()
        self.LoadContent(title, message)
        self.frame.reparentTo(self.node)
        
    def LoadContent(self, title, message):
        bg = OnscreenImage(image = 'Assets/Images/Inventory/BlackScreen.png', scale = (2, 1, 1))
        bg.setTransparency(TransparencyAttrib.MAlpha)
        bg.reparentTo(self.node)
        
        popup = OnscreenImage(image = 'Assets/Images/Menus/Popups/popup.png')
        popup.setTransparency(TransparencyAttrib.MAlpha)
        popup.reparentTo(self.node)
        
        titleText = OnscreenText(text = title, pos = (-0.29, 0.51), scale = 0.07, fg = (1, 1, 1, 1))
        titleText.reparentTo(self.node)
        
        self.LoadButton('Button_Okay', 'okay', 'okay_over', -0.27, -0.13, self.OnButtonClicked, ['okay'])
        self.LoadButton('Button_Cancel', 'cancel', 'cancel_over', 0.27, -0.13, self.OnButtonClicked, ['cancel'])
        
        messageText = OnscreenText(text = message, pos = (0, 0.2), scale = 0.07, fg = (1, 1, 1, 1))
        messageText.reparentTo(self.node)
        
    def LoadButton(self, egg, up, over, x, y, cmd, args):
        maps = loader.loadModel("Assets/Images/Menus/Popups/%s" % (egg))
        b = DirectButton(geom = (maps.find('**/%s' % (up)),
                         maps.find('**/%s' % (over)),
                         maps.find('**/%s' % (over)),
                         maps.find('**/%s' % (up))),
                         command = cmd,
                         extraArgs = args,
                         pressEffect = 0,
                         relief = None,
                         rolloverSound = None, 
                         clickSound = None,
                         pos = (x, 1, y),
                         scale = (0.5, 1, 60.0/400.0))
        b.reparentTo(self.frame)
        
    def Destroy(self):
        self.frame.destroy()
        self.node.removeNode()
        
    def OnButtonClicked(self, buttonText):
        if(buttonText == 'okay'):
            self.okayFunction(self)
        elif(buttonText == 'cancel'):
            self.cancelFunction(self)
            
            
Example #7
0
class LoadingScreen():
    """Show a directWaitbar to display the current loading state of the
    application"""
    def __init__(self):
        # a fill panel so the player doesn't see how everything
        # gets loaded in the background
        self.frameMain = DirectFrame(
            image="gui/MenuBackground.png",
            image_scale=(1.7778, 1, 1),
            #image_pos=(0, 0, 0.25),
            frameSize=(
                base.a2dLeft, base.a2dRight,
                base.a2dTop, base.a2dBottom),
            frameColor=(0,0,0,0))
        self.frameMain.setTransparency(True)
        self.frameMain.setBin("fixed", 6000)
        self.frameMain.setDepthWrite(False)

        self.logo = DirectFrame(
            image="Logo.png",
            image_scale=0.25,
            image_pos=(0, 0, 0.55),
            frameSize=(
                base.a2dLeft, base.a2dRight,
                base.a2dTop, base.a2dBottom),
            frameColor=(0,0,0,0))
        self.logo.reparentTo(self.frameMain)


        # the text Loading...
        self.lblLoading = DirectLabel(
            scale=0.10,
            pos=(0, 0, -0.15),
            frameColor=(0, 0, 0, 0),
            text=_("Loading..."),
            text_align=TextNode.ACenter,
            text_fg=(1, 1, 1, 1))
        self.lblLoading.reparentTo(self.frameMain)

        self.stop()

    def start(self):
        self.frameMain.show()
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()

    def stop(self):
        self.frameMain.hide()
Example #8
0
 def getGuestItem(self, name, inviteStatus):
     label = DirectLabel(relief=None,
                         text=name,
                         text_scale=0.045,
                         text_align=TextNode.ALeft,
                         textMayChange=True)
     dot = DirectFrame(relief=None,
                       geom=self.hostingGui.find('**/questionMark'),
                       pos=(0.5, 0.0, 0.01))
     if inviteStatus == PartyGlobals.InviteStatus.Accepted:
         dot['geom'] = (self.hostingGui.find('**/checkmark'), )
     elif inviteStatus == PartyGlobals.InviteStatus.Rejected:
         dot['geom'] = (self.hostingGui.find('**/x'), )
     PartyUtils.truncateTextOfLabelBasedOnWidth(
         label, name, PartyGlobals.EventsPageGuestNameMaxWidth)
     dot.reparentTo(label)
     return label
Example #9
0
class Mainmenu():
    def __init__(self):
        self.frameMain = DirectFrame(
            image="gui/MenuBackground.png",
            image_scale=(1.7778, 1, 1),
            #image_pos=(0, 0, 0.25),
            frameSize=(
                base.a2dLeft, base.a2dRight,
                base.a2dTop, base.a2dBottom),
            frameColor=(0,0,0,0))
        self.frameMain.setTransparency(True)

        self.logo = DirectFrame(
            image="Logo.png",
            image_scale=0.45,
            image_pos=(0, 0, 0.35),
            frameSize=(
                base.a2dLeft, base.a2dRight,
                base.a2dTop, base.a2dBottom),
            frameColor=(0,0,0,0))
        self.logo.reparentTo(self.frameMain)

        btnGeom = "gui/button"

        self.btnStart = menuHelper.createButton(_("Start"), btnGeom, 0, -0.7, ["menu_start"])
        self.btnStart.reparentTo(self.frameMain)

        self.btnOptions = menuHelper.createButton(_("Options"), btnGeom, -1.0, -0.7, ["menu_options"])
        self.btnOptions.reparentTo(self.frameMain)

        self.btnQuit = menuHelper.createButton(_("Quit"), btnGeom, 1.0, -0.7, ["menu_quit"])
        self.btnQuit.reparentTo(self.frameMain)

        self.hide()

    def show(self):
        self.frameMain.show()

    def hide(self):
        self.frameMain.hide()
Example #10
0
class CraftInventory(DirectObject):
    def __init__(self):
        self.itemFrame = DirectScrolledFrame(
            text="Inventory",
            text_scale=0.25,
            text_pos=(0, 0.75, 0),
            text_bg=(1, 1, 1, 1),
            # make the frame occupy the whole window
            frameSize=(-0.6, 0.6, -0.8, 0.8),
            pos=(-0.7, 0, 0),
            # make the canvas as big as the frame
            canvasSize=(-0.6, 0.6, -0.8, 0.8),
            # set the frames color to white
            frameColor=(1, 1, 1, 1),
        )
        self.itemList = []

        self.craftFrame = DirectFrame(
            text="Crafting",
            text_scale=0.25,
            text_pos=(0, 0.75, 0),
            text_bg=(1, 1, 1, 1),
            # make the frame occupy the whole window
            frameSize=(-0.6, 0.6, -0.8, 0.8),
            pos=(0.7, 0, 0),
            # set the frames color to white
            frameColor=(1, 1, 1, 1),
        )
        self.craftDrop = DirectFrame(
            text="drop ore",
            text_scale=0.1,
            pos=(0, 0.4, 0),
            frameSize=(-0.25, 0.25, -0.25, 0.25),
            frameColor=(1, 0, 0, 1),
        )
        self.craftDrop.reparentTo(self.craftFrame)

    def show(self):
        self.itemFrame.show()
        self.craftFrame.show()

    def hide(self):
        self.itemFrame.hide()
        self.craftFrame.hide()

    def __makeItem(self, item):
        obj = DirectLabel(
            text=str(item.giveLoot()) + "x " + item.giveType(),
            text_scale=0.5,
            text_pos=(0, -1, 0),
            image=("item.png", "item_hover.png", "item.png"),  # normal, hover, disabled
            scale=0.16,
            numStates=2,
            state=DGG.NORMAL,
            relief=DGG.GROOVE,
        )
        obj.setTransparency(True)
        obj["activeState"] = 0
        obj.reparentTo(self.itemFrame.getCanvas())
        obj.bind(DGG.B1PRESS, self.dragStart, [obj])
        obj.bind(DGG.B1RELEASE, self.dragStop)
        obj.bind(DGG.ENTER, self.inObject, [obj])
        obj.bind(DGG.EXIT, self.outObject, [obj])
        return obj

    def updateList(self, items):
        for item in self.itemList:
            item.destroy()
        i = 1
        j = 0
        pad = 0.2
        numItemsPerRow = 2
        itemWidth = 0.32
        itemHeight = 0.32
        # left = -(itemWidth * (numItemsPerRow/2.0)) - 0.16
        left = self.itemFrame.getX()  # + (itemWidth + 0.16)
        xStep = itemWidth + 0.13
        yStep = -(itemHeight + 0.13)
        top = 0.8 - (0.16 + pad)
        for item in items:
            self.itemList.append(self.__makeItem(item))
            x = left + i * xStep
            y = top + j * yStep
            self.itemList[-1].setPos(x, 0.0, y)
            if i == numItemsPerRow:
                i = 0
                j += 1
            i += 1
        if i == 1:
            j -= 1
        height = ((j) * -yStep) - 0.16
        # resize the canvas. This will make the scrollbars dis-/appear,
        # dependent on if the canvas is bigger than the frame size.
        self.itemFrame["canvasSize"] = (-0.6, 0.6, -height, 0.8)

    def inObject(self, element, event):
        # Can be used to highlight objects
        element["activeState"] = 1
        element.setActiveState()
        # print "over object"

    def outObject(self, element, event):
        # Can be used to unhighlight objects
        # element["state"] = 0
        element["activeState"] = 0
        element.setActiveState()

    def dragStart(self, element, event):
        print "start drag"
        taskMgr.remove("dragDropTask")
        vWidget2render2d = element.getPos(render2d)
        vMouse2render2d = Point3(event.getMouse()[0], 0, event.getMouse()[1])
        editVec = Vec3(vWidget2render2d - vMouse2render2d)
        t = taskMgr.add(self.dragTask, "dragDropTask")
        element.reparentTo(aspect2d)
        t.element = element
        t.editVec = editVec
        t.elementStartPos = element.getPos()

    def dragTask(self, state):
        mwn = base.mouseWatcherNode
        if mwn.hasMouse():
            vMouse2render2d = Point3(mwn.getMouse()[0], 0, mwn.getMouse()[1])
            newPos = vMouse2render2d + state.editVec
            state.element.setPos(render2d, newPos)
        return Task.cont

    def dragStop(self, event):
        print "stop drag with:", event
        isInArea = False

        t = taskMgr.getTasksNamed("dragDropTask")[0]
        # for dropArea in self.dropAreas:
        #    if self.isInBounds(event.getMouse(), dropArea["frameSize"], dropArea.getPos(render)):
        #        print "inside Area:", dropArea["text"], dropArea.getPos(render)
        #        isInArea = True
        #        t.element.setPos(dropArea.getPos(render))
        #        t.element.setX(t.element.getX() * self.ratio)
        #        #t.element.setX(t.element.getX() - t.element.getWidth() / 2.0)
        #        break

        if not isInArea:
            t.element.setPos(t.elementStartPos)
            t.element.reparentTo(self.itemFrame.getCanvas())
        taskMgr.remove("dragDropTask")

    def isInBounds(self, location, bounds, posShift=None):
        x = 0 if posShift is None else posShift.getX()
        y = 0 if posShift is None else posShift.getZ()

        left = x + bounds[0]
        right = x + bounds[1]
        bottom = y + bounds[2]
        top = y + bounds[3]

        # are we outside of the bounding box from the left
        if location[0] < left:
            return False
        # are we outside of the bounding box from the right
        if location[0] > right:
            return False
        # are we outside of the bounding box from the bottom
        if location[1] < bottom:
            return False
        # are we outside of the bounding box from the top
        if location[1] > top:
            return False
        # the location is inside the bbox
        return True
class CIProgressScreen:

    Color = (118 / 255.0, 121 / 255.0, 127 / 255.0, 1.0)
    BarColor = (152 / 255.0, 129 / 255.0, 64 / 255.0, 1.0)

    def __init__(self):
        self.defaultLogoScale = 1
        self.defaultLogoZ = 0.65
        self.bgm = loader.loadModel(
            "phase_3/models/gui/progress-background.bam")
        self.bgm.find('**/logo').stash()
        self.barShadow = OnscreenImage(image=self.bgm.find("**/bar_shadow"),
                                       parent=hidden)
        self.bgm.find("**/bar_shadow").removeNode()
        self.bg = self.bgm.find('**/bg')
        self.defaultBgTexture = self.bg.findTexture('*')

        self.logoNode, self.logoImg = CIGlobals.getLogoImage(
            hidden, self.defaultLogoScale, (0, 0, self.defaultLogoZ))

        self.bg_img = OnscreenImage(image=self.bg, parent=hidden)
        self.bg_img.setSx(1.35)
        self.bg_img.hide()
        self.progress_bar = DirectWaitBar(value=0,
                                          pos=(0, 0, -0.85),
                                          parent=hidden,
                                          text_pos=(0, 0, 0.2))
        self.progress_bar.setSx(1.064)
        self.progress_bar.setSz(0.38)
        toontipgui = loader.loadModel(
            'phase_3.5/models/gui/stickerbook_gui.bam')
        poster = toontipgui.find('**/questCard')
        self.toontipFrame = DirectFrame(image=poster,
                                        image_scale=(1.4, 1, 1),
                                        parent=hidden,
                                        relief=None,
                                        pos=(0, 0, -0.1),
                                        scale=0.85)
        self.toontipLbl = OnscreenText(text="",
                                       parent=self.toontipFrame,
                                       fg=(89.0 / 255, 95.0 / 255, 98.0 / 255,
                                           1),
                                       font=CIGlobals.getToonFont(),
                                       wordwrap=13,
                                       pos=(-0.59, 0.25),
                                       align=TextNode.ALeft,
                                       scale=0.08)
        self.loading_lbl = DirectLabel(text="",
                                       relief=None,
                                       scale=0.08,
                                       pos=(-1.0725, 0, -0.79),
                                       text_align=TextNode.ALeft,
                                       sortOrder=100,
                                       text_fg=(1, 1, 1, 1),
                                       text_font=CIGlobals.getMinnieLogoFont(),
                                       parent=hidden,
                                       text_shadow=(0, 0, 0, 0))

        # This is useful when the user has chosen to hide aspect2d before the loading screen.
        # However, we want to show the loading screen all the time, so we need to restore the
        # previous state after the loading screen ends.
        self.mustRestoreHiddenAspect2d = False

    def begin(self, hood, range, wantGui):
        render.hide()
        NametagGlobals.setWant2dNametags(False)

        if base.aspect2d.isHidden():
            base.aspect2d.show()
            self.mustRestoreHiddenAspect2d = True

        self.renderFrames()
        base.setBackgroundColor(0, 0, 0)
        if hood == "localAvatarEnterGame":
            self.loading_lbl['text'] = "Entering..."
        elif hood == "init":
            self.loading_lbl['text'] = "Loading..."
        else:
            self.loading_lbl['text'] = "Heading to %s..." % hood
        self.progress_bar['barColor'] = self.BarColor
        self.progress_bar['range'] = range
        self.bgm.reparentTo(aspect2d)

        ZoneUtil.Hood2ZoneId.keys()

        # We only want to show special loading screens for actual in-game locations.
        if hood in ZoneUtil.Hood2ZoneId.keys():
            abbr = ZoneUtil.ZoneId2HoodAbbr.get(
                ZoneUtil.Hood2ZoneId.get(hood)).lower()
            bgTexture = loader.loadTexture(
                'phase_14/maps/{0}_loading.png'.format(abbr), okMissing=True)

            if bgTexture:
                self.bg.setTexture(bgTexture, 1)

        self.barShadow.reparentTo(aspect2d)
        self.bg.reparentTo(render2d)
        self.bg_img.reparentTo(hidden)
        self.loading_lbl.reparentTo(aspect2d)
        self.logoNode.reparentTo(aspect2d)
        self.progress_bar.reparentTo(aspect2d)
        tip = random.choice(CIGlobals.ToonTips)
        self.toontipLbl.setText("TOON TIP:\n" + tip)
        self.toontipFrame.reparentTo(aspect2d)
        self.__count = 0
        self.__expectedCount = range
        self.progress_bar.update(self.__count)

    def renderFramesTask(self, task):
        self.renderFrames()
        return task.cont

    def end(self):
        base.setBackgroundColor(CIGlobals.DefaultBackgroundColor)
        taskMgr.remove("renderFrames")
        render.show()

        if self.mustRestoreHiddenAspect2d:
            base.aspect2d.hide()
            self.mustRestoreHiddenAspect2d = False

        self.progress_bar.finish()
        self.bg_img.reparentTo(hidden)
        self.logoNode.reparentTo(hidden)
        self.barShadow.reparentTo(hidden)
        self.bg.reparentTo(hidden)

        # Let's get rid of the extra texture stage.
        self.bg.setTexture(self.defaultBgTexture, 1)

        self.bgm.reparentTo(hidden)
        self.loading_lbl.reparentTo(hidden)
        self.progress_bar.reparentTo(hidden)
        self.toontipFrame.reparentTo(hidden)
        base.transitions.fadeScreen(1.0)
        NametagGlobals.setWant2dNametags(True)
        self.renderFrames()

    def destroy(self):
        self.bg.removeNode()
        del self.bg
        self.bgm.removeNode()
        del self.bgm
        self.bg_img.destroy()
        self.barShadow.destroy()
        del self.barShadow
        self.loading_lbl.destroy()
        self.progress_bar.destroy()
        self.bgm.destroy()
        self.mustRestoreHiddenAspect2d = False
        del self.bg_img
        del self.loading_lbl
        del self.progress_bar
        del self.bgm
        del self.defaultBgTexture
        del self.mustRestoreHiddenAspect2d

    def renderFrames(self):
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()

    def tick(self):
        self.__count += 1
        self.progress_bar.update(self.__count)
Example #12
0
class NameValueList(UIItem):
    """
    A NameValueList is a list of name and value pairs. This is commonly used in the settings screen
    where the user has a list of items and can edit them at any point in time.
    This is just a generic UI element to keep all of the data and logic within the game subsystem
    """
    def __init__(self, items=[], lines_to_show=5):
        # items is a tuple consisting of (text name of item, selection values, current selection)
        self._items = []
        self._lines_to_show = lines_to_show

        self.__menuContainer = DirectFrame(
            #text_pos=(0,1),
            pos=(-0.6, 0, 0.3),
            text_scale=1.5,
            text_align=TextNode.ALeft,
            text_fg=(0, 0, 0, 0),
            relief=DGG.FLAT,
            frameColor=(1, 1, 1, 0),
            #left,right,bottom,top
            frameSize=(-0.5, 0.5, -0.5, 0.5))
        self.__menuContainer.hide()

        self.selectedItem = 0

        self.editing = False
        self.blink = False
        self.blinkTask = None

        for item in items:
            self.addItem(item[0], item[1], item[2])

    def setPos(self, x, y, z):
        self.__menuContainer.setPos(x, y, z)

    def addItem(self, text_name, selection_values, current_selection_idx=-1):
        """
        Adds an item to the list display.
        text_name - The string representation of the list item
        selection_values - A list of available values for selection in this field
        current_selection - The currently selected item
        """

        pos_name = Vec3(-0.47, 0, 0.4 - (len(self._items) * 0.15))
        pos_value = Vec3(1.0, 0, 0.4 - (len(self._items) * 0.15))

        length = len(self._items)

        selection_text = ""
        if current_selection_idx != -1:
            selection_text = str(selection_values[current_selection_idx])

        name_display = DirectButton(
            text=text_name,
            command=None,
            extraArgs=[len(self._items)],
            text_align=TextNode.ALeft,
            scale=0.1,
            #left/right, forward/back, up/down
            pos=pos_name,
            text_fg=(1, 1, 1, 1),
            rolloverSound=None,
            clickSound=None,
            pressEffect=0,
            relief=None,
            textMayChange=True
            #text_font=base.fontLoader.load('Arial Bold.ttf')
        )
        name_display.reparentTo(self.__menuContainer)

        value_display = DirectButton(
            text=str(selection_text),
            command=None,
            extraArgs=[len(self._items)],
            text_align=TextNode.ALeft,
            scale=0.1,
            #left/right, forward/back, up/down
            pos=pos_value,
            text_fg=(1, 1, 1, 1),
            rolloverSound=None,
            clickSound=None,
            pressEffect=0,
            relief=None,
            textMayChange=True
            #text_font=base.fontLoader.load('Arial Bold.ttf')
        )

        value_display.reparentTo(self.__menuContainer)

        v = {}
        v['name'] = text_name
        v['name_display'] = name_display
        v['value_display'] = value_display
        v['selection_values'] = selection_values
        v['current_selection_idx'] = current_selection_idx
        self._items.append(v)

    def up(self):
        """Move one item up in the menu."""

        if self.editing:
            current_item = self._items[self.selectedItem]
            current_item['current_selection_idx'] = (
                current_item['current_selection_idx'] + 1) % len(
                    current_item['selection_values'])
            current_item['value_display']['text'] = current_item[
                'selection_values'][current_item['current_selection_idx']]
        else:

            newItem = self.selectedItem - 1
            if (newItem < 0):
                newItem = len(self._items) - 1
            self.select(newItem)

        UIItem.up(self)

    def down(self):
        """Move one item down in the menu."""
        if self.editing:
            current_item = self._items[self.selectedItem]
            current_item['current_selection_idx'] = (
                current_item['current_selection_idx'] - 1) % len(
                    current_item['selection_values'])
            current_item['value_display']['text'] = current_item[
                'selection_values'][current_item['current_selection_idx']]
        else:

            newItem = self.selectedItem + 1
            if (newItem >= len(self._items)):
                newItem = 0
            self.select(newItem)

        UIItem.down(self)

    def show(self):
        if (self.__menuContainer.isHidden()):
            Sequence(
                Func(self.__menuContainer.setAlphaScale, 0.0),
                Func(self.__menuContainer.show),
                LerpFunctionInterval(self.__menuContainer.setAlphaScale,
                                     toData=1.0,
                                     fromData=0.0,
                                     duration=1.0)).start()

    def hide(self):
        self.ignoreAll()
        if (not self.__menuContainer.isHidden()):
            Sequence(
                LerpFunctionInterval(self.__menuContainer.setAlphaScale,
                                     toData=0.0,
                                     fromData=1.0,
                                     duration=1.0),
                Func(self.__menuContainer.hide),
                Func(self.__menuContainer.setAlphaScale, 1.0)).start()

    def setParent(self, parent):
        self.__menuContainer.reparentTo(parent)

    def select(self, item):
        self._items[self.selectedItem]['name_display']['text_fg'] = (1, 1, 1,
                                                                     1)
        self._items[self.selectedItem]['name_display']['text_bg'] = (0, 0, 0,
                                                                     0)
        self._items[self.selectedItem]['value_display']['text_fg'] = (1, 1, 1,
                                                                      1)
        self._items[self.selectedItem]['value_display']['text_bg'] = (0, 0, 0,
                                                                      0)
        self.selectedItem = item
        self._items[self.selectedItem]['name_display']['text_fg'] = (0, 0, 0.5,
                                                                     1)
        self._items[self.selectedItem]['name_display']['text_bg'] = (1, 1, 1,
                                                                     1)
        self._items[self.selectedItem]['value_display']['text_fg'] = (0, 0,
                                                                      0.5, 1)
        self._items[self.selectedItem]['value_display']['text_bg'] = (1, 1, 1,
                                                                      1)

    def toggleEdit(self):
        self.editing = not self.editing
        if self.editing:
            # Start blinking
            self.blinkTask = base.taskMgr.doMethodLater(
                0.4, self._doBlink, 'nvBlinkTask')
        else:
            # Stop blinking
            if self.blinkTask != None:
                base.taskMgr.remove(self.blinkTask)

    def _doBlink(self, task):
        self.blink = not self.blink
        if self.blink:
            self._items[self.selectedItem]['value_display']['text_fg'] = (0, 0,
                                                                          0, 1)
            self._items[self.selectedItem]['value_display']['text_bg'] = (1, 1,
                                                                          1, 1)
        else:
            self._items[self.selectedItem]['value_display']['text_fg'] = (1, 1,
                                                                          1, 1)
            self._items[self.selectedItem]['value_display']['text_bg'] = (0, 0,
                                                                          0, 0)
        return Task.again
Example #13
0
class ItemChooser(metaclass=abc.ABCMeta):
    """The base class for choose-one-of widgets.

    Args:
        is_shadowed (bool):
            Optional. If True, a shadowed font
            color will be used for this widget.
    """

    def __init__(self, is_shadowed=False):
        font = (0, 0, 0, 0.3 if is_shadowed else 0)
        self._ind = 0
        self._items = None
        self._chosen_item = None

        self._fr = DirectFrame(frameSize=(-0.11, 0.12, -0.025, 0.024), frameColor=font)
        self._name = DirectLabel(
            parent=self._fr,
            frameColor=(0, 0, 0, 0.3),
            text_fg=SILVER_COL,
            text_font=base.main_font,  # noqa: F821
            text="",
            text_scale=0.03,
            pos=(0, 0, -0.01),
        )
        but_params = {
            "parent": self._fr,
            "text_fg": SILVER_COL,
            "frameColor": font,
            "scale": (0.075, 0, 0.075),
        }
        DirectButton(pos=(0.15, 0, -0.015), text=">", command=self._next, **but_params)
        DirectButton(pos=(-0.15, 0, -0.015), text="<", command=self._prev, **but_params)
        self._fr.hide()

    @abc.abstractmethod
    def _show_info(self):
        """Show the chosen item info."""
        raise NotImplementedError("Chooser class must have _show_info() method.")

    @property
    def chosen_item(self):
        """The item chosen with this widget.

        Returns:
            object: The chosen object.
        """
        return self._chosen_item

    def _next(self):
        """Choose the next item from the list."""
        self._ind += 1
        self._show_info()

    def _prev(self):
        """Choose the previous item from the list."""
        self._ind -= 1
        self._show_info()

    def destroy(self):
        """Clear this widget."""
        self._fr.destroy()

        self._ind = 0
        self._chosen_item = None
        self._items = None

    def prepare(self, parent, pos, items, init_ind=None):
        """Set this widget's parent and position.

        Args:
            parent (panda3d.core.NodePath): Parent widget.
            pos (tuple): New widget position.
            items (dict): Items to iterate through.
            init_ind (int): Index of the initial value.
        """
        self._items = items

        self._fr.reparentTo(parent)
        self._fr.setPos(pos)
        self._fr.show()

        if init_ind is not None:
            self._ind = init_ind

        self._show_info()
Example #14
0
class GUI:
    def __init__(self, mainClass):
        self.unitFrame = DirectFrame(frameColor=(0, 0, 0, 0.5),
                                     frameSize=(-0.25, 0.25, -1, 1),
                                     pos=(0.8, 0, 0))
        self.unitFrame.reparentTo(render2d)
        self.unitFrame.hide()

        self.wallFrame = DirectFrame(frameColor=(0, 0, 0, 0.5),
                                     frameSize=(-0.25, 0.25, -1, 1),
                                     pos=(0.8, 0, 0))
        self.wallFrame.reparentTo(render2d)
        #	self.wallFrame.hide()

        #	self.drillWall = DirectButton(text = ('drill wall'), scale = 0.1, command = mainClass.cameraClass.mineWall, extraArgs = [mainClass])
        #	self.drillWall.reparentTo(self.wallFrame)
        #	self.drillWall.setPos(0,0,0.9)

        self.drillWall = DirectButton(text='Hi',
                                      scale=0.1,
                                      command=self.queueMine,
                                      extraArgs=[mainClass])
        #	self.drillWall.reparentTo(self.wallFrame)
        self.drillWall.setPos(0, 0, 0.5)
        self.drillWall.hide()

    def hi(self):
        print 'HIII'

    def showWall(self, wall, mainClass):
        if (wall.selectable == True):

            self.hideUIs()
            self.drillWall.show()

        #	if (wall.dig != None):
        #		self.

#		uButton1 = DirectButton(text = ('need'), scale = 0.1)
#		uButton1.reparentTo(self.unitFrame)
#		uButton1.setPos(0,0,0.9)
#
#		uButton2 = DirectButton(text = ('to'), scale = 0.1)
#		uButton2.reparentTo(self.unitFrame)
#		uButton2.setPos(0,0,0.7)
#
#		uButton3 = DirectButton(text = ('finish'), scale = 0.1)
#		uButton3.reparentTo(self.unitFrame)
#		uButton3.setPos(0,0,0.5)
#
#		uButton4 = DirectButton(text = ('GUI'), scale = 0.1)
#		uButton4.reparentTo(self.unitFrame)
#		uButton4.setPos(0,0,0.3)

    def unitGUI(self, mainClass, unitnumber):
        self.hideUIs()
        self.unitFrame.show()

    #	if (mainClass.parserClass.unit

    def wallGUI(self, mainClass, wallPos):
        pass

    #	self.unitFrame.hide()
    #	self.wallFrame.show()
    #	if (mainClass.mapLoaderClass.tileArray[wallPos[1]][wallPos[0]].drillTime != None):
    #		self.drillWall.show()

    def hideUIs(self):
        self.unitFrame.hide()

    def queueMine(self, mainClass):
        #	mainClass.cameraClass.clearSelection(mainClass)
        mainClass.priorities.queueMine(mainClass.mouseClass.tileSelected)
Example #15
0
class CraftInventory(DirectObject):
    def __init__(self):
        self.itemFrame = DirectScrolledFrame(
            text="Inventory",
            text_scale=0.25,
            text_pos=(0, 0.75, 0),
            text_bg=(1, 1, 1, 1),
            # make the frame occupy the whole window
            frameSize=(-0.6, 0.6, -0.8, 0.8),
            pos=(-0.7, 0, 0),
            # make the canvas as big as the frame
            canvasSize=(-0.6, 0.6, -0.8, 0.8),
            # set the frames color to white
            frameColor=(1, 1, 1, 1))
        self.itemList = []

        self.craftFrame = DirectFrame(
            text="Crafting",
            text_scale=0.25,
            text_pos=(0, 0.75, 0),
            text_bg=(1, 1, 1, 1),
            # make the frame occupy the whole window
            frameSize=(-0.6, 0.6, -0.8, 0.8),
            pos=(0.7, 0, 0),
            # set the frames color to white
            frameColor=(1, 1, 1, 1))
        self.craftDrop = DirectFrame(text="drop ore",
                                     text_scale=0.1,
                                     pos=(0, 0.4, 0),
                                     frameSize=(-0.25, 0.25, -0.25, 0.25),
                                     frameColor=(1, 0, 0, 1))
        self.craftDrop.reparentTo(self.craftFrame)

    def show(self):
        self.itemFrame.show()
        self.craftFrame.show()

    def hide(self):
        self.itemFrame.hide()
        self.craftFrame.hide()

    def __makeItem(self, item):
        obj = DirectLabel(
            text=str(item.giveLoot()) + "x " + item.giveType(),
            text_scale=0.5,
            text_pos=(0, -1, 0),
            image=("item.png", "item_hover.png",
                   "item.png"),  #normal, hover, disabled
            scale=0.16,
            numStates=2,
            state=DGG.NORMAL,
            relief=DGG.GROOVE)
        obj.setTransparency(True)
        obj["activeState"] = 0
        obj.reparentTo(self.itemFrame.getCanvas())
        obj.bind(DGG.B1PRESS, self.dragStart, [obj])
        obj.bind(DGG.B1RELEASE, self.dragStop)
        obj.bind(DGG.ENTER, self.inObject, [obj])
        obj.bind(DGG.EXIT, self.outObject, [obj])
        return obj

    def updateList(self, items):
        for item in self.itemList:
            item.destroy()
        i = 1
        j = 0
        pad = 0.2
        numItemsPerRow = 2
        itemWidth = 0.32
        itemHeight = 0.32
        #left = -(itemWidth * (numItemsPerRow/2.0)) - 0.16
        left = self.itemFrame.getX()  # + (itemWidth + 0.16)
        xStep = itemWidth + 0.13
        yStep = -(itemHeight + 0.13)
        top = 0.8 - (0.16 + pad)
        for item in items:
            self.itemList.append(self.__makeItem(item))
            x = left + i * xStep
            y = top + j * yStep
            self.itemList[-1].setPos(x, 0.0, y)
            if i == numItemsPerRow:
                i = 0
                j += 1
            i += 1
        if i == 1: j -= 1
        height = ((j) * -yStep) - 0.16
        # resize the canvas. This will make the scrollbars dis-/appear,
        # dependent on if the canvas is bigger than the frame size.
        self.itemFrame["canvasSize"] = (-0.6, 0.6, -height, 0.8)

    def inObject(self, element, event):
        # Can be used to highlight objects
        element["activeState"] = 1
        element.setActiveState()
        #print "over object"

    def outObject(self, element, event):
        # Can be used to unhighlight objects
        #element["state"] = 0
        element["activeState"] = 0
        element.setActiveState()

    def dragStart(self, element, event):
        print "start drag"
        taskMgr.remove('dragDropTask')
        vWidget2render2d = element.getPos(render2d)
        vMouse2render2d = Point3(event.getMouse()[0], 0, event.getMouse()[1])
        editVec = Vec3(vWidget2render2d - vMouse2render2d)
        t = taskMgr.add(self.dragTask, 'dragDropTask')
        element.reparentTo(aspect2d)
        t.element = element
        t.editVec = editVec
        t.elementStartPos = element.getPos()

    def dragTask(self, state):
        mwn = base.mouseWatcherNode
        if mwn.hasMouse():
            vMouse2render2d = Point3(mwn.getMouse()[0], 0, mwn.getMouse()[1])
            newPos = vMouse2render2d + state.editVec
            state.element.setPos(render2d, newPos)
        return Task.cont

    def dragStop(self, event):
        print "stop drag with:", event
        isInArea = False

        t = taskMgr.getTasksNamed('dragDropTask')[0]
        #for dropArea in self.dropAreas:
        #    if self.isInBounds(event.getMouse(), dropArea["frameSize"], dropArea.getPos(render)):
        #        print "inside Area:", dropArea["text"], dropArea.getPos(render)
        #        isInArea = True
        #        t.element.setPos(dropArea.getPos(render))
        #        t.element.setX(t.element.getX() * self.ratio)
        #        #t.element.setX(t.element.getX() - t.element.getWidth() / 2.0)
        #        break

        if not isInArea:
            t.element.setPos(t.elementStartPos)
            t.element.reparentTo(self.itemFrame.getCanvas())
        taskMgr.remove('dragDropTask')

    def isInBounds(self, location, bounds, posShift=None):
        x = 0 if posShift is None else posShift.getX()
        y = 0 if posShift is None else posShift.getZ()

        left = x + bounds[0]
        right = x + bounds[1]
        bottom = y + bounds[2]
        top = y + bounds[3]

        # are we outside of the bounding box from the left
        if location[0] < left: return False
        # are we outside of the bounding box from the right
        if location[0] > right: return False
        # are we outside of the bounding box from the bottom
        if location[1] < bottom: return False
        # are we outside of the bounding box from the top
        if location[1] > top: return False
        # the location is inside the bbox
        return True
Example #16
0
class Optionsmenu():
    def __init__(self):
        self.frameMain = DirectFrame(
            image="gui/MenuBackground.png",
            image_scale=(1.7778, 1, 1),
            #image_pos=(0, 0, 0.25),
            frameSize=(
                base.a2dLeft, base.a2dRight,
                base.a2dTop, base.a2dBottom),
            frameColor=(0,0,0,0))
        self.frameMain.setTransparency(True)

        self.logo = DirectFrame(
            image="Logo.png",
            image_scale=0.25,
            image_pos=(0, 0, 0.55),
            frameSize=(
                base.a2dLeft, base.a2dRight,
                base.a2dTop, base.a2dBottom),
            frameColor=(0,0,0,0))
        self.logo.reparentTo(self.frameMain)


        btnGeom = "gui/button"

        self.btnBack = menuHelper.createButton(_("Back"), btnGeom, 0, -0.7, ["options_back"])
        self.btnBack.reparentTo(self.frameMain)


        volume = base.musicManager.getVolume()
        self.sliderVolume = DirectSlider(
            scale=0.5,
            pos=(-0.5, 0, 0),
            range=(0, 1),
            scrollSize=0.01,
            text=_("Volume %d%%") % volume*100,
            text_scale=0.1,
            text_pos=(0, 0.15),
            text_fg=(1, 1, 1, 1),
            thumb_frameColor=(0,0.75, 0.25, 1),
            frameColor=(0.35, 0.15, 0.05, 1),
            value=volume,
            command=self.sliderVolume_ValueChanged)
        self.sliderVolume.reparentTo(self.frameMain)

        isChecked = not base.AppHasAudioFocus
        img = None
        imgON = "gui/AudioSwitch_on.png"
        imgOFF = "gui/AudioSwitch_off.png"
        if base.AppHasAudioFocus:
            img = imgON
        else:
            img = imgOFF
        self.cbVolumeMute = DirectCheckBox(
            text=_("Mute Audio"),
            text_scale=0.5,
            text_align=TextNode.ACenter,
            text_pos=(0, 0.65),
            text_fg=(1, 1, 1, 1),
            scale=0.105,
            pos=(0.5, 0, 0),
            command=self.cbVolumeMute_CheckedChanged,
            relief=None,
            pressEffect=False,
            isChecked=isChecked,
            image=img,
            image_scale=0.5,
            checkedImage=imgOFF,
            uncheckedImage=imgON)
        self.cbVolumeMute.setTransparency(True)
        self.cbVolumeMute.setImage()
        self.cbVolumeMute.reparentTo(self.frameMain)

        prcPath = os.path.join(basedir, "%s.prc"%appName)
        self.advancedOptions = DirectLabel(
            text=_("Advanced options can be made in the following text file\n%s")%prcPath,
            text_scale=0.5,
            text_fg=(1, 1, 1, 1),
            scale=0.1,
            pos=(0, 0, -0.25),
            frameColor=(0, 0, 0, 0))
        self.advancedOptions.setTransparency(True)
        self.advancedOptions.reparentTo(self.frameMain)

        self.hide()

    def show(self):
        self.frameMain.show()

    def hide(self):
        self.frameMain.hide()

    def cbVolumeMute_CheckedChanged(self, checked):
        if checked:
            base.disableAllAudio()
        else:
            base.enableAllAudio()

    def sliderVolume_ValueChanged(self):
        volume = round(self.sliderVolume["value"], 2)
        self.sliderVolume["text"] = _("Volume %d%%") % int(volume * 100)
        base.sfxManagerList[0].setVolume(volume)
        base.musicManager.setVolume(volume)
Example #17
0
class Transitions:

    # These may be reassigned before the fade or iris transitions are
    # actually invoked to change the models that will be used.
    IrisModelName = "models/misc/iris"
    FadeModelName = "models/misc/fade"

    def __init__(self, loader, model=None, scale=3.0, pos=Vec3(0, 0, 0)):
        self.transitionIval = None
        self.letterboxIval = None
        self.iris = None
        self.fade = None
        self.letterbox = None
        self.fadeModel = model
        self.imagePos = pos
        if model:
            self.alphaOff = Vec4(1, 1, 1, 0)
            self.alphaOn = Vec4(1, 1, 1, 1)
            model.setTransparency(1)
            self.lerpFunc = LerpColorScaleInterval
        else:
            self.alphaOff = Vec4(0, 0, 0, 0)
            self.alphaOn = Vec4(0, 0, 0, 1)
            self.lerpFunc = LerpColorInterval

        self.irisTaskName = "irisTask"
        self.fadeTaskName = "fadeTask"
        self.letterboxTaskName = "letterboxTask"

    def __del__(self):
        if self.fadeModel:
            self.fadeModel.removeNode()
            self.fadeModel = None

    ##################################################
    # Fade
    ##################################################

    # We can set a custom model for the fade before using it for the first time
    def setFadeModel(self, model, scale=1.0):
        self.fadeModel = model
        # We have to change some default parameters for a custom fadeModel
        self.alphaOn = Vec4(1, 1, 1, 1)

        # Reload fade if its already been created
        if self.fade:
            self.fade.destroy()
            self.fade = None
            self.loadFade()

    def loadFade(self):
        if self.fade is None:
            # We create a DirectFrame for the fade polygon, instead of
            # simply loading the polygon model and using it directly,
            # so that it will also obscure mouse events for objects
            # positioned behind it.
            self.fade = DirectFrame(
                parent=hidden,
                guiId='fade',
                relief=None,
                image=self.fadeModel,
                image_scale=(4, 2, 2),
                state=DGG.NORMAL,
            )
            if not self.fadeModel:
                # No fade model was given, so we make this the fade model.
                self.fade["relief"] = DGG.FLAT
                self.fade["frameSize"] = (-2, 2, -1, 1)
                self.fade["frameColor"] = (0, 0, 0, 1)
                self.fade.setTransparency(TransparencyAttrib.MAlpha)
            self.fade.setBin('unsorted', 0)
            self.fade.setColor(0, 0, 0, 0)

    def getFadeInIval(self, t=0.5, finishIval=None):
        """
        Returns an interval without starting it.  This is particularly useful in
        cutscenes, so when the cutsceneIval is escaped out of we can finish the fade immediately
        """
        #self.noTransitions() masad: this creates a one frame pop, is it necessary?
        self.loadFade()
        transitionIval = Sequence(
            Func(self.fade.reparentTo, aspect2d, DGG.FADE_SORT_INDEX),
            Func(self.fade.showThrough
                 ),  # in case aspect2d is hidden for some reason
            self.lerpFunc(
                self.fade,
                t,
                self.alphaOff,
                # self.alphaOn,
            ),
            Func(self.fade.detachNode),
            name=self.fadeTaskName,
        )
        if finishIval:
            transitionIval.append(finishIval)
        return transitionIval

    def getFadeOutIval(self, t=0.5, finishIval=None):
        """
        Create a sequence that lerps the color out, then
        parents the fade to hidden
        """
        self.noTransitions()
        self.loadFade()

        transitionIval = Sequence(
            Func(self.fade.reparentTo, aspect2d, DGG.FADE_SORT_INDEX),
            Func(self.fade.showThrough
                 ),  # in case aspect2d is hidden for some reason
            self.lerpFunc(
                self.fade,
                t,
                self.alphaOn,
                # self.alphaOff,
            ),
            name=self.fadeTaskName,
        )
        if finishIval:
            transitionIval.append(finishIval)
        return transitionIval

    def fadeIn(self, t=0.5, finishIval=None):
        """
        Play a fade in transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the color
        from black to transparent. When the color lerp is finished, it
        parents the fade polygon to hidden.
        """
        gsg = base.win.getGsg()
        if gsg:
            # If we're about to fade in from black, go ahead and
            # preload all the textures etc.
            base.graphicsEngine.renderFrame()
            render.prepareScene(gsg)
            render2d.prepareScene(gsg)

        if (t == 0):
            # Fade in immediately with no lerp
            #print "transitiosn: fadeIn 0.0"
            self.noTransitions()
            self.loadFade()
            self.fade.detachNode()
        else:
            # Create a sequence that lerps the color out, then
            # parents the fade to hidden
            self.transitionIval = self.getFadeInIval(t, finishIval)
            self.transitionIval.start()

    def fadeOut(self, t=0.5, finishIval=None):
        """
        Play a fade out transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the color
        from transparent to full black. When the color lerp is finished,
        it leaves the fade polygon covering the aspect2d plane until you
        fadeIn or call noFade.
        lerp
        """
        if (t == 0):
            # Fade out immediately with no lerp
            self.noTransitions()
            self.loadFade()
            self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)
            self.fade.setColor(self.alphaOn)
        elif ConfigVariableBool('no-loading-screen', False):
            if finishIval:
                self.transitionIval = finishIval
                self.transitionIval.start()
        else:
            # Create a sequence that lerps the color out, then
            # parents the fade to hidden
            self.transitionIval = self.getFadeOutIval(t, finishIval)
            self.transitionIval.start()

    def fadeOutActive(self):
        return self.fade and self.fade.getColor()[3] > 0

    def fadeScreen(self, alpha=0.5):
        """
        Put a semitransparent screen over the camera plane
        to darken out the world. Useful for drawing attention to
        a dialog box for instance
        """
        #print "transitiosn: fadeScreen"
        self.noTransitions()
        self.loadFade()
        self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)
        self.fade.setColor(self.alphaOn[0], self.alphaOn[1], self.alphaOn[2],
                           alpha)

    def fadeScreenColor(self, color):
        """
        Put a semitransparent screen over the camera plane
        to darken out the world. Useful for drawing attention to
        a dialog box for instance
        """
        #print "transitiosn: fadeScreenColor"
        self.noTransitions()
        self.loadFade()
        self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)
        self.fade.setColor(color)

    def noFade(self):
        """
        Removes any current fade tasks and parents the fade polygon away
        """
        #print "transitiosn: noFade"
        if self.transitionIval:
            self.transitionIval.pause()
            self.transitionIval = None
        if self.fade:
            # Make sure to reset the color, since fadeOutActive() is looking at it
            self.fade.setColor(self.alphaOff)
            self.fade.detachNode()

    def setFadeColor(self, r, g, b):
        self.alphaOn.set(r, g, b, 1)
        self.alphaOff.set(r, g, b, 0)

    ##################################################
    # Iris
    ##################################################

    def loadIris(self):
        if self.iris == None:
            self.iris = loader.loadModel(self.IrisModelName)
            self.iris.setPos(0, 0, 0)

    def irisIn(self, t=0.5, finishIval=None):
        """
        Play an iris in transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the scale
        of the iris polygon up so it looks like we iris in. When the
        scale lerp is finished, it parents the iris polygon to hidden.
        """
        self.noTransitions()
        self.loadIris()
        if (t == 0):
            self.iris.detachNode()
        else:
            self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)

            self.transitionIval = Sequence(
                LerpScaleInterval(self.iris, t, scale=0.18, startScale=0.01),
                Func(self.iris.detachNode),
                name=self.irisTaskName,
            )
            if finishIval:
                self.transitionIval.append(finishIval)
            self.transitionIval.start()

    def irisOut(self, t=0.5, finishIval=None):
        """
        Play an iris out transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the scale
        of the iris down so it looks like we iris out. When the scale
        lerp is finished, it leaves the iris polygon covering the
        aspect2d plane until you irisIn or call noIris.
        """
        self.noTransitions()
        self.loadIris()
        self.loadFade()  # we need this to cover up the hole.
        if (t == 0):
            self.iris.detachNode()
            self.fadeOut(0)
        else:
            self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)

            self.transitionIval = Sequence(
                LerpScaleInterval(self.iris, t, scale=0.01, startScale=0.18),
                Func(self.iris.detachNode),
                # Use the fade to cover up the hole that the iris would leave
                Func(self.fadeOut, 0),
                name=self.irisTaskName,
            )
            if finishIval:
                self.transitionIval.append(finishIval)
            self.transitionIval.start()

    def noIris(self):
        """
        Removes any current iris tasks and parents the iris polygon away
        """
        if self.transitionIval:
            self.transitionIval.pause()
            self.transitionIval = None
        if self.iris != None:
            self.iris.detachNode()
        # Actually we need to remove the fade too,
        # because the iris effect uses it.
        self.noFade()

    def noTransitions(self):
        """
        This call should immediately remove any and all transitions running
        """
        self.noFade()
        self.noIris()
        # Letterbox is not really a transition, it is a screen overlay
        # self.noLetterbox()

    ##################################################
    # Letterbox
    ##################################################

    def loadLetterbox(self):
        if not self.letterbox:
            # We create a DirectFrame for the fade polygon, instead of
            # simply loading the polygon model and using it directly,
            # so that it will also obscure mouse events for objects
            # positioned behind it.
            self.letterbox = NodePath("letterbox")
            # Allow fade in and out of the bars
            self.letterbox.setTransparency(1)

            # Allow DirectLabels to be parented to the letterbox sensibly
            self.letterbox.setBin('unsorted', 0)

            # Allow a custom look to the letterbox graphic.

            # TODO: This model isn't available everywhere.  We should
            # pass it in as a parameter.
            button = loader.loadModel('models/gui/toplevel_gui',
                                      okMissing=True)

            barImage = None
            if button:
                barImage = button.find('**/generic_button')

            self.letterboxTop = DirectFrame(
                parent=self.letterbox,
                guiId='letterboxTop',
                relief=DGG.FLAT,
                state=DGG.NORMAL,
                frameColor=(0, 0, 0, 1),
                borderWidth=(0, 0),
                frameSize=(-1, 1, 0, 0.2),
                pos=(0, 0, 0.8),
                image=barImage,
                image_scale=(2.25, 1, .5),
                image_pos=(0, 0, .1),
                image_color=(0.3, 0.3, 0.3, 1),
                sortOrder=0,
            )
            self.letterboxBottom = DirectFrame(
                parent=self.letterbox,
                guiId='letterboxBottom',
                relief=DGG.FLAT,
                state=DGG.NORMAL,
                frameColor=(0, 0, 0, 1),
                borderWidth=(0, 0),
                frameSize=(-1, 1, 0, 0.2),
                pos=(0, 0, -1),
                image=barImage,
                image_scale=(2.25, 1, .5),
                image_pos=(0, 0, .1),
                image_color=(0.3, 0.3, 0.3, 1),
                sortOrder=0,
            )

            # masad: always place these at the bottom of render
            self.letterboxTop.setBin('sorted', 0)
            self.letterboxBottom.setBin('sorted', 0)
            self.letterbox.reparentTo(render2d, -1)
            self.letterboxOff(0)

    def noLetterbox(self):
        """
        Removes any current letterbox tasks and parents the letterbox polygon away
        """
        if self.letterboxIval:
            self.letterboxIval.pause()
            self.letterboxIval = None
        if self.letterbox:
            self.letterbox.stash()

    def letterboxOn(self, t=0.25, finishIval=None):
        """
        Move black bars in over t seconds.
        """
        self.noLetterbox()
        self.loadLetterbox()
        self.letterbox.unstash()
        if (t == 0):
            self.letterboxBottom.setPos(0, 0, -1)
            self.letterboxTop.setPos(0, 0, 0.8)
        else:
            self.letterboxIval = Sequence(
                Parallel(
                    LerpPosInterval(
                        self.letterboxBottom,
                        t,
                        pos=Vec3(0, 0, -1),
                        #startPos = Vec3(0, 0, -1.2),
                    ),
                    LerpPosInterval(
                        self.letterboxTop,
                        t,
                        pos=Vec3(0, 0, 0.8),
                        # startPos = Vec3(0, 0, 1),
                    ),
                ),
                name=self.letterboxTaskName,
            )
            if finishIval:
                self.letterboxIval.append(finishIval)
            self.letterboxIval.start()

    def letterboxOff(self, t=0.25, finishIval=None):
        """
        Move black bars away over t seconds.
        """
        self.noLetterbox()
        self.loadLetterbox()
        self.letterbox.unstash()
        if (t == 0):
            self.letterbox.stash()
        else:
            self.letterboxIval = Sequence(
                Parallel(
                    LerpPosInterval(
                        self.letterboxBottom,
                        t,
                        pos=Vec3(0, 0, -1.2),
                        # startPos = Vec3(0, 0, -1),
                    ),
                    LerpPosInterval(
                        self.letterboxTop,
                        t,
                        pos=Vec3(0, 0, 1),
                        # startPos = Vec3(0, 0, 0.8),
                    ),
                ),
                Func(self.letterbox.stash),
                Func(messenger.send, 'letterboxOff'),
                name=self.letterboxTaskName,
            )
            if finishIval:
                self.letterboxIval.append(finishIval)
            self.letterboxIval.start()
Example #18
0
class Hud(DirectObject):
    def __init__(self):
        self.frameCharStatus = DirectFrame(
            # size of the frame
            frameSize = (0, .8,
                         -.20, 0),
            # bg color Transparent
            frameColor = (0, 0, 0, 0))
        self.frameCharStatus.reparentTo(base.a2dTopLeft)

        self.statusHealth = OnscreenImage(
            image = "HUD_Life100.png",
            scale = (0.1, 1, 0.1),
            pos = (0.085, 0, -0.085))
        self.statusHealth.setTransparency(True)
        self.statusHealth.reparentTo(self.frameCharStatus)

        self.statusWeapon = OnscreenImage(
            image = "WeaponMG.png",
            scale = (0.1, 1, 0.1),
            pos = (0.285, 0, -0.085))
        self.statusWeapon.setTransparency(True)
        self.statusWeapon.reparentTo(self.frameCharStatus)

        self.highscore = DirectLabel(
            text = "0",
            text_fg = (0,0,0,1),
            text_align = TextNode.ALeft,
            frameColor = (0,0,0,0),
            pos = (0.4,0,-0.12),
            scale = 0.15)
        self.highscore.setTransparency(True)
        self.highscore.reparentTo(self.frameCharStatus)

    def show(self):
        self.frameCharStatus.show()
        self.accept("setHighscore", self.setHighscore)
        self.accept("setHealth", self.setHealth)

    def hide(self):
        self.frameCharStatus.hide()
        self.ignore("setHighscore")
        self.ignore("setHealth")

    def setHighscore(self, score):
        self.highscore["text"] = str(score)

    def setHealth(self, hp):
        if hp > 75.0:
            self.statusHealth.setImage("HUD_Life100.png")
        elif hp > 50.0:
            self.statusHealth.setImage("HUD_Life75.png")
        elif hp > 25.0:
            self.statusHealth.setImage("HUD_Life50.png")
        elif hp > 0:
            self.statusHealth.setImage("HUD_Life25.png")
        else:
            print "Your dead!"
            self.statusHealth.setImage("HUD_Life0.png")
        self.statusHealth.setTransparency(True)

    def setWeapon(self, weaponType):
        if weaponType == "Pistol":
            self.statusWeapon.setImage("WeaponPistol.png")
        else:
            self.statusWeapon.setImage("WeaponMG.png")
        self.statusWeapon.setTransparency(True)
Example #19
0
class GUI:
	def __init__(self, mainClass):
		self.unitFrame = DirectFrame(frameColor = (0,0,0,0.5), frameSize = (-0.25, 0.25, -1, 1), pos = (0.8, 0, 0))
		self.unitFrame.reparentTo(render2d)
		self.unitFrame.hide()
		
		self.wallFrame = DirectFrame(frameColor = (0,0,0,0.5), frameSize = (-0.25, 0.25, -1, 1), pos = (0.8, 0, 0))
		self.wallFrame.reparentTo(render2d)
	#	self.wallFrame.hide()
		
	#	self.drillWall = DirectButton(text = ('drill wall'), scale = 0.1, command = mainClass.cameraClass.mineWall, extraArgs = [mainClass])
	#	self.drillWall.reparentTo(self.wallFrame)
	#	self.drillWall.setPos(0,0,0.9)
		
		self.drillWall = DirectButton(text = 'Hi', scale = 0.1, command = self.queueMine, extraArgs = [mainClass])
	#	self.drillWall.reparentTo(self.wallFrame)
		self.drillWall.setPos(0,0,0.5)
		self.drillWall.hide()
		
	def hi(self):
		print 'HIII'
		
	def showWall(self, wall, mainClass):
		if (wall.selectable == True):
			
			self.hideUIs()
			self.drillWall.show()
			
		#	if (wall.dig != None):
		#		self.
		
#		uButton1 = DirectButton(text = ('need'), scale = 0.1)
#		uButton1.reparentTo(self.unitFrame)
#		uButton1.setPos(0,0,0.9)
#		
#		uButton2 = DirectButton(text = ('to'), scale = 0.1)
#		uButton2.reparentTo(self.unitFrame)
#		uButton2.setPos(0,0,0.7)
#		
#		uButton3 = DirectButton(text = ('finish'), scale = 0.1)
#		uButton3.reparentTo(self.unitFrame)
#		uButton3.setPos(0,0,0.5)
#		
#		uButton4 = DirectButton(text = ('GUI'), scale = 0.1)
#		uButton4.reparentTo(self.unitFrame)
#		uButton4.setPos(0,0,0.3)
		
		
	
	def unitGUI(self, mainClass, unitnumber):
		self.hideUIs()
		self.unitFrame.show()
	#	if (mainClass.parserClass.unit
	
	def wallGUI(self, mainClass, wallPos):
		pass
	#	self.unitFrame.hide()
	#	self.wallFrame.show()
	#	if (mainClass.mapLoaderClass.tileArray[wallPos[1]][wallPos[0]].drillTime != None):
	#		self.drillWall.show()
	
	def hideUIs(self):
		self.unitFrame.hide()
		
	def queueMine(self, mainClass):
	#	mainClass.cameraClass.clearSelection(mainClass)
		mainClass.priorities.queueMine(mainClass.mouseClass.tileSelected)
class ConfigMenu(IMenu):
    def __init__(self):
        frame = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                       base.a2dBottom, base.a2dTop),
                            frameColor=(0, 0, 0, 0.5))
        IMenu.__init__(self, frame=frame)
        self.menuVerticalChoicesList = [{
            "event": "*",
            "text": "Text Display Time"
        }, {
            "event": "*",
            "text": "Sound Effects Volume Level"
        }, {
            "event": "*",
            "text": "Music Volume Level"
        }, {
            "event": "*",
            "text": "Controls"
        }, {
            "event": "Back-Game",
            "text": "Resume Game"
        }, {
            "event": "Back-Start",
            "text": "Back to Start Menu"
        }]
        self.menuHorizontalChoices = [{
            "event": "Chara-Sub",
            "text": "*"
        }, {
            "event": "Chara-Add",
            "text": "*"
        }]
        self.statsSheet = None
        self.createVerticalButtons()
        self.addTitle()
        self.config_stats()

    def createButton(self, text, index, eventArgs):
        btn = DirectRadioButton(text=text,
                                text_align=TextNode.ALeft,
                                scale=0.05,
                                frameColor=(0, 0, 0, 0.0),
                                pos=(base.a2dLeft + 0.7, 0,
                                     (0.5 - (index * .15))),
                                variable=self.menuVerticalChoice,
                                value=[index],
                                text_fg=(1, 1, 1, 1),
                                command=self.menuVerticalEvent)

        self.menuVerticalButtons.append(btn)
        btn.reparentTo(self.frameMain)

    def addTitle(self):
        self.title = OnscreenText('Configurations',
                                  1,
                                  fg=(1, 0, 0, 1),
                                  pos=(base.a2dLeft + 0.7, 0.8),
                                  font=base.font_title,
                                  align=TextNode.ALeft,
                                  scale=.15,
                                  mayChange=1)
        self.title.reparentTo(self.frameMain)

    def cancelCommand(self):
        base.messenger.send("Back-Game")

    def change_config(self, value):
        index = self.menuVerticalChoice[0]
        stats = [
            self.change_text_display_time,
            self.change_sfx_vol,
            self.change_bgm_vol,
        ]
        if index < len(stats):
            stats[index](value)
            self.config_stats()

    def change_text_display_time(self, value):
        payload = base.gameData.textDisplayTime + (value * 0.5)
        payload = max(payload, 0.5)
        payload = min(payload, 10.0)
        base.gameData.textDisplayTime = payload
        # send update by event later

    def change_bgm_vol(self, value):
        payload = base.gameData.bgm_vol + (value * 0.1)
        payload = max(payload, 0.0)
        payload = min(payload, 1.0)
        base.gameData.bgm_vol = payload
        # send update by event later

    def change_sfx_vol(self, value):
        payload = base.gameData.sfx_vol + (value * 0.1)
        payload = max(payload, 0.0)
        payload = min(payload, 1.0)
        base.gameData.sfx_vol = payload
        # send update by event later

    def config_stats(self):
        if self.statsSheet:
            self.statsSheet.detachNode()
        self.statsSheet = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                                 base.a2dBottom, base.a2dTop),
                                      frameColor=(0, 1, 0, 0))
        stats = [
            '{} seconds'.format(base.gameData.textDisplayTime),
            '{} %'.format(int(base.gameData.sfx_vol * 100)),
            '{} %'.format(int(base.gameData.bgm_vol * 100)),
        ]
        self.add_controls(stats)
        i = 0
        for stat in stats:
            self.add_stat(stat, i)
            i += 1
        self.statsSheet.reparentTo(self.frameMain)

    def add_controls(self, arr):
        output = ''
        for ctrl in base.controlList:
            if ctrl[3] != base.control_type or not ctrl[4]:
                continue
            output += '{} - {}\n'.format(ctrl[2][0], ctrl[4])
        arr.append(output)

    def add_stat(self, text, index):
        stat = DirectLabel(scale=0.05,
                           text_align=TextNode.ALeft,
                           pos=(0, 0, (0.5 - (index * .15))),
                           pad=(0.5, 0.5),
                           frameColor=(0, 0, 0, 0.0),
                           text=text,
                           text_fg=(1, 1, 1, 1))
        stat.reparentTo(self.statsSheet)

    def readKeys(self, task):
        keysPressed = sum(base.directionMap.values())

        if keysPressed == 0:
            self.isButtonUp = True

            if base.commandMap["confirm"]:
                self.menuVerticalEvent()
                base.messenger.send("playConfirm")
            elif base.commandMap["cancel"]:
                self.cancelCommand()
                base.messenger.send("playCancel")

            base.resetButtons()
            return task.cont

        if not self.isButtonUp:
            return task.cont

        if base.directionMap["up"]:
            self.navigateChoice(-1, self.menuVerticalChoice,
                                self.menuVerticalChoicesList)
            self.isButtonUp = False
        elif base.directionMap["down"]:
            self.navigateChoice(1, self.menuVerticalChoice,
                                self.menuVerticalChoicesList)
            self.isButtonUp = False
        elif base.directionMap["left"]:
            self.menuHorizontalChoice[0] = 0
            self.isButtonUp = False
            self.menuHorizontalEvent()
        elif base.directionMap["right"]:
            self.menuHorizontalChoice[0] = 1
            self.isButtonUp = False
            self.menuHorizontalEvent()

        base.resetButtons()
        return task.cont
Example #21
0
class ToonPanel(DirectFrame):
    notify = directNotify.newCategory('ToonPanel')
    animal2HeadData = {'dog': (0.125, 0.04),
     'duck': (0.1, 0.025),
     'cat': (0.115, 0.04),
     'rabbit': (0.115, 0.04),
     'horse': (0.115, 0.06),
     'monkey': (0.115, 0.06),
     'pig': (0.115, 0.07),
     'mouse': (0.09, 0.02),
     'bear': (0.125, 0.05)}
    State2Text = {'status': ('Seeing if %s is available...', '%s is busy right now; try again later.'),
     'teleport': ('Trying to go to %s...', 'Could not go to %s.'),
     'friend': ('Asking %s to be your friend...', '%s said no, thank you.', 'You are now friends with %s!'),
     'remove': ('Are you sure you want to remove %s from your friends list?', '%s left your friends list.')}

    def __init__(self):
        DirectFrame.__init__(self, scale=1.2)
        self['image'] = DGG.getDefaultDialogGeom()
        self['image_hpr'] = (0, 0, -90)
        self['image_scale'] = (0.62, 0.9, 0.325)
        self['image_color'] = (1, 1, 0.75, 1)
        self['image_pos'] = (0, 0, -0.065)
        self['relief'] = None
        self.reparentTo(base.a2dTopRight)
        self.setPos(-0.235, 0.0, -0.325)
        self.hide()
        self.head = None
        self.laffMeter = None
        self.exitButton = None
        self.friendButton = None
        self.teleportButton = None
        self.nameText = None
        self.actionFrame = None
        self.actionFrameText = None
        self.actionFrameButton = None
        self.actionFrameButton2 = None
        self.avatarInfo = None
        self.action = None
        self.fsm = ClassicFSM.ClassicFSM('ToonPanel', [State.State('off', self.enterOff, self.exitOff), State.State('waitOnAvatarInfoResponse', self.enterWaitOnAvatarInfoResponse, self.exitWaitOnAvatarInfoResponse, ['panel']), State.State('panel', self.enterPanel, self.exitPanel, ['off'])], 'off', 'off')
        self.fsm.enterInitialState()
        self.actionFSM = ClassicFSM.ClassicFSM('ToonPanelActionFSM', [State.State('off', self.enterOff, self.exitOff),
         State.State('waitOnAvatarStatusResponse', self.enterWaitOnAvatarStatusResponse, self.exitWaitOnAvatarStatusResponse, ['waitOnAvatarTeleportResponse',
          'waitOnAvatarFriendListResponse',
          'avatarBusy',
          'off']),
         State.State('avatarBusy', self.enterAvatarBusy, self.exitAvatarBusy, ['off']),
         State.State('waitOnAvatarTeleportResponse', self.enterWaitOnAvatarTeleportResponse, self.exitWaitOnAvatarTeleportResponse, ['unableToTP']),
         State.State('unableToTP', self.enterUnableToTP, self.exitUnableToTP, ['off']),
         State.State('waitOnAvatarFriendListResponse', self.enterWaitOnAvatarFriendListResponse, self.exitWaitOnAvatarFriendListResponse, ['fRequestA', 'fRequestR']),
         State.State('fRequestA', self.enterFriendRequestAccepted, self.exitFriendRequestAccepted, ['off']),
         State.State('fRequestR', self.enterFriendRequestRejected, self.exitFriendRequestRejected, ['off']),
         State.State('removeFriendConfirm', self.enterRemoveFriendConfirm, self.exitRemoveFriendConfirm, ['off', 'removedFriend']),
         State.State('removedFriend', self.enterRemovedFriend, self.exitRemovedFriend, ['off'])], 'off', 'off')
        self.actionFSM.enterInitialState()
        return

    def maybeUpdateFriendButton(self):
        if self.friendButton:
            if self.avatarInfo:
                if self.avatarInfo[0] not in base.localAvatar.friends:
                    self.friendButton['text'] = 'Add Friend'
                    self.friendButton['extraArgs'] = ['waitOnAvatarFriendListResponse']
                else:
                    self.friendButton['text'] = 'Remove Friend'
                    self.friendButton['extraArgs'] = ['removeFriendConfirm']

    def enterOff(self):
        pass

    def exitOff(self):
        pass

    def enterUnableToTP(self):
        pass

    def exitUnableToTP(self):
        pass

    def enterWaitOnAvatarTeleportResponse(self):
        self.setActionText(self.State2Text['teleport'][0] % self.getAvatarName())
        self.makeButtons('Cancel')
        self.acceptOnce('gotAvatarTeleportResponse', self.handleTeleportResponse)
        base.cr.friendsManager.d_iWantToTeleportToAvatar(self.avatarInfo[0])

    def handleTeleportResponse(self, avatarId, shardId, zoneId):
        if self.avatarInfo[0] == avatarId:
            requestStatus = {}
            whereName = ZoneUtil.getWhereName(zoneId)
            loaderName = ZoneUtil.getLoaderName(zoneId)
            requestStatus['zoneId'] = zoneId
            if base.localAvatar.parentId == shardId:
                requestStatus['shardId'] = None
            else:
                requestStatus['shardId'] = shardId
            requestStatus['hoodId'] = ZoneUtil.getHoodId(zoneId, 1)
            requestStatus['where'] = whereName
            requestStatus['loader'] = loaderName
            requestStatus['how'] = 'teleportIn'
            requestStatus['avId'] = avatarId
            base.cr.playGame.getPlace().fsm.request('teleportOut', [requestStatus])
            self.cleanup()
        return

    def exitWaitOnAvatarTeleportResponse(self):
        self.ignore('gotAvatarTeleportResponse')
        self.clearActionText()
        self.clearActionButtons()

    def setActionText(self, text):
        self.actionFrameText.setText(text)

    def clearActionText(self):
        self.actionFrameText.setText('')

    def makeButtons(self, button1, button2 = None):
        button2GeomFunc = {'Cancel': CIGlobals.getCancelBtnGeom,
         'No': CIGlobals.getCancelBtnGeom,
         'Okay': CIGlobals.getOkayBtnGeom,
         'Yes': CIGlobals.getOkayBtnGeom}
        if button1 and not button2:
            button1Pos = (0, 0, -0.1)
        elif button1 and button2:
            button1Pos = (-0.1, 0, -0.1)
        button2Pos = (0.1, 0, -0.1)
        if button1:
            self.actionFrameButton = DirectButton(text=button1, geom=button2GeomFunc[button1](), parent=self.actionFrame, pos=button1Pos, text_scale=0.045, text_pos=(0, -0.08), command=self.actionButtonPressed, extraArgs=[1], relief=None, geom_scale=0.75)
        if button2:
            self.actionFrameButton2 = DirectButton(text=button2, geom=button2GeomFunc[button2](), parent=self.actionFrame, pos=button2Pos, text_scale=0.045, text_pos=(0, -0.08), command=self.actionButtonPressed, extraArgs=[2], relief=None, geom_scale=0.75)
        return

    def actionButtonPressed(self, buttonNum):
        currentState = self.actionFSM.getCurrentState().getName()
        if buttonNum == 1:
            if currentState in ('waitOnAvatarStatusResponse', 'waitOnAvatarTeleportResponse', 'waitOnAvatarFriendListResponse', 'avatarBusy', 'unableToTP', 'fRequestA', 'fRequestR', 'removeFriendConfirm', 'removedFriend'):
                if currentState == 'waitOnAvatarFriendListResponse':
                    base.cr.friendsManager.d_iCancelledFriendRequest(self.avatarInfo[0])
                elif currentState == 'removeFriendConfirm':
                    self.actionFSM.request('removedFriend')
                    return
                self.actionFSM.request('off')
                self.removeActionPanel()
                self.action = None
        elif buttonNum == 2:
            self.actionFSM.request('off')
            self.removeActionPanel()
            self.action = None
        return

    def clearActionButtons(self):
        if self.actionFrameButton2:
            self.actionFrameButton2.destroy()
            self.actionFrameButton2 = None
        if self.actionFrameButton:
            self.actionFrameButton.destroy()
            self.actionFrameButton = None
        return

    def enterAvatarBusy(self):
        self.setActionText(self.State2Text['status'][1] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitAvatarBusy(self):
        self.clearActionText()
        self.clearActionButtons()

    def getAvatarName(self):
        if self.avatarInfo:
            return self.avatarInfo[1]

    def enterWaitOnAvatarStatusResponse(self):
        self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse)
        base.cr.friendsManager.d_requestAvatarStatus(self.avatarInfo[0])
        self.setActionText(self.State2Text['status'][0] % self.getAvatarName())
        self.makeButtons('Cancel')

    def handleAvatarStatusResponse(self, avatarId, status):
        if avatarId == self.avatarInfo[0]:
            if status == 1:
                self.actionFSM.request('avatarBusy')
            else:
                self.actionFSM.request(self.action)
        else:
            self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse)

    def exitWaitOnAvatarStatusResponse(self):
        self.ignore('gotAvatarStatus')
        self.clearActionText()
        self.clearActionButtons()

    def enterWaitOnAvatarFriendListResponse(self):
        self.acceptOnce('friendRequestAccepted', self.handleFriendRequestAccepted)
        self.acceptOnce('friendRequestRejected', self.handleFriendRequestRejected)
        base.cr.friendsManager.d_askAvatarToBeFriends(self.avatarInfo[0])
        self.setActionText(self.State2Text['friend'][0] % self.getAvatarName())
        self.makeButtons('Cancel')

    def handleFriendRequestAccepted(self):
        self.actionFSM.request('fRequestA')

    def handleFriendRequestRejected(self):
        self.actionFSM.request('fRequestR')

    def exitWaitOnAvatarFriendListResponse(self):
        self.ignore('friendRequestAccepted')
        self.ignore('friendRequestRejected')
        self.clearActionText()
        self.clearActionButtons()

    def enterFriendRequestAccepted(self):
        self.setActionText(self.State2Text['friend'][2] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitFriendRequestAccepted(self):
        self.clearActionText()
        self.clearActionButtons()

    def enterFriendRequestRejected(self):
        self.setActionText(self.State2Text['friend'][1] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitFriendRequestRejected(self):
        self.clearActionText()
        self.clearActionButtons()

    def enterRemoveFriendConfirm(self):
        self.setActionText(self.State2Text['remove'][0] % self.getAvatarName())
        self.makeButtons('Yes', 'No')

    def exitRemoveFriendConfirm(self):
        self.clearActionText()
        self.clearActionButtons()

    def enterRemovedFriend(self):
        base.cr.friendsManager.d_iRemovedFriend(self.avatarInfo[0])
        self.setActionText(self.State2Text['remove'][1] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitRemovedFriend(self):
        self.clearActionText()
        self.clearActionButtons()

    def makeActionPanel(self):
        self.actionFrame = DirectFrame(image=DGG.getDefaultDialogGeom(), image_scale=(0.7, 0.5, 0.45), image_color=(1, 1, 0.75, 1), relief=None)
        self.actionFrame.reparentTo(base.a2dTopRight)
        self.actionFrame.setPos(-0.815, 0, -0.31)
        self.actionFrameText = OnscreenText(text='', parent=self.actionFrame, scale=0.05, wordwrap=12, pos=(0, 0.1))
        return

    def removeActionPanel(self):
        self.clearActionButtons()
        if self.actionFrameText:
            self.actionFrameText.destroy()
            self.actionFrameText = None
        if self.actionFrame:
            self.actionFrame.destroy()
            self.actionFrame = None
        return

    def doAction(self, action):
        self.action = action
        self.actionFSM.requestFinalState()
        self.removeActionPanel()
        self.makeActionPanel()
        if action != 'removeFriendConfirm':
            self.actionFSM.request('waitOnAvatarStatusResponse')
        else:
            self.actionFSM.request(action)

    def enterWaitOnAvatarInfoResponse(self):
        self.label = OnscreenText(text='Retrieving Toon\ndetails...', parent=self, scale=0.04)
        self.acceptOnce('avatarInfoResponse', self.handleAvatarInfoResponse)
        base.cr.friendsManager.d_requestAvatarInfo(self.avatarInfo[0])

    def handleAvatarInfoResponse(self, name, dna, maxHealth, health):
        if self.avatarInfo:
            self.avatarInfo.append(name)
            self.avatarInfo.append(dna)
            self.avatarInfo.append(maxHealth)
            self.avatarInfo.append(health)
            self.fsm.request('panel')

    def exitWaitOnAvatarInfoResponse(self):
        self.label.destroy()
        del self.label
        self.ignore('avatarInfoResponse')

    def makePanel(self, avId):
        if self.avatarInfo:
            if self.avatarInfo[0] == avId:
                return
        self.cleanup()
        base.localAvatar.hideFriendButton()
        self.show()
        self.avatarInfo = []
        self.avatarInfo.append(avId)
        self.fsm.request('waitOnAvatarInfoResponse')

    def exitClicked(self):
        self.cleanup()
        base.localAvatar.showFriendButton()

    def cleanup(self):
        self.actionFSM.requestFinalState()
        self.fsm.requestFinalState()
        self.avatarInfo = None
        return

    def enterPanel(self):
        self.nameText = OnscreenText(text=self.avatarInfo[1], parent=self, pos=(0, 0.2), scale=0.035, wordwrap=8)
        self.nameText.setBin('gui-popup', 60)
        dna = ToonDNA.ToonDNA()
        dna.setDNAStrand(self.avatarInfo[2])
        self.head = ToonHead.ToonHead(base.cr)
        self.head.generateHead(dna.gender, dna.animal, dna.head, 1)
        self.head.setHeadColor(dna.headcolor)
        self.head.reparentTo(self)
        self.head.setDepthWrite(1)
        self.head.setDepthTest(1)
        self.head.setH(180)
        self.head.setScale(self.animal2HeadData[dna.animal][0])
        self.head.setZ(self.animal2HeadData[dna.animal][1])
        self.laffMeter = LaffOMeter()
        r, g, b, _ = dna.headcolor
        self.laffMeter.generate(r, g, b, dna.animal, self.avatarInfo[3], self.avatarInfo[4])
        self.laffMeter.reparentTo(self)
        self.laffMeter.setBin('gui-popup', 60)
        self.laffMeter.setScale(0.045)
        self.laffMeter.setPos(0, 0, -0.1)
        self.friendButton = DirectButton(geom=CIGlobals.getDefaultBtnGeom(), text='Add Friend', scale=0.58, relief=None, text_scale=0.058, geom_scale=(1.25, 0, 0.9), text_pos=(0, -0.0125), parent=self, pos=(0, 0, -0.12), command=self.doAction, extraArgs=['waitOnAvatarFriendListResponse'])
        self.friendButton.setPos(0, 0.0, -0.225)
        self.maybeUpdateFriendButton()
        self.teleportButton = DirectButton(geom=CIGlobals.getDefaultBtnGeom(), text='Teleport', scale=0.58, relief=None, text_scale=0.058, geom_scale=(1.25, 0, 0.9), text_pos=(0, -0.0125), parent=self, pos=(0, 0, -0.12), command=self.doAction, extraArgs=['waitOnAvatarTeleportResponse'])
        self.teleportButton.setPos(0, 0, -0.275)
        self.exitButton = DirectButton(geom=CIGlobals.getCancelBtnGeom(), parent=self, relief=None, scale=0.6, pos=(-0.127, 0.0, -0.3425), command=self.exitClicked)
        return

    def exitPanel(self):
        if self.actionFSM.getCurrentState().getName() == 'waitOnAvatarFriendListResponse':
            if self.avatarInfo:
                base.cr.friendsManager.d_iCancelledFriendRequest(self.avatarInfo[0])
        self.actionFSM.requestFinalState()
        self.action = None
        self.avatarInfo = None
        self.removeActionPanel()
        self.hide()
        if self.nameText:
            self.nameText.destroy()
            self.nameText = None
        if self.head:
            self.head.removeNode()
            self.head.delete()
            self.head = None
        if self.laffMeter:
            self.laffMeter.disable()
            self.laffMeter.delete()
            self.laffMeter = None
        if self.friendButton:
            self.friendButton.destroy()
            self.friendButton = None
        if self.teleportButton:
            self.teleportButton.destroy()
            self.teleportButton = None
        if self.exitButton:
            self.exitButton.destroy()
            self.exitButton = None
        return
Example #22
0
class MenuOptions(Menu):

    def __init__(self, _engine):
        """
        This function will initialise the main screen of the options
        and prepare the tabs with the various settings
        """
        Menu.__init__(self)

        # Engine
        self.engine = _engine

        self.initGeneralTab()
        self.initControlTab()

        self.currentTab = [0]

        self.tabGroup = [
            DirectRadioButton(
                text = _("General"),
                variable = self.currentTab,
                value = [0],
                scale = 0.05,
                pos = (-0.6, 0, 0.65),
                command = self.showGeneralTab),
            DirectRadioButton(
                text = _("Controls"),
                variable = self.currentTab,
                value = [1],
                scale = 0.05,
                pos = (0.6, 0, 0.65),
                command = self.showControlTab)
            ]

        for tab in self.tabGroup:
            tab.reparentTo(self.frameMain)
            tab.setOthers(self.tabGroup)

        # set the text of all GUI elements
        self.setText()

        self.hideBase()

    def initGeneralTab(self):
        """
        This function will set up the content of the
        general tab
        """
        self.frameGeneral = DirectFrame(
            # size of the frame
            frameSize = (base.a2dLeft, base.a2dRight,
                         -0.6, 0.6),
            # position of the frame
            pos = (0, 0, 0),
            # tramsparent bg color
            frameColor = (0, 0, 0, 0.5))

        yPos = 0.45
        shiftY = 0.25

        self.lblLanguage = DirectLabel(
            text = _("Language"),
            scale = 0.15,
            pos = (base.a2dLeft + 0.25, 0, yPos),
            frameColor = (0,0,0,0),
            text_fg = (1,1,1,1),
            #text_font = self.defaultFont,
            text_align = TextNode.ALeft)

        self.cmbLanguage = DirectOptionMenu(
            text = "languages",
            scale = 0.15,
            pos = (base.a2dRight - 1.5, 0, 0.45),
            items = ["Deutsch","English","русский", "français"],
            initialitem = 0,
            highlightColor = (0.65,0.65,0.65,1),
            #text_font = self.defaultFontRegular,
            #item_text_font = self.defaultFontRegular,
            command = self.cmbLanguage_SelectionChanged)

        yPos -= shiftY

        self.lblResolution = DirectLabel(
            text = _("Screen resolution"),
            scale = 0.15,
            pos = (base.a2dLeft + 0.25, 0, yPos),
            frameColor = (0,0,0,0),
            text_fg = (1,1,1,1),
            #text_font = self.defaultFont,
            text_align = TextNode.ALeft)

        # get the display resolutions
        di = base.pipe.getDisplayInformation()
        sizes = []
        for index in range(di.getTotalDisplayModes()):
            tmptext = "{0}x{1}".format(
                di.getDisplayModeWidth(index),
                di.getDisplayModeHeight(index))
            if not tmptext in sizes:
                sizes.append(tmptext)

        self.cmbResolution = DirectOptionMenu(
            text = "resolutions",
            scale = 0.15,
            pos = (base.a2dRight - 1.5, 0, yPos),
            items = sizes,
            initialitem = 0,
            highlightColor = (0.65, 0.65, 0.65, 1),
            #text_font = self.defaultFontRegular,
            #item_text_font = self.defaultFontRegular,
            command = self.cmbResolution_SelectionChanged)

        yPos -= shiftY

        self.lblGraphicQuality = DirectLabel(
            text = _("Graphic quality"),
            scale = 0.15,
            pos = (base.a2dLeft + 0.25, 0, yPos),
            frameColor = (0,0,0,0),
            text_fg = (1,1,1,1),
            #text_font = self.defaultFont,
            text_align = TextNode.ALeft)

        self.graphicqualityTextMap = {
            0:_("Low"),
            1:_("Medium"),
            2:_("High")}
        self.sliderGraphicQuality = DirectSlider(
            scale = 0.5,
            pos = (base.a2dRight - 1, 0, yPos + 0.05),
            range = (0,2),
            scrollSize = 1,
            text = self.graphicqualityTextMap[self.engine.settings.graphicquality],
            text_scale = 0.25,
            text_align = TextNode.ALeft,
            text_pos = (1.1, -0.1),
            text_fg = (1,1,1,1),
            #text_font = self.defaultFont,
            value = self.engine.settings.graphicquality,
            command = self.sliderGraphicQuality_ValueChanged)

        yPos -= shiftY

        self.lblVolume = DirectLabel(
            text = _("Volume"),
            scale = 0.15,
            pos = (base.a2dLeft + 0.25, 0, yPos),
            frameColor = (0,0,0,0),
            text_fg = (1,1,1,1),
            #text_font = self.defaultFont,
            text_align = TextNode.ALeft)

        self.sliderVolume = DirectSlider(
            scale = 0.5,
            pos = (base.a2dRight - 1, 0, yPos + 0.05),
            range = (0,1),
            scrollSize = 0.01,
            text = str(int(self.engine.settings.volume * 100)) + "%",
            text_scale = 0.25,
            text_align = TextNode.ALeft,
            text_pos = (1.1, -0.1),
            text_fg = (1,1,1,1),
            #text_font = self.defaultFont,
            value = self.engine.settings.volume,
            command = self.sliderVolume_ValueChanged)

        yPos -= shiftY

        self.lblVolumeMute = DirectLabel(
            text = _("Mute"),
            scale = 0.15,
            pos = (base.a2dLeft + 0.25, 0, yPos),
            frameColor = (0,0,0,0),
            text_fg = (1,1,1,1),
            #text_font = self.defaultFont,
            text_align = TextNode.ALeft)

        self.cbVolumeMute = DirectCheckBox(
            text = "X",
            pos = (base.a2dRight - 1, 0, yPos),
            scale = (0.25, 0.25, 0.25),
            command = self.cbVolumeMute_CheckedChanged,
            rolloverSound = None,
            clickSound = None,
            relief = 0,
            pressEffect = False,
            #frameColor = (0,0,0,0),
            checkedImage = "gui/buttons/options/SoundSwitch_off.png",
            uncheckedImage = "gui/buttons/options/SoundSwitch_on.png"
            )
        self.cbVolumeMute.setTransparency(1)
        self.cbVolumeMute.setImage()
        self.cbVolumeMute["image_scale"] = 0.25
        self.cbVolumeMute["text"] = ""

        self.createBackButton(self.btnBack_Click)

        self.lblLanguage.reparentTo(self.frameGeneral)
        self.cmbLanguage.reparentTo(self.frameGeneral)
        self.lblResolution.reparentTo(self.frameGeneral)
        self.cmbResolution.reparentTo(self.frameGeneral)
        self.lblGraphicQuality.reparentTo(self.frameGeneral)
        self.sliderGraphicQuality.reparentTo(self.frameGeneral)
        self.lblVolume.reparentTo(self.frameGeneral)
        self.sliderVolume.reparentTo(self.frameGeneral)
        self.lblVolumeMute.reparentTo(self.frameGeneral)
        self.cbVolumeMute.reparentTo(self.frameGeneral)

        self.frameGeneral.reparentTo(self.frameMain)

        self.accept("LanguageChanged", self.setText)

    def initControlTab(self):
        """
        This function will set up the content of the
        control tab
        """
        self.frameControl = DirectFrame(
            # size of the frame
            frameSize = (base.a2dLeft, base.a2dRight,
                         -0.6, 0.6),
            # position of the frame
            pos = (0, 0, 0),
            # tramsparent bg color
            frameColor = (0, 0, 0, 0.5))

        numItemsVisible = 9
        itemHeight = 0.10

        # the list field for the keyboard maping to the actions
        self.controlsList = DirectScrolledList(
            decButton_pos= (0, 0, -0.05),
            decButton_text = _("up"),
            decButton_text_scale = 0.04,
            decButton_borderWidth = (0.005, 0.005),

            incButton_pos= (0, 0, -1.05),
            incButton_text = _("down"),
            incButton_text_scale = 0.04,
            incButton_borderWidth = (0.005, 0.005),

            frameSize = (-1, 1, -1.1, 0.0),
            frameColor = (0,0,0,0.5),
            pos = (0, 0, 0.6),
            numItemsVisible = numItemsVisible,
            forceHeight = itemHeight,
            itemFrame_frameSize = (-0.9, 0.9, -0.9, 0),
            itemFrame_pos = (0, 0, -0.1),
            )

        self.fillControlsList()

        self.controlsList.reparentTo(self.frameControl)
        self.frameControl.reparentTo(self.frameMain)

    def fillControlsList(self):
        for key, value in sorted(self.engine.settings.playerKeys.items()):
            # the base frame of any item in the list
            itemFrame = DirectFrame(
                frameSize = (-0.9, 0.9, -0.09, 0),
                frameColor = (0, 1, 0, 0))

            def changeKey(key, value):
                # all possible keyboard keys to set for a specific action
                keyboard = [
                    "escape",
                    "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
                    "f11", "f12",

                    "print_screen", "scroll_lock", "pause", "num_lock",
                    "insert", "delete", "home", "end", "page_up", "page_down",

                    "tab", "caps_lock", "shift", "rcontrol", "lcontrol", "ralt",
                    "lalt", "space", "backspace", "enter",

                    "arrow_left", "arrow_up", "arrow_down", "arrow_right",

                    "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
                    "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x",
                    "y", "z",

                    "ä", "ö", "ü",

                    ",", ";", ".", ":", "_", "-", "#", "'", "+", "*", "~", "'",
                    "`", "!", "\"", "§", "$", "%", "&", "/", "(", ")", "=", "?",
                    "{", "}", "[", "]", "\\", "^", "°"
                    ]

                def setKey(arg):
                    """
                    This function will set the chosen key for the given action
                    """
                    # ignore all keyboard inputs again
                    for keyboardKey in keyboard:
                        self.ignore(keyboardKey)
                    if arg == 1:
                        # if the dialog was closed with OK
                        # set the settings to the new value
                        self.engine.settings.playerKeys[key][0] = self.selectedKey
                        if len(self.engine.settings.playerKeys[key]) > 1:
                            # just set the run key value if it is possible
                            newKey = self.engine.settings.playerKeys["run"][0] + "-" + self.selectedKey
                            self.engine.settings.playerKeys[key][1] = newKey
                    # refresh the controls list
                    self.controlsList.removeAllItems()
                    self.fillControlsList()
                    # finaly close the dialog
                    self.keySelectDialog.hide()
                    self.keySelectDialog = None

                # this variable will store the selected key for the given action
                self.selectedKey = value[0]
                def setSelectedKey(selkey):
                    """
                    set the pressed key as the selected one and actualise the text
                    on the dialog
                    """
                    self.selectedKey = selkey
                    self.keySelectDialog["text"] = "{0}: {1}".format(key, self.selectedKey)

                # accept all keyboard keys
                for keyboardKey in keyboard:
                    self.accept(
                        keyboardKey,
                        setSelectedKey,
                        [keyboardKey])

                # set up a dialog wich will ask for the new key for the chosen action
                self.keySelectDialog = OkCancelDialog(
                    dialogName = "OkCancelDialog",
                    text = "{0}: {1}".format(key, value[0]),
                    fadeScreen = 1,
                    command = setKey
                    )
                # show the dialog
                self.keySelectDialog.show()

            # add the change button to change the key of the action
            itemBtnChange = DirectButton(
                text = _("change"),
                scale = 0.05,
                pos = (0.5, 0, -0.05),
                command = changeKey,
                extraArgs = [key, value]
                )
            itemBtnChange.reparentTo(itemFrame)
            # add the label wich will show the name and key of the action
            itemText = DirectLabel(
                text = "{0} - {1}".format(key, value[0]),
                text_scale = 0.06,
                text_align = TextNode.ALeft,
                pos = (-0.88, 0, -0.06))
            itemText.reparentTo(itemFrame)

            # finaly add the item to the list
            self.controlsList.addItem(itemFrame)


    def show(self):
        self.setText()
        self.showBase()

    def showGeneralTab(self):
        # set the selected language in the textbox
        if self.engine.settings.selectedLanguage == "de-DE":
            self.cmbLanguage.set(0, False)
        elif self.engine.settings.selectedLanguage == "ru-RU":
            self.cmbLanguage.set(2, False)
        elif self.engine.settings.selectedLanguage == "fr-FR":
            self.cmbLanguage.set(3, False)
        else:
            self.cmbLanguage.set(1, False)


        res = str(self.engine.settings.windowSize[0]) + "x" + str(self.engine.settings.windowSize[1])
        i = 0
        for item in self.cmbResolution["items"]:
            if item == res:
                self.cmbResolution.set(i, False)
            i += 1

        self.sliderGraphicQuality["value"] = self.engine.settings.graphicquality

        self.sliderVolume["value"] = self.engine.settings.volume

        #self.cbVolumeMute["indicatorValue"] = settings.muted
        self.cbVolumeMute["isChecked"] = not self.engine.settings.muted
        self.cbVolumeMute.commandFunc(None)
        #self.cbVolumeMute.setIndicatorValue()

        self.frameGeneral.show()
        self.hideControlTab()

    def showControlTab(self):
        self.frameControl.show()
        self.hideGeneralTab()

    def hide(self):
        self.hideBase()

    def hideGeneralTab(self):
        self.frameGeneral.hide()

    def hideControlTab(self):
        self.frameControl.hide()

    def setText(self):
        self.title["text"] = _("Options")
        self.btnBack["text"] = _("Back")
        self.lblLanguage["text"] = _("Language")
        self.lblResolution["text"] = _("Screen resolution")
        self.lblGraphicQuality["text"] = _("Graphic quality")
        self.graphicqualityTextMap = {
            0:_("Low"),
            1:_("Medium"),
            2:_("High")}
        self.sliderGraphicQuality["text"] = self.graphicqualityTextMap[
            self.engine.settings.graphicquality]
        self.lblVolume["text"] = _("Volume")
        self.lblVolumeMute["text"] = _("Mute")


    def cmbLanguage_SelectionChanged(self, arg):
        # TODO: get available languages and maping from language class!
        if arg == "Deutsch":
            self.engine.lng.changeLanguage("de-DE")
            self.engine.settings.selectedLanguage = "de-DE"
        elif arg == "русский":
            self.engine.lng.changeLanguage("ru-RU")
            self.engine.settings.selectedLanguage = "ru-RU"
        elif arg == "français":
            self.engine.lng.changeLanguage("fr-FR")
            self.engine.settings.selectedLanguage = "fr-FR"
        else:
            self.engine.lng.changeLanguage("en-US")
            self.engine.settings.selectedLanguage = "en-US"

    def cmbResolution_SelectionChanged(self, arg):
        resx = int(arg.split("x")[0])
        resy = int(arg.split("x")[1])
        self.engine.settings.windowSize = [resx, resy]
        self.engine.graphicMgr.setResolution(resx, resy)

    def sliderGraphicQuality_ValueChanged(self):
        val = int(round(self.sliderGraphicQuality["value"], 0))
        self.sliderGraphicQuality["text"] = self.graphicqualityTextMap[val]
        if val != self.engine.settings.graphicquality:
            self.engine.settings.graphicquality = val
            self.engine.graphicMgr.setGraphicQuality(self.engine.settings.graphicquality)

    def sliderVolume_ValueChanged(self):
        val = round(self.sliderVolume["value"], 2)
        self.sliderVolume["text"] = str(int(val * 100)) + "%"
        self.engine.settings.volume = val
        self.engine.audioMgr.setVolume(self.engine.settings.volume)

    def cbVolumeMute_CheckedChanged(self, checked):
        self.cbVolumeMute["image_scale"] = 0.35
        self.cbVolumeMute["image_pos"] = (0.05,0,0.25)
        self.engine.settings.muted = bool(checked)
        self.engine.audioMgr.mute(self.engine.settings.muted)

    def btnBack_Click(self):
        base.messenger.send("OptMenu_back")
Example #23
0
class FileDialog(DirectObject):
    def __init__(self, title, initial_status, callback):
        self.frmLeft = -.7
        self.frmBottom = -.12
        self.frmRight = .7
        self.frmTop = .12

        self.frmWidth = self.frmRight - self.frmLeft
        self.frmHeight = self.frmTop - self.frmBottom

        self.title = title
        self.initial_status = initial_status
        self.callback = callback

        self.result = None
        self.done = 0

    def activate(self):
        # create main dialog frame
        # Note: frame position references the CENTER of the frame
        self.frm = DirectFrame(pos=(0, 0, 0),
                               frameSize=(self.frmLeft, self.frmRight,
                                          self.frmBottom, self.frmTop),
                               relief=DGG.RIDGE,
                               borderWidth=(0.01, 0.01),
                               frameColor=(0.6, 0.6, 0.6, 1.0))

        self.frm.reparentTo(base.aspect2d)

        # Note: wonderfully enough, label position on the other hand
        # references the CENTER of the LEFT border of the label!
        titleLabel = DirectLabel(text=self.title,
                                 scale=0.04,
                                 frameColor=(0.5, 0.5, 0.5, 1),
                                 relief=DGG.RIDGE,
                                 borderWidth=(0.01, 0.01),
                                 text_align=TextNode.ALeft)

        titleLabel.setPos(-self.frmWidth / 2 + .02, 0,
                          self.frmHeight / 2 - .045)
        titleLabel.reparentTo(self.frm)

        sc = .04
        self.dir_edit_field = DirectEntry(
            text='',  # prompt text
            scale=sc,
            frameColor=(0.65, 0.65, 0.65, 1),
            command=self.setText,
            width=32,
            numLines=1,
            focus=1,
            focusInCommand=self.efFocusIn,
        )

        self.dir_edit_field.setPos(-self.frmWidth / 2 + .02, 0,
                                   self.frmHeight / 2 - .13)
        self.dir_edit_field.reparentTo(self.frm)

        self.statusLabel = DirectLabel(
            text=self.initial_status,
            scale=0.04,
            frameColor=(0.6, 0.6, 0.6, 1),
            # relief = DGG.RIDGE,
            # borderWidth = (0.01, 0.01),
            text_align=TextNode.ALeft)

        self.statusLabel.setPos(-self.frmWidth / 2 + .02, 0,
                                self.frmHeight / 2 - .2)
        self.statusLabel.reparentTo(self.frm)

    # call this if you need to run a form before your mainloop starts steppping the taskMgr
    def run(self):
        while self.done != 1:
            taskMgr.step()

        taskMgr.step(
        )  # once more to make the last output from the dialog visible
        # while we load a zone
        self.frm.removeNode()

    def end(self):
        self.frm.removeNode()

    # callback function to set  text: called by the Panda3d taskMgr when the user
    # has entered something into the DirectEntry widget
    def setText(self, textEntered):
        print 'dir_edit_field::setText:', textEntered
        self.done = self.callback(textEntered)
        if self.done != 1:
            self.dir_edit_field['focus'] = 1

    #clear the text
    def efFocusIn(self):
        print 'focus in'
        self.dir_edit_field.enterText('')

    def setStatus(self, status):
        self.statusLabel['text'] = status
Example #24
0
class GuiConsole(DirectObject.DirectObject):
    def __init__(self, class_parent, parent, h_size, v_size, aspect, hugpos):
        self.h_size = h_size
        self.v_size = v_size
        self.scale = 0.04
        self.parent = class_parent
        self.numlines = int(v_size / self.scale - 2)

        self.pos_min_x = 0
        self.pos_min_y = 0
        self.pos_max_x = self.h_size
        self.pos_max_y = 0.7

        if aspect > 0:
            self.pos_max_x /= aspect
        else:
            self.pos_max_y *= aspect

        self.consoleFrame = DirectFrame(relief=DGG.RIDGE,
                                        frameColor=(0, 0, 0, 0),
                                        scale=self.scale,
                                        frameSize=(0, self.h_size / self.scale,
                                                   0,
                                                   self.v_size / self.scale))

        if parent == base.a2dBottomLeft:  #@UndefinedVariable
            self.pos_min_x -= 1
            self.pos_min_y -= 1
            self.pos_max_x -= 1
            self.pos_max_y -= 1

        if hugpos == "bottom":
            self.consoleFrame.setPos(0, 0, GUI_BOTTOM_OFFSET - 0.085)
            self.pos_min_x = 0
            self.pos_min_y = GUI_BOTTOM_OFFSET - 0.085 - 0.07
            self.pos_max_x = self.h_size
            self.pos_max_y = GUI_BOTTOM_OFFSET - 0.085

        fixedWidthFont = loader.loadFont(GUI_FONT)  #@UndefinedVariable
        #fixedWidthFont.setPixelsPerUnit(60)
        #fixedWidthFont.setRenderMode(fixedWidthFont.RMSolid)
        if not fixedWidthFont.isValid():
            print "pandaInteractiveConsole.py :: could not load the defined font %s" % str(
                self.font)
            fixedWidthFont = DGG.getDefaultFont()

        #fixedWidthFont.setPageSize(512,512)
        #fixedWidthFont.setPixelsPerUnit(60)

        self.consoleEntry = DirectEntry(
            self.consoleFrame,
            text="",
            command=self.onEnterPress
            #, width       = self.h_size/self.scale -2
            ,
            pos=(0.01, 0, 0.02),
            initialText="Enter text...",
            numLines=1,
            focus=0,
            entryFont=fixedWidthFont,
            scale=1,
            frameColor=(0, 0, 0, 0.2),
            text_fg=(0, 1, 0, 1),
            text_shadow=(0, 0, 0, 1))

        #self.consoleEntry = DirectEntry(self.consoleFrame)

        self.consoleEntry["frameSize"] = (0, self.h_size / self.scale, 0, 1)
        self.consoleEntry["width"] = self.h_size / self.scale
        self.consoleEntry["focusInCommand"] = self.focusInCallback
        self.consoleEntry["focusOutCommand"] = self.focusOutCallback

        self.consoleFrame.reparentTo(parent)

        self.textBuffer = list()
        self.textBufferLength = 100
        for i in xrange(self.textBufferLength):
            self.textBuffer.append(['', (100, 100, 100, 1)])
        self.textBufferPos = self.textBufferLength - self.numlines

        # output lines
        self.consoleOutputList = list()
        for i in xrange(self.numlines):
            label = OnscreenText(parent=self.consoleFrame,
                                 text="",
                                 pos=(0, i + 1.5),
                                 align=TextNode.ALeft,
                                 mayChange=1,
                                 scale=1.0,
                                 fg=(100, 100, 100, 1),
                                 shadow=(0, 0, 0, 1))
            # , frame = (200,0,0,1) )
            label.setFont(fixedWidthFont)
            self.consoleOutputList.append(label)

        self.linelength = 57
        self.linewrap = textwrap.TextWrapper()
        self.linewrap.width = self.linelength
        self.toggleConsole()

    def focusInCallback(self):
        self.parent.parent.camera_manager.disableKeyMovement()

    def focusOutCallback(self):
        self.parent.parent.camera_manager.enableKeyMovement()

    def show(self):
        if self.consoleFrame.isHidden():
            self.consoleFrame.toggleVis()

    def hide(self):
        pass
        #if not self.consoleFrame.isHidden():
        #    self.consoleFrame.toggleVis()

    def toggleConsole(self):
        self.consoleFrame.toggleVis()
        hidden = self.consoleFrame.isHidden()
        #self.consoleEntry['focus'] != hidden
        if hidden:
            #self.ignoreAll()
            self.accept('control', self.toggleConsole)
            self.accept('enter', self.manageFocus)
            self.accept('escape', self.unfocus)
        else:
            #self.ignoreAll()
            #self.accept( 'page_up', self.scroll, [-5] )
            #self.accept( 'page_up-repeat', self.scroll, [-5] )
            #self.accept( 'page_down', self.scroll, [5] )
            #self.accept( 'page_down-repeat', self.scroll, [5] )
            #self.accept( 'window-event', self.windowEvent)

            #self.accept( 'arrow_up'  , self.scrollCmd, [ 1] )
            #self.accept( 'arrow_down', self.scrollCmd, [-1] )

            self.accept('control', self.toggleConsole)
            self.accept('enter', self.manageFocus)
            self.accept('escape', self.unfocus)
            #self.accept( self.autocomplete_key, self.autocomplete )
            #self.accept( self.autohelp_key, self.autohelp )

            # accept v, c and x, where c & x copy's the whole console text
            #messenger.toggleVerbose()
            #for osx use ('meta')
            #if sys.platform == 'darwin':
            #  self.accept( 'meta', self.unfocus )
            #  self.accept( 'meta-up', self.focus )
            #  self.accept( 'meta-c', self.copy )
            #  self.accept( 'meta-x', self.cut )
            #  self.accept( 'meta-v', self.paste )
            #for windows use ('control')
            #if sys.platform == 'win32' or sys.platform == 'linux2':
            #  self.accept( 'control', self.unfocus )
            #  self.accept( 'control-up', self.focus )
            #  self.accept( 'control-c', self.copy )
            #  self.accept( 'control-x', self.cut )
            #  self.accept( 'control-v', self.paste )

    def onEnterPress(self, textEntered):
        # set to last message
        self.textBufferPos = self.textBufferLength - self.numlines
        # clear line
        self.consoleEntry.enterText('')
        self.consoleOutput(textEntered, utils.CONSOLE_PLAYER1_TEXT)
        ClientMsg.chat(textEntered)
        self.focus()

    def manageFocus(self):
        if self.consoleFrame.isHidden():
            self.consoleFrame.toggleVis()

        if self.consoleEntry["focus"] == 0:
            self.focus()

    def consoleOutput(self, printString, msgType):
        if msgType == utils.CONSOLE_SYSTEM_ERROR:
            self.write(printString, utils.CONSOLE_SYSTEM_ERROR_TEXT_COLOR)
        elif msgType == utils.CONSOLE_SYSTEM_MESSAGE:
            self.write(printString, utils.CONSOLE_SYSTEM_MESSAGE_TEXT_COLOR)
        elif msgType == utils.CONSOLE_PLAYER1_TEXT:
            self.write(printString, utils.CONSOLE_PLAYER1_TEXT_COLOR)
        else:
            self.write(printString, utils.CONSOLE_PLAYER2_TEXT_COLOR)

    def write(self, printString, color=(100, 100, 100, 0.5)):
        # remove not printable characters (which can be input by console input)
        printString = re.sub(r'[^%s]' % re.escape(string.printable[:95]), "",
                             printString)

        splitLines = self.linewrap.wrap(printString)
        for line in splitLines:
            self.textBuffer.append([line, color])
            self.textBuffer.pop(0)

        self.updateOutput()

    def updateOutput(self):
        for lineNumber in xrange(self.numlines):
            lineText, color = self.textBuffer[lineNumber + self.textBufferPos]
            self.consoleOutputList[self.numlines - lineNumber -
                                   1].setText(lineText)
            self.consoleOutputList[self.numlines - lineNumber -
                                   1]['fg'] = color

    def focus(self):
        self.consoleEntry['focus'] = 1

    def unfocus(self):
        self.consoleEntry['focus'] = 0

    def getTightBounds(self):
        l, r, b, t = self.consoleFrame.getBounds()
        print l, r, b, t
        bottom_left = Point3(l, 0, b)
        top_right = Point3(r, 0, t)
        return (bottom_left, top_right)
class ToonPanel(DirectFrame):
    notify = directNotify.newCategory("ToonPanel")

    animal2HeadData = {
        'dog': (0.125, 0.04),
        'duck': (0.1, 0.025),
        'cat': (0.115, 0.04),
        'rabbit': (0.115, 0.04),
        'horse': (0.115, 0.06),
        'monkey': (0.115, 0.06),
        'pig': (0.115, 0.07),
        'mouse': (0.09, 0.02),
        'bear': (0.125, 0.05)
    }

    State2Text = {
        'status': ('Seeing if %s is available...',
                   '%s is busy right now; try again later.'),
        'teleport': ('Trying to go to %s...', 'Could not go to %s.'),
        'friend': ('Asking %s to be your friend...', '%s said no, thank you.',
                   'You are now friends with %s!'),
        'remove':
        ('Are you sure you want to remove %s from your friends list?',
         '%s left your friends list.')
    }

    def __init__(self):
        DirectFrame.__init__(self, scale=1.2)
        self['image'] = DGG.getDefaultDialogGeom()
        self['image_hpr'] = (0, 0, -90)
        self['image_scale'] = (0.67, 0.9, 0.325)
        self['image_color'] = (1, 1, 0.75, 1)
        self['image_pos'] = (0, 0, -0.09)
        self['relief'] = None
        self.reparentTo(base.a2dTopRight)
        self.setPos(-0.235, 0.0, -0.325)
        self.hide()
        self.head = None
        self.laffMeter = None
        self.exitButton = None
        self.friendButton = None
        self.teleportButton = None
        self.whisperButton = None
        self.nameText = None
        self.actionFrame = None
        self.actionFrameText = None
        self.actionFrameButton = None
        self.actionFrameButton2 = None
        self.avatarInfo = None
        self.action = None
        self.locationText = None
        self.shardText = None
        self.detailsExitBtn = None

        self.fsm = ClassicFSM.ClassicFSM('ToonPanel', [
            State.State('off', self.enterOff, self.exitOff),
            State.State('waitOnAvatarInfoResponse',
                        self.enterWaitOnAvatarInfoResponse,
                        self.exitWaitOnAvatarInfoResponse, ['panel']),
            State.State('panel', self.enterPanel, self.exitPanel, ['off'])
        ], 'off', 'off')
        self.fsm.enterInitialState()

        self.actionFSM = ClassicFSM.ClassicFSM('ToonPanelActionFSM', [
            State.State('off', self.enterOff, self.exitOff),
            State.State(
                'waitOnAvatarStatusResponse',
                self.enterWaitOnAvatarStatusResponse,
                self.exitWaitOnAvatarStatusResponse, [
                    'waitOnAvatarTeleportResponse',
                    'waitOnAvatarFriendListResponse', 'avatarBusy', 'off'
                ]),
            State.State('avatarBusy', self.enterAvatarBusy,
                        self.exitAvatarBusy, ['off']),
            State.State('waitOnAvatarTeleportResponse',
                        self.enterWaitOnAvatarTeleportResponse,
                        self.exitWaitOnAvatarTeleportResponse, ['unableToTP']),
            State.State('unableToTP', self.enterUnableToTP,
                        self.exitUnableToTP, ['off']),
            State.State('waitOnAvatarFriendListResponse',
                        self.enterWaitOnAvatarFriendListResponse,
                        self.exitWaitOnAvatarFriendListResponse,
                        ['fRequestA', 'fRequestR']),
            State.State('fRequestA', self.enterFriendRequestAccepted,
                        self.exitFriendRequestAccepted, ['off']),
            State.State('fRequestR', self.enterFriendRequestRejected,
                        self.exitFriendRequestRejected, ['off']),
            State.State('removeFriendConfirm', self.enterRemoveFriendConfirm,
                        self.exitRemoveFriendConfirm,
                        ['off', 'removedFriend']),
            State.State('removedFriend', self.enterRemovedFriend,
                        self.exitRemovedFriend, ['off'])
        ], 'off', 'off')
        self.actionFSM.enterInitialState()

    def makeMoreDetailsPanel(self):
        self.actionFSM.request('off')
        self.removeMoreDetailsPanel()
        self.removeActionPanel()
        self.makeActionPanel()
        zoneId = self.avatarInfo[5]
        shardId = self.avatarInfo[6]
        isOnline = self.avatarInfo[7]
        shardName = 'Unknown District'
        hoodName = ZoneUtil.getHoodId(zoneId, 1)
        for district in base.cr.activeDistricts.values():
            if district.doId == shardId:
                shardName = district.getDistrictName()
                break
        if not isOnline:
            hoodName = 'Offline'
            shardName = 'Offline'
        self.locationText = OnscreenText('Location: {0}'.format(hoodName),
                                         parent=self.actionFrame,
                                         pos=(-0.3, 0.05, 0),
                                         align=TextNode.ALeft,
                                         scale=0.04)
        self.shardText = OnscreenText('District: {0}'.format(shardName),
                                      parent=self.actionFrame,
                                      pos=(-0.3, 0.0, 0),
                                      align=TextNode.ALeft,
                                      scale=0.04)
        self.detailsExitBtn = DirectButton(geom=CIGlobals.getCancelBtnGeom(),
                                           parent=self.actionFrame,
                                           relief=None,
                                           scale=0.8,
                                           pos=(-0.3, 0.0, -0.175),
                                           command=self.removeMoreDetailsPanel)

    def removeMoreDetailsPanel(self):
        if self.locationText:
            self.locationText.destroy()
            self.locationText = None
        if self.shardText:
            self.shardText.destroy()
            self.shardText = None
        if self.detailsExitBtn:
            self.detailsExitBtn.destroy()
            self.detailsExitBtn = None
        self.removeActionPanel()

    def maybeUpdateFriendButton(self):
        if self.friendButton:
            if self.avatarInfo:
                if not self.avatarInfo[0] in base.localAvatar.friends:
                    self.friendButton['text'] = 'Add Friend'
                    self.friendButton['extraArgs'] = [
                        'waitOnAvatarFriendListResponse'
                    ]
                else:
                    self.friendButton['text'] = 'Remove Friend'
                    self.friendButton['extraArgs'] = ['removeFriendConfirm']

    def enterOff(self):
        pass

    def exitOff(self):
        pass

    def enterUnableToTP(self):
        pass

    def exitUnableToTP(self):
        pass

    def enterWaitOnAvatarTeleportResponse(self):
        self.setActionText(self.State2Text['teleport'][0] %
                           self.getAvatarName())
        self.makeButtons('Cancel')
        self.acceptOnce('gotAvatarTeleportResponse',
                        self.handleTeleportResponse)
        base.cr.friendsManager.d_iWantToTeleportToAvatar(self.avatarInfo[0])

    def handleTeleportResponse(self, avatarId, shardId, zoneId):
        if self.avatarInfo[0] == avatarId:
            requestStatus = {}
            whereName = ZoneUtil.getWhereName(zoneId)
            loaderName = ZoneUtil.getLoaderName(zoneId)
            requestStatus['zoneId'] = zoneId
            if base.localAvatar.parentId == shardId:
                requestStatus['shardId'] = None
            else:
                requestStatus['shardId'] = shardId
            requestStatus['hoodId'] = ZoneUtil.getHoodId(zoneId, 1)
            requestStatus['where'] = whereName
            requestStatus['loader'] = loaderName
            requestStatus['how'] = 'teleportIn'
            requestStatus['avId'] = avatarId
            base.cr.playGame.getPlace().fsm.request('teleportOut',
                                                    [requestStatus])
            self.cleanup()

    def exitWaitOnAvatarTeleportResponse(self):
        self.ignore('gotAvatarTeleportResponse')
        self.clearActionText()
        self.clearActionButtons()

    def setActionText(self, text):
        self.actionFrameText.setText(text)

    def clearActionText(self):
        self.actionFrameText.setText("")

    def makeButtons(self, button1, button2=None):
        button2GeomFunc = {
            'Cancel': CIGlobals.getCancelBtnGeom,
            'No': CIGlobals.getCancelBtnGeom,
            'Okay': CIGlobals.getOkayBtnGeom,
            'Yes': CIGlobals.getOkayBtnGeom
        }
        if button1 and not button2:
            button1Pos = (0, 0, -0.1)
        elif button1 and button2:
            button1Pos = (-0.1, 0, -0.1)
        button2Pos = (0.1, 0, -0.1)
        if button1:
            self.actionFrameButton = DirectButton(
                text=button1,
                geom=button2GeomFunc[button1](),
                parent=self.actionFrame,
                pos=button1Pos,
                text_scale=0.045,
                text_pos=(0, -0.08),
                command=self.actionButtonPressed,
                extraArgs=[1],
                relief=None,
                geom_scale=0.75)
        if button2:
            self.actionFrameButton2 = DirectButton(
                text=button2,
                geom=button2GeomFunc[button2](),
                parent=self.actionFrame,
                pos=button2Pos,
                text_scale=0.045,
                text_pos=(0, -0.08),
                command=self.actionButtonPressed,
                extraArgs=[2],
                relief=None,
                geom_scale=0.75)

    def actionButtonPressed(self, buttonNum):
        currentState = self.actionFSM.getCurrentState().getName()
        if buttonNum == 1:
            if currentState in [
                    'waitOnAvatarStatusResponse',
                    'waitOnAvatarTeleportResponse',
                    'waitOnAvatarFriendListResponse', 'avatarBusy',
                    'unableToTP', 'fRequestA', 'fRequestR',
                    'removeFriendConfirm', 'removedFriend'
            ]:
                if currentState == 'waitOnAvatarFriendListResponse':
                    base.cr.friendsManager.d_iCancelledFriendRequest(
                        self.avatarInfo[0])
                elif currentState == 'removeFriendConfirm':
                    self.actionFSM.request('removedFriend')
                    return
                self.actionFSM.request('off')
                self.removeActionPanel()
                self.action = None
        elif buttonNum == 2:
            self.actionFSM.request('off')
            self.removeActionPanel()
            self.action = None

    def clearActionButtons(self):
        if self.actionFrameButton2:
            self.actionFrameButton2.destroy()
            self.actionFrameButton2 = None
        if self.actionFrameButton:
            self.actionFrameButton.destroy()
            self.actionFrameButton = None

    def enterAvatarBusy(self):
        self.setActionText(self.State2Text['status'][1] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitAvatarBusy(self):
        self.clearActionText()
        self.clearActionButtons()

    def getAvatarName(self):
        if self.avatarInfo:
            return self.avatarInfo[1]

    def enterWaitOnAvatarStatusResponse(self):
        self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse)
        base.cr.friendsManager.d_requestAvatarStatus(self.avatarInfo[0])
        self.setActionText(self.State2Text['status'][0] % self.getAvatarName())
        self.makeButtons('Cancel')

    def handleAvatarStatusResponse(self, avatarId, status):
        if avatarId == self.avatarInfo[0]:

            # Busy
            if status == 1:
                self.actionFSM.request('avatarBusy')

            # Not busy
            else:
                self.actionFSM.request(self.action)
        else:
            self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse)

    def exitWaitOnAvatarStatusResponse(self):
        self.ignore('gotAvatarStatus')
        self.clearActionText()
        self.clearActionButtons()

    def enterWaitOnAvatarFriendListResponse(self):
        self.acceptOnce('friendRequestAccepted',
                        self.handleFriendRequestAccepted)
        self.acceptOnce('friendRequestRejected',
                        self.handleFriendRequestRejected)
        base.cr.friendsManager.d_askAvatarToBeFriends(self.avatarInfo[0])
        self.setActionText(self.State2Text['friend'][0] % self.getAvatarName())
        self.makeButtons('Cancel')

    def handleFriendRequestAccepted(self):
        self.actionFSM.request('fRequestA')

    def handleFriendRequestRejected(self):
        self.actionFSM.request('fRequestR')

    def exitWaitOnAvatarFriendListResponse(self):
        self.ignore('friendRequestAccepted')
        self.ignore('friendRequestRejected')
        self.clearActionText()
        self.clearActionButtons()

    def enterFriendRequestAccepted(self):
        self.setActionText(self.State2Text['friend'][2] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitFriendRequestAccepted(self):
        self.clearActionText()
        self.clearActionButtons()

    def enterFriendRequestRejected(self):
        self.setActionText(self.State2Text['friend'][1] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitFriendRequestRejected(self):
        self.clearActionText()
        self.clearActionButtons()

    def enterRemoveFriendConfirm(self):
        self.setActionText(self.State2Text['remove'][0] % self.getAvatarName())
        self.makeButtons('Yes', 'No')

    def exitRemoveFriendConfirm(self):
        self.clearActionText()
        self.clearActionButtons()

    def enterRemovedFriend(self):
        base.cr.friendsManager.d_iRemovedFriend(self.avatarInfo[0])
        self.setActionText(self.State2Text['remove'][1] % self.getAvatarName())
        self.makeButtons('Okay')

    def exitRemovedFriend(self):
        self.clearActionText()
        self.clearActionButtons()

    def makeActionPanel(self):
        self.actionFrame = DirectFrame(image=DGG.getDefaultDialogGeom(),
                                       image_scale=(0.7, 0.5, 0.45),
                                       image_color=(1, 1, 0.75, 1),
                                       relief=None)
        self.actionFrame.reparentTo(base.a2dTopRight)
        self.actionFrame.setPos(-0.815, 0, -0.31)
        self.actionFrameText = OnscreenText(text="",
                                            parent=self.actionFrame,
                                            scale=0.05,
                                            wordwrap=12,
                                            pos=(0, 0.1))

    def removeActionPanel(self):
        self.clearActionButtons()
        if self.actionFrameText:
            self.actionFrameText.destroy()
            self.actionFrameText = None
        if self.actionFrame:
            self.actionFrame.destroy()
            self.actionFrame = None

    def doAction(self, action):
        self.action = action
        self.actionFSM.requestFinalState()
        self.removeMoreDetailsPanel()
        self.removeActionPanel()
        self.makeActionPanel()
        if action != 'removeFriendConfirm':
            self.actionFSM.request('waitOnAvatarStatusResponse')
        else:
            self.actionFSM.request(action)

    def enterWaitOnAvatarInfoResponse(self):
        self.label = OnscreenText(text='Retrieving Toon\ndetails...',
                                  parent=self,
                                  scale=0.04)
        self.acceptOnce('avatarInfoResponse', self.handleAvatarInfoResponse)
        base.cr.friendsManager.d_requestAvatarInfo(self.avatarInfo[0])

    def handleAvatarInfoResponse(self, name, dna, maxHealth, health, zoneId,
                                 shardId, isOnline, adminToken):
        if self.avatarInfo:
            self.avatarInfo.append(name)
            self.avatarInfo.append(dna)
            self.avatarInfo.append(maxHealth)
            self.avatarInfo.append(health)
            self.avatarInfo.append(zoneId)
            self.avatarInfo.append(shardId)
            self.avatarInfo.append(isOnline)
            self.avatarInfo.append(adminToken)
            self.fsm.request('panel')

    def exitWaitOnAvatarInfoResponse(self):
        self.label.destroy()
        del self.label
        self.ignore('avatarInfoResponse')

    def makePanel(self, avId):
        if self.avatarInfo:
            if self.avatarInfo[0] == avId:
                # They clicked on the same toon without closing the
                # previous panel, maybe they're spamming?
                return

        self.cleanup()

        base.localAvatar.hideFriendButton()

        self.show()
        self.avatarInfo = []
        self.avatarInfo.append(avId)
        self.fsm.request('waitOnAvatarInfoResponse')

    def exitClicked(self):
        self.cleanup()
        base.localAvatar.showFriendButton()

    def cleanup(self):
        self.actionFSM.requestFinalState()
        self.fsm.requestFinalState()
        self.avatarInfo = None

    def enterPanel(self):
        adminToken = self.avatarInfo[8]
        text_color = CIGlobals.TextColorByAdminToken[adminToken]
        self.nameText = OnscreenText(text=self.avatarInfo[1],
                                     parent=self,
                                     pos=(0, 0.2),
                                     scale=0.035,
                                     wordwrap=8,
                                     fg=text_color)
        self.nameText.setBin('gui-popup', 60)

        dna = ToonDNA.ToonDNA()
        dna.setDNAStrand(self.avatarInfo[2])

        self.head = ToonHead.ToonHead(base.cr)
        self.head.generateHead(dna.gender, dna.animal, dna.head, 1)
        self.head.setHeadColor(dna.headcolor)
        self.head.reparentTo(self)
        self.head.setDepthWrite(1)
        self.head.setDepthTest(1)
        self.head.setH(180)
        self.head.setScale(self.animal2HeadData[dna.animal][0])
        self.head.setZ(self.animal2HeadData[dna.animal][1])

        self.laffMeter = LaffOMeter()
        r, g, b, _ = dna.headcolor
        self.laffMeter.generate(r, g, b, dna.animal, self.avatarInfo[3],
                                self.avatarInfo[4])
        self.laffMeter.reparentTo(self)
        self.laffMeter.setBin('gui-popup', 60)
        self.laffMeter.setScale(0.045)
        self.laffMeter.setPos(0, 0, -0.1)

        self.friendButton = DirectButton(
            geom=CIGlobals.getDefaultBtnGeom(),
            text="Add Friend",
            scale=0.58,
            relief=None,
            text_scale=0.058,
            geom_scale=(1.25, 0, 0.9),
            text_pos=(0, -0.0125),
            parent=self,
            pos=(0, 0, -0.12),
            command=self.doAction,
            extraArgs=['waitOnAvatarFriendListResponse'])
        self.friendButton.setPos(0, 0.0, -0.225)
        self.maybeUpdateFriendButton()

        self.teleportButton = DirectButton(
            geom=CIGlobals.getDefaultBtnGeom(),
            text="Teleport",
            scale=0.58,
            relief=None,
            text_scale=0.058,
            geom_scale=(1.25, 0, 0.9),
            text_pos=(0, -0.0125),
            parent=self,
            pos=(0, 0, -0.12),
            command=self.doAction,
            extraArgs=['waitOnAvatarTeleportResponse'])
        self.teleportButton.setPos(0, 0, -0.275)

        self.whisperButton = DirectButton(
            geom=CIGlobals.getDefaultBtnGeom(),
            text="Whisper",
            scale=0.58,
            relief=None,
            text_scale=0.058,
            geom_scale=(1.25, 0, 0.9),
            text_pos=(0, -0.0125),
            parent=self,
            pos=(0, 0, -0.12),
            command=base.localAvatar.handleClickedWhisper,
            extraArgs=[self.avatarInfo[1], self.avatarInfo[0], 1])
        self.whisperButton.setPos(0, 0, -0.325)

        self.exitButton = DirectButton(geom=CIGlobals.getCancelBtnGeom(),
                                       parent=self,
                                       relief=None,
                                       scale=0.6,
                                       pos=(0, 0.0, -0.39),
                                       command=self.exitClicked)
        gui = loader.loadModel("phase_3.5/models/gui/friendslist_gui.bam")
        self.moreDetailsBtn = DirectButton(
            geom=(gui.find('**/Horiz_Arrow_UP'), gui.find('**/Horiz_Arrow_DN'),
                  gui.find('**/Horiz_Arrow_Rllvr'),
                  gui.find('**/Horiz_Arrow_UP')),
            relief=None,
            parent=self,
            pos=(-0.127, 0.0, -0.39),
            geom_hpr=(180, 0, 0),
            command=self.makeMoreDetailsPanel,
            scale=0.77,
            text=('', 'More Details', 'More Details', ''),
            text_scale=0.045,
            text_fg=(1, 1, 1, 1),
            text_shadow=(0, 0, 0, 1),
            text_pos=(-0.08, -0.01),
            text_align=TextNode.ARight)

    def exitPanel(self):
        if self.actionFSM.getCurrentState().getName(
        ) == 'waitOnAvatarFriendListResponse':
            if self.avatarInfo:
                base.cr.friendsManager.d_iCancelledFriendRequest(
                    self.avatarInfo[0])
        self.actionFSM.requestFinalState()
        self.action = None
        self.avatarInfo = None
        self.removeActionPanel()
        self.removeMoreDetailsPanel()
        self.hide()
        if self.nameText:
            self.nameText.destroy()
            self.nameText = None
        if self.head:
            self.head.removeNode()
            self.head.delete()
            self.head = None
        if self.laffMeter:
            self.laffMeter.disable()
            self.laffMeter.delete()
            self.laffMeter = None
        if self.friendButton:
            self.friendButton.destroy()
            self.friendButton = None
        if self.teleportButton:
            self.teleportButton.destroy()
            self.teleportButton = None
        if self.whisperButton:
            self.whisperButton.destroy()
            self.whisperButton = None
        if self.exitButton:
            self.exitButton.destroy()
            self.exitButton = None
        if self.moreDetailsBtn:
            self.moreDetailsBtn.destroy()
            self.moreDetailsBtn = None
Example #26
0
class OptionMenu(IMenu):
    def __init__(self):
        frame = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                       base.a2dBottom, base.a2dTop),
                            frameColor=(0, 0, 0, 1.0))
        IMenu.__init__(self, frame=frame)
        self.menuVerticalChoicesList = [
            {
                "event": "Option-Items",
                "text": "Items"
            },
            # {"event": "Option-Equip", "text": "Equip"},
            # {"event": "Option-Magic", "text": "Magic"},
            {
                "event": "Option-Save",
                "text": "Save"
            },
            {
                "event": "Option-Config",
                "text": "Config"
            },
            {
                "event": "Back-Field",
                "text": "Back to Game"
            },
            {
                "event": "Option-Quit",
                "text": "Back to Start Menu"
            }
        ]
        self.menuHorizontalChoices = [{
            "event": "Chara-Sub",
            "text": "*"
        }, {
            "event": "Chara-Add",
            "text": "*"
        }]
        self.characterSheetList = []
        self.characterSheetIndex = 0
        for hero in base.gameData.hero_party:
            self.characterSheetList.append(hero)

        self.createVerticalButtons()
        self.addTitle()
        self.charaName = None
        self.statsSheet = None
        self.displayCharacterSheet(self.characterSheetIndex)

    def createButton(self, text, index, eventArgs):
        btn = DirectRadioButton(text=text.upper(),
                                text_align=TextNode.ALeft,
                                scale=0.05,
                                frameColor=(0, 0, 0, 0.0),
                                pos=(base.a2dLeft + 0.075, 0,
                                     (0.3 - (index * .15))),
                                variable=self.menuVerticalChoice,
                                value=[index],
                                text_fg=(1, 1, 1, 1),
                                command=self.menuVerticalEvent)

        self.menuVerticalButtons.append(btn)
        btn.reparentTo(self.frameMain)

    def addTitle(self):
        self.title = OnscreenText('Character Stats',
                                  1,
                                  fg=(1, 0, 0, 1),
                                  pos=(base.a2dLeft + 0.7, 0.8),
                                  font=base.font_title,
                                  align=TextNode.ALeft,
                                  scale=.15,
                                  mayChange=1)
        self.title.reparentTo(self.frameMain)

    def cancelCommand(self):
        base.messenger.send("Back-Field")

    def displayCharacterSheet(self, value):
        if self.charaName:
            self.charaName.detachNode()
            self.statsSheet.detachNode()
        self.characterSheetIndex += value
        self.characterSheetIndex = max(0, self.characterSheetIndex)
        self.characterSheetIndex = min(self.characterSheetIndex,
                                       len(self.characterSheetList) - 1)
        chara = self.characterSheetList[self.characterSheetIndex]
        self.charaName = DirectLabel(scale=0.12,
                                     text_align=TextNode.ALeft,
                                     pos=(base.a2dLeft + 0.7, 0, 0.5),
                                     pad=(0.5, 0.5),
                                     frameColor=(0, 0, 0, 0.0),
                                     text=chara['name'],
                                     text_fg=(1, 1, 1, 1))
        self.charaName.reparentTo(self.frameMain)

        self.statsSheet = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                                 base.a2dBottom, base.a2dTop),
                                      frameColor=(0, 1, 0, 0))

        next_xp = y_helpers.get_experience_estimate(chara['level'] + 1)
        stats = [
            'Health Points: {} / {}'.format(chara['hp'], chara['max_hp']),
            'Level: {}'.format(chara['level']),
            '',
            'Attack: {}'.format(y_helpers.get_stat(chara['attack'])),
            'Defense: {}'.format(y_helpers.get_stat(chara['defense'])),
            'Speed: {}'.format(y_helpers.get_stat(chara['speed'])),
            '',
            'Experience Points: {}'.format(chara['xp']),
            'Points needed to level up: {}'.format(next_xp - chara['xp']),
        ]
        for stat in stats:
            self.add_stat(stat, stats.index(stat))
        self.statsSheet.reparentTo(self.frameMain)

    def add_stat(self, text, index):
        stat = DirectLabel(scale=0.07,
                           text_align=TextNode.ALeft,
                           pos=(base.a2dLeft + 0.7, 0, (0.3 - (index * .1))),
                           pad=(0.5, 0.5),
                           frameColor=(0, 0, 0, 0.0),
                           text=text,
                           text_fg=(1, 1, 1, 1))
        stat.reparentTo(self.statsSheet)
Example #27
0
class LevelSelection:
    def __init__(self):

        self.frameMain = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                                base.a2dBottom, base.a2dTop),
                                     frameColor=(0.05, 0.05, 0.05, 1))
        self.frameMain.setTransparency(1)

        self.btnLevel1 = self.createLevelButton(
            (-0.6, 0, 0.15), "assets/gui/Level1Button.png", 1)
        self.btnLevel1.reparentTo(self.frameMain)

        self.btnLevel2 = self.createLevelButton(
            (0.6, 0, 0.15), "assets/gui/Level2Button.png", 2)
        self.btnLevel2.reparentTo(self.frameMain)

        self.footerFrame = DirectFrame(text="SELECT THE ARENA",
                                       text_fg=(1, 1, 1, 1),
                                       text_scale=0.08,
                                       text_pos=(0, -0.03),
                                       frameSize=(base.a2dLeft, base.a2dRight,
                                                  0.1, -0.1),
                                       pos=(0, 0, base.a2dBottom + 0.2),
                                       frameColor=(0, 0, 0, 0.5))
        self.footerFrame.setTransparency(1)
        self.footerFrame.reparentTo(self.frameMain)

        self.btnBack = DirectButton(text="BACK",
                                    text_fg=(1, 1, 1, 1),
                                    text_align=TextNode.ALeft,
                                    scale=0.1,
                                    pad=(0.15, 0.15),
                                    pos=(base.a2dLeft + 0.08, 0, -0.03),
                                    frameColor=(
                                        (0.2, 0.2, 0.2, 0.8),
                                        (0.4, 0.4, 0.4, 0.8),
                                        (0.4, 0.4, 0.4, 0.8),
                                        (0.1, 0.1, 0.1, 0.8),
                                    ),
                                    relief=1,
                                    command=base.messenger.send,
                                    extraArgs=["LevelSelection-Back"],
                                    pressEffect=False,
                                    rolloverSound=None,
                                    clickSound=None)
        self.btnBack.setTransparency(1)
        self.btnBack.reparentTo(self.footerFrame)

        self.hide()

    def createLevelButton(self, pos, image, levelNr):
        btn = DirectButton(scale=(0.5, 1, 0.75),
                           relief=0,
                           frameColor=(0, 0, 0, 0),
                           pos=pos,
                           image=image,
                           command=self.selectLevel,
                           extraArgs=[levelNr],
                           rolloverSound=None,
                           clickSound=None)
        btn.setTransparency(1)
        return btn

    def selectLevel(self, level):
        self.selectedLevel = level
        base.messenger.send("LevelSelection-Start")

    def show(self):
        self.frameMain.show()

    def hide(self):
        self.frameMain.hide()
Example #28
0
class GuiTextFrame:
    def __init__(self, offset, h_size, v_size, numLines, hugpos):
        self.numLines = numLines
        #if hugpos == "statusbar":
        #    color = (0,0,0,1)
        #else:
        #    color = (0.2, 0.2, 0.2, 0.8)
        color = (0.2, 0.2, 0.2, 0.9)
        self.frame = DirectFrame(   relief = DGG.FLAT
                                  , frameColor = color
                                  , scale = 1
                                  , frameSize = (0, h_size, 0, -v_size) )
        self.v_size = v_size
        self.hugpos = hugpos
        self.offset = offset
        
        if hugpos == "top":
            self.frame.reparentTo(base.a2dTopLeft)#@UndefinedVariable
            self.frame.setPos(self.offset.getX(), 0, self.offset.getZ() - GUI_TOP_OFFSET)
        elif hugpos == "bottom":
            self.frame.reparentTo(base.a2dBottomLeft)#@UndefinedVariable
            self.frame.setPos(self.offset.getX(), 0, self.offset.getZ() + GUI_BOTTOM_OFFSET -0.085)
        elif hugpos == "statusbar":
            self.frame.reparentTo(base.a2dTopLeft)#@UndefinedVariable
            self.frame.setPos(self.offset.getX(), 0, self.offset.getZ())

        fixedWidthFont = loader.loadFont(GUI_FONT)#@UndefinedVariable
        if not fixedWidthFont.isValid():
            print "pandaInteractiveConsole.py :: could not load the defined font %s" % str(self.font)
            fixedWidthFont = DGG.getDefaultFont()
        
        if numLines == 1:
            self.lineHeight = 0.05
        else:
            self.lineHeight = v_size*0.9 / numLines
            
        # output lines
        self.frameOutputList = list()
        for i in xrange( self.numLines ):
            label = OnscreenText( parent = self.frame
                              , text = ""
                              , pos = (0.005, -(i+1)*self.lineHeight)
                              , align=TextNode.ALeft
                              , mayChange=1
                              , scale=0.04
                              , fg = (1,1,1,1)
                              , shadow = (0, 0, 0, 1))
                              #, frame = (200,0,0,1) )
            label.setFont( fixedWidthFont )
            self.frameOutputList.append( label )

    def write(self, lineNumber, text):
        if lineNumber > self.numLines:
            return
        self.frameOutputList[lineNumber - 1].setText(text)
        
    def redraw(self, aspect):
        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)
            self.frame.setPos(p)
        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)
            self.frame.setPos(p)
        elif self.hugpos == "statusbar":
            self.frame["frameSize"] = (0, 2*aspect, 0, -self.v_size)
            self.frame.resetFrameSize()
Example #29
0
class FullscreenPopup(DirectObject):
    
    def __init__(self, title, fields, initialValues, okayFunction, cancelFunction):
        self.okayFunction = okayFunction
        self.cancelFunction = cancelFunction
        self.node = aspect2d.attachNewNode('popup')
        self.frame = DirectFrame()
        self.fields = {}
        self.LoadContent(title, fields, initialValues)
        self.frame.reparentTo(self.node)
        
    def LoadContent(self, title, fields, initialValues):
        bg = OnscreenImage(image = 'Assets/Images/Inventory/BlackScreen.png', scale = (2, 1, 1))
        bg.setTransparency(TransparencyAttrib.MAlpha)
        bg.reparentTo(self.node)
        
        popup = OnscreenImage(image = 'Assets/Images/Menus/Popups/fullscreenPopup.png')
        popup.setTransparency(TransparencyAttrib.MAlpha)
        popup.reparentTo(self.node)
        
        titleText = OnscreenText(text = title, pos = (-0.29, 0.81), scale = 0.07, fg = (1, 1, 1, 1))
        titleText.reparentTo(self.node)
        
        self.LoadButton('Button_Okay', 'okay', 'okay_over', -0.27, -0.8, self.OnButtonClicked, ['okay'])
        self.LoadButton('Button_Cancel', 'cancel', 'cancel_over', 0.27, -0.8, self.OnButtonClicked, ['cancel'])
        
        y = 0
        for i in xrange(len(fields)):
            self.fields[fields[i]] = self.CreateField(fields[i], initialValues[i], y, y)
            y += 1
        
    def LoadButton(self, egg, up, over, x, y, cmd, args):
        maps = loader.loadModel("Assets/Images/Menus/Popups/%s" % (egg))
        b = DirectButton(geom = (maps.find('**/%s' % (up)),
                         maps.find('**/%s' % (over)),
                         maps.find('**/%s' % (over)),
                         maps.find('**/%s' % (up))),
                         command = cmd,
                         extraArgs = args,
                         pressEffect = 0,
                         relief = None,
                         rolloverSound = None, 
                         clickSound = None,
                         pos = (x, 1, y),
                         scale = (0.5, 1, 60.0/400.0))
        b.reparentTo(self.frame)
        
    def CreateField(self, fieldLabel, initText, yIndex, focus):
        label = OnscreenText(text = fieldLabel, pos = (-0.4, 0.35 - yIndex * 0.2), scale = 0.07, fg = (1, 1, 1, 1))
        label.reparentTo(self.node)
        f = DirectEntry(text = '' ,
                        scale = 0.05,
                        initialText = initText, 
                        numLines = 1,
                        rolloverSound = None,
                        clickSound = None,
                        pos = (-0.4, 1, 0.25 - yIndex * 0.2),
                        focus = (not focus))
        f.reparentTo(self.frame)
        return f
    
    def GetValue(self, key):
        return self.fields[key].get()
        
    def Destroy(self):
        self.frame.destroy()
        self.node.removeNode()
        
    def OnButtonClicked(self, buttonText):
        if(buttonText == 'okay'):
            self.okayFunction(self)
        elif(buttonText == 'cancel'):
            self.cancelFunction(self)
Example #30
0
class Menu(UIItem):
    def __init__(self, list=[]):
        self.__menuContainer = DirectFrame(
            #text_pos=(0,1),
            pos=(0, 0, 0),
            text_scale=1.5,
            text_fg=(0, 0, 0, 0),
            relief=DGG.FLAT,
            frameColor=(1, 1, 1, 0.5))
        self.__menuContainer.hide()
        self.__menuItems = []
        self.selectedItem = 0
        self.addItems(list)

    def addItem(self, text, action):
        self.__menuItems.append(
            DirectButton(
                text=text,
                command=self.pressEnter,
                extraArgs=[len(self.__menuItems)],
                text_align=TextNode.ALeft,
                scale=0.1,
                #left/right, forward/back, up/down
                pos=Vec3(-0.38, 0, 0.5 - (len(self.__menuItems) * 0.15)),
                text_fg=(1, 1, 1, 1),
                rolloverSound=None,
                clickSound=None,
                pressEffect=0,
                relief=None,
                textMayChange=True
                #text_font=base.fontLoader.load('Arial Bold.ttf')
            ))
        self.__menuItems[-1].reparentTo(self.__menuContainer)
        self.__menuItems[-1].setPythonTag('action', action)
        self.__menuItems[-1].setPythonTag('text', text)

    def addItems(self, list):
        for k, v in list:
            self.addItem(k, v)

    def hasItem(self, text):
        for i in self.__menuItems:
            if (i['text'] == text): return True
        return False

    def __del__(self):
        self.ignoreAll()

    def pressEnter(self, item=None):
        if (item != None):
            self.selectedItem = item

        logging.info("pressEnter:: selectedItem = %s" % str(self.selectedItem))

        action = self.__menuItems[self.selectedItem].getPythonTag('action')
        text = self.__menuItems[self.selectedItem].getPythonTag('text')

        logging.info("pressEnter:: action = %s" % str(action))

        if (action != None):  #function
            #self.hide()
            action(text)  #call the function in 'action'

    def enter(self):
        """ Press the enter key to select the current menu item. """
        self.pressEnter()
        UIItem.enter(self)

    def up(self):
        """Move one item up in the menu."""
        newItem = self.selectedItem - 1
        if (newItem < 0):
            newItem = len(self.__menuItems) - 1
        self.select(newItem)

        UIItem.up(self)

    def down(self):
        """Move one item down in the menu."""
        newItem = self.selectedItem + 1
        if (newItem >= len(self.__menuItems)):
            newItem = 0
        self.select(newItem)

        UIItem.down(self)

    def select(self, item):
        self.__menuItems[self.selectedItem]['text_fg'] = (1, 1, 1, 1)
        self.__menuItems[self.selectedItem]['text_bg'] = (0, 0, 0, 0)
        self.selectedItem = item
        self.__menuItems[self.selectedItem]['text_fg'] = (0, 0, 0.5, 1)
        self.__menuItems[self.selectedItem]['text_bg'] = (1, 1, 1, 1)

    def show(self):
        assert len(self.__menuItems) > 0
        self.select(0)  #make the first item selected
        if (self.__menuContainer.isHidden()):
            Sequence(
                Func(self.__menuContainer.setAlphaScale, 0.0),
                Func(self.__menuContainer.show),
                LerpFunctionInterval(self.__menuContainer.setAlphaScale,
                                     toData=1.0,
                                     fromData=0.0,
                                     duration=1.0)).start()

    def hide(self):
        self.ignoreAll()
        if (not self.__menuContainer.isHidden()):
            Sequence(
                LerpFunctionInterval(self.__menuContainer.setAlphaScale,
                                     toData=0.0,
                                     fromData=1.0,
                                     duration=1.0),
                Func(self.__menuContainer.hide),
                Func(self.__menuContainer.setAlphaScale, 1.0)).start()
        #now, hide all dialogs referred to:
        for i in self.__menuItems:
            a = i.getPythonTag('action')
            if (isinstance(a, Menu)):
                a.hide()

    def setParent(self, parent):
        self.__menuContainer.reparentTo(parent)

    def setPos(self, x, y, z):
        self.__menuContainer.setPos(x, y, z)
class CharacterSelection:
    def __init__(self):

        self.frameMain = DirectFrame(
            frameSize = (base.a2dLeft, base.a2dRight,
                         base.a2dBottom, base.a2dTop),
            frameColor = (0.05, 0.05, 0.05, 1))
        self.frameMain.setTransparency(1)

        width = abs(base.a2dLeft) + base.a2dRight

        red = loader.loadTexture("assets/gui/CharRedBG.png")
        red.setWrapU(Texture.WM_repeat)
        red.setWrapV(Texture.WM_repeat)
        self.char1Frame = DirectFrame(
            text = "Player 1",
            text_fg = (1,1,1,1),
            text_scale = 0.1,
            text_pos = (0, base.a2dTop - 0.2),
            frameSize = (-width/6.0, width/6.0,
                         base.a2dBottom, base.a2dTop),
            frameTexture = red,
            pos = (base.a2dLeft+width/6.0, 0, 0))
        self.char1Frame.updateFrameStyle()
        self.char1Frame.setTransparency(1)
        self.char1Frame.reparentTo(self.frameMain)

        blue = loader.loadTexture("assets/gui/CharBlueBG.png")
        blue.setWrapU(Texture.WM_repeat)
        blue.setWrapV(Texture.WM_repeat)
        self.char2Frame = DirectFrame(
            text = "Player 2",
            text_fg = (1,1,1,1),
            text_scale = 0.1,
            text_pos = (0, base.a2dTop - 0.2),
            frameSize = (-width/6.0, width/6.0,
                         base.a2dBottom, base.a2dTop),
            frameTexture = blue,
            pos = (base.a2dRight-width/6.0, 0, 0))
        self.char2Frame.setTransparency(1)
        self.char2Frame.reparentTo(self.frameMain)

        self.footerFrame = DirectFrame(
            text = "PLAYER 1 - CHOOSE YOUR CHARACTER",
            text_fg = (1,1,1,1),
            text_scale = 0.08,
            text_pos = (0, -0.03),
            frameSize = (base.a2dLeft, base.a2dRight,
                         0.1, -0.1),
            pos = (0, 0, base.a2dBottom + 0.2),
            frameColor = (0, 0, 0, 0.5))
        self.footerFrame.setTransparency(1)
        self.footerFrame.reparentTo(self.frameMain)

        self.charSelectFrame = DirectFrame(
            text = "VS",
            text_fg = (1,1,1,1),
            text_scale = 0.1,
            text_pos = (0, base.a2dTop - 0.2),
            frameSize = (-width/6.0, width/6.0,
                         base.a2dBottom, base.a2dTop),
            frameColor = (0,0,0,0))
        self.charSelectFrame.reparentTo(self.frameMain)

        self.btnChar1 = self.createCharacterButton(
            (-0.2, 0, 0),
            "assets/gui/Char1Button.png",
            1)
        self.btnChar1.reparentTo(self.charSelectFrame)

        self.btnChar2 = self.createCharacterButton(
            (0.2, 0, 0),
            "assets/gui/Char2Button.png",
            2)
        self.btnChar2.reparentTo(self.charSelectFrame)

        self.btnBack = DirectButton(
            text = "BACK",
            text_fg = (1,1,1,1),
            text_align = TextNode.ALeft,
            scale = 0.1,
            pad = (0.15, 0.15),
            pos = (base.a2dLeft + 0.08, 0, -0.03),
            frameColor = (
                (0.2,0.2,0.2,0.8),
                (0.4,0.4,0.4,0.8),
                (0.4,0.4,0.4,0.8),
                (0.1,0.1,0.1,0.8)),
            relief = 1,
            command = base.messenger.send,
            extraArgs = ["CharSelection-Back"],
            pressEffect = False,
            rolloverSound = None,
            clickSound = None)
        self.btnBack.setTransparency(1)
        self.btnBack.reparentTo(self.footerFrame)

        self.btnStart = DirectButton(
            text = "START",
            text_fg = (1,1,1,1),
            text_align = TextNode.ARight,
            scale = 0.1,
            pad = (0.15, 0.15),
            pos = (base.a2dRight - 0.08, 0, -0.03),
            relief = 1,
            frameColor = (
                (0.2,0.2,0.2,0.8),
                (0.4,0.4,0.4,0.8),
                (0.4,0.4,0.4,0.8),
                (0.1,0.1,0.1,0.8)),
            command = base.messenger.send,
            extraArgs = ["CharSelection-Start"],
            pressEffect = False,
            rolloverSound = None,
            clickSound = None)
        self.btnStart.setTransparency(1)
        self.btnStart.reparentTo(self.footerFrame)
        self.btnStart["state"] = DGG.DISABLED

        self.hide()

    def createCharacterButton(self, pos, image, charNr):
        btn = DirectButton(
            scale = 0.1,
            relief = 0,
            frameColor = (0,0,0,0),
            pos = pos,
            image = image,
            command = self.selectCharacter,
            extraArgs = [charNr],
            rolloverSound = None,
            clickSound = None)
        btn.setTransparency(1)
        return btn

    def selectCharacter(self, charNr):
        if self.char1Frame["image"] == None:
            self.char1Frame["image"] = "assets/gui/Char{}_L.png".format(charNr)
            self.char1Frame["image_scale"] = (0.5,1, 1)
            self.selectedCharacter1 = charNr
            self.footerFrame["text"] = "PLAYER 2 - CHOOSE YOUR CHARACTER"
        elif self.char2Frame["image"] == None:
            self.char2Frame["image"] = "assets/gui/Char{}_R.png".format(charNr)
            self.char2Frame["image_scale"] = (0.5,1, 1)
            self.selectedCharacter2 = charNr
            self.btnStart["state"] = DGG.NORMAL
            self.footerFrame["text"] = "START THE FIGHT >"

    def show(self):
        self.selectedCharacter1 = None
        self.selectedCharacter2 = None
        self.char1Frame["image"] = None
        self.char2Frame["image"] = None
        self.footerFrame["text"] = "PLAYER 1 - CHOOSE YOUR CHARACTER"
        self.btnStart["state"] = DGG.DISABLED
        self.frameMain.show()

    def hide(self):
        self.frameMain.hide()
Example #32
0
class Transitions:

    # These may be reassigned before the fade or iris transitions are
    # actually invoked to change the models that will be used.
    IrisModelName = "models/misc/iris"
    FadeModelName = "models/misc/fade"

    def __init__(self, loader,
                 model=None,
                 scale=3.0,
                 pos=Vec3(0, 0, 0)):
        self.transitionIval = None
        self.letterboxIval = None
        self.iris = None
        self.fade = None
        self.letterbox = None
        self.fadeModel = model
        self.imagePos = pos
        if model:
            self.alphaOff = Vec4(1, 1, 1, 0)
            self.alphaOn = Vec4(1, 1, 1, 1)
            model.setTransparency(1)
            self.lerpFunc = LerpColorScaleInterval
        else:
            self.alphaOff = Vec4(0, 0, 0, 0)
            self.alphaOn = Vec4(0, 0, 0, 1)
            self.lerpFunc = LerpColorInterval

        self.irisTaskName = "irisTask"
        self.fadeTaskName = "fadeTask"
        self.letterboxTaskName = "letterboxTask"

    def __del__(self):
        if self.fadeModel:
            self.fadeModel.removeNode()
            self.fadeModel = None

    ##################################################
    # Fade
    ##################################################

    # We can set a custom model for the fade before using it for the first time
    def setFadeModel(self, model, scale=1.0):
        self.fadeModel = model
        # We have to change some default parameters for a custom fadeModel
        self.alphaOn = Vec4(1, 1, 1, 1)

        # Reload fade if its already been created
        if self.fade:
            self.fade.destroy()
            self.fade = None
            self.loadFade()

    def loadFade(self):
        if self.fade is None:
            # We create a DirectFrame for the fade polygon, instead of
            # simply loading the polygon model and using it directly,
            # so that it will also obscure mouse events for objects
            # positioned behind it.
            self.fade = DirectFrame(
                parent = hidden,
                guiId = 'fade',
                relief = None,
                image = self.fadeModel,
                image_scale = (4, 2, 2),
                state = DGG.NORMAL,
                )
            if not self.fadeModel:
                # No fade model was given, so we make this the fade model.
                self.fade["relief"] = DGG.FLAT
                self.fade["frameSize"] = (-2, 2, -1, 1)
                self.fade["frameColor"] = (0, 0, 0, 1)
                self.fade.setTransparency(TransparencyAttrib.MAlpha)
            self.fade.setBin('unsorted', 0)
            self.fade.setColor(0,0,0,0)

    def getFadeInIval(self, t=0.5, finishIval=None):
        """
        Returns an interval without starting it.  This is particularly useful in
        cutscenes, so when the cutsceneIval is escaped out of we can finish the fade immediately
        """
        #self.noTransitions() masad: this creates a one frame pop, is it necessary?
        self.loadFade()
        transitionIval = Sequence(Func(self.fade.reparentTo, aspect2d, DGG.FADE_SORT_INDEX),
                                  Func(self.fade.showThrough),  # in case aspect2d is hidden for some reason
                                  self.lerpFunc(self.fade, t,
                                                self.alphaOff,
                                                # self.alphaOn,
                                                ),
                                  Func(self.fade.detachNode),
                                  name = self.fadeTaskName,
                                  )
        if finishIval:
            transitionIval.append(finishIval)
        return transitionIval

    def getFadeOutIval(self, t=0.5, finishIval=None):
        """
        Create a sequence that lerps the color out, then
        parents the fade to hidden
        """
        self.noTransitions()
        self.loadFade()

        transitionIval = Sequence(Func(self.fade.reparentTo,aspect2d,DGG.FADE_SORT_INDEX),
                                  Func(self.fade.showThrough),  # in case aspect2d is hidden for some reason
                                  self.lerpFunc(self.fade, t,
                                                self.alphaOn,
                                                # self.alphaOff,
                                                ),
                                  name = self.fadeTaskName,
                                  )
        if finishIval:
            transitionIval.append(finishIval)
        return transitionIval

    def fadeIn(self, t=0.5, finishIval=None):
        """
        Play a fade in transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the color
        from black to transparent. When the color lerp is finished, it
        parents the fade polygon to hidden.
        """
        gsg = base.win.getGsg()
        if gsg:
            # If we're about to fade in from black, go ahead and
            # preload all the textures etc.
            base.graphicsEngine.renderFrame()
            render.prepareScene(gsg)
            render2d.prepareScene(gsg)

        if (t == 0):
            # Fade in immediately with no lerp
            #print "transitiosn: fadeIn 0.0"
            self.noTransitions()
            self.loadFade()
            self.fade.detachNode()
        else:
            # Create a sequence that lerps the color out, then
            # parents the fade to hidden
            self.transitionIval = self.getFadeInIval(t, finishIval)
            self.transitionIval.start()

    def fadeOut(self, t=0.5, finishIval=None):
        """
        Play a fade out transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the color
        from transparent to full black. When the color lerp is finished,
        it leaves the fade polygon covering the aspect2d plane until you
        fadeIn or call noFade.
        lerp
        """
        if (t == 0):
            # Fade out immediately with no lerp
            self.noTransitions()
            self.loadFade()
            self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)
            self.fade.setColor(self.alphaOn)
        elif ConfigVariableBool('no-loading-screen', False):
            if finishIval:
                self.transitionIval = finishIval
                self.transitionIval.start()
        else:
            # Create a sequence that lerps the color out, then
            # parents the fade to hidden
            self.transitionIval = self.getFadeOutIval(t,finishIval)
            self.transitionIval.start()

    def fadeOutActive(self):
        return self.fade and self.fade.getColor()[3] > 0

    def fadeScreen(self, alpha=0.5):
        """
        Put a semitransparent screen over the camera plane
        to darken out the world. Useful for drawing attention to
        a dialog box for instance
        """
        #print "transitiosn: fadeScreen"
        self.noTransitions()
        self.loadFade()
        self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)
        self.fade.setColor(self.alphaOn[0],
                           self.alphaOn[1],
                           self.alphaOn[2],
                           alpha)

    def fadeScreenColor(self, color):
        """
        Put a semitransparent screen over the camera plane
        to darken out the world. Useful for drawing attention to
        a dialog box for instance
        """
        #print "transitiosn: fadeScreenColor"
        self.noTransitions()
        self.loadFade()
        self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)
        self.fade.setColor(color)

    def noFade(self):
        """
        Removes any current fade tasks and parents the fade polygon away
        """
        #print "transitiosn: noFade"
        if self.transitionIval:
            self.transitionIval.pause()
            self.transitionIval = None
        if self.fade:
            # Make sure to reset the color, since fadeOutActive() is looking at it
            self.fade.setColor(self.alphaOff)
            self.fade.detachNode()

    def setFadeColor(self, r, g, b):
        self.alphaOn.set(r, g, b, 1)
        self.alphaOff.set(r, g, b, 0)


    ##################################################
    # Iris
    ##################################################

    def loadIris(self):
        if self.iris == None:
            self.iris = loader.loadModel(self.IrisModelName)
            self.iris.setPos(0, 0, 0)

    def irisIn(self, t=0.5, finishIval=None):
        """
        Play an iris in transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the scale
        of the iris polygon up so it looks like we iris in. When the
        scale lerp is finished, it parents the iris polygon to hidden.
        """
        self.noTransitions()
        self.loadIris()
        if (t == 0):
            self.iris.detachNode()
        else:
            self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)

            self.transitionIval = Sequence(LerpScaleInterval(self.iris, t,
                                                   scale = 0.18,
                                                   startScale = 0.01),
                                 Func(self.iris.detachNode),
                                 name = self.irisTaskName,
                                 )
            if finishIval:
                self.transitionIval.append(finishIval)
            self.transitionIval.start()

    def irisOut(self, t=0.5, finishIval=None):
        """
        Play an iris out transition over t seconds.
        Places a polygon on the aspect2d plane then lerps the scale
        of the iris down so it looks like we iris out. When the scale
        lerp is finished, it leaves the iris polygon covering the
        aspect2d plane until you irisIn or call noIris.
        """
        self.noTransitions()
        self.loadIris()
        self.loadFade()  # we need this to cover up the hole.
        if (t == 0):
            self.iris.detachNode()
            self.fadeOut(0)
        else:
            self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX)

            self.transitionIval = Sequence(LerpScaleInterval(self.iris, t,
                                                   scale = 0.01,
                                                   startScale = 0.18),
                                 Func(self.iris.detachNode),
                                 # Use the fade to cover up the hole that the iris would leave
                                 Func(self.fadeOut, 0),
                                 name = self.irisTaskName,
                                 )
            if finishIval:
                self.transitionIval.append(finishIval)
            self.transitionIval.start()

    def noIris(self):
        """
        Removes any current iris tasks and parents the iris polygon away
        """
        if self.transitionIval:
            self.transitionIval.pause()
            self.transitionIval = None
        if self.iris != None:
            self.iris.detachNode()
        # Actually we need to remove the fade too,
        # because the iris effect uses it.
        self.noFade()

    def noTransitions(self):
        """
        This call should immediately remove any and all transitions running
        """
        self.noFade()
        self.noIris()
        # Letterbox is not really a transition, it is a screen overlay
        # self.noLetterbox()

    ##################################################
    # Letterbox
    ##################################################

    def loadLetterbox(self):
        if not self.letterbox:
            # We create a DirectFrame for the fade polygon, instead of
            # simply loading the polygon model and using it directly,
            # so that it will also obscure mouse events for objects
            # positioned behind it.
            self.letterbox = NodePath("letterbox")
            # Allow fade in and out of the bars
            self.letterbox.setTransparency(1)

            # Allow DirectLabels to be parented to the letterbox sensibly
            self.letterbox.setBin('unsorted', 0)

            # Allow a custom look to the letterbox graphic.

            # TODO: This model isn't available everywhere.  We should
            # pass it in as a parameter.
            button = loader.loadModel('models/gui/toplevel_gui',
                                      okMissing = True)

            barImage = None
            if button:
                barImage = button.find('**/generic_button')

            self.letterboxTop = DirectFrame(
                parent = self.letterbox,
                guiId = 'letterboxTop',
                relief = DGG.FLAT,
                state = DGG.NORMAL,
                frameColor = (0, 0, 0, 1),
                borderWidth = (0, 0),
                frameSize = (-1, 1, 0, 0.2),
                pos = (0, 0, 0.8),
                image = barImage,
                image_scale = (2.25,1,.5),
                image_pos = (0,0,.1),
                image_color = (0.3,0.3,0.3,1),
                sortOrder = 0,
                )
            self.letterboxBottom = DirectFrame(
                parent = self.letterbox,
                guiId = 'letterboxBottom',
                relief = DGG.FLAT,
                state = DGG.NORMAL,
                frameColor = (0, 0, 0, 1),
                borderWidth = (0, 0),
                frameSize = (-1, 1, 0, 0.2),
                pos = (0, 0, -1),
                image = barImage,
                image_scale = (2.25,1,.5),
                image_pos = (0,0,.1),
                image_color = (0.3,0.3,0.3,1),
                sortOrder = 0,
                )

            # masad: always place these at the bottom of render
            self.letterboxTop.setBin('sorted',0)
            self.letterboxBottom.setBin('sorted',0)
            self.letterbox.reparentTo(render2d, -1)
            self.letterboxOff(0)

    def noLetterbox(self):
        """
        Removes any current letterbox tasks and parents the letterbox polygon away
        """
        if self.letterboxIval:
            self.letterboxIval.pause()
            self.letterboxIval = None
        if self.letterbox:
            self.letterbox.stash()

    def letterboxOn(self, t=0.25, finishIval=None):
        """
        Move black bars in over t seconds.
        """
        self.noLetterbox()
        self.loadLetterbox()
        self.letterbox.unstash()
        if (t == 0):
            self.letterboxBottom.setPos(0, 0, -1)
            self.letterboxTop.setPos(0, 0, 0.8)
        else:
            self.letterboxIval = Sequence(Parallel(
                LerpPosInterval(self.letterboxBottom,
                                t,
                                pos = Vec3(0, 0, -1),
                                #startPos = Vec3(0, 0, -1.2),
                                ),
                LerpPosInterval(self.letterboxTop,
                                t,
                                pos = Vec3(0, 0, 0.8),
                                # startPos = Vec3(0, 0, 1),
                                ),
                ),
                                          name = self.letterboxTaskName,
                                          )
            if finishIval:
                self.letterboxIval.append(finishIval)
            self.letterboxIval.start()

    def letterboxOff(self, t=0.25, finishIval=None):
        """
        Move black bars away over t seconds.
        """
        self.noLetterbox()
        self.loadLetterbox()
        self.letterbox.unstash()
        if (t == 0):
            self.letterbox.stash()
        else:
            self.letterboxIval = Sequence(Parallel(
                LerpPosInterval(self.letterboxBottom,
                                t,
                                pos = Vec3(0, 0, -1.2),
                                # startPos = Vec3(0, 0, -1),
                                ),
                LerpPosInterval(self.letterboxTop,
                                t,
                                pos = Vec3(0, 0, 1),
                                # startPos = Vec3(0, 0, 0.8),
                                ),
                ),
                                          Func(self.letterbox.stash),
                                          Func(messenger.send,'letterboxOff'),
                                          name = self.letterboxTaskName,
                                          )
            if finishIval:
                self.letterboxIval.append(finishIval)
            self.letterboxIval.start()
Example #33
0
class DMDSpriteFont(object):
    def __init__(self, fontPath, parent, sX=1, sY=1, sZ=1):
        self.__container = DirectFrame(
            #text_pos=(0,1),
            pos=(0, 0, 0),
            relief=DGG.FLAT,
            frameColor=(1, 1, 1, 0.5))
        self.__container.hide()
        self.__container.reparentTo(parent)
        self._planes = []
        self.char_width = sX - 0.06
        self.sX = sX
        self.sY = sY
        self.sZ = sZ
        self.x = 0
        self.y = 0
        self.z = 0
        self.fontPath = fontPath

        self.textures = {}
        self.char_translation_map = {"%": "percent"}

        for c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890%":
            if c in self.char_translation_map:
                char = self.char_translation_map[c]
            else:
                char = c
            if os.path.exists(os.path.join(self.fontPath, char + ".png")):
                logging.info("Loading font texture " + str(char))
                self.textures[c] = base.loader.loadTexture(
                    os.path.join(self.fontPath, char + ".png"))

    def _addPlane(self):
        plane = base.loader.loadModel('assets/models/plane')
        plane.setPos(self.x + ((len(self._planes) - 1) * self.char_width),
                     self.y, self.z)  #set its position
        plane.setScale(self.sX, self.sY, self.sZ)
        plane.reparentTo(self.__container)  #reparent to render
        plane.setTransparency(1)
        plane.node().setEffect(BillboardEffect.makePointEye())
        self._planes.append(plane)
        return plane

    def clear(self):
        for p in self._planes:
            p.removeNode()
        self._planes = []

    def setText(self, str_text):
        self.clear()
        for c in str_text:
            if c in self.textures:
                plane = self._addPlane()
                plane.setTexture(self.textures[c], 1)

    def setPos(self, position):
        self.x = position[0]
        self.y = position[1]
        self.z = position[2]

    def hide(self):
        self.__container.hide()

    def show(self):
        self.__container.show()
Example #34
0
class MagicMenu(IMenu):
    def __init__(self):
        frame = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                       base.a2dBottom, base.a2dTop),
                            frameColor=(0, 0, 0, 1.0))
        IMenu.__init__(self, frame=frame)
        self.menuVerticalChoicesList = []
        self.menuHorizontalChoices = [{
            "event": "Chara-Sub",
            "text": "*"
        }, {
            "event": "Chara-Add",
            "text": "*"
        }]
        self.characterSheetList = []
        self.characterSheetIndex = 0
        self.statsSheet = None
        for hero in base.gameData.hero_party:
            self.characterSheetList.append(hero)

        self.addTitle()
        self.characterSheet = None
        self.displayCharacterSheet(self.characterSheetIndex)

    def createButton(self, text, index, eventArgs):
        btn = DirectRadioButton(text=text,
                                text_align=TextNode.ALeft,
                                scale=0.05,
                                frameColor=(0, 0, 0, 0.0),
                                pos=(base.a2dLeft + 0.075, 0,
                                     (0.3 - (index * .06))),
                                variable=self.menuVerticalChoice,
                                value=[index],
                                text_fg=(1, 1, 1, 1),
                                command=self.menuVerticalEvent)

        self.menuVerticalButtons.append(btn)
        btn.reparentTo(self.frameMain)

    def addTitle(self):
        self.title = OnscreenText('Magic Spells',
                                  1,
                                  fg=(1, 0, 0, 1),
                                  pos=(base.a2dLeft + 0.7, 0.8),
                                  font=base.font_title,
                                  align=TextNode.ALeft,
                                  scale=.15,
                                  mayChange=1)
        self.title.reparentTo(self.frameMain)

    def cancelCommand(self):
        base.messenger.send("Back-Option")

    def updateInventory(self):
        if self.menuVerticalButtons:
            for btn in self.menuVerticalButtons:
                btn.removeNode()
        self.menuVerticalChoicesList = []
        self.menuVerticalChoice = [0]
        chara = self.characterSheetList[self.characterSheetIndex]
        for magic in chara['magic']:
            magicInfo = y_helpers.find_by_id(magic, base.magicData.items)
            # need events to use items?
            self.menuVerticalChoicesList.append({
                "event": "*",
                "text": magicInfo['name']
            })
        self.menuVerticalChoicesList.append({
            "event": "Back-Option",
            "text": "Back to Menu"
        })

        self.menuVerticalButtons = []
        self.createVerticalButtons()

        self.magic_stats(0)

    def displayCharacterSheet(self, value):
        if self.characterSheet:
            self.characterSheet.detachNode()
        self.characterSheetIndex += value
        self.characterSheetIndex = max(0, self.characterSheetIndex)
        self.characterSheetIndex = min(self.characterSheetIndex,
                                       len(self.characterSheetList) - 1)
        chara = self.characterSheetList[self.characterSheetIndex]
        self.characterSheet = DirectLabel(scale=0.12,
                                          text_align=TextNode.ALeft,
                                          pos=(base.a2dLeft + 0.7, 0, 0.5),
                                          pad=(0.5, 0.5),
                                          frameColor=(0, 0, 0, 0.0),
                                          text=chara['name'],
                                          text_fg=(1, 1, 1, 1))
        self.characterSheet.reparentTo(self.frameMain)

        self.updateInventory()

    def updateCheckbuttons(self):
        for btn in self.menuVerticalButtons:
            index = self.menuVerticalButtons.index(btn)
            isPressed = index == self.menuVerticalChoice[0]
            btn["indicatorValue"] = isPressed
            btn.setIndicatorValue()

            chara = self.characterSheetList[self.characterSheetIndex]
            if self.menuVerticalChoice[0] < len(chara['magic']):
                self.magic_stats(self.menuVerticalChoice[0])

        for btn in self.menuHorizontalButtons:
            index = self.menuHorizontalButtons.index(btn)
            isPressed = index == self.menuHorizontalChoice[0]
            btn["indicatorValue"] = isPressed
            btn.setIndicatorValue()

    def magic_stats(self, index):
        if self.statsSheet:
            self.statsSheet.detachNode()
        self.statsSheet = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                                 base.a2dBottom, base.a2dTop),
                                      frameColor=(0, 1, 0, 0))
        chara = self.characterSheetList[self.characterSheetIndex]
        magic = y_helpers.find_by_id(chara['magic'][index],
                                     base.magicData.items)
        stats = [
            '{}'.format(magic['name']),
            '',
            'Description: {}'.format(magic['description']),
            'Costs: {}'.format(self.write_costs(magic['costs'])),
            'Targets: {}'.format(magic['target']),
        ]
        for stat in stats:
            self.add_stat(stat, stats.index(stat))
        self.statsSheet.reparentTo(self.frameMain)

    def write_costs(self, costs):
        output = ''
        for key in costs:
            output += '({} x {}) '.format(key, costs[key])
        return output

    def add_stat(self, text, index):
        stat = DirectLabel(scale=0.07,
                           text_align=TextNode.ALeft,
                           pos=(base.a2dLeft + 0.7, 0, (0.3 - (index * .1))),
                           pad=(0.5, 0.5),
                           frameColor=(0, 0, 0, 0.0),
                           text=text,
                           text_fg=(1, 1, 1, 1))
        stat.reparentTo(self.statsSheet)
Example #35
0
def windowMaker(base, label):
    # find an open slot, if none, return false
    windict = dict()
    grid = None
    for i in range(grid_size[0]):
        for j in range(grid_size[1]):
            if occupied[i][j] == False:
                grid = (i, j)
                occupied[i][j] = True
                break
        else:
            continue
        break
    if not grid: return False
    windict['grid'] = grid
    position = grid_to_screen_pos(*grid)

    #open window
    newwin = base.openWindow(name=label)
    newwin.setWindowEvent(label + "-event")
    listener.accept(newwin.getWindowEvent(), windowEvent)
    windict['win'] = newwin

    #format window
    wp = WindowProperties()
    wp.setOrigin(*position)
    wp.setSize(*ws)
    newwin.requestProperties(wp)

    #make 3d-mousewatcher display region
    displayRegion = newwin.getDisplayRegion(0)
    displayRegion.setDimensions(.3, 1, 0, 1)
    mkNode = MouseAndKeyboard(newwin, 0, label + "_keyboard_mouse")
    mk = base.dataRoot.attachNewNode(mkNode)
    windict['mk'] = mk
    modis = ModifierButtons()
    modis.addButton(ButtonHandle('shift'))
    modis.addButton(ButtonHandle('control'))
    mwNode = MouseWatcher(label)
    mwNode.setModifierButtons(modis)
    mwNode.setDisplayRegion(displayRegion)
    mw = mk.attachNewNode(mwNode)
    windict['mw'] = mw
    bt = ButtonThrower(label + "_button_thrower")
    bt.setModifierButtons(modis)
    windict['bt'] = bt
    bt.setPrefix(label + "_")
    mw.attachNewNode(bt)
    #listen for default button events
    for button in buttons:
        listener.accept(bt.prefix + button, buttons[button])

    #format render display region
    render_dr = newwin.getDisplayRegion(1)
    windict['render_dr'] = render_dr
    render_dr.setDimensions(.3, 1, 0, 1)

    #create a display region for Gui Elements
    gui_dr = newwin.makeDisplayRegion(0, .3, .3, 1)
    # gui_dr.setSort(20)
    mwNodegui = MouseWatcher(label + "gui")
    mwNodegui.setDisplayRegion(gui_dr)
    mwgui = mk.attachNewNode(mwNodegui)

    #create a 2d render/aspect for gui
    rendergui = NodePath('render2d')
    rendergui.setDepthWrite(0)
    rendergui.setMaterialOff(1)
    rendergui.setTwoSided(1)
    #set up aspect2d
    aspectgui = rendergui.attachNewNode(PGTop('aspectgui'))
    aspectgui.node().setMouseWatcher(mwgui.node())
    #set up camera
    camNodegui = Camera("camNode2d")
    cameragui = rendergui.attachNewNode(camNodegui)
    cameragui.setPos(0, 0, 0)
    cameragui.setDepthTest(False)
    cameragui.setDepthWrite(False)
    lens = OrthographicLens()
    lens.setFilmSize(2, 2)
    lens.setNearFar(-1000, 1000)
    cameragui.node().setLens(lens)
    gui_dr.setCamera(cameragui)
    #make frame for gui
    frame = DirectFrame(frameSize=(-1, 1, -1, 1),
                        frameColor=(.5, .5, .5, 1),
                        relief='ridge')
    frame.reparentTo(aspectgui)
    frame.setTransparency(0)
    windict['gui_frame'] = frame

    #create Gui elements
    guibuttons = dict()
    # guibuttons['Create'] = label+"_mode_create"
    guibuttons['Preview'] = label + "_preview"
    # createButton(base, frame, .7, "Create", label+"_mode_create")
    createButton(base, frame, .7, "Preview", label + "_preview")
    windict['guibuttons'] = guibuttons

    #create a display region for math data preview
    preview_dr = newwin.makeDisplayRegion(0, .3, 0, .3)
    windict['preview_dr'] = preview_dr
    # preview_label = label+"_preview"
    # preview_mwNode = MouseWatcher(preview_label)
    # preview_mwNode.setDisplayRegion(preview_dr)
    # preview_mw = mk.attachNewNode(preview_mwNode)
    # preview_bt = ButtonThrower(preview_label+"_button_thrower")
    # preview_bt.setPrefix(preview_label+"_")
    # preview_mw.attachNewNode(preview_bt)
    # preview_dr.setSort(30)

    win_to_windict[newwin] = windict

    return windict
Example #36
0
class GuiUnitInfo:
    def __init__(self, offset, parent, unit_type, default_hp, hp, default_ap, ap):
            
        self.offset = offset
        self.frame = DirectFrame(   relief = DGG.FLAT
                                  , scale = 1
                                  , frameSize = (-0.5, 0.5, 0, -0.5)
                                  , parent = parent )
        self.frame.setBillboardPointEye()
        self.frame.setLightOff()
        self.frame.setBin("fixed", 40)
        self.frame.setDepthTest(False)
        self.frame.setDepthWrite(False)
        
        fixedWidthFont = loader.loadFont(GUI_FONT)#@UndefinedVariable        
        #fixedWidthFont.setPixelsPerUnit(60)
        #fixedWidthFont.setRenderMode(fontt.RMSolid)
        if not fixedWidthFont.isValid():
            print "pandaInteractiveConsole.py :: could not load the defined font %s" % str(self.font)
            fixedWidthFont = DGG.getDefaultFont()
        
        self.label = OnscreenText( parent = self.frame
                              , text = ""
                              , pos = (offset.getX(),offset.getZ()+0.1)
                              , align=TextNode.ACenter
                              , mayChange=True
                              , scale=0.1
                              , fg = (1,0,0,1)
                              #, shadow = (0, 0, 0, 1)
                              #, frame = (200,0,0,1) 
                              )
        self.label.setFont( fixedWidthFont )
        #self.label.setLightOff()

        self.all_icons = {}
        self.visible_icons = {}
        self.addIcon("overwatch")
        self.addIcon("set_up")
        
        self.ap_bar = DirectWaitBar(parent = self.frame
                                  , text = ""
                                  , range = default_ap
                                  , value = ap
                                  , pos = (offset.getX()+0.08,0,offset.getZ()-0.27)
                                  , barColor = (0,0,1,1)
                                  , frameColor = (0,0,0.5,0.2)
                                  , scale = (0.3,0.5,0.3))
        
        self.hp_bar = DirectWaitBar(parent = self.frame
                                  , text = ""
                                  , range = default_hp
                                  , value = hp
                                  , pos = (offset.getX()+0.08,0,offset.getZ()-0.2)
                                  , barColor = (0,1,0,1)
                                  , frameColor = (1,0,0,0.9)
                                  , scale = (0.3,0.5,0.3))
        
        self.insignia = OnscreenImage(parent = self.frame
                                            ,image = "unit_" + unit_type + "_big_transparent_32.png"
                                            #,pos = (offset.getX(),0,offset.getZ()+0.14)
                                            , pos = (offset.getX() - 0.31,0,offset.getZ()-0.23)
                                            ,scale = 0.09)
        self.insignia.setTransparency(TransparencyAttrib.MAlpha)

    def addIcon(self, name):
        self.all_icons[name] = OnscreenImage(parent = self.frame
                                            ,image = name + "_icon.png"
                                           #,pos = offset + (0,0,-0.1)
                                            ,scale = 0.08)
        
        self.all_icons[name].setTransparency(TransparencyAttrib.MAlpha)
        self.all_icons[name].hide()
        
    def write(self, text):
        text = ""
        self.label.setText(text)
        
    def redraw(self):
        return

    def remove(self):
        self.frame.remove()
        
    def reparentTo(self, parent):
        self.frame.reparentTo(parent)
        
    def hide(self):
        self.label.hide()
        
    def show(self):
        self.label.show()
    
    def refreshBars(self, hp, ap):
        self.ap_bar['value'] = ap
        self.hp_bar['value'] = hp
        self.ap_bar.setValue()
        self.hp_bar.setValue()
        
    def refreshIcons(self):
        count = len(self.visible_icons)
        start_pos =  (1 - count) * 0.25 / 2
        for icon in self.all_icons:
            if icon in self.visible_icons:
                self.visible_icons[icon].setPos(self.offset + (start_pos, 0, -0.08))
                self.visible_icons[icon].show()
                start_pos += 0.21
            else:
                self.all_icons[icon].hide()
            
    def hideOverwatch(self):
        if "overwatch" in self.visible_icons:
            self.visible_icons.pop("overwatch")
        self.refreshIcons()

    def showOverwatch(self):
        self.visible_icons["overwatch"] = self.all_icons["overwatch"]
        self.refreshIcons()
    
    def hideSetUp(self):
        if "set_up" in self.visible_icons:
            self.visible_icons.pop("set_up")
        self.refreshIcons()

    def showSetUp(self):
        self.visible_icons["set_up"] = self.all_icons["set_up"]
        self.refreshIcons()
Example #37
0
class CharacterSelection:
    def __init__(self):

        self.frameMain = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight,
                                                base.a2dBottom, base.a2dTop),
                                     frameColor=(0.05, 0.05, 0.05, 1))
        self.frameMain.setTransparency(1)

        width = abs(base.a2dLeft) + base.a2dRight

        red = loader.loadTexture("assets/gui/CharRedBG.png")
        red.setWrapU(Texture.WM_repeat)
        red.setWrapV(Texture.WM_repeat)
        self.char1Frame = DirectFrame(text="Player 1",
                                      text_fg=(1, 1, 1, 1),
                                      text_scale=0.1,
                                      text_pos=(0, base.a2dTop - 0.2),
                                      frameSize=(-width / 6.0, width / 6.0,
                                                 base.a2dBottom, base.a2dTop),
                                      frameTexture=red,
                                      pos=(base.a2dLeft + width / 6.0, 0, 0))
        self.char1Frame.updateFrameStyle()
        self.char1Frame.setTransparency(1)
        self.char1Frame.reparentTo(self.frameMain)

        blue = loader.loadTexture("assets/gui/CharBlueBG.png")
        blue.setWrapU(Texture.WM_repeat)
        blue.setWrapV(Texture.WM_repeat)
        self.char2Frame = DirectFrame(text="Player 2",
                                      text_fg=(1, 1, 1, 1),
                                      text_scale=0.1,
                                      text_pos=(0, base.a2dTop - 0.2),
                                      frameSize=(-width / 6.0, width / 6.0,
                                                 base.a2dBottom, base.a2dTop),
                                      frameTexture=blue,
                                      pos=(base.a2dRight - width / 6.0, 0, 0))
        self.char2Frame.setTransparency(1)
        self.char2Frame.reparentTo(self.frameMain)

        self.footerFrame = DirectFrame(text="PLAYER 1 - CHOOSE YOUR CHARACTER",
                                       text_fg=(1, 1, 1, 1),
                                       text_scale=0.08,
                                       text_pos=(0, -0.03),
                                       frameSize=(base.a2dLeft, base.a2dRight,
                                                  0.1, -0.1),
                                       pos=(0, 0, base.a2dBottom + 0.2),
                                       frameColor=(0, 0, 0, 0.5))
        self.footerFrame.setTransparency(1)
        self.footerFrame.reparentTo(self.frameMain)

        self.charSelectFrame = DirectFrame(
            text="VS",
            text_fg=(1, 1, 1, 1),
            text_scale=0.1,
            text_pos=(0, base.a2dTop - 0.2),
            frameSize=(-width / 6.0, width / 6.0, base.a2dBottom, base.a2dTop),
            frameColor=(0, 0, 0, 0))
        self.charSelectFrame.reparentTo(self.frameMain)

        self.btnChar1 = self.createCharacterButton(
            (-0.2, 0, 0), "assets/gui/Char1Button.png", 1)
        self.btnChar1.reparentTo(self.charSelectFrame)

        self.btnChar2 = self.createCharacterButton(
            (0.2, 0, 0), "assets/gui/Char2Button.png", 2)
        self.btnChar2.reparentTo(self.charSelectFrame)

        self.btnBack = DirectButton(text="BACK",
                                    text_fg=(1, 1, 1, 1),
                                    text_align=TextNode.ALeft,
                                    scale=0.1,
                                    pad=(0.15, 0.15),
                                    pos=(base.a2dLeft + 0.08, 0, -0.03),
                                    frameColor=((0.2, 0.2, 0.2,
                                                 0.8), (0.4, 0.4, 0.4, 0.8),
                                                (0.4, 0.4, 0.4,
                                                 0.8), (0.1, 0.1, 0.1, 0.8)),
                                    relief=1,
                                    command=base.messenger.send,
                                    extraArgs=["CharSelection-Back"],
                                    pressEffect=False,
                                    rolloverSound=None,
                                    clickSound=None)
        self.btnBack.setTransparency(1)
        self.btnBack.reparentTo(self.footerFrame)

        self.btnStart = DirectButton(text="START",
                                     text_fg=(1, 1, 1, 1),
                                     text_align=TextNode.ARight,
                                     scale=0.1,
                                     pad=(0.15, 0.15),
                                     pos=(base.a2dRight - 0.08, 0, -0.03),
                                     relief=1,
                                     frameColor=((0.2, 0.2, 0.2,
                                                  0.8), (0.4, 0.4, 0.4, 0.8),
                                                 (0.4, 0.4, 0.4,
                                                  0.8), (0.1, 0.1, 0.1, 0.8)),
                                     command=base.messenger.send,
                                     extraArgs=["CharSelection-Start"],
                                     pressEffect=False,
                                     rolloverSound=None,
                                     clickSound=None)
        self.btnStart.setTransparency(1)
        self.btnStart.reparentTo(self.footerFrame)
        self.btnStart["state"] = DGG.DISABLED

        self.hide()

    def createCharacterButton(self, pos, image, charNr):
        btn = DirectButton(scale=0.1,
                           relief=0,
                           frameColor=(0, 0, 0, 0),
                           pos=pos,
                           image=image,
                           command=self.selectCharacter,
                           extraArgs=[charNr],
                           rolloverSound=None,
                           clickSound=None)
        btn.setTransparency(1)
        return btn

    def selectCharacter(self, charNr):
        if self.char1Frame["image"] == None:
            self.char1Frame["image"] = "assets/gui/Char{}_L.png".format(charNr)
            self.char1Frame["image_scale"] = (0.5, 1, 1)
            self.selectedCharacter1 = charNr
            self.footerFrame["text"] = "PLAYER 2 - CHOOSE YOUR CHARACTER"
        elif self.char2Frame["image"] == None:
            self.char2Frame["image"] = "assets/gui/Char{}_R.png".format(charNr)
            self.char2Frame["image_scale"] = (0.5, 1, 1)
            self.selectedCharacter2 = charNr
            self.btnStart["state"] = DGG.NORMAL
            self.footerFrame["text"] = "START THE FIGHT >"

    def show(self):
        self.selectedCharacter1 = None
        self.selectedCharacter2 = None
        self.char1Frame["image"] = None
        self.char2Frame["image"] = None
        self.footerFrame["text"] = "PLAYER 1 - CHOOSE YOUR CHARACTER"
        self.btnStart["state"] = DGG.DISABLED
        self.frameMain.show()

    def hide(self):
        self.frameMain.hide()
Example #38
0
class FileDialog(DirectObject):

    def __init__(self, title, initial_status, callback):
        self.frmLeft = -.7
        self.frmBottom = -.12
        self.frmRight = .7
        self.frmTop = .12
        
        self.frmWidth = self.frmRight - self.frmLeft
        self.frmHeight = self.frmTop - self.frmBottom
        
        self.title = title
        self.initial_status = initial_status
        self.callback = callback
        
        self.result = None
        self.done = 0
            
            
    def activate(self):
        # create main dialog frame
        # Note: frame position references the CENTER of the frame
        self.frm = DirectFrame(
            pos = (0,0,0),
            frameSize = (self.frmLeft, self.frmRight,self.frmBottom, self.frmTop),
            relief = DGG.RIDGE,
            borderWidth = (0.01, 0.01),
            frameColor = (0.6, 0.6, 0.6, 1.0))
        
        self.frm.reparentTo(base.aspect2d)
        
        # Note: wonderfully enough, label position on the other hand
        # references the CENTER of the LEFT border of the label!
        titleLabel = DirectLabel(text = self.title,
            scale = 0.04,
            frameColor = (0.5, 0.5, 0.5, 1),
            relief = DGG.RIDGE,
            borderWidth = (0.01, 0.01),
            text_align = TextNode.ALeft)
            
        titleLabel.setPos(-self.frmWidth/2+.02, 0, self.frmHeight/2-.045)
        titleLabel.reparentTo(self.frm)
        
        sc = .04     
        self.dir_edit_field = DirectEntry(
            text = '',      # prompt text
            scale = sc,
            frameColor = (0.65, 0.65, 0.65, 1),
            command=self.setText,
            width = 32,
            numLines = 1,
            focus = 1,
            focusInCommand=self.efFocusIn,
            )

        self.dir_edit_field.setPos(-self.frmWidth/2+.02, 0, self.frmHeight/2-.13)
        self.dir_edit_field.reparentTo(self.frm)

        self.statusLabel = DirectLabel(text = self.initial_status,
            scale = 0.04,
            frameColor = (0.6, 0.6, 0.6, 1),
            # relief = DGG.RIDGE,
            # borderWidth = (0.01, 0.01),
            text_align = TextNode.ALeft)
            
        self.statusLabel.setPos(-self.frmWidth/2+.02, 0, self.frmHeight/2-.2)
        self.statusLabel.reparentTo(self.frm)

    # call this if you need to run a form before your mainloop starts steppping the taskMgr
    def run(self):
        while self.done != 1:
            taskMgr.step()

        taskMgr.step()          # once more to make the last output from the dialog visible
                                # while we load a zone
        self.frm.removeNode()

    def end(self):
        self.frm.removeNode()
        

    # callback function to set  text: called by the Panda3d taskMgr when the user
    # has entered something into the DirectEntry widget
    def setText(self, textEntered):
        print 'dir_edit_field::setText:', textEntered
        self.done = self.callback(textEntered)
        if self.done != 1:
            self.dir_edit_field['focus'] = 1

                
    #clear the text
    def efFocusIn(self):
        print 'focus in'
        self.dir_edit_field.enterText('')
        
    def setStatus(self, status):
        self.statusLabel['text'] = status
class GUIDialog:
    def __init__(self):
        self.mainFrame = DirectFrame(frameColor=(0, 0, 0, 0.5),
                                     borderWidth=(10, 10),
                                     frameSize=(-2, 2, -1, -0.45))
        self.textIndex = 0
        self.isCalling = False
        self.frameText = None
        self.frameActor = None
        self.frameChoices = None
        self.textList = []
        self.hide()

    def setLabel(self, labelName):
        base.textEngine.setTextLabel(labelName)
        self.textList = base.textEngine.getDialogue()
        self.processLine(self.textList[self.textIndex])

    def processLine(self, line):
        if line['type'] == 'text':
            self.dialogueLine(line)
        elif line['type'] == 'menu':
            self.choiceLine(line)

    def choiceLine(self, lineObj):
        self.setFrameText(lineObj['text'])
        self.setFrameChoices(lineObj)
        self.show()

    def dialogueLine(self, lineObj):
        self.setFrameActor(lineObj['actor'])
        self.setFrameText(lineObj['line'])
        self.show()

    def showMessage(self, txt):
        self.setFrameText(txt)
        self.show()

    def setFrameChoices(self, lineObj):
        base.resetButtons()
        if self.frameChoices:
            self.frameChoices.quit()

        optionsList = lineObj['options']
        self.frameChoices = GUIDialogOptions(optionsList)
        self.frameChoices.reparentTo(self.mainFrame)
        taskMgr.add(self.frameChoices.readKeys, "readKeysTask")
        for option in optionsList:
            index = optionsList.index(option)
            base.accept("TextChoice-{}".format(index), self.chooseOption,
                        [lineObj, index])

    def destroyFrameChoices(self, optionsList):
        self.frameChoices.quit()
        self.frameChoices = None
        taskMgr.remove("readKeysTask")
        for option in optionsList:
            index = optionsList.index(option)
            base.ignore("TextChoice-{}".format(index))

    def chooseOption(self, lineObj, index):
        base.textEngine.chooseFromMenu(lineObj, index)
        self.destroyFrameChoices(lineObj['options'])
        self.textList = base.textEngine.getDialogue()
        self.textIndex = 0
        self.processLine(self.textList[self.textIndex])

    def setFrameActor(self, text):
        if self.frameActor:
            self.frameActor.detach_node()
        self.frameActor = OnscreenText(text=text,
                                       pos=(-1.2, -0.55),
                                       scale=0.07,
                                       wordwrap=35,
                                       mayChange=False,
                                       align=TextNode.ALeft,
                                       fg=(1, 1, 1, 1),
                                       shadow=(0, 0, 0, 1),
                                       shadowOffset=(0.05, 0.05))
        self.frameActor.reparentTo(self.mainFrame)

    def setFrameText(self, text):
        if self.frameText:
            self.frameText.detach_node()
        self.frameText = OnscreenText(text=text,
                                      pos=(-1.2, -0.65),
                                      scale=0.07,
                                      wordwrap=35,
                                      mayChange=False,
                                      align=TextNode.ALeft,
                                      fg=(1, 1, 1, 1),
                                      shadow=(0, 0, 0, 1),
                                      shadowOffset=(0.05, 0.05))
        self.frameText.reparentTo(self.mainFrame)

    def show(self):
        self.mainFrame.show()

    def hide(self):
        self.mainFrame.hide()
        if self.frameText:
            self.frameText.detach_node()
        if self.frameActor:
            self.frameActor.detach_node()
        self.textIndex = 0
        self.frameText = None

    def next(self):
        if not self.isCalling:
            self.isCalling = True
            taskMgr.doMethodLater(.1, self.nextText, 'Next Text')

    def nextText(self, task):
        if self.textIndex < len(self.textList) - 1:
            self.textIndex += 1
            self.processLine(self.textList[self.textIndex])
        else:
            self.hide()

        self.isCalling = False
        return task.done

    @property
    def isShowing(self):
        return self.frameText != None

    @property
    def isChoices(self):
        return self.frameChoices != None

    def reparentTo(self, target):
        self.mainFrame.reparentTo(target)

    def removeNode(self):
        self.mainFrame.removeNode()
Example #40
0
class CIProgressScreen:

    def __init__(self):
        self.defaultLogoScale = 0.85
        self.defaultLogoZ = 0.65
        self.bgm = loader.loadModel('phase_3/models/gui/progress-background.bam')
        self.bgm.find('**/logo').stash()
        self.bg = self.bgm.find('**/bg')
        self.logo = loader.loadTexture('phase_3/maps/CogInvasion_Logo.png')
        self.logoNode = hidden.attachNewNode('logoNode')
        self.logoNode.setScale(self.defaultLogoScale)
        self.logoNode.setPos(0, self.defaultLogoZ, 0)
        self.logoImg = OnscreenImage(image=self.logo, scale=(0.685, 0, 0.3), parent=self.logoNode)
        self.logoImg.setTransparency(True)
        self.bg_img = OnscreenImage(image=self.bg, parent=hidden)
        self.bg_img.setSx(1.35)
        self.bg_img.hide()
        self.progress_bar = DirectWaitBar(value=0, pos=(0, 0, -0.85), parent=hidden, text_pos=(0,
                                                                                               0,
                                                                                               0.2))
        self.progress_bar.setSx(1.064)
        self.progress_bar.setSz(0.38)
        toontipgui = loader.loadModel('phase_3.5/models/gui/stickerbook_gui.bam')
        poster = toontipgui.find('**/questCard')
        self.toontipFrame = DirectFrame(image=poster, image_scale=(1.4, 1, 1), parent=hidden, relief=None, pos=(0,
                                                                                                                0,
                                                                                                                -0.1), scale=0.85)
        self.toontipLbl = OnscreenText(text='', parent=self.toontipFrame, fg=(0.35,
                                                                              0.35,
                                                                              0.35,
                                                                              1), font=CIGlobals.getToonFont(), wordwrap=14.5, pos=(-0.59,
                                                                                                                                    0.25), align=TextNode.ALeft, scale=0.08)
        self.loading_lbl = DirectLabel(text='', relief=None, scale=0.08, pos=(-1.0725,
                                                                              0,
                                                                              -0.79), text_align=TextNode.ALeft, sortOrder=100, text_fg=(0.343,
                                                                                                                                         0.343,
                                                                                                                                         0.343,
                                                                                                                                         1.0), text_font=CIGlobals.getMinnieFont(), parent=hidden, text_shadow=(0,
                                                                                                                                                                                                                0,
                                                                                                                                                                                                                0,
                                                                                                                                                                                                                1))
        return

    def begin(self, hood, range, wantGui):
        render.hide()
        self.renderFrames()
        base.setBackgroundColor(0, 0, 0)
        if hood == 'localAvatarEnterGame':
            self.loading_lbl['text'] = 'Entering...'
        else:
            if hood == 'init':
                self.loading_lbl['text'] = 'Loading...'
            else:
                self.loading_lbl['text'] = 'Heading to %s...' % hood
        self.progress_bar['barColor'] = (0.343, 0.343, 0.343, 1.0)
        self.progress_bar['range'] = range
        self.bgm.reparentTo(aspect2d)
        self.bg.reparentTo(render2d)
        self.bg_img.reparentTo(hidden)
        self.loading_lbl.reparentTo(aspect2d)
        self.logoNode.reparentTo(aspect2d)
        self.progress_bar.reparentTo(aspect2d)
        tip = random.choice(CIGlobals.ToonTips)
        self.toontipLbl.setText('TOON TIP:\n' + tip)
        self.toontipFrame.reparentTo(aspect2d)
        self.__count = 0
        self.__expectedCount = range
        self.progress_bar.update(self.__count)

    def renderFramesTask(self, task):
        self.renderFrames()
        return task.cont

    def end(self):
        base.setBackgroundColor(CIGlobals.DefaultBackgroundColor)
        taskMgr.remove('renderFrames')
        render.show()
        self.progress_bar.finish()
        self.bg_img.reparentTo(hidden)
        self.logoNode.reparentTo(hidden)
        self.bg.reparentTo(hidden)
        self.bgm.reparentTo(hidden)
        self.loading_lbl.reparentTo(hidden)
        self.progress_bar.reparentTo(hidden)
        self.toontipFrame.reparentTo(hidden)
        self.renderFrames()

    def destroy(self):
        self.bg.removeNode()
        del self.bg
        self.bgm.removeNode()
        del self.bgm
        self.bg_img.destroy()
        self.loading_lbl.destroy()
        self.progress_bar.destroy()
        self.bgm.destroy()
        del self.bg_img
        del self.loading_lbl
        del self.progress_bar
        del self.bgm

    def renderFrames(self):
        base.graphicsEngine.renderFrame()
        base.graphicsEngine.renderFrame()

    def tick(self):
        self.__count += 1
        self.progress_bar.update(self.__count)
Example #41
0
class Archive:
    """docstring for Archive"""
    def __init__(self):
        self.archivesShotMsg = []
        self.frameArchive = DirectFrame(image="gui/BackGround_a.png",
                                        image_scale=(1.7778, 1, 1),
                                        frameSize=(base.a2dLeft, base.a2dRight,
                                                   base.a2dBottom,
                                                   base.a2dTop),
                                        frameColor=(0, 0, 0, 0))
        self.frameArchive.setTransparency(1)

        ArchiveFrameTexture = loader.loadTexture("gui/ArchiveFrameBG.png")
        self.frameArchive1 = DirectFrame(
            frameTexture=ArchiveFrameTexture,
            frameSize=(-1.4, -0.6, base.a2dBottom + 0.5, base.a2dTop - 0.4),
            frameColor=(1, 1, 1, 0.5),
        )

        self.frameArchive1.reparentTo(self.frameArchive)

        self.frameArchive2 = DirectFrame(frameSize=(-0.4, 0.4,
                                                    base.a2dBottom + 0.5,
                                                    base.a2dTop - 0.4),
                                         frameColor=(1, 1, 1, 0.5),
                                         frameTexture=ArchiveFrameTexture)
        self.frameArchive2.reparentTo(self.frameArchive)

        self.frameArchive3 = DirectFrame(frameSize=(0.6, 1.4,
                                                    base.a2dBottom + 0.5,
                                                    base.a2dTop - 0.4),
                                         frameColor=(1, 1, 1, 0.5),
                                         frameTexture=ArchiveFrameTexture)
        self.frameArchive3.reparentTo(self.frameArchive)

        self.v = [0]

        self.archiveImg = loader.loadTexture("gui/ArchiveImg.png")
        self.questionMark = loader.loadTexture("gui/QuestionMark.jpg")
        self.pictures = [
            DirectFrame(frameSize=(-1.3, -0.7, base.a2dBottom + 0.9,
                                   base.a2dTop - 0.5),
                        frameColor=(1, 1, 1, 1),
                        frameTexture=self.questionMark),
            DirectFrame(frameSize=(-0.3, 0.3, base.a2dBottom + 0.9,
                                   base.a2dTop - 0.5),
                        frameColor=(1, 1, 1, 1),
                        frameTexture=self.questionMark),
            DirectFrame(frameSize=(0.7, 1.3, base.a2dBottom + 0.9,
                                   base.a2dTop - 0.5),
                        frameColor=(1, 1, 1, 1),
                        frameTexture=self.questionMark)
        ]
        self.pictures[0].reparentTo(self.frameArchive1)
        self.pictures[1].reparentTo(self.frameArchive2)
        self.pictures[2].reparentTo(self.frameArchive3)

        self.buttons = [
            DirectRadioButton(variable=self.v,
                              value=[0],
                              scale=0.05,
                              pos=(-0.98, 0, base.a2dTop - 1.4),
                              command=self.updateUI),
            DirectRadioButton(variable=self.v,
                              value=[1],
                              scale=0.05,
                              pos=(0.02, 0, base.a2dTop - 1.4),
                              command=self.updateUI),
            DirectRadioButton(variable=self.v,
                              value=[2],
                              scale=0.05,
                              pos=(1.02, 0, base.a2dTop - 1.4),
                              command=self.updateUI)
        ]
        self.buttons[0].reparentTo(self.frameArchive1)
        self.buttons[1].reparentTo(self.frameArchive2)
        self.buttons[2].reparentTo(self.frameArchive3)
        for button in self.buttons:
            button.setOthers(self.buttons)

        titles0 = [
            OnscreenText(scale=.05,
                         align=TextNode.ACenter,
                         pos=(-1.0, base.a2dBottom + 0.85),
                         text="time",
                         fg=(0, 0, 0, 1)),
            OnscreenText(scale=.05,
                         align=TextNode.ACenter,
                         pos=(-1.0, base.a2dBottom + 0.8),
                         text="room",
                         fg=(0, 0, 0, 1)),
            #    DirectLabel(frameColor = (0, 0, 0, 0),scale = .05, align = TextNode.ALeft, pos=(-1.1, 0, base.a2dBottom+0.75), text="attribute", fg = (0,0,0,1))
        ]
        titles0[0].hide()
        titles0[1].hide()
        # titles0[0].reparentTo(self.frameArchive1)
        # titles0[1].reparentTo(self.frameArchive1)
        #  titles0[2].reparentTo(self.frameArchive1)

        titles1 = [
            OnscreenText(scale=.05,
                         align=TextNode.ACenter,
                         pos=(-0.0, base.a2dBottom + 0.85),
                         text="time",
                         fg=(0, 0, 0, 1)),
            OnscreenText(scale=.05,
                         align=TextNode.ACenter,
                         pos=(-0.0, base.a2dBottom + 0.8),
                         text="room",
                         fg=(0, 0, 0, 1)),
            #     DirectLabel(frameColor = (0, 0, 0, 0),scale = .05, align = TextNode.ALeft, pos=(-0.1, 0, base.a2dBottom+0.75), text="attribute", fg = (0,0,0,1))
        ]
        titles1[0].hide()
        titles1[1].hide()
        # titles1[0].reparentTo(self.frameArchive2)
        # titles1[1].reparentTo(self.frameArchive2)
        #  titles1[2].reparentTo(self.frameArchive2)

        titles2 = [
            OnscreenText(scale=.05,
                         align=TextNode.ACenter,
                         pos=(1, base.a2dBottom + 0.85),
                         text="time",
                         fg=(0, 0, 0, 1)),
            OnscreenText(scale=.05,
                         align=TextNode.ACenter,
                         pos=(1, base.a2dBottom + 0.8),
                         text="room",
                         fg=(0, 0, 0, 1)),
            #     DirectLabel(frameColor = (0, 0, 0, 0),scale = .05, align = TextNode.ALeft, pos=(0.9, 0, base.a2dBottom+0.75), text="attribute", fg = (0,0,0,1))
        ]
        titles2[0].hide()
        titles2[1].hide()
        # titles2[0].reparentTo(self.frameArchive3)
        # titles2[1].reparentTo(self.frameArchive3)
        #  titles2[2].reparentTo(self.frameArchive3)
        self.title = [titles0, titles1, titles2]

        self.btn_load = self.createButton("Load", -0.6, ["LoadArchive"])
        self.btn_delete = self.createButton("Delete", -0.8, ["DeleteArchive"])
        self.btn_newgame = self.createButton("NewGame", -0.7, ["NewGame"])

        self.hide()

    def createButton(self, text, horizontalPos, eventArgs):
        sound = loader.loadSfx("Audio/click.wav")
        maps = loader.loadModel("gui/button_map")
        btnGeom = (maps.find("**/btn_ready"), maps.find("**/btn_click"),
                   maps.find("**/btn_rollover"), maps.find("**/btn_disabled"))
        btn = DirectButton(
            text=text,
            text_fg=(1, 1, 1, 1),
            text_scale=0.05,
            text_pos=(0.125, -0.013),
            text_align=TextNode.ALeft,
            scale=2,
            geom=btnGeom,
            pos=(base.a2dRight - 0.6, 0, horizontalPos),
            # pos = (horizontalPos, 0, -.7),
            relief=0,
            frameColor=(0, 0, 0, 0),
            command=base.messenger.send,
            extraArgs=eventArgs,
            pressEffect=True,
            rolloverSound=None,
            clickSound=sound)
        btn.reparentTo(self.frameArchive)
        return btn

    def updateUI(self):
        if len(self.archivesShotMsg) == 0:
            base.messenger.send("UpdateArchive")
        else:
            if len(self.archivesShotMsg[self.v[0]]) == 0:
                self.btn_delete.hide()
                self.btn_load.hide()
                self.btn_newgame.show()
            else:
                self.btn_delete.show()
                self.btn_load.show()
                self.btn_newgame.hide()

    def show(self, archiveListShortMsg):
        self.archivesShotMsg = archiveListShortMsg

        for index in range(3):
            self.title[index][0].show()
            self.title[index][1].show()
            if len(self.archivesShotMsg[index]) == 0:
                self.pictures[index]["frameTexture"] = self.questionMark
                self.title[index][0].setText("?")
                self.title[index][1].setText("?")
            else:
                self.pictures[index]["frameTexture"] = self.archiveImg
                self.title[index][0].setText(
                    "createTime : " +
                    str(archiveListShortMsg[index]["timestamp"]))
                self.title[index][1].setText(
                    "currRoom : " +
                    str(archiveListShortMsg[index]["currRoom"]))

        self.updateUI()
        self.frameArchive.show()

    def hide(self):
        for index in range(3):
            self.title[index][0].hide()
            self.title[index][1].hide()
        self.frameArchive.hide()
class LevelSelection:
    def __init__(self):

        self.frameMain = DirectFrame(
            frameSize = (base.a2dLeft, base.a2dRight,
                         base.a2dTop, base.a2dBottom),
            frameColor = (0.05, 0.05, 0.05, 1))
        self.frameMain.setTransparency(1)

        self.btnLevel1 = self.createLevelButton(
            (-0.6, 0, 0.15),
            "assets/gui/Level1Button.png",
            1)
        self.btnLevel1.reparentTo(self.frameMain)

        self.btnLevel2 = self.createLevelButton(
            (0.6, 0, 0.15),
            "assets/gui/Level2Button.png",
            2)
        self.btnLevel2.reparentTo(self.frameMain)

        self.footerFrame = DirectFrame(
            text = "SELECT THE ARENA",
            text_fg = (1,1,1,1),
            text_scale = 0.08,
            text_pos = (0, -0.03),
            frameSize = (base.a2dLeft, base.a2dRight,
                         -0.1, 0.1),
            pos = (0, 0, base.a2dBottom + 0.2),
            frameColor = (0, 0, 0, 0.5))
        self.footerFrame.setTransparency(1)
        self.footerFrame.reparentTo(self.frameMain)

        self.btnBack = DirectButton(
            text = "BACK",
            text_fg = (1,1,1,1),
            text_align = TextNode.ALeft,
            scale = 0.1,
            pad = (0.15, 0.15),
            pos = (base.a2dLeft + 0.08, 0, -0.03),
            frameColor = (
                (0.2,0.2,0.2,0.8),
                (0.4,0.4,0.4,0.8),
                (0.4,0.4,0.4,0.8),
                (0.1,0.1,0.1,0.8),
                ),
            relief = 1,
            command = base.messenger.send,
            extraArgs = ["LevelSelection-Back"],
            pressEffect = False,
            rolloverSound = None,
            clickSound = None)
        self.btnBack.setTransparency(1)
        self.btnBack.reparentTo(self.footerFrame)

        self.hide()

    def createLevelButton(self, pos, image, levelNr):
        btn = DirectButton(
            scale = (0.5, 1, 0.75),
            relief = 0,
            frameColor = (0,0,0,0),
            pos = pos,
            image = image,
            command = self.selectLevel,
            extraArgs = [levelNr],
            rolloverSound = None,
            clickSound = None)
        btn.setTransparency(1)
        return btn

    def selectLevel(self, level):
        self.selectedLevel = level
        base.messenger.send("LevelSelection-Start")

    def show(self):
        self.frameMain.show()

    def hide(self):
        self.frameMain.hide()