2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
16 * Code for controlling player movement
39 //look at keyboard, mouse, joystick, CyberMan, whatever, and set
40 //physics vars rotvel, velocity
42 fix Afterburner_charge=f1_0;
44 #define AFTERBURNER_USE_SECS 3 //use up in 3 seconds
45 #define DROP_DELTA_TIME (f1_0/15) //drop 3 per second
47 extern int Drop_afterburner_blob_flag; //ugly hack
49 extern fix Seismic_tremor_magnitude;
51 void read_flying_controls( object * obj )
53 fix forward_thrust_time;
55 Assert(FrameTime > 0); //Get MATT if hit this!
57 // this section commented and moved to the bottom by WraithX
58 // if (Player_is_dead) {
59 // vm_vec_zero(&obj->mtype.phys_info.rotthrust);
60 // vm_vec_zero(&obj->mtype.phys_info.thrust);
63 // end of section to be moved.
65 if ((obj->type!=OBJ_PLAYER) || (obj->id!=Player_num)) return; //references to player_ship require that this obj be the player
67 if (Guided_missile[Player_num] && Guided_missile[Player_num]->signature==Guided_missile_sig[Player_num]) {
69 vms_matrix rotmat,tempm;
72 //this is a horrible hack. guided missile stuff should not be
73 //handled in the middle of a routine that is dealing with the player
75 vm_vec_zero(&obj->mtype.phys_info.rotthrust);
77 rotangs.p = Controls.pitch_time / 2 + Seismic_tremor_magnitude/64;
78 rotangs.b = Controls.bank_time / 2 + Seismic_tremor_magnitude/16;
79 rotangs.h = Controls.heading_time / 2 + Seismic_tremor_magnitude/64;
81 vm_angles_2_matrix(&rotmat,&rotangs);
83 vm_matrix_x_matrix(&tempm,&Guided_missile[Player_num]->orient,&rotmat);
85 Guided_missile[Player_num]->orient = tempm;
87 speed = Weapon_info[Guided_missile[Player_num]->id].speed[Difficulty_level];
89 vm_vec_copy_scale(&Guided_missile[Player_num]->mtype.phys_info.velocity,&Guided_missile[Player_num]->orient.fvec,speed);
91 if (Game_mode & GM_MULTI)
92 multi_send_guided_info (Guided_missile[Player_num],0);
97 obj->mtype.phys_info.rotthrust.x = Controls.pitch_time;
98 obj->mtype.phys_info.rotthrust.y = Controls.heading_time;
99 obj->mtype.phys_info.rotthrust.z = Controls.bank_time;
102 // mprintf( (0, "Rot thrust = %.3f,%.3f,%.3f\n", f2fl(obj->mtype.phys_info.rotthrust.x),f2fl(obj->mtype.phys_info.rotthrust.y), f2fl(obj->mtype.phys_info.rotthrust.z) ));
104 forward_thrust_time = Controls.forward_thrust_time;
106 if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER)
108 if (Controls.state[afterburner]) { // player has key down
109 //if (forward_thrust_time >= 0) { //..and isn't moving backward
111 fix afterburner_scale;
112 int old_count,new_count;
114 //add in value from 0..1
115 afterburner_scale = f1_0 + min(f1_0/2,Afterburner_charge) * 2;
117 forward_thrust_time = fixmul(FrameTime,afterburner_scale); //based on full thrust
119 old_count = (Afterburner_charge / (DROP_DELTA_TIME/AFTERBURNER_USE_SECS));
121 Afterburner_charge -= FrameTime/AFTERBURNER_USE_SECS;
123 if (Afterburner_charge < 0)
124 Afterburner_charge = 0;
126 new_count = (Afterburner_charge / (DROP_DELTA_TIME/AFTERBURNER_USE_SECS));
128 if (old_count != new_count)
129 Drop_afterburner_blob_flag = 1; //drop blob (after physics called)
133 fix cur_energy,charge_up;
136 charge_up = min(FrameTime/8,f1_0 - Afterburner_charge); //recharge over 8 seconds
138 cur_energy = max(Players[Player_num].energy-i2f(10),0); //don't drop below 10
140 //maybe limit charge up by energy
141 charge_up = min(charge_up,cur_energy/10);
143 Afterburner_charge += charge_up;
145 Players[Player_num].energy -= charge_up * 100 / 10; //full charge uses 10% of energy
149 // Set object's thrust vector for forward/backward
150 vm_vec_copy_scale(&obj->mtype.phys_info.thrust,&obj->orient.fvec, forward_thrust_time );
153 vm_vec_scale_add2(&obj->mtype.phys_info.thrust,&obj->orient.rvec, Controls.sideways_thrust_time );
156 vm_vec_scale_add2(&obj->mtype.phys_info.thrust,&obj->orient.uvec, Controls.vertical_thrust_time );
158 if (obj->mtype.phys_info.flags & PF_WIGGLE)
161 fix_fastsincos(GameTime, &swiggle, NULL);
162 if (FrameTime < F1_0) // Only scale wiggle if getting at least 1 FPS, to avoid causing the opposite problem.
163 swiggle = fixmul(swiggle*20, FrameTime); //make wiggle fps-independent (based on pre-scaled amount of wiggle at 20 FPS)
164 vm_vec_scale_add2(&obj->mtype.phys_info.velocity,&obj->orient.uvec,fixmul(swiggle,Player_ship->wiggle));
167 // As of now, obj->mtype.phys_info.thrust & obj->mtype.phys_info.rotthrust are
168 // in units of time... In other words, if thrust==FrameTime, that
169 // means that the user was holding down the Max_thrust key for the
170 // whole frame. So we just scale them up by the max, and divide by
171 // FrameTime to make them independant of framerate
173 // Prevent divide overflows on high frame rates.
174 // In a signed divide, you get an overflow if num >= div<<15
178 // Note, you must check for ft < F1_0/2, else you can get an overflow on the << 15.
179 if ((ft < F1_0/2) && (ft << 15 <= Player_ship->max_thrust)) {
180 mprintf((0, "Preventing divide overflow in controls.c for Max_thrust!\n"));
181 ft = (Player_ship->max_thrust >> 15) + 1;
184 vm_vec_scale( &obj->mtype.phys_info.thrust, fixdiv(Player_ship->max_thrust,ft) );
186 if ((ft < F1_0/2) && (ft << 15 <= Player_ship->max_rotthrust)) {
187 mprintf((0, "Preventing divide overflow in controls.c for max_rotthrust!\n"));
188 ft = (Player_ship->max_thrust >> 15) + 1;
191 vm_vec_scale( &obj->mtype.phys_info.rotthrust, fixdiv(Player_ship->max_rotthrust,ft) );
194 // moved here by WraithX
197 //vm_vec_zero(&obj->mtype.phys_info.rotthrust); // let dead players rotate, changed by WraithX
198 vm_vec_zero(&obj->mtype.phys_info.thrust); // don't let dead players move, changed by WraithX
205 extern void transfer_energy_to_shield(fix);
207 control_info Controls;
209 fix Cruise_speed = 0;
214 #define JOYSTICK_READ_TIME (F1_0 / 40) // Read joystick at 40 Hz.
216 #define JOYSTICK_READ_TIME (F1_0 / 10) // Read joystick at 10 Hz.
219 fix LastReadTime = 0;
221 fix joy_axis[JOY_MAX_AXES];
224 void reset_cruise(void)
230 static inline void button_down(control_button button)
232 Controls.count[button]++;
233 Controls.state[button] = 1;
234 Controls.time_went_down[button] = timer_get_fixed_seconds();
238 static inline void button_up(control_button button)
240 Controls.state[button] = 0;
241 Controls.time_held_down[button] += timer_get_fixed_seconds() - Controls.time_went_down[button];
245 // Returns the number of seconds this 'button' has been down since last call.
246 static inline fix button_down_time(control_button button)
250 if (!Controls.state[button]) {
251 time_down = Controls.time_held_down[button];
252 Controls.time_held_down[button] = 0;
254 time = timer_get_fixed_seconds();
255 time_down = time - Controls.time_went_down[button];
256 Controls.time_went_down[button] = time;
263 void controls_cmd_lookdown_on(int argc, char **argv) { button_down(pitch_forward); }
264 void controls_cmd_lookdown_off(int argc, char **argv) { button_up(pitch_forward); }
265 void controls_cmd_lookup_on(int argc, char **argv) { button_down(pitch_backward); }
266 void controls_cmd_lookup_off(int argc, char **argv) { button_up(pitch_backward); }
267 void controls_cmd_left_on(int argc, char **argv) { button_down(turn_left); }
268 void controls_cmd_left_off(int argc, char **argv) { button_up(turn_left); }
269 void controls_cmd_right_on(int argc, char **argv) { button_down(turn_right); }
270 void controls_cmd_right_off(int argc, char **argv) { button_up(turn_right); }
271 void controls_cmd_strafe_on(int argc, char **argv) { button_down(slide_on); }
272 void controls_cmd_strafe_off(int argc, char **argv) { button_up(slide_on); }
273 void controls_cmd_moveleft_on(int argc, char **argv) { button_down(slide_left); }
274 void controls_cmd_moveleft_off(int argc, char **argv) { button_up(slide_left); }
275 void controls_cmd_moveright_on(int argc, char **argv) { button_down(slide_right); }
276 void controls_cmd_moveright_off(int argc, char **argv) { button_up(slide_right); }
277 void controls_cmd_moveup_on(int argc, char **argv) { button_down(slide_up); }
278 void controls_cmd_moveup_off(int argc, char **argv) { button_up(slide_up); }
279 void controls_cmd_movedown_on(int argc, char **argv) { button_down(slide_down); }
280 void controls_cmd_movedown_off(int argc, char **argv) { button_up(slide_down); }
281 void controls_cmd_bank_on(int argc, char **argv) { button_down(bank_on); }
282 void controls_cmd_bank_off(int argc, char **argv) { button_up(bank_on); }
283 void controls_cmd_bankleft_on(int argc, char **argv) { button_down(bank_left); }
284 void controls_cmd_bankleft_off(int argc, char **argv) { button_up(bank_left); }
285 void controls_cmd_bankright_on(int argc, char **argv) { button_down(bank_right); }
286 void controls_cmd_bankright_off(int argc, char **argv) { button_up(bank_right); }
287 void controls_cmd_forward_on(int argc, char **argv) { button_down(accelerate); }
288 void controls_cmd_forward_off(int argc, char **argv) { button_up(accelerate); }
289 void controls_cmd_back_on(int argc, char **argv) { button_down(reverse); }
290 void controls_cmd_back_off(int argc, char **argv) { button_up(reverse); }
291 void controls_cmd_cruiseup_on(int argc, char **argv) { button_down(cruise_faster); }
292 void controls_cmd_cruiseup_off(int argc, char **argv) { button_up(cruise_faster); }
293 void controls_cmd_cruisedown_on(int argc, char **argv) { button_down(cruise_slower); }
294 void controls_cmd_cruisedown_off(int argc, char **argv){ button_up(cruise_slower); }
295 void controls_cmd_cruiseoff_on(int argc, char **argv) { button_down(cruise_off); }
296 void controls_cmd_cruiseoff_off(int argc, char **argv) { button_up(cruise_off); }
297 void controls_cmd_nrgshield_on(int argc, char **argv) { button_down(energy_shield); }
298 void controls_cmd_nrgshield_off(int argc, char **argv) { button_up(energy_shield); }
299 void controls_cmd_attack_on(int argc, char **argv) { button_down(fire_primary); }
300 void controls_cmd_attack_off(int argc, char **argv) { button_up(fire_primary); }
301 void controls_cmd_attack2_on(int argc, char **argv) { button_down(fire_secondary); }
302 void controls_cmd_attack2_off(int argc, char **argv) { button_up(fire_secondary); }
303 void controls_cmd_rearview_on(int argc, char **argv) { button_down(rear_view); }
304 void controls_cmd_rearview_off(int argc, char **argv) { button_up(rear_view); }
305 void controls_cmd_automap_on(int argc, char **argv) { button_down(automap); }
306 void controls_cmd_automap_off(int argc, char **argv) { button_up(automap); }
307 void controls_cmd_afterburn_on(int argc, char **argv) { button_down(afterburner); }
308 void controls_cmd_afterburn_off(int argc, char **argv) { button_up(afterburner); }
309 void controls_cmd_flare(int argc, char **argv) { button_down(fire_flare); }
310 void controls_cmd_bomb(int argc, char **argv) { button_up(drop_bomb); }
311 void controls_cmd_cycle(int argc, char **argv) { button_down(cycle_primary); }
312 void controls_cmd_cycle2(int argc, char **argv) { button_up(cycle_secondary); }
313 void controls_cmd_headlight(int argc, char **argv) { button_down(headlight); }
315 void controls_cmd_togglebomb(int argc, char **argv)
317 weapon_toggle_bomb();
320 void controls_cmd_weapon(int argc, char **argv)
324 if (argc < 2 || !stricmp(argv[1], "-h")) {
325 con_printf(CON_NORMAL, "%s <num>\n", argv[0]);
326 con_printf(CON_NORMAL, " select or toggle weapon <num>\n");
336 do_weapon_select((n-1) % 5, (n-1) / 5);
340 void controls_init(void)
342 cmd_addcommand("+lookdown", controls_cmd_lookdown_on);
343 cmd_addcommand("-lookdown", controls_cmd_lookdown_off);
344 cmd_addcommand("+lookup", controls_cmd_lookup_on);
345 cmd_addcommand("-lookup", controls_cmd_lookup_off);
346 cmd_addcommand("+left", controls_cmd_left_on);
347 cmd_addcommand("-left", controls_cmd_left_off);
348 cmd_addcommand("+right", controls_cmd_right_on);
349 cmd_addcommand("-right", controls_cmd_right_off);
350 cmd_addcommand("+strafe", controls_cmd_strafe_on);
351 cmd_addcommand("-strafe", controls_cmd_strafe_off);
352 cmd_addcommand("+moveleft", controls_cmd_moveleft_on);
353 cmd_addcommand("-moveleft", controls_cmd_moveleft_off);
354 cmd_addcommand("+moveright", controls_cmd_moveright_on);
355 cmd_addcommand("-moveright", controls_cmd_moveright_off);
356 cmd_addcommand("+moveup", controls_cmd_moveup_on);
357 cmd_addcommand("-moveup", controls_cmd_moveup_off);
358 cmd_addcommand("+movedown", controls_cmd_movedown_on);
359 cmd_addcommand("-movedown", controls_cmd_movedown_off);
360 cmd_addcommand("+bank", controls_cmd_bank_on);
361 cmd_addcommand("-bank", controls_cmd_bank_off);
362 cmd_addcommand("+bankleft", controls_cmd_bankleft_on);
363 cmd_addcommand("-bankleft", controls_cmd_bankleft_off);
364 cmd_addcommand("+bankright", controls_cmd_bankright_on);
365 cmd_addcommand("-bankright", controls_cmd_bankright_off);
366 cmd_addcommand("+forward", controls_cmd_forward_on);
367 cmd_addcommand("-forward", controls_cmd_forward_off);
368 cmd_addcommand("+back", controls_cmd_back_on);
369 cmd_addcommand("-back", controls_cmd_back_off);
370 cmd_addcommand("+cruiseup", controls_cmd_cruiseup_on);
371 cmd_addcommand("-cruiseup", controls_cmd_cruiseup_off);
372 cmd_addcommand("+cruisedown", controls_cmd_cruisedown_on);
373 cmd_addcommand("-cruisedown", controls_cmd_cruisedown_off);
374 cmd_addcommand("+cruiseoff", controls_cmd_cruiseoff_on);
375 cmd_addcommand("-cruiseoff", controls_cmd_cruiseoff_off);
376 cmd_addcommand("+nrgshield", controls_cmd_nrgshield_on);
377 cmd_addcommand("-nrgshield", controls_cmd_nrgshield_off);
378 cmd_addcommand("+rearview", controls_cmd_rearview_on);
379 cmd_addcommand("-rearview", controls_cmd_rearview_off);
380 cmd_addcommand("+attack", controls_cmd_attack_on);
381 cmd_addcommand("-attack", controls_cmd_attack_off);
382 cmd_addcommand("+attack2", controls_cmd_attack2_on);
383 cmd_addcommand("-attack2", controls_cmd_attack2_off);
384 cmd_addcommand("+automap", controls_cmd_automap_on);
385 cmd_addcommand("-automap", controls_cmd_automap_off);
386 cmd_addcommand("+afterburner", controls_cmd_afterburn_on);
387 cmd_addcommand("-afterburner", controls_cmd_afterburn_off);
388 cmd_addcommand("flare", controls_cmd_flare);
389 cmd_addcommand("bomb", controls_cmd_bomb);
390 cmd_addcommand("cycle", controls_cmd_cycle);
391 cmd_addcommand("cycle2", controls_cmd_cycle2);
392 cmd_addcommand("headlight", controls_cmd_headlight);
393 cmd_addcommand("togglebomb", controls_cmd_togglebomb);
394 cmd_addcommand("weapon", controls_cmd_weapon);
398 /* Preserves pitch, heading, and states */
399 void controls_reset(void)
401 Controls.forward_thrust_time = 0;
402 Controls.sideways_thrust_time = 0;
403 Controls.vertical_thrust_time = 0;
404 Controls.bank_time = 0;
405 memset(Controls.count, 0, CONTROL_NUM_BUTTONS);
409 void controls_read_all()
414 int raw_joy_axis[JOY_MAX_AXES];
417 fix analog_control[7]; // indexed on control_analog
419 memset(analog_control, 0, sizeof(analog_control));
425 ctime = timer_get_fixed_seconds();
427 //--------- Read Joystick -----------
428 if ( (LastReadTime + JOYSTICK_READ_TIME > ctime) ) {
430 if ((ctime < 0) && (LastReadTime >= 0))
432 if ((ctime < 0) && (LastReadTime > 0))
434 LastReadTime = ctime;
435 } else if (Config_control_joystick.intval) {
436 LastReadTime = ctime;
437 channel_masks = joystick_read_raw_axis( JOY_ALL_AXIS, raw_joy_axis );
439 Assert(joy_num_axes <= 6); // don't have cvar mapping above 6 yet
440 for (i = 0; i < joy_num_axes; i++) {
442 if (channel_masks&(1<<i)) {
444 int joy_null_value = f2i(Config_joystick_deadzone[joy_advaxes[i].intval - 1].intval * 128);
446 raw_joy_axis[i] = joy_get_scaled_reading( raw_joy_axis[i], i );
448 if (raw_joy_axis[i] > joy_null_value)
449 raw_joy_axis[i] = ((raw_joy_axis[i] - joy_null_value) * 128) / (128 - joy_null_value);
450 else if (raw_joy_axis[i] < -joy_null_value)
451 raw_joy_axis[i] = ((raw_joy_axis[i] + joy_null_value) * 128) / (128 - joy_null_value);
454 joy_axis[i] = (raw_joy_axis[i] * FrameTime) / 128;
462 for (i = 0; i < joy_num_axes; i++)
466 if (Config_control_joystick.intval)
467 for (i = 0; i < 6; i++)
468 analog_control[joy_advaxes[i].intval] += joy_axis[i] * (joy_invert[i].intval ? -1 : 1) * Config_joystick_sensitivity[joy_advaxes[i].intval-1].value;
470 if (Config_control_mouse.intval) {
471 //--------- Read Mouse -----------
472 mouse_get_delta( &dx, &dy, &dz );
474 analog_control[mouse_axes[0].intval] += dx * FrameTime / 35 * (mouse_invert[0].intval ? -1 : 1) * Config_mouse_sensitivity[mouse_axes[0].intval-1].value;
475 analog_control[mouse_axes[1].intval] += dy * FrameTime / 25 * (mouse_invert[1].intval ? -1 : 1) * Config_mouse_sensitivity[mouse_axes[1].intval-1].value;
476 analog_control[mouse_axes[2].intval] += dz * FrameTime * (mouse_invert[2].intval ? -1 : 1) * Config_mouse_sensitivity[mouse_axes[2].intval-1].value;
479 //------------ Read pitch_time -----------
480 if ( !Controls.state[slide_on] ) {
481 // mprintf((0, "pitch: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
484 kp += button_down_time(pitch_forward) / (PH_SCALE * 2);
485 kp -= button_down_time(pitch_backward) / (PH_SCALE * 2);
488 Controls.pitch_time = 0;
490 if (Controls.pitch_time < 0)
491 Controls.pitch_time = 0;
493 if (Controls.pitch_time > 0)
494 Controls.pitch_time = 0;
495 Controls.pitch_time += kp;
497 Controls.pitch_time -= analog_control[AXIS_PITCH];
500 Controls.pitch_time = 0;
502 if (!Player_is_dead) {
504 //----------- Read vertical_thrust_time -----------------
506 if ( Controls.state[slide_on] ) {
507 Controls.vertical_thrust_time += button_down_time(pitch_forward);
508 Controls.vertical_thrust_time -= button_down_time(pitch_backward);
509 Controls.vertical_thrust_time += analog_control[AXIS_PITCH];
512 Controls.vertical_thrust_time += button_down_time(slide_up);
513 Controls.vertical_thrust_time -= button_down_time(slide_down);
514 Controls.vertical_thrust_time += analog_control[AXIS_UPDOWN];
518 //---------- Read heading_time -----------
520 if ( !Controls.state[slide_on] && !Controls.state[bank_on] ) {
521 //mprintf((0, "heading: %7.3f %7.3f: %7.3f\n", f2fl(k4), f2fl(k6), f2fl(Controls.heading_time)));
524 kh -= button_down_time(turn_left) / PH_SCALE;
525 kh += button_down_time(turn_right) / PH_SCALE;
528 Controls.heading_time = 0;
530 if (Controls.heading_time < 0)
531 Controls.heading_time = 0;
533 if (Controls.heading_time > 0)
534 Controls.heading_time = 0;
535 Controls.heading_time += kh;
537 Controls.heading_time += analog_control[AXIS_TURN];
540 Controls.heading_time = 0;
542 if (!Player_is_dead) {
544 //----------- Read sideways_thrust_time -----------------
546 if ( Controls.state[slide_on] ) {
547 Controls.sideways_thrust_time -= button_down_time(turn_left);
548 Controls.sideways_thrust_time += button_down_time(turn_right);
549 Controls.sideways_thrust_time += analog_control[AXIS_TURN];
552 Controls.sideways_thrust_time -= button_down_time(slide_left);
553 Controls.sideways_thrust_time += button_down_time(slide_right);
554 Controls.sideways_thrust_time += analog_control[AXIS_LEFTRIGHT];
558 //----------- Read bank_time -----------------
560 if ( Controls.state[bank_on] ) {
561 Controls.bank_time += button_down_time(turn_left);
562 Controls.bank_time -= button_down_time(turn_right);
563 Controls.bank_time -= analog_control[AXIS_TURN];
566 Controls.bank_time += button_down_time(bank_left);
567 Controls.bank_time -= button_down_time(bank_right);
568 Controls.bank_time -= analog_control[AXIS_BANK];
570 // the following "if" added by WraithX, 4/14/00
571 // done so that dead players can't move
572 if (!Player_is_dead) {
574 //----------- Read forward_thrust_time -------------
576 Controls.forward_thrust_time += button_down_time(accelerate);
577 Controls.forward_thrust_time -= button_down_time(reverse);
578 Controls.forward_thrust_time -= analog_control[AXIS_THROTTLE];
580 //---------Read Energy->Shield key----------
582 if ((Players[Player_num].flags & PLAYER_FLAGS_CONVERTER) && Controls.state[energy_shield])
583 transfer_energy_to_shield(button_down_time(energy_shield));
587 //----------- Read stupid-cruise-control-type of throttle.
589 Cruise_speed += button_down_time(cruise_faster);
590 Cruise_speed -= button_down_time(cruise_slower);
592 if (Controls.count[cruise_off])
595 if (Cruise_speed > i2f(100))
596 Cruise_speed = i2f(100);
597 if (Cruise_speed < 0)
600 if (Controls.forward_thrust_time == 0)
601 Controls.forward_thrust_time = fixmul(Cruise_speed,FrameTime) / 100;
607 //----------- Clamp values between -FrameTime and FrameTime
608 if (FrameTime > F1_0 )
609 mprintf( (1, "Bogus frame time of %.2f seconds\n", f2fl(FrameTime) ));
611 if (Controls.pitch_time > FrameTime/2 ) Controls.pitch_time = FrameTime/2;
612 if (Controls.vertical_thrust_time > FrameTime ) Controls.vertical_thrust_time = FrameTime;
613 if (Controls.heading_time > FrameTime ) Controls.heading_time = FrameTime;
614 if (Controls.sideways_thrust_time > FrameTime ) Controls.sideways_thrust_time = FrameTime;
615 if (Controls.bank_time > FrameTime ) Controls.bank_time = FrameTime;
616 if (Controls.forward_thrust_time > FrameTime ) Controls.forward_thrust_time = FrameTime;
617 //if (Controls.afterburner_time > FrameTime ) Controls.afterburner_time = FrameTime;
619 if (Controls.pitch_time < -FrameTime/2 ) Controls.pitch_time = -FrameTime/2;
620 if (Controls.vertical_thrust_time < -FrameTime ) Controls.vertical_thrust_time = -FrameTime;
621 if (Controls.heading_time < -FrameTime ) Controls.heading_time = -FrameTime;
622 if (Controls.sideways_thrust_time < -FrameTime ) Controls.sideways_thrust_time = -FrameTime;
623 if (Controls.bank_time < -FrameTime ) Controls.bank_time = -FrameTime;
624 if (Controls.forward_thrust_time < -FrameTime ) Controls.forward_thrust_time = -FrameTime;
625 //if (Controls.afterburner_time < -FrameTime ) Controls.afterburner_time = -FrameTime;
627 //--------- Don't do anything if in debug mode
629 if ( keyd_pressed[KEY_DELETE] ) {
630 memset( &Controls, 0, sizeof(control_info) );