|
1
|
|
|
# |
|
2
|
|
|
# Copyright 2001 - 2016 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 types |
|
22
|
|
|
import pygameui as ui |
|
23
|
|
|
from osci.StarMapWidget import StarMapWidget |
|
24
|
|
|
from osci import gdata, res, client |
|
25
|
|
|
import ige.ospace.Const as Const |
|
26
|
|
|
from ige.ospace import Rules |
|
27
|
|
|
import ige |
|
28
|
|
|
import math |
|
29
|
|
|
|
|
30
|
|
|
# grouping options |
|
31
|
|
|
CLASS = 1 |
|
32
|
|
|
DAMAGE = 2 |
|
33
|
|
|
EXPERIENCE = 4 |
|
34
|
|
|
DESIGN = 8 |
|
35
|
|
|
LEVEL = 16 |
|
36
|
|
|
SPEED = 32 |
|
37
|
|
|
|
|
38
|
|
|
speedDesc = { |
|
39
|
|
|
0: _("0"), |
|
40
|
|
|
1: _("0 - 4"), |
|
41
|
|
|
2: _("4 - 5"), |
|
42
|
|
|
3: _("5 - 6"), |
|
43
|
|
|
4: _("6 - 7"), |
|
44
|
|
|
5: _("7 - 8"), |
|
45
|
|
|
6: _("> 8"), |
|
46
|
|
|
} |
|
47
|
|
|
|
|
48
|
|
|
dmgDesc = { |
|
49
|
|
|
0: _("0% - 33%"), |
|
50
|
|
|
1: _("34% - 66%"), |
|
51
|
|
|
2: _("67% - 99%"), |
|
52
|
|
|
3: _("100%"), |
|
53
|
|
|
} |
|
54
|
|
|
|
|
55
|
|
|
def getCountShipsByDesign(ships, maxCount, shipDesignID): |
|
56
|
|
|
count = 0 |
|
57
|
|
|
retShips = [] |
|
58
|
|
|
if maxCount < 1 and maxCount > 0: # calc percent to num ships |
|
59
|
|
|
numShips = 0 |
|
60
|
|
|
for ship in ships: |
|
61
|
|
|
if ship[0] == shipDesignID: |
|
62
|
|
|
numShips += 1 |
|
63
|
|
|
maxCount = int(math.floor(numShips * maxCount)) |
|
64
|
|
|
if maxCount == 0: |
|
65
|
|
|
return retShips |
|
66
|
|
|
for ship in ships: |
|
67
|
|
|
if ship[0] == shipDesignID and (count < maxCount or maxCount == -1): |
|
68
|
|
|
retShips.append(ship) |
|
69
|
|
|
count += 1 |
|
70
|
|
|
return retShips |
|
71
|
|
|
|
|
72
|
|
|
def getCountShips(ships, maxCount): |
|
73
|
|
|
count = 0 |
|
74
|
|
|
retShips = [] |
|
75
|
|
|
if maxCount < 1 and maxCount > 0: # calc percent to num ships |
|
76
|
|
|
maxCount = int(math.floor(len(ships) * maxCount)) |
|
77
|
|
|
if maxCount == 0: |
|
78
|
|
|
return retShips |
|
79
|
|
|
for ship in ships: |
|
80
|
|
|
if count < maxCount or maxCount == -1: |
|
81
|
|
|
retShips.append(ship) |
|
82
|
|
|
count += 1 |
|
83
|
|
|
return retShips |
|
84
|
|
|
|
|
85
|
|
|
def appendToDict(dict, key, object): |
|
86
|
|
|
if not dict.has_key(key): |
|
87
|
|
|
dict[key] = [object] |
|
88
|
|
|
else: |
|
89
|
|
|
dict[key].append(object) |
|
90
|
|
|
|
|
91
|
|
|
def groupShipsByClass(ships): |
|
92
|
|
|
retShips = {} |
|
93
|
|
|
for ship in ships: |
|
94
|
|
|
appendToDict(retShips, getTech(ship).combatClass, ship) |
|
95
|
|
|
|
|
96
|
|
|
return retShips |
|
97
|
|
|
|
|
98
|
|
|
def groupShipsByExpr(ships): |
|
99
|
|
|
retShips = {} |
|
100
|
|
|
for ship in ships: |
|
101
|
|
|
appendToDict(retShips, ship[3], ship) |
|
102
|
|
|
|
|
103
|
|
|
return retShips |
|
104
|
|
|
|
|
105
|
|
|
def groupShipsByDmg(ships): |
|
106
|
|
|
retShips = {} |
|
107
|
|
|
for ship in ships: |
|
108
|
|
|
appendToDict(retShips, getDamageLevel(ship), ship) |
|
109
|
|
|
|
|
110
|
|
|
return retShips |
|
111
|
|
|
|
|
112
|
|
|
def groupShipsByDesign(ships): |
|
113
|
|
|
player = client.getPlayer() |
|
114
|
|
|
retShips = {} |
|
115
|
|
|
for ship in ships: |
|
116
|
|
|
appendToDict(retShips, ship[0], ship) |
|
117
|
|
|
|
|
118
|
|
|
return retShips |
|
119
|
|
|
|
|
120
|
|
|
def groupShipsByLevel(ships): |
|
121
|
|
|
retShips = {} |
|
122
|
|
|
for ship in ships: |
|
123
|
|
|
appendToDict(retShips, getExperienceLevel(ship), ship) |
|
124
|
|
|
|
|
125
|
|
|
return retShips |
|
126
|
|
|
|
|
127
|
|
|
def groupShipsBySpeed(ships): |
|
128
|
|
|
retShips = {} |
|
129
|
|
|
for ship in ships: |
|
130
|
|
|
appendToDict(retShips, getSpeedLevel(ship), ship) |
|
131
|
|
|
|
|
132
|
|
|
return retShips |
|
133
|
|
|
|
|
134
|
|
|
def getTech(ship): |
|
135
|
|
|
player = client.getPlayer() |
|
136
|
|
|
return player.shipDesigns[ship[0]] |
|
137
|
|
|
|
|
138
|
|
|
def getExperienceLevel(ship): |
|
139
|
|
|
tech = getTech(ship) |
|
140
|
|
|
return Rules.shipExpToLevel.get(int(ship[3] / tech.baseExp), Rules.shipDefLevel) |
|
141
|
|
|
|
|
142
|
|
|
def getDamageLevel(ship): |
|
143
|
|
|
tech = getTech(ship) |
|
144
|
|
|
dmg = (float(ship[1]) / tech.maxHP) * 100 |
|
145
|
|
|
if dmg <= 33: |
|
146
|
|
|
return 0 |
|
147
|
|
|
elif dmg > 33 and dmg <= 66: |
|
148
|
|
|
return 1 |
|
149
|
|
|
elif dmg > 66 and dmg <= 99: |
|
150
|
|
|
return 2 |
|
151
|
|
|
else: # 100% |
|
152
|
|
|
return 3 |
|
153
|
|
|
|
|
154
|
|
|
def getSpeedLevel(ship): |
|
155
|
|
|
speed = getTech(ship).speed |
|
156
|
|
|
if speed <= 0: |
|
157
|
|
|
return 0 |
|
158
|
|
|
elif speed > 0 and speed < 4: |
|
159
|
|
|
return 1 |
|
160
|
|
|
elif speed >= 4 and speed < 5: |
|
161
|
|
|
return 2 |
|
162
|
|
|
elif speed >= 5 and speed < 6: |
|
163
|
|
|
return 3 |
|
164
|
|
|
elif speed >= 6 and speed < 7: |
|
165
|
|
|
return 4 |
|
166
|
|
|
elif speed >= 7 and speed < 8: |
|
167
|
|
|
return 5 |
|
168
|
|
|
else: # >= 8 |
|
169
|
|
|
return 6 |
|
170
|
|
|
|
|
171
|
|
|
class FleetSplitDlg: |
|
172
|
|
|
|
|
173
|
|
|
def __init__(self, app): |
|
174
|
|
|
self.app = app |
|
175
|
|
|
self.createUI() |
|
176
|
|
|
|
|
177
|
|
|
def display(self, fleetDlg): |
|
178
|
|
|
self.fleetDlg = fleetDlg |
|
179
|
|
|
fleet = client.get(self.fleetDlg.fleetID, noUpdate = 1) |
|
180
|
|
|
self.origShips = fleet.ships[:] |
|
181
|
|
|
self.storEn = self.origEn = fleet.storEn |
|
182
|
|
|
self.origEnMax = fleet.maxEn |
|
183
|
|
|
self.newShips = [] |
|
184
|
|
|
self.newBio = 0 |
|
185
|
|
|
self.newMin = 0 |
|
186
|
|
|
self.newEn = 0 |
|
187
|
|
|
self.newEnMax = 0 |
|
188
|
|
|
self.checks = 0 |
|
189
|
|
|
self.Nchecks = 0 |
|
190
|
|
|
|
|
191
|
|
|
self.win.vDesign.checked = 0 |
|
192
|
|
|
self.win.vClass.checked = 0 |
|
193
|
|
|
self.win.vDmg.checked = 0 |
|
194
|
|
|
self.win.vExpr.checked = 0 |
|
195
|
|
|
self.win.vLevel.checked = 0 |
|
196
|
|
|
self.win.vSpeed.checked = 0 |
|
197
|
|
|
self.win.vNDesign.checked = 0 |
|
198
|
|
|
self.win.vNClass.checked = 0 |
|
199
|
|
|
self.win.vNDmg.checked = 0 |
|
200
|
|
|
self.win.vNExpr.checked = 0 |
|
201
|
|
|
self.win.vNLevel.checked = 0 |
|
202
|
|
|
self.win.vNSpeed.checked = 0 |
|
203
|
|
|
|
|
204
|
|
|
self.show() |
|
205
|
|
|
self.win.show() |
|
206
|
|
|
# register for updates |
|
207
|
|
|
if self not in gdata.updateDlgs: |
|
208
|
|
|
gdata.updateDlgs.append(self) |
|
209
|
|
|
|
|
210
|
|
|
def hide(self): |
|
211
|
|
|
self.win.setStatus(_("Ready.")) |
|
212
|
|
|
self.win.hide() |
|
213
|
|
|
# unregister updates |
|
214
|
|
|
if self in gdata.updateDlgs: |
|
215
|
|
|
gdata.updateDlgs.remove(self) |
|
216
|
|
|
|
|
217
|
|
|
def update(self): |
|
218
|
|
|
self.hide() |
|
219
|
|
|
|
|
220
|
|
|
def groupShips(self, grouped, by): |
|
221
|
|
|
for key, item in grouped.items(): |
|
222
|
|
|
if type(item) == types.ListType: |
|
223
|
|
|
if by & DESIGN: |
|
224
|
|
|
grouped[key] = groupShipsByDesign(item) |
|
225
|
|
|
self.groupShips(grouped[key], by - DESIGN) |
|
226
|
|
|
elif by & CLASS: |
|
227
|
|
|
grouped[key] = groupShipsByClass(item) |
|
228
|
|
|
self.groupShips(grouped[key], by - CLASS) |
|
229
|
|
|
elif by & DAMAGE: |
|
230
|
|
|
grouped[key] = groupShipsByDmg(item) |
|
231
|
|
|
self.groupShips(grouped[key], by - DAMAGE) |
|
232
|
|
|
elif by & LEVEL: |
|
233
|
|
|
grouped[key] = groupShipsByLevel(item) |
|
234
|
|
|
self.groupShips(grouped[key], by - LEVEL) |
|
235
|
|
|
elif by & EXPERIENCE: |
|
236
|
|
|
grouped[key] = groupShipsByExpr(item) |
|
237
|
|
|
self.groupShips(grouped[key], by - EXPERIENCE) |
|
238
|
|
|
elif by & SPEED: |
|
239
|
|
|
grouped[key] = groupShipsBySpeed(item) |
|
240
|
|
|
self.groupShips(grouped[key], by - SPEED) |
|
241
|
|
|
|
|
242
|
|
|
def appendShips(self, grouped, items, player, checks): |
|
243
|
|
|
for key, item in grouped.items(): |
|
244
|
|
|
if checks == 0: |
|
245
|
|
|
for ship in item: |
|
246
|
|
|
self.appendItem(ship, items, player, 0) |
|
247
|
|
|
|
|
248
|
|
|
return |
|
249
|
|
|
|
|
250
|
|
|
if type(item) == types.ListType: |
|
251
|
|
|
self.appendItem(item, items, player, checks) |
|
252
|
|
|
else: |
|
253
|
|
|
self.appendShips(item, items, player, checks) |
|
254
|
|
|
|
|
255
|
|
|
def show(self): |
|
256
|
|
|
# orig fleet |
|
257
|
|
|
items = [] |
|
258
|
|
|
player = client.getPlayer() |
|
259
|
|
|
|
|
260
|
|
|
grouped = {None: self.origShips} |
|
261
|
|
|
self.groupShips(grouped, self.checks) |
|
262
|
|
|
self.appendShips(grouped, items, player, self.checks) |
|
263
|
|
|
|
|
264
|
|
|
self.win.vOShips.items = items |
|
265
|
|
|
self.win.vOShips.itemsChanged() |
|
266
|
|
|
self.win.vOShips.selectItem(None) |
|
267
|
|
|
self.win.vOEn.text = str(self.origEn) |
|
268
|
|
|
self.win.vOEnMax.text = _('/ %d') % self.origEnMax |
|
269
|
|
|
|
|
270
|
|
|
# new fleet |
|
271
|
|
|
items = [] |
|
272
|
|
|
|
|
273
|
|
|
grouped = {None: self.newShips} |
|
274
|
|
|
self.groupShips(grouped, self.Nchecks) |
|
275
|
|
|
self.appendShips(grouped, items, player, self.Nchecks) |
|
276
|
|
|
|
|
277
|
|
|
self.win.vNShips.items = items |
|
278
|
|
|
self.win.vNShips.itemsChanged() |
|
279
|
|
|
self.win.vNShips.selectItem(None) |
|
280
|
|
|
self.win.vNEn.text = str(self.newEn) |
|
281
|
|
|
self.win.vNEnMax.text = _('/ %d') % self.newEnMax |
|
282
|
|
|
|
|
283
|
|
|
def appendItem(self, ships, items, player, checks): |
|
284
|
|
|
if type(ships[0]) == types.ListType: |
|
285
|
|
|
count = len(ships) |
|
286
|
|
|
designName = "" |
|
287
|
|
|
listData = ships |
|
288
|
|
|
exp = "" |
|
289
|
|
|
hpText = "" |
|
290
|
|
|
designID = None |
|
291
|
|
|
className = "" |
|
292
|
|
|
level = "" |
|
293
|
|
|
speed = "" |
|
294
|
|
|
else: |
|
295
|
|
|
count = "" |
|
296
|
|
|
designID, hp, shield, exp = ships |
|
297
|
|
|
tech = getTech(ships) |
|
298
|
|
|
designName = tech.name |
|
299
|
|
|
className = _(gdata.shipClasses[tech.combatClass]) |
|
300
|
|
|
hpText = _("%d / %d") % (hp, shield) |
|
301
|
|
|
level = getExperienceLevel(ships) |
|
302
|
|
|
listData = [ships] |
|
303
|
|
|
speed = _("%.2f") % tech.speed |
|
304
|
|
|
|
|
305
|
|
|
if checks & DAMAGE: |
|
306
|
|
|
hpText = dmgDesc[getDamageLevel(listData[0])] |
|
307
|
|
|
|
|
308
|
|
|
if checks & CLASS: |
|
309
|
|
|
tech = getTech(listData[0]) |
|
310
|
|
|
className = _(gdata.shipClasses[tech.combatClass]) |
|
311
|
|
|
|
|
312
|
|
|
if checks & EXPERIENCE: |
|
313
|
|
|
exp = listData[0][3] |
|
314
|
|
|
|
|
315
|
|
|
if checks & LEVEL: |
|
316
|
|
|
level = getExperienceLevel(listData[0]) |
|
317
|
|
|
|
|
318
|
|
|
if checks & SPEED: |
|
319
|
|
|
speed = speedDesc[getSpeedLevel(listData[0])] |
|
320
|
|
|
|
|
321
|
|
|
if checks & DESIGN: |
|
322
|
|
|
designName = getTech(listData[0]).name |
|
323
|
|
|
if not (checks & CLASS): |
|
324
|
|
|
tech = getTech(listData[0]) |
|
325
|
|
|
className = _(gdata.shipClasses[tech.combatClass]) |
|
326
|
|
|
if not (checks & SPEED): |
|
327
|
|
|
speed = _("%.2f") % getTech(listData[0]).speed |
|
328
|
|
|
|
|
329
|
|
|
|
|
330
|
|
|
item = ui.Item(designName, |
|
331
|
|
|
tHP = hpText, |
|
332
|
|
|
tExp = exp, |
|
333
|
|
|
tClass = className, |
|
334
|
|
|
designID = designID, |
|
335
|
|
|
tLevel = level, |
|
336
|
|
|
tShip = listData, |
|
337
|
|
|
tCount = count, |
|
338
|
|
|
tSpeed = speed, |
|
339
|
|
|
) |
|
340
|
|
|
items.append(item) |
|
341
|
|
|
|
|
342
|
|
|
def onSplit(self, widget, action, data): |
|
343
|
|
|
# TODO |
|
344
|
|
|
self.win.setStatus(_('Executing SPLIT FLEET command...')) |
|
345
|
|
|
try: |
|
346
|
|
|
fleet = client.get(self.fleetDlg.fleetID, noUpdate = 1) |
|
347
|
|
|
newFleet, origFleet, fleets = client.cmdProxy.splitFleet(self.fleetDlg.fleetID, |
|
348
|
|
|
self.newShips, self.newEn) |
|
349
|
|
|
except ige.GameException, e: |
|
350
|
|
|
self.win.setStatus(e.args[0]) |
|
351
|
|
|
return |
|
352
|
|
|
# update related objects |
|
353
|
|
|
client.getPlayer().fleets = fleets |
|
354
|
|
|
client.db[newFleet.oid] = newFleet |
|
355
|
|
|
client.db[origFleet.oid] = origFleet |
|
356
|
|
|
# update client |
|
357
|
|
|
self.win.setStatus(_('Command has been executed.')) |
|
358
|
|
|
self.hide() |
|
359
|
|
|
self.fleetDlg.display(newFleet.oid) |
|
360
|
|
|
gdata.mainGameDlg.update() |
|
361
|
|
|
|
|
362
|
|
|
def updateRes(self): |
|
363
|
|
|
# orig max |
|
364
|
|
|
player = client.getPlayer() |
|
365
|
|
|
self.origEnMax = 0 |
|
366
|
|
|
for designID, hp, shield, exp in self.origShips: |
|
367
|
|
|
tech = player.shipDesigns[designID] |
|
368
|
|
|
self.origEnMax += tech.storEn |
|
369
|
|
|
# new max |
|
370
|
|
|
self.newEnMax = 0 |
|
371
|
|
|
for designID, hp, shield, exp in self.newShips: |
|
372
|
|
|
tech = player.shipDesigns[designID] |
|
373
|
|
|
self.newEnMax += tech.storEn |
|
374
|
|
|
# orig |
|
375
|
|
|
if self.origEn > self.origEnMax: |
|
376
|
|
|
self.newEn += self.origEn - self.origEnMax |
|
377
|
|
|
self.origEn = self.origEnMax |
|
378
|
|
|
# new |
|
379
|
|
|
if self.newEn > self.newEnMax: |
|
380
|
|
|
self.origEn += self.newEn - self.newEnMax |
|
381
|
|
|
self.newEn = self.newEnMax |
|
382
|
|
|
|
|
383
|
|
|
def onOShipSelected(self, widget, action, data): |
|
384
|
|
|
item = self.win.vOShips.selection[0] |
|
385
|
|
|
self.moveShipsToRight(item.tShip) |
|
386
|
|
|
# |
|
387
|
|
|
self.updateRes() |
|
388
|
|
|
self.show() |
|
389
|
|
|
|
|
390
|
|
|
def onNShipSelected(self, widget, action, data): |
|
391
|
|
|
item = self.win.vNShips.selection[0] |
|
392
|
|
|
self.moveShipsToLeft(item.tShip) |
|
393
|
|
|
# |
|
394
|
|
|
self.updateRes() |
|
395
|
|
|
self.show() |
|
396
|
|
|
|
|
397
|
|
|
def onStorChng(self, widget, action, data): |
|
398
|
|
|
try: |
|
399
|
|
|
self.origEn = int(self.win.vOEn.text) |
|
400
|
|
|
self.newEn = int(self.win.vNEn.text) |
|
401
|
|
|
except ValueError: |
|
402
|
|
|
self.win.setStatus(_('Enter a number.')) |
|
403
|
|
|
self.show() |
|
404
|
|
|
return |
|
405
|
|
|
# update changed |
|
406
|
|
|
newVal = getattr(self, widget.data) |
|
407
|
|
|
if widget.data[:4] == 'orig': |
|
408
|
|
|
mirror = 'new%s' % widget.data[4:] |
|
409
|
|
|
total = getattr(self, 'stor%s' % widget.data[4:]) |
|
410
|
|
|
if widget.data[:3] == 'new': |
|
411
|
|
|
mirror = 'orig%s' % widget.data[3:] |
|
412
|
|
|
total = getattr(self, 'stor%s' % widget.data[3:]) |
|
413
|
|
|
mirrVal = total - newVal |
|
|
|
|
|
|
414
|
|
|
if mirrVal < 0: |
|
415
|
|
|
newVal = total |
|
416
|
|
|
mirrVal = 0 |
|
417
|
|
|
setattr(self, widget.data, newVal) |
|
418
|
|
|
setattr(self, mirror, mirrVal) |
|
|
|
|
|
|
419
|
|
|
self.updateRes() |
|
420
|
|
|
self.show() |
|
421
|
|
|
|
|
422
|
|
|
def onMoveMenu(self, widget, action, data): |
|
423
|
|
|
selItem = self.win.vOShips.selection[0] |
|
424
|
|
|
if hasattr(selItem, "designID"): |
|
425
|
|
|
self.moveRightPopup.show() |
|
426
|
|
|
|
|
427
|
|
|
def onNMoveMenu(self, widget, action, data): |
|
428
|
|
|
selItem = self.win.vNShips.selection[0] |
|
429
|
|
|
if hasattr(selItem, "designID"): |
|
430
|
|
|
self.moveLeftPopup.show() |
|
431
|
|
|
|
|
432
|
|
|
def onMoveAction(self, widget, action, data): |
|
433
|
|
|
selItem = self.win.vOShips.selection[0] |
|
434
|
|
|
if selItem.designID == None: |
|
435
|
|
|
self.moveShipsToRight(getCountShips(selItem.tShip, data)) |
|
436
|
|
|
else: |
|
437
|
|
|
self.moveShipsToRight(getCountShipsByDesign(self.origShips, data, selItem.designID)) |
|
438
|
|
|
|
|
439
|
|
|
self.updateRes() |
|
440
|
|
|
self.show() |
|
441
|
|
|
|
|
442
|
|
|
def onNMoveAction(self, widget, action, data): |
|
443
|
|
|
selItem = self.win.vNShips.selection[0] |
|
444
|
|
|
if selItem.designID == None: |
|
445
|
|
|
self.moveShipsToLeft(getCountShips(selItem.tShip, data)) |
|
446
|
|
|
else: |
|
447
|
|
|
self.moveShipsToLeft(getCountShipsByDesign(self.newShips, data, selItem.designID)) |
|
448
|
|
|
|
|
449
|
|
|
self.updateRes() |
|
450
|
|
|
self.show() |
|
451
|
|
|
|
|
452
|
|
|
def onClear(self, widget, action, data): |
|
453
|
|
|
self.moveShipsToLeft(self.newShips[:]) |
|
454
|
|
|
self.updateRes() |
|
455
|
|
|
self.show() |
|
456
|
|
|
|
|
457
|
|
|
def moveShipsToRight(self, ships): |
|
458
|
|
|
for ship in ships: |
|
459
|
|
|
self.origShips.remove(ship) |
|
460
|
|
|
self.newShips.append(ship) |
|
461
|
|
|
# move fuel to the new fleet |
|
462
|
|
|
tech = client.getPlayer().shipDesigns[ship[0]] |
|
463
|
|
|
avail = min(self.origEn, tech.storEn) |
|
464
|
|
|
self.newEn += avail |
|
465
|
|
|
self.origEn -= avail |
|
466
|
|
|
|
|
467
|
|
|
def moveShipsToLeft(self, ships): |
|
468
|
|
|
for ship in ships: |
|
469
|
|
|
self.newShips.remove(ship) |
|
470
|
|
|
self.origShips.append(ship) |
|
471
|
|
|
# move fuel to the new fleet |
|
472
|
|
|
tech = client.getPlayer().shipDesigns[ship[0]] |
|
473
|
|
|
avail = min(self.origEn, tech.storEn) |
|
474
|
|
|
self.newEn -= avail |
|
475
|
|
|
self.origEn += avail |
|
476
|
|
|
|
|
477
|
|
|
def onGroup(self, widget, action, data): |
|
478
|
|
|
if widget.checked: |
|
479
|
|
|
self.checks += widget.data |
|
480
|
|
|
else: |
|
481
|
|
|
self.checks -= widget.data |
|
482
|
|
|
|
|
483
|
|
|
self.updateRes() |
|
484
|
|
|
self.show() |
|
485
|
|
|
|
|
486
|
|
|
def onNGroup(self, widget, action, data): |
|
487
|
|
|
if widget.checked: |
|
488
|
|
|
self.Nchecks += widget.data |
|
489
|
|
|
else: |
|
490
|
|
|
self.Nchecks -= widget.data |
|
491
|
|
|
|
|
492
|
|
|
self.updateRes() |
|
493
|
|
|
self.show() |
|
494
|
|
|
|
|
495
|
|
|
def onCancel(self, widget, action, data): |
|
496
|
|
|
self.hide() |
|
497
|
|
|
|
|
498
|
|
|
def createUI(self): |
|
499
|
|
|
w, h = gdata.scrnSize |
|
500
|
|
|
self.win = ui.Window(self.app, |
|
501
|
|
|
modal = 1, |
|
502
|
|
|
escKeyClose = 1, |
|
503
|
|
|
titleOnly = w == 800 and h == 600, |
|
504
|
|
|
movable = 0, |
|
505
|
|
|
title = _('Split Fleet'), |
|
506
|
|
|
rect = ui.Rect((w - 800 - 4 * (w != 800)) / 2, (h - 600 - 4 * (h != 600)) / 2, 800 + 4 * (w != 800), 580 + 4 * (h != 600)), |
|
507
|
|
|
layoutManager = ui.SimpleGridLM(), |
|
508
|
|
|
tabChange = True, |
|
509
|
|
|
) |
|
510
|
|
|
self.win.subscribeAction('*', self) |
|
511
|
|
|
# original fleet |
|
512
|
|
|
ui.Title(self.win, layout = (0, 0, 20, 1), text = _('Original fleet'), |
|
513
|
|
|
align = ui.ALIGN_W, font = 'normal-bold') |
|
514
|
|
|
ui.Listbox(self.win, id = 'vOShips', layout = (0, 1, 20, 21), |
|
515
|
|
|
columns = ( |
|
516
|
|
|
(_('#'), 'tCount', 1.5, ui.ALIGN_NONE), |
|
517
|
|
|
(_('Name'), 'text', 5, ui.ALIGN_W), |
|
518
|
|
|
(_('Lvl'), 'tLevel', 1.5, ui.ALIGN_NONE), |
|
519
|
|
|
(_('Class'), 'tClass', 3, ui.ALIGN_E), |
|
520
|
|
|
(_('HP'), 'tHP', 4, ui.ALIGN_E), |
|
521
|
|
|
(_('Exp'), 'tExp', 2, ui.ALIGN_E), |
|
522
|
|
|
(_('Spd'), 'tSpeed', 2, ui.ALIGN_E), |
|
523
|
|
|
), |
|
524
|
|
|
columnLabels = 1, action = 'onOShipSelected', rmbAction = 'onMoveMenu' |
|
525
|
|
|
) |
|
526
|
|
|
# grouping options |
|
527
|
|
|
ui.Title(self.win, layout = (0, 22, 20, 1), text = _('Group by'), |
|
528
|
|
|
align = ui.ALIGN_W, font = 'normal-bold') |
|
529
|
|
|
ui.Check(self.win, layout = (0, 23, 5, 1), id = "vDesign", text = _("design"), |
|
530
|
|
|
action = "onGroup", data = DESIGN) |
|
531
|
|
|
ui.Check(self.win, layout = (5, 23, 5, 1), id = "vClass", text = _("class"), |
|
532
|
|
|
action = "onGroup", data = CLASS) |
|
533
|
|
|
ui.Check(self.win, layout = (10, 23, 5, 1), id = "vDmg", text = _("damage"), |
|
534
|
|
|
action = "onGroup", data = DAMAGE) |
|
535
|
|
|
ui.Check(self.win, layout = (15, 23, 5, 1), id = "vExpr", text = _("experience"), |
|
536
|
|
|
action = "onGroup", data = EXPERIENCE) |
|
537
|
|
|
ui.Check(self.win, layout = (0, 24, 5, 1), id = "vLevel", text = _("level"), |
|
538
|
|
|
action = "onGroup", data = LEVEL) |
|
539
|
|
|
ui.Check(self.win, layout = (5, 24, 5, 1), id = "vSpeed", text = _("speed"), |
|
540
|
|
|
action = "onGroup", data = SPEED) |
|
541
|
|
|
# tanks |
|
542
|
|
|
ui.Title(self.win, layout = (0, 25, 20, 1), text = _('Tanks'), |
|
543
|
|
|
align = ui.ALIGN_W, font = 'normal-bold') |
|
544
|
|
|
ui.Label(self.win, layout = (0, 26, 5, 1), text = _('Fuel'), align = ui.ALIGN_W) |
|
545
|
|
|
ui.Entry(self.win, layout = (5, 26, 5, 1), id = 'vOEn', action = 'onStorChng', |
|
546
|
|
|
align = ui.ALIGN_E, data ='origEn', orderNo = 15) |
|
547
|
|
|
ui.Label(self.win, layout = (10, 26, 5, 1), id = 'vOEnMax', align = ui.ALIGN_W) |
|
548
|
|
|
|
|
549
|
|
|
# new fleet |
|
550
|
|
|
ui.Title(self.win, layout = (20, 0, 20, 1), text = _('New fleet'), |
|
551
|
|
|
align = ui.ALIGN_W, font = 'normal-bold') |
|
552
|
|
|
ui.Listbox(self.win, id = 'vNShips', layout = (20, 1, 20, 21), |
|
553
|
|
|
columns = ( |
|
554
|
|
|
(_('#'), 'tCount', 1.5, ui.ALIGN_NONE), |
|
555
|
|
|
(_('Name'), 'text', 5, ui.ALIGN_W), |
|
556
|
|
|
(_('Lvl'), 'tLevel', 1.5, ui.ALIGN_NONE), |
|
557
|
|
|
(_('Class'), 'tClass', 3, ui.ALIGN_E), |
|
558
|
|
|
(_('HP'), 'tHP', 4, ui.ALIGN_E), |
|
559
|
|
|
(_('Exp'), 'tExp', 2, ui.ALIGN_E), |
|
560
|
|
|
(_('Spd'), 'tSpeed', 2, ui.ALIGN_E), |
|
561
|
|
|
), |
|
562
|
|
|
columnLabels = 1, action = 'onNShipSelected', rmbAction = 'onNMoveMenu') |
|
563
|
|
|
# grouping |
|
564
|
|
|
ui.Title(self.win, layout = (20, 22, 16, 1), text = _('Group by'), |
|
565
|
|
|
align = ui.ALIGN_W, font = 'normal-bold') |
|
566
|
|
|
ui.Button(self.win, layout = (36, 22, 4, 1), text = _("Clear"), action = 'onClear') |
|
567
|
|
|
ui.Check(self.win, layout = (20, 23, 5, 1), id = "vNDesign", text = _("design"), |
|
568
|
|
|
action = "onNGroup", data = DESIGN) |
|
569
|
|
|
ui.Check(self.win, layout = (25, 23, 5, 1), id = "vNClass", text = _("class"), |
|
570
|
|
|
action = "onNGroup", data = CLASS) |
|
571
|
|
|
ui.Check(self.win, layout = (30, 23, 5, 1), id = "vNDmg", text = _("damage"), |
|
572
|
|
|
action = "onNGroup", data = DAMAGE) |
|
573
|
|
|
ui.Check(self.win, layout = (35, 23, 5, 1), id = "vNExpr", text = _("experience"), |
|
574
|
|
|
action = "onNGroup", data = EXPERIENCE) |
|
575
|
|
|
ui.Check(self.win, layout = (20, 24, 5, 1), id = "vNLevel", text = _("level"), |
|
576
|
|
|
action = "onNGroup", data = LEVEL) |
|
577
|
|
|
ui.Check(self.win, layout = (25, 24, 5, 1), id = "vNSpeed", text = _("speed"), |
|
578
|
|
|
action = "onNGroup", data = SPEED) |
|
579
|
|
|
# tanks |
|
580
|
|
|
ui.Title(self.win, layout = (20, 25, 20, 1), text = _('Tanks'), |
|
581
|
|
|
align = ui.ALIGN_W, font = 'normal-bold') |
|
582
|
|
|
ui.Label(self.win, layout = (20, 26, 5, 1), text = _('Fuel'), align = ui.ALIGN_W) |
|
583
|
|
|
ui.Entry(self.win, layout = (25, 26, 5, 1), id = 'vNEn', action = 'onStorChng', |
|
584
|
|
|
align = ui.ALIGN_E, data ='newEn', orderNo = 16) |
|
585
|
|
|
ui.Label(self.win, layout = (30, 26, 5, 1), id = 'vNEnMax', align = ui.ALIGN_W) |
|
586
|
|
|
|
|
587
|
|
|
# status bar + submit/cancel |
|
588
|
|
|
ui.Title(self.win, id = 'vStatusBar', layout = (0, 27, 30, 1), align = ui.ALIGN_W) |
|
589
|
|
|
ui.TitleButton(self.win, layout = (35, 27, 5, 1), text = _('Split'), action = 'onSplit') |
|
590
|
|
|
ui.TitleButton(self.win, layout = (30, 27, 5, 1), text = _('Cancel'), action = 'onCancel') |
|
591
|
|
|
self.moveRightPopup = ui.Menu(self.app, title = _("Move right"), |
|
592
|
|
|
width = 10, |
|
593
|
|
|
columns = 2, |
|
594
|
|
|
items = [ |
|
595
|
|
|
ui.Item(_("1 ship"), action = "onMoveAction", data = 1), |
|
596
|
|
|
ui.Item(_("5 ships"), action = "onMoveAction", data = 5), |
|
597
|
|
|
ui.Item(_("10 ships"), action = "onMoveAction", data = 10), |
|
598
|
|
|
ui.Item(_("50 ships"), action = "onMoveAction", data = 50), |
|
599
|
|
|
ui.Item(_("100 ships"), action = "onMoveAction", data = 100), |
|
600
|
|
|
ui.Item(_("1/2 of ships"), action = "onMoveAction", data = 0.5), |
|
601
|
|
|
ui.Item(_("1/3 of ships"), action = "onMoveAction", data = 0.34), |
|
602
|
|
|
ui.Item(_("1/4 of ships"), action = "onMoveAction", data = 0.25), |
|
603
|
|
|
ui.Item(_("All ships"), action = "onMoveAction", data = -1), |
|
604
|
|
|
] |
|
605
|
|
|
) |
|
606
|
|
|
self.moveRightPopup.subscribeAction("*", self) |
|
607
|
|
|
|
|
608
|
|
|
self.moveLeftPopup = ui.Menu(self.app, title = _("Move left"), |
|
609
|
|
|
width = 10, |
|
610
|
|
|
columns = 2, |
|
611
|
|
|
items = [ |
|
612
|
|
|
ui.Item(_("1 ship"), action = "onNMoveAction", data = 1), |
|
613
|
|
|
ui.Item(_("5 ships"), action = "onNMoveAction", data = 5), |
|
614
|
|
|
ui.Item(_("10 ships"), action = "onNMoveAction", data = 10), |
|
615
|
|
|
ui.Item(_("50 ships"), action = "onNMoveAction", data = 50), |
|
616
|
|
|
ui.Item(_("100 ships"), action = "onNMoveAction", data = 100), |
|
617
|
|
|
ui.Item(_("1/2 of ships"), action = "onNMoveAction", data = 0.5), |
|
618
|
|
|
ui.Item(_("1/3 of ships"), action = "onNMoveAction", data = 0.34), |
|
619
|
|
|
ui.Item(_("1/4 of ships"), action = "onNMoveAction", data = 0.25), |
|
620
|
|
|
ui.Item(_("All ships"), action = "onNMoveAction", data = -1), |
|
621
|
|
|
] |
|
622
|
|
|
) |
|
623
|
|
|
self.moveLeftPopup.subscribeAction("*", self) |
|
624
|
|
|
|