Issues (229)

client/osci/dialog/PlayerSelectDlg.py (1 issue)

Severity
1
#
2
#  Copyright 2001 - 2018 Ludek Smid [http://www.ospace.net/]
3
#
4
#  This file is part of Outer Space.
5
#
6
#  Outer Space is free software; you can redistribute it and/or modify
7
#  it under the terms of the GNU General Public License as published by
8
#  the Free Software Foundation; either version 2 of the License, or
9
#  (at your option) any later version.
10
#
11
#  Outer Space is distributed in the hope that it will be useful,
12
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
#  GNU General Public License for more details.
15
#
16
#  You should have received a copy of the GNU General Public License
17
#  along with Outer Space; if not, write to the Free Software
18
#  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
#
20
21
import pygameui as ui
22
23
import ige
24
25
from osci import client
26
from osci import gdata
27
import ige.ospace.Const as Const
28
29
from MainGameDlg import MainGameDlg
30
from ConfirmDlg import ConfirmDlg
31
from BookingDlg import BookingDlg
32
from PasswordDlg import PasswordDlg
33
34
class PlayerSelectDlg:
35
    """ Called for selection of active or picking a new player."""
36
37
    def __init__(self, app):
38
        self.app = app
39
        self.wantsNew = False
40
        self.needsPassword = False
41
        self.previousSelection = None # this is to fix connection lost/relog usability issue
42
        self.createUI()
43
        self.passwordDlg = PasswordDlg(app)
44
        self.confirmDlg = ConfirmDlg(app)
45
        self.confirmDlg.setTitle(_("No free starting position"))
46
47
    def display(self, caller = None):
48
        self.caller = caller
49
        if gdata.mainGameDlg and self.previousSelection:
50
            # this means connection dropped and we relogged
51
            # let's go straight to the previously selected game
52
            self._selectPlayer(self.previousSelection)
53
            return
54
        if self.show():
55
            self.win.show()
56
57
    def hide(self):
58
        self.win.hide()
59
60
    def show(self):
61
        items = []
62
        items.extend(self.showActivePlayers())
63
        if self.wantsNew:
64
            items.extend(self.showStartPositions())
65
        self.win.vPos.setItems(items)
66
        return True
67
68
    def showActivePlayers(self):
69
        dataActive = client.cmdProxy.getActivePositions()
70
        items = []
71
        for playerID, galaxyName, playerType in dataActive:
72
            item = ui.Item(galaxyName, type = 'Active', tObjID = playerID, tPosType = Const.PLAYER_SELECT_CONTINUE)
73
            if playerType == Const.T_PLAYER:
74
                item.tPos = _('Continue playing.')
75
            elif playerType == Const.T_PIRPLAYER:
76
                item.tPos = _('Yarr!')
77
            else:
78
                item.tPos = _('Unknown type of player.')
79
            items.append(item)
80
        if not items:
81
            item = ui.Item('', type = '', tObjID = 'No active players', tPosType = None)
82
            item.tPos = 'No Active Player'
83
            items.append(item)
84
        return items
85
86
    def showStartPositions(self):
87
        dataStart = client.cmdProxy.getStartingPositions()
88
        items = []
89
        for objID, galaxyName, posType in dataStart:
90
            item = ui.Item(galaxyName, type = _('Open'), tObjID = objID, tPosType = posType)
91
            if posType == Const.PLAYER_SELECT_NEWPLAYER:
92
                item.tPos = _('Independent player')
93
            elif posType == Const.PLAYER_SELECT_AIPLAYER:
94
                item.tPos = _("Rebel faction")
95
            elif posType == Const.PLAYER_SELECT_PIRATE:
96
                item.tPos = _("Pirate faction [VIP password needed]")
97
            else:
98
                item.tPos = _('Unknown. You cannot use this.')
99
            items.append(item)
100
        return items
101
102
    def onSelect(self, widget, action, data):
103
        if not self.win.vPos.selection:
104
            self.win.setStatus(_('Select position.'))
105
            return
106
        item = self.win.vPos.selection[0]
107
        if item.tPosType == Const.PLAYER_SELECT_CONTINUE:
108
            playerID = item.tObjID
109
        elif item.tPosType == Const.PLAYER_SELECT_NEWPLAYER:
110
            self.win.setStatus(_('Executing CREATE NEW PLAYER command...'))
111
            playerID = client.cmdProxy.createNewPlayer(item.tObjID)
112
            self.win.setStatus(_('Command has been executed.'))
113
        elif item.tPosType == Const.PLAYER_SELECT_AIPLAYER:
114
            self.win.setStatus(_('Executing TAKE OVER REBEL FACTION command...'))
115
            playerID = client.cmdProxy.takeOverAIPlayer(item.tObjID)
