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
introduced
by
![]() |
|||
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 |