321 lines
10 KiB
C
Executable file
321 lines
10 KiB
C
Executable file
/*
|
|
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
|
|
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
|
|
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
|
|
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
|
|
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
|
|
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
|
|
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
|
|
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
|
|
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
|
|
COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|
*/
|
|
/*
|
|
* $Source: /cvsroot/dxx-rebirth/d1x-rebirth/main/controls.c,v $
|
|
* $Revision: 1.1.1.1 $
|
|
* $Author: zicodxx $
|
|
* $Date: 2006/03/17 19:43:28 $
|
|
*
|
|
* Code for controlling player movement
|
|
*
|
|
* $Log: controls.c,v $
|
|
* Revision 1.1.1.1 2006/03/17 19:43:28 zicodxx
|
|
* initial import
|
|
*
|
|
* Revision 1.4 2003/07/11 21:32:28 donut
|
|
* make ship bobbing fps-independant
|
|
*
|
|
* Revision 1.3 2000/04/19 21:30:00 sekmu
|
|
* movable death-cam from WraithX
|
|
*
|
|
* Revision 1.2 1999/11/21 14:05:00 sekmu
|
|
* observer mode
|
|
*
|
|
* Revision 1.1.1.1 1999/06/14 22:05:52 donut
|
|
* Import of d1x 1.37 source.
|
|
*
|
|
* Revision 2.0 1995/02/27 11:27:11 john
|
|
* New version 2.0, which has no anonymous unions, builds with
|
|
* Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
|
|
*
|
|
* Revision 1.50 1995/02/22 14:11:19 allender
|
|
* remove anonymous unions from object structure
|
|
*
|
|
* Revision 1.49 1994/12/15 13:04:10 mike
|
|
* Replace Players[Player_num].time_total references with GameTime.
|
|
*
|
|
* Revision 1.48 1994/11/27 23:12:13 matt
|
|
* Made changes for new mprintf calling convention
|
|
*
|
|
* Revision 1.47 1994/11/25 22:15:54 matt
|
|
* Added asserts to try to trap frametime < 0 bug
|
|
*
|
|
* Revision 1.46 1994/11/16 11:25:40 matt
|
|
* Took out int3's since I determined that the errors are caused by neg frametime
|
|
*
|
|
* Revision 1.45 1994/11/15 13:07:23 matt
|
|
* Added int3's to try to trap bug
|
|
*
|
|
* Revision 1.44 1994/10/14 16:18:12 john
|
|
* Made Assert that the object was player just nicely exit
|
|
* the function.
|
|
*
|
|
* Revision 1.43 1994/10/13 11:35:25 john
|
|
* Made Thrustmaster FCS Hat work. Put a background behind the
|
|
* keyboard configure. Took out turn_sensitivity. Changed sound/config
|
|
* menu to new menu. Made F6 be calibrate joystick.
|
|
*
|
|
* Revision 1.42 1994/09/29 11:22:02 mike
|
|
* Zero thrust when player dies.
|
|
*
|
|
* Revision 1.41 1994/09/16 13:10:30 mike
|
|
* Hook in afterburner stuff.
|
|
*
|
|
* Revision 1.40 1994/09/14 22:21:54 matt
|
|
* Avoid post-death assert
|
|
*
|
|
* Revision 1.39 1994/09/11 20:30:27 matt
|
|
* Cleaned up thrust vars, changing a few names
|
|
*
|
|
* Revision 1.38 1994/09/10 15:46:31 john
|
|
* First version of new keyboard configuration.
|
|
*
|
|
* Revision 1.37 1994/09/07 15:58:12 mike
|
|
* Check for player dead in controls so you can't fire or move after dead, logical, huh?
|
|
*
|
|
* Revision 1.36 1994/09/06 14:51:56 john
|
|
* Added sensitivity adjustment, fixed bug with joystick button not
|
|
* staying down.
|
|
*
|
|
* Revision 1.35 1994/09/01 15:43:26 john
|
|
* Put pitch bak like it was.
|
|
*
|
|
* Revision 1.34 1994/08/31 18:59:35 john
|
|
* Made rotthrust back like it was.
|
|
*
|
|
* Revision 1.33 1994/08/31 18:49:17 john
|
|
* Slowed Maxrothrust a bit,
|
|
* ..
|
|
*
|
|
* Revision 1.32 1994/08/31 18:32:05 john
|
|
* Lower max rotational thrust
|
|
*
|
|
* Revision 1.31 1994/08/29 21:18:27 john
|
|
* First version of new keyboard/oystick remapping stuff.
|
|
*
|
|
* Revision 1.30 1994/08/29 16:18:30 mike
|
|
* trap divide overflow.
|
|
*
|
|
* Revision 1.29 1994/08/26 14:40:45 john
|
|
* *** empty log message ***
|
|
*
|
|
* Revision 1.28 1994/08/26 12:23:50 john
|
|
* MAde joystick read up to 15 times per second max.
|
|
*
|
|
* Revision 1.27 1994/08/26 10:50:59 john
|
|
* Took out Controls_always_stopped.
|
|
*
|
|
* Revision 1.26 1994/08/26 10:47:27 john
|
|
* *** empty log message ***
|
|
*
|
|
* Revision 1.25 1994/08/26 10:46:50 john
|
|
* New version of controls.
|
|
*
|
|
* Revision 1.24 1994/08/25 19:41:44 john
|
|
* *** empty log message ***
|
|
*
|
|
* Revision 1.23 1994/08/25 18:44:55 john
|
|
* *** empty log message ***
|
|
*
|
|
* Revision 1.22 1994/08/25 18:43:46 john
|
|
* First revision of new control code.
|
|
*
|
|
* Revision 1.21 1994/08/24 20:02:46 john
|
|
* Added cyberman support; made keys work key_down_time
|
|
* returning seconds instead of milliseconds,.
|
|
*
|
|
*
|
|
* Revision 1.20 1994/08/24 19:00:27 john
|
|
* Changed key_down_time to return fixed seconds instead of
|
|
* milliseconds.
|
|
*
|
|
* Revision 1.19 1994/08/19 15:22:12 mike
|
|
* Fix divide overflow in sliding.
|
|
*
|
|
* Revision 1.18 1994/08/19 14:42:50 john
|
|
* Added joystick sensitivity.
|
|
*
|
|
* Revision 1.17 1994/08/17 16:50:01 john
|
|
* Added damaging fireballs, missiles.
|
|
*
|
|
* Revision 1.16 1994/08/12 22:41:54 john
|
|
* Took away Player_stats; added Players array.
|
|
*
|
|
* Revision 1.15 1994/08/09 16:03:56 john
|
|
* Added network players to editor.
|
|
*
|
|
* Revision 1.14 1994/07/28 12:33:31 matt
|
|
* Made sliding use thrust, rather than changing velocity directly
|
|
*
|
|
* Revision 1.13 1994/07/27 20:53:21 matt
|
|
* Added rotational drag & thrust, so turning now has momemtum like moving
|
|
*
|
|
* Revision 1.12 1994/07/25 10:24:06 john
|
|
* Victor stuff.
|
|
*
|
|
* Revision 1.11 1994/07/22 17:53:16 john
|
|
* Added better victormax support
|
|
*
|
|
* Revision 1.10 1994/07/21 21:31:29 john
|
|
* First cheapo version of VictorMaxx tracking.
|
|
*
|
|
* Revision 1.9 1994/07/15 15:16:18 john
|
|
* Fixed some joystick stuff.
|
|
*
|
|
* Revision 1.8 1994/07/15 09:32:09 john
|
|
* Changes player movement.
|
|
*
|
|
* Revision 1.7 1994/07/13 00:14:58 matt
|
|
* Moved all (or nearly all) of the values that affect player movement to
|
|
* bitmaps.tbl
|
|
*
|
|
* Revision 1.6 1994/07/12 12:40:14 matt
|
|
* Revamped physics system
|
|
*
|
|
* Revision 1.5 1994/07/02 13:50:39 matt
|
|
* Cleaned up includes
|
|
*
|
|
* Revision 1.4 1994/07/01 10:55:25 john
|
|
* Added analog joystick throttle
|
|
*
|
|
* Revision 1.3 1994/06/30 20:04:28 john
|
|
* Added -joydef support.
|
|
*
|
|
* Revision 1.2 1994/06/30 19:01:58 matt
|
|
* Moved flying controls code from physics.c to controls.c
|
|
*
|
|
* Revision 1.1 1994/06/30 18:41:25 matt
|
|
* Initial revision
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
#ifdef RCS
|
|
#pragma off (unreferenced)
|
|
static char rcsid[] = "$Id: controls.c,v 1.1.1.1 2006/03/17 19:43:28 zicodxx Exp $";
|
|
#pragma on (unreferenced)
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "mono.h"
|
|
#include "key.h"
|
|
#include "joy.h"
|
|
#include "timer.h"
|
|
#include "error.h"
|
|
|
|
#include "inferno.h"
|
|
#include "game.h"
|
|
#include "object.h"
|
|
#include "player.h"
|
|
|
|
#include "controls.h"
|
|
#include "joydefs.h"
|
|
#include "render.h"
|
|
#include "args.h"
|
|
#include "palette.h"
|
|
#include "mouse.h"
|
|
#include "kconfig.h"
|
|
|
|
//added on 11/20/99 by Victor Rachels for observer mode
|
|
#include "observer.h"
|
|
//end this section addition - VR
|
|
|
|
//look at keyboard, mouse, joystick, CyberMan, whatever, and set
|
|
//physics vars rotvel, velocity
|
|
|
|
void read_flying_controls( object * obj )
|
|
{
|
|
fix afterburner_thrust;
|
|
|
|
Assert(FrameTime > 0); //Get MATT if hit this!
|
|
|
|
//this section commented and moved to the bottom by WraithX
|
|
// if (Player_is_dead) {
|
|
// vm_vec_zero(&obj->mtype.phys_info.rotthrust);
|
|
// vm_vec_zero(&obj->mtype.phys_info.thrust);
|
|
// return;
|
|
// }
|
|
//end of section to be moved.
|
|
|
|
//added/edited on 11/20/99 by Victor Rachels to add observer mode
|
|
// if ((obj->type!=OBJ_PLAYER) || (obj->id!=Player_num)) return; //references to player_ship require that this obj be the player
|
|
if(obj->id!=Player_num || (obj->type==OBJ_GHOST && !I_am_observer)) return;
|
|
//end this section edit - VR
|
|
|
|
// Couldn't the "50" in the next three lines be changed to "64" with no ill effect?
|
|
obj->mtype.phys_info.rotthrust.x = Controls.pitch_time;
|
|
obj->mtype.phys_info.rotthrust.y = Controls.heading_time;
|
|
obj->mtype.phys_info.rotthrust.z = Controls.bank_time;
|
|
|
|
// 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) ));
|
|
|
|
afterburner_thrust = 0;
|
|
if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER)
|
|
afterburner_thrust = FrameTime;
|
|
|
|
// Set object's thrust vector for forward/backward
|
|
vm_vec_copy_scale(&obj->mtype.phys_info.thrust,&obj->orient.fvec, Controls.forward_thrust_time + afterburner_thrust );
|
|
|
|
// slide left/right
|
|
vm_vec_scale_add2(&obj->mtype.phys_info.thrust,&obj->orient.rvec, Controls.sideways_thrust_time );
|
|
|
|
// slide up/down
|
|
vm_vec_scale_add2(&obj->mtype.phys_info.thrust,&obj->orient.uvec, Controls.vertical_thrust_time );
|
|
|
|
if (obj->mtype.phys_info.flags & PF_WIGGLE) {
|
|
fix swiggle;
|
|
fix_fastsincos(GameTime, &swiggle, NULL);
|
|
if (FrameTime < F1_0) // Only scale wiggle if getting at least 1 FPS, to avoid causing the opposite problem.
|
|
swiggle = fixmul(swiggle*20, FrameTime); //make wiggle fps-independant (based on pre-scaled amount of wiggle at 20 FPS)
|
|
vm_vec_scale_add2(&obj->mtype.phys_info.velocity,&obj->orient.uvec,fixmul(swiggle,Player_ship->wiggle));
|
|
}
|
|
|
|
// As of now, obj->mtype.phys_info.thrust & obj->mtype.phys_info.rotthrust are
|
|
// in units of time... In other words, if thrust==FrameTime, that
|
|
// means that the user was holding down the Max_thrust key for the
|
|
// whole frame. So we just scale them up by the max, and divide by
|
|
// FrameTime to make them independant of framerate
|
|
|
|
// Prevent divide overflows on high frame rates.
|
|
// In a signed divide, you get an overflow if num >= div<<15
|
|
{
|
|
fix ft = FrameTime;
|
|
|
|
// Note, you must check for ft < F1_0/2, else you can get an overflow on the << 15.
|
|
if ((ft < F1_0/2) && (ft << 15 <= Player_ship->max_thrust)) {
|
|
mprintf((0, "Preventing divide overflow in controls.c for Max_thrust!\n"));
|
|
ft = (Player_ship->max_thrust >> 15) + 1;
|
|
}
|
|
|
|
vm_vec_scale( &obj->mtype.phys_info.thrust, fixdiv(Player_ship->max_thrust,ft) );
|
|
|
|
if ((ft < F1_0/2) && (ft << 15 <= Player_ship->max_rotthrust)) {
|
|
mprintf((0, "Preventing divide overflow in controls.c for max_rotthrust!\n"));
|
|
ft = (Player_ship->max_thrust >> 15) + 1;
|
|
}
|
|
|
|
vm_vec_scale( &obj->mtype.phys_info.rotthrust, fixdiv(Player_ship->max_rotthrust,ft) );
|
|
}
|
|
|
|
//moved here by WraithX
|
|
if (Player_is_dead) {
|
|
//vm_vec_zero(&obj->mtype.phys_info.rotthrust); //let dead players rotate, changed by WraithX
|
|
vm_vec_zero(&obj->mtype.phys_info.thrust); //don't let dead players move, changed by WraithX
|
|
return;
|
|
}//end if
|
|
|
|
|
|
}
|