116
            self.win.setStatus(_('Command has been executed.'))
117
        elif item.tPosType == Const.PLAYER_SELECT_PIRATE:
118
            playerID = self.passwordDlg.display(lambda x: self._takeOverPirate(item.tObjID, x))
0 ignored issues
show
The variable item does not seem to be defined for all execution paths.
Loading history...
119
            return
120
        else:
121
            return
122
        self._selectPlayer(playerID)
123
124
    def _takeOverPirate(self, positionID, password):
125
        self.win.setStatus(_('Executing TAKE OVER PIRATE FACTION command...'))
126
        try:
127
            playerID = client.cmdProxy.takeOverPirate(positionID, password)
128
        except ige.SecurityException:
129
            self.win.setStatus(_("Supply valid VIP password."))
130
            return
131
        self.win.setStatus(_('Command has been executed.'))
132
        self._selectPlayer(playerID)
133
134
    def _selectPlayer(self, playerID):
135
        self.win.setStatus(_('Executing SELECT PLAYER command...'))
136
        client.cmdProxy.selectPlayer(playerID)
137
        self.previousSelection = playerID
138
        self.win.setStatus(_('Command has been executed.'))
139
        self.hide()
140
        if not gdata.mainGameDlg:
141
            gdata.mainGameDlg = MainGameDlg(self.app)
142
            gdata.mainGameDlg.display()
143
        client.updateDatabase()
144
145
    def onToggleNew(self, widget, action, data):
146
        self.wantsNew = not self.wantsNew
147
        if self.wantsNew:
148
            self.win.vToggle.text = _('Hide Open Slots')
149
        else:
150
            self.win.vToggle.text = _('Show Open Slots')
151
            self.win.vPos.unselectAll()
152
            self.needsPassword = False
153
        # there is a bug which prevents redraw for mere text change
154
        self.win.vToggle.visible = 0
155
        self.win.vToggle.visible = 1
156
        self.show()
157
158
    def onListSelect(self, widget, action, data):
159
        if data.tPosType == Const.PLAYER_SELECT_CONTINUE:
160
            playerID = data.tObjID
161
            self._selectPlayer(playerID)
162
        needsPassword = data.tPosType == Const.PLAYER_SELECT_PIRATE
163
        dirty = False
164
        if needsPassword != self.needsPassword:
165
            self.needsPassword = needsPassword
166
167
    def onBooking(self, widget, action, data):
168
        self.win.hide()
169
        self.win.setStatus(_('Command has been executed.'))
170
        BookingDlg(gdata.app).display(self)
171
172
    def onCancel(self, widget, action, data):
173
        self.win.hide()
174
        self.app.exit()
175
176
    def createUI(self):
177
        w, h = gdata.scrnSize
178
        self.win = ui.Window(self.app,
179
            modal = 1,
180
            movable = 0,
181
            title = _('Select gaming session'),
182
            rect = ui.Rect((w - 564) / 2, (h - 264) / 2, 564, 264),
183
            layoutManager = ui.SimpleGridLM(),
184
            tabChange = True
185
        )
186
        ui.Listbox(self.win, layout = (0, 0, 28, 10), id = 'vPos',
187
            columns = ((_('Type'), 'type', 4, ui.ALIGN_W),
188
                       (_('Galaxy'), 'text', 8, ui.ALIGN_W),
189
                       (_('Position'), 'tPos', 0, ui.ALIGN_W)),
190
            action = 'onListSelect',
191
            columnLabels = 1)
192
        self.win.subscribeAction('*', self)
193
        ui.Button(self.win, layout = (20, 10, 8, 1), text = _('Book New Game'), action = 'onBooking', tooltipTitle = _("New galaxy"), tooltip = _("Allows you to either start new single player galaxy, or get in a queue for\ngame with other players. That game will start when queue fills the capacity,\nand will show up in this dialog as active.\n\nYou can queue for multiple galaxies. Only single player games has account limit."))
194
        ui.Button(self.win, layout = (0, 10, 8, 1), id = 'vToggle', text = _('Show Open Slots'), action = 'onToggleNew', tooltipTitle = _("Open slots"), tooltip = _("Slots available in already running galaxies, there is no telling\nwhat state the game or the empire is in."))
195
        ui.Title(self.win, layout = (0, 11, 20, 1), id = 'vStatusBar', align = ui.ALIGN_W)
196
        ui.TitleButton(self.win, layout = (20, 11, 4, 1), text = _('Exit'), action = 'onCancel')
197
        ui.TitleButton(self.win, layout = (24, 11, 4, 1), text = _('Select'), action = 'onSelect')
198
        self.win.statusBar = self.win.vStatusBar
199