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
|
|
|
|