Starshatter_Open
Open source Starshatter engine
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
ShipCtrl.cpp
Go to the documentation of this file.
1
/* Project Starshatter 4.5
2
Destroyer Studios LLC
3
Copyright © 1997-2004. All Rights Reserved.
4
5
SUBSYSTEM: Stars.exe
6
FILE: ShipCtrl.cpp
7
AUTHOR: John DiCamillo
8
9
10
OVERVIEW
11
========
12
Ship Controller class
13
*/
14
15
#include "
MemDebug.h
"
16
#include "
ShipCtrl.h
"
17
#include "
Ship.h
"
18
#include "
ShipDesign.h
"
19
#include "
Shield.h
"
20
#include "
Sensor.h
"
21
#include "
NavSystem.h
"
22
#include "
FlightComp.h
"
23
#include "
LandingGear.h
"
24
#include "
Sim.h
"
25
#include "
StarSystem.h
"
26
#include "
Starshatter.h
"
27
#include "
HUDView.h
"
28
#include "
HUDSounds.h
"
29
#include "
KeyMap.h
"
30
#include "
RadioMessage.h
"
31
#include "
RadioTraffic.h
"
32
33
#include "
MouseController.h
"
34
#include "
Keyboard.h
"
35
#include "
Joystick.h
"
36
#include "
Game.h
"
37
#include "
DataLoader.h
"
38
39
// +--------------------------------------------------------------------+
40
41
ShipCtrl::ShipCtrl
(
Ship
* s,
MotionController
* ctrl)
42
: ship(s), controller(ctrl), throttle_active(false), launch_latch(false),
43
pickle_latch(false), target_latch(false)
44
{
45
for
(
int
i = 0; i < 10; i++)
46
GetAsyncKeyState(
'0'
+i);
47
}
48
49
// +--------------------------------------------------------------------+
50
51
int
52
ShipCtrl::KeyDown
(
int
action)
53
{
54
int
k =
Joystick::KeyDownMap
(action) ||
55
Keyboard::KeyDownMap
(action);
56
57
return
k;
58
}
59
60
int
61
ShipCtrl::Toggled
(
int
action)
62
{
63
static
double
last_toggle_time = 0;
64
65
if
(
KeyDown
(action)) {
66
if
((
Game::RealTime
() - last_toggle_time) > 250) {
67
last_toggle_time =
Game::RealTime
();
68
return
1;
69
}
70
}
71
72
return
0;
73
}
74
75
// +--------------------------------------------------------------------+
76
77
void
78
ShipCtrl::Launch
()
79
{
80
if
(
controller
) {
81
ship
->
SetThrottle
(100);
82
throttle_active
=
false
;
83
launch_latch
=
true
;
84
}
85
}
86
87
// +--------------------------------------------------------------------+
88
89
void
90
ShipCtrl::ExecFrame
(
double
seconds)
91
{
92
Starshatter
* stars =
Starshatter::GetInstance
();
93
if
(stars && stars->
GetChatMode
())
return
;
94
if
(!
ship
)
return
;
95
96
const
int
DELTA_THROTTLE = 5;
97
98
controller
->
Acquire
();
99
100
if
(
ship
->
IsStarship
() &&
ship
->
GetFLCSMode
() ==
Ship::FLCS_HELM
) {
101
ship
->
ApplyHelmPitch
(
controller
->
Pitch
() * seconds);
102
ship
->
ApplyHelmYaw
(
controller
->
Yaw
() * seconds);
103
}
104
else
{
105
ship
->
ApplyRoll
(
controller
->
Roll
());
106
ship
->
ApplyPitch
(
controller
->
Pitch
());
107
ship
->
ApplyYaw
(
controller
->
Yaw
());
108
}
109
110
ship
->
SetTransX
(
controller
->
X
() *
ship
->
Design
()->
trans_x
);
111
ship
->
SetTransY
(
controller
->
Y
() *
ship
->
Design
()->
trans_y
);
112
ship
->
SetTransZ
(
controller
->
Z
() *
ship
->
Design
()->
trans_z
);
113
114
bool
augmenter =
false
;
115
116
if
(
controller
->
Throttle
() > 0.05) {
117
if
(
throttle_active
) {
118
ship
->
SetThrottle
(
controller
->
Throttle
() * 100);
119
120
if
(
controller
->
Throttle
() >= 0.99)
121
augmenter =
true
;
122
}
123
else
if
(!
launch_latch
||
controller
->
Throttle
() > 0.5) {
124
throttle_active
=
true
;
125
launch_latch
=
false
;
126
}
127
}
128
else
if
(
throttle_active
) {
129
ship
->
SetThrottle
(0);
130
throttle_active
=
false
;
131
}
132
133
ship
->
ExecFLCSFrame
();
134
135
static
double
time_til_change = 0.0;
136
137
if
(time_til_change < 0.001) {
138
if
(
KeyDown
(
KEY_THROTTLE_UP
)) {
139
ship
->
SetThrottle
(
ship
->
Throttle
() + DELTA_THROTTLE);
140
time_til_change = 0.05;
141
}
142
143
else
if
(
KeyDown
(
KEY_THROTTLE_DOWN
)) {
144
ship
->
SetThrottle
(
ship
->
Throttle
() - DELTA_THROTTLE);
145
time_til_change = 0.05;
146
}
147
148
else
if
(
KeyDown
(
KEY_THROTTLE_ZERO
)) {
149
ship
->
SetThrottle
(0);
150
if
(
ship
->
GetFLCS
())
151
ship
->
GetFLCS
()->
FullStop
();
152
time_til_change = 0.05;
153
}
154
155
else
if
(
KeyDown
(
KEY_THROTTLE_FULL
)) {
156
ship
->
SetThrottle
(100);
157
time_til_change = 0.05;
158
}
159
160
else
if
(
KeyDown
(
KEY_FLCS_MODE_AUTO
)) {
161
ship
->
CycleFLCSMode
();
162
time_til_change = 0.5f;
163
}
164
165
else
if
(
KeyDown
(
KEY_CYCLE_PRIMARY
)) {
166
HUDSounds::PlaySound
(
HUDSounds::SND_WEP_MODE
);
167
ship
->
CyclePrimary
();
168
time_til_change = 0.5f;
169
}
170
171
else
if
(
KeyDown
(
KEY_CYCLE_SECONDARY
)) {
172
HUDSounds::PlaySound
(
HUDSounds::SND_WEP_MODE
);
173
ship
->
CycleSecondary
();
174
time_til_change = 0.5f;
175
}
176
177
if
(
ship
->
GetShield
()) {
178
Shield
* shield =
ship
->
GetShield
();
179
double
level = shield->
GetPowerLevel
();
180
181
if
(
KeyDown
(
KEY_SHIELDS_FULL
)) {
182
HUDSounds::PlaySound
(
HUDSounds::SND_SHIELD_LEVEL
);
183
shield->
SetPowerLevel
(100);
184
time_til_change = 0.5f;
185
}
186
187
else
if
(
KeyDown
(
KEY_SHIELDS_ZERO
)) {
188
HUDSounds::PlaySound
(
HUDSounds::SND_SHIELD_LEVEL
);
189
shield->
SetPowerLevel
(0);
190
time_til_change = 0.5f;
191
}
192
193
else
if
(
KeyDown
(
KEY_SHIELDS_UP
)) {
194
if
(level < 25) level = 25;
195
else
if
(level < 50) level = 50;
196
else
if
(level < 75) level = 75;
197
else
level = 100;
198
199
HUDSounds::PlaySound
(
HUDSounds::SND_SHIELD_LEVEL
);
200
shield->
SetPowerLevel
(level);
201
time_til_change = 0.5f;
202
}
203
204
else
if
(
KeyDown
(
KEY_SHIELDS_DOWN
)) {
205
if
(level > 75) level = 75;
206
else
if
(level > 50) level = 50;
207
else
if
(level > 25) level = 25;
208
else
level = 0;
209
210
HUDSounds::PlaySound
(
HUDSounds::SND_SHIELD_LEVEL
);
211
shield->
SetPowerLevel
(level);
212
time_til_change = 0.5f;
213
}
214
215
}
216
217
if
(
ship
->
GetSensor
()) {
218
Sensor
* sensor =
ship
->
GetSensor
();
219
220
if
(sensor->
GetMode
() <
Sensor::PST
) {
221
if
(
KeyDown
(
KEY_SENSOR_MODE
)) {
222
int
sensor_mode = sensor->
GetMode
() + 1;
223
if
(sensor_mode >
Sensor::GM
)
224
sensor_mode =
Sensor::PAS
;
225
226
sensor->
SetMode
((
Sensor::Mode
) sensor_mode);
227
time_til_change = 0.5f;
228
}
229
230
else
if
(
KeyDown
(
KEY_SENSOR_GROUND_MODE
)) {
231
if
(
ship
->
IsAirborne
()) {
232
sensor->
SetMode
(
Sensor::GM
);
233
time_til_change = 0.5f;
234
}
235
}
236
}
237
else
{
238
// manual "return to search" command for starships:
239
if
(
KeyDown
(
KEY_SENSOR_MODE
)) {
240
ship
->
DropTarget
();
241
}
242
}
243
244
if
(
KeyDown
(
KEY_SENSOR_RANGE_PLUS
)) {
245
sensor->
IncreaseRange
();
246
time_til_change = 0.5f;
247
}
248
249
else
if
(
KeyDown
(
KEY_SENSOR_RANGE_MINUS
)) {
250
sensor->
DecreaseRange
();
251
time_til_change = 0.5f;
252
}
253
}
254
255
if
(
KeyDown
(
KEY_EMCON_PLUS
)) {
256
ship
->
SetEMCON
(
ship
->
GetEMCON
()+1);
257
time_til_change = 0.5f;
258
}
259
260
else
if
(
KeyDown
(
KEY_EMCON_MINUS
)) {
261
ship
->
SetEMCON
(
ship
->
GetEMCON
()-1);
262
time_til_change = 0.5f;
263
}
264
}
265
else
266
time_til_change -= seconds;
267
268
if
(
controller
->
ActionMap
(
KEY_ACTION_0
))
269
ship
->
FirePrimary
();
270
271
if
(
controller
->
ActionMap
(
KEY_ACTION_1
)) {
272
if
(!
pickle_latch
)
273
ship
->
FireSecondary
();
274
275
pickle_latch
=
true
;
276
}
277
else
{
278
pickle_latch
=
false
;
279
}
280
281
if
(
controller
->
ActionMap
(
KEY_ACTION_3
)) {
282
if
(!
target_latch
)
283
ship
->
LockTarget
(
SimObject::SIM_SHIP
);
284
285
target_latch
=
true
;
286
}
287
else
{
288
target_latch
=
false
;
289
}
290
291
ship
->
SetAugmenter
(augmenter || (
KeyDown
(
KEY_AUGMENTER
) ?
true
:
false
));
292
293
if
(
Toggled
(
KEY_DECOY
))
294
ship
->
FireDecoy
();
295
296
if
(
Toggled
(
KEY_LAUNCH_PROBE
))
297
ship
->
LaunchProbe
();
298
299
if
(
Toggled
(
KEY_GEAR_TOGGLE
))
300
ship
->
ToggleGear
();
301
302
if
(
Toggled
(
KEY_NAVLIGHT_TOGGLE
))
303
ship
->
ToggleNavlights
();
304
305
if
(
Toggled
(
KEY_LOCK_TARGET
))
306
ship
->
LockTarget
(
SimObject::SIM_SHIP
,
false
,
true
);
307
308
else
if
(
Toggled
(
KEY_LOCK_THREAT
))
309
ship
->
LockTarget
(
SimObject::SIM_DRONE
);
310
311
else
if
(
Toggled
(
KEY_LOCK_CLOSEST_SHIP
))
312
ship
->
LockTarget
(
SimObject::SIM_SHIP
,
true
,
false
);
313
314
else
if
(
Toggled
(
KEY_LOCK_CLOSEST_THREAT
))
315
ship
->
LockTarget
(
SimObject::SIM_DRONE
,
true
,
false
);
316
317
else
if
(
Toggled
(
KEY_LOCK_HOSTILE_SHIP
))
318
ship
->
LockTarget
(
SimObject::SIM_SHIP
,
true
,
true
);
319
320
else
if
(
Toggled
(
KEY_LOCK_HOSTILE_THREAT
))
321
ship
->
LockTarget
(
SimObject::SIM_DRONE
,
true
,
true
);
322
323
else
if
(
Toggled
(
KEY_CYCLE_SUBTARGET
))
324
ship
->
CycleSubTarget
(1);
325
326
else
if
(
Toggled
(
KEY_PREV_SUBTARGET
))
327
ship
->
CycleSubTarget
(-1);
328
329
if
(
Toggled
(
KEY_AUTO_NAV
)) {
330
ship
->
SetAutoNav
(
true
);
331
// careful: this object has just been deleted!
332
return
;
333
}
334
335
if
(
Toggled
(
KEY_DROP_ORBIT
)) {
336
ship
->
DropOrbit
();
337
// careful: this object has just been deleted!
338
return
;
339
}
340
}
341
Stars45
ShipCtrl.cpp
Generated on Tue Jun 5 2012 20:47:10 for Starshatter_Open by
1.8.1