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 pygameui as ui |
22
|
|
|
from osci.StarMapWidget import StarMapWidget |
23
|
|
|
from osci import gdata, res, client, sequip |
24
|
|
|
import ige.ospace.Const as Const |
25
|
|
|
|
26
|
|
|
ENGINE = 1 |
27
|
|
|
SMALL = 2 |
28
|
|
|
MEDIUM = 4 |
29
|
|
|
LARGE = 8 |
30
|
|
|
PLANET = 16 |
31
|
|
|
OTHER = 32 |
32
|
|
|
ARMOR = 64 |
33
|
|
|
SHIELD = 128 |
34
|
|
|
POD = 256 |
35
|
|
|
SCANNER = 512 |
36
|
|
|
|
37
|
|
|
typeText = { |
38
|
|
|
ENGINE: _('Engine'), |
39
|
|
|
SMALL: _('Anti-small'), |
40
|
|
|
MEDIUM: _('Anti-medium'), |
41
|
|
|
LARGE: _('Anti-large'), |
42
|
|
|
PLANET: _('Anti-planet'), |
43
|
|
|
OTHER: _('Other'), |
44
|
|
|
ARMOR: _('Armor'), |
45
|
|
|
SHIELD: _('Shield'), |
46
|
|
|
POD: _('Deployable'), |
47
|
|
|
SCANNER:_('Scanner'), |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
class ConstrSelTechDlg: |
51
|
|
|
|
52
|
|
|
def __init__(self, app): |
53
|
|
|
self.app = app |
54
|
|
|
self.createUI() |
55
|
|
|
|
56
|
|
|
def display(self, techType, techSubtype, selectCallback, selected = 0, hullID = 0): |
57
|
|
|
self.techID = Const.OID_NONE |
58
|
|
|
self.selectCallback = selectCallback |
59
|
|
|
self.techType = techType |
60
|
|
|
self.techSubtype = techSubtype |
61
|
|
|
self.selected = selected |
62
|
|
|
if hullID: |
63
|
|
|
self.hullType = client.getFullTechInfo(hullID).combatClass |
64
|
|
|
else: |
65
|
|
|
self.hullType = 0 |
66
|
|
|
self.typeFilter = ENGINE | \ |
67
|
|
|
SMALL | MEDIUM | LARGE | PLANET | \ |
68
|
|
|
OTHER | ARMOR | SHIELD | POD | SCANNER |
69
|
|
|
self.show() |
70
|
|
|
self.win.show() |
71
|
|
|
# register for updates |
72
|
|
|
if self not in gdata.updateDlgs: |
73
|
|
|
gdata.updateDlgs.append(self) |
74
|
|
|
|
75
|
|
|
def hide(self): |
76
|
|
|
self.win.setStatus(_("Ready.")) |
77
|
|
|
self.win.hide() |
78
|
|
|
# unregister updates |
79
|
|
|
if self in gdata.updateDlgs: |
80
|
|
|
gdata.updateDlgs.remove(self) |
81
|
|
|
|
82
|
|
|
def update(self): |
83
|
|
|
self.show() |
84
|
|
|
|
85
|
|
|
def getTechType(self, tech): |
86
|
|
|
if getattr(tech, "engPwr") > 0: |
87
|
|
|
return ENGINE |
88
|
|
|
if getattr(tech, "weaponClass") == 0 and getattr(tech, "weaponDmgMin") > 0: |
89
|
|
|
return SMALL |
90
|
|
|
if getattr(tech, "weaponClass") == 1: |
91
|
|
|
return MEDIUM |
92
|
|
|
if getattr(tech, "weaponClass") == 2: |
93
|
|
|
return LARGE |
94
|
|
|
if getattr(tech, "weaponClass") == 3: |
95
|
|
|
return PLANET |
96
|
|
|
if getattr(tech, "subtype") == "seq_mod" \ |
97
|
|
|
and ( |
98
|
|
|
getattr(tech, "maxHP") > 0 |
99
|
|
|
or getattr(tech, "autoRepairFix") > 0 |
100
|
|
|
or getattr(tech, "autoRepairPerc") > 0 |
101
|
|
|
): |
102
|
|
|
# armor modules |
103
|
|
|
return ARMOR |
104
|
|
|
if getattr(tech, "shieldPerc") > 0 or getattr(tech, "hardShield") > 0: |
105
|
|
|
return SHIELD |
106
|
|
|
if getattr(tech, "subtype") == "seq_struct": |
107
|
|
|
return POD |
108
|
|
|
if getattr(tech, "subtype") == "seq_mod" and getattr(tech, 'scannerPwr') > 0: |
109
|
|
|
return SCANNER |
110
|
|
|
return OTHER |
111
|
|
|
|
112
|
|
|
def show(self): |
113
|
|
|
self.showItems() |
114
|
|
|
|
115
|
|
|
def showItems(self): |
116
|
|
|
items = [] |
117
|
|
|
selected = None |
118
|
|
|
player = client.getPlayer() |
119
|
|
|
for techID in player.techs: |
120
|
|
|
tech = client.getTechInfo(techID) |
121
|
|
|
if getattr(tech, self.techType) == 0: |
122
|
|
|
continue |
123
|
|
|
if self.techSubtype and tech.subtype not in self.techSubtype: |
124
|
|
|
continue |
125
|
|
|
# skip equipment not suitable for this hull |
126
|
|
|
if tech.minHull > self.hullType: |
127
|
|
|
continue |
128
|
|
|
if tech.maxHull < self.hullType: |
129
|
|
|
continue |
130
|
|
|
|
131
|
|
|
techType = self.getTechType(tech) |
132
|
|
|
if self.typeFilter & techType == 0: |
133
|
|
|
continue |
134
|
|
|
|
135
|
|
|
item = ui.Item(tech.name, tData = sequip.getLongDescr(techID), techID = techID, |
136
|
|
|
tType = typeText[techType]) |
137
|
|
|
|
138
|
|
|
if techID == self.selected: |
139
|
|
|
selected = item |
140
|
|
|
|
141
|
|
|
items.append(item) |
142
|
|
|
self.win.vList.items = items |
143
|
|
|
self.win.vList.itemsChanged() |
144
|
|
|
self.win.vList.selectItem(selected) |
145
|
|
|
|
146
|
|
|
def onCancel(self, widget, action, data): |
147
|
|
|
self.hide() |
148
|
|
|
|
149
|
|
|
def onFilter(self, widget, action, data): |
150
|
|
|
if widget.checked: |
151
|
|
|
self.typeFilter |= widget.data |
152
|
|
|
else: |
153
|
|
|
self.typeFilter &= ~widget.data |
154
|
|
|
self.showItems() |
155
|
|
|
|
156
|
|
|
def onSelect(self, widget, action, data): |
157
|
|
|
self.hide() |
158
|
|
|
if self.win.vList.selection: |
159
|
|
|
self.selectCallback(self.win.vList.selection[0].techID) |
160
|
|
|
|
161
|
|
|
def createUI(self): |
162
|
|
|
w, h = gdata.scrnSize |
163
|
|
|
self.win = ui.Window(self.app, |
164
|
|
|
modal = 1, |
165
|
|
|
escKeyClose = 1, |
166
|
|
|
movable = 0, |
167
|
|
|
title = _('Select component'), |
168
|
|
|
rect = ui.Rect((w - 764) / 2, (h - 304) / 2, 764, 304), |
169
|
|
|
layoutManager = ui.SimpleGridLM(), |
170
|
|
|
) |
171
|
|
|
self.win.subscribeAction('*', self) |
172
|
|
|
# component list |
173
|
|
|
ui.Listbox(self.win, layout = (0, 0, 38, 13), id = "vList", |
174
|
|
|
columns = ( |
175
|
|
|
(_('Name'), 'text', 9, ui.ALIGN_W), |
176
|
|
|
(_('Type'), 'tType', 4, ui.ALIGN_W), |
177
|
|
|
(_('Data'), 'tData', 0, ui.ALIGN_W), |
178
|
|
|
), |
179
|
|
|
sortedBy = ('tType', 1), |
180
|
|
|
action = "onSelect", |
181
|
|
|
rmbAction = "onCancel" |
182
|
|
|
) |
183
|
|
|
|
184
|
|
|
# status bar + submit/cancel |
185
|
|
|
ui.TitleButton(self.win, layout = (33, 13, 5, 1), text = _('Cancel'), action = 'onCancel') |
186
|
|
|
ui.Title(self.win, id = 'vStatusBar', layout = (0, 13, 33, 1), align = ui.ALIGN_W) |
187
|
|
|
#self.win.statusBar = self.win.vStatusBar |
188
|
|
|
|