2006-03-20 17:12:09 +00:00
/*
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 - 1999 PARALLAX SOFTWARE CORPORATION . ALL RIGHTS RESERVED .
*/
/*
*
* object system definitions
*
*/
# ifndef _OBJECT_H
# define _OBJECT_H
# include "pstypes.h"
# include "vecmat.h"
# include "segment.h"
# include "gameseg.h"
2013-03-24 20:32:01 +00:00
# if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
# include "aistruct.h"
2013-03-24 20:32:01 +00:00
# endif
2006-03-20 17:12:09 +00:00
# include "gr.h"
# include "piggy.h"
2013-03-24 20:32:01 +00:00
# include "polyobj.h"
2006-03-20 17:12:09 +00:00
/*
* CONSTANTS
*/
# define MAX_OBJECTS 350 // increased on 01/24/95 for multiplayer. --MK; total number of objects in world
2009-02-17 11:34:16 +00:00
# define MAX_USED_OBJECTS (MAX_OBJECTS-20)
2006-03-20 17:12:09 +00:00
// Object types
2012-09-01 22:24:42 +00:00
enum object_type_t
{
OBJ_NONE = 255 , // unused object
OBJ_WALL = 0 , // A wall... not really an object, but used for collisions
OBJ_FIREBALL = 1 , // a fireball, part of an explosion
OBJ_ROBOT = 2 , // an evil enemy
OBJ_HOSTAGE = 3 , // a hostage you need to rescue
OBJ_PLAYER = 4 , // the player on the console
OBJ_WEAPON = 5 , // a laser, missile, etc
OBJ_CAMERA = 6 , // a camera to slew around with
OBJ_POWERUP = 7 , // a powerup you can pick up
OBJ_DEBRIS = 8 , // a piece of robot
OBJ_CNTRLCEN = 9 , // the control center
OBJ_FLARE = 10 , // a flare
OBJ_CLUTTER = 11 , // misc objects
OBJ_GHOST = 12 , // what the player turns into when dead
OBJ_LIGHT = 13 , // a light source, & not much else
OBJ_COOP = 14 , // a cooperative player object.
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2012-09-01 22:24:42 +00:00
OBJ_MARKER = 15 , // a map marker
2013-03-03 01:03:33 +00:00
# endif
2012-09-01 22:24:42 +00:00
} ;
2006-03-20 17:12:09 +00:00
// WARNING!! If you add a type here, add its name to Object_type_names
// in object.c
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
# define MAX_OBJECT_TYPES 15
# elif defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
# define MAX_OBJECT_TYPES 16
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
// Result types
# define RESULT_NOTHING 0 // Ignore this collision
# define RESULT_CHECK 1 // Check for this collision
// Control types - what tells this object what do do
# define CT_NONE 0 // doesn't move (or change movement)
# define CT_AI 1 // driven by AI
# define CT_EXPLOSION 2 // explosion sequencer
# define CT_FLYING 4 // the player is flying
# define CT_SLEW 5 // slewing
# define CT_FLYTHROUGH 6 // the flythrough system
# define CT_WEAPON 9 // laser, etc.
# define CT_REPAIRCEN 10 // under the control of the repair center
# define CT_MORPH 11 // this object is being morphed
# define CT_DEBRIS 12 // this is a piece of debris
# define CT_POWERUP 13 // animating powerup blob
# define CT_LIGHT 14 // doesn't actually do anything
# define CT_REMOTE 15 // controlled by another net player
# define CT_CNTRLCEN 16 // the control center/main reactor
// Movement types
# define MT_NONE 0 // doesn't move
# define MT_PHYSICS 1 // moves by physics
# define MT_SPINNING 3 // this object doesn't move, just sits and spins
// Render types
# define RT_NONE 0 // does not render
# define RT_POLYOBJ 1 // a polygon model
# define RT_FIREBALL 2 // a fireball
# define RT_LASER 3 // a laser
# define RT_HOSTAGE 4 // a hostage
# define RT_POWERUP 5 // a powerup
# define RT_MORPH 6 // a robot being morphed
# define RT_WEAPON_VCLIP 7 // a weapon that renders as a vclip
// misc object flags
# define OF_EXPLODING 1 // this object is exploding
# define OF_SHOULD_BE_DEAD 2 // this object should be dead, so next time we can, we should delete this object.
# define OF_DESTROYED 4 // this has been killed, and is showing the dead version
# define OF_SILENT 8 // this makes no sound when it hits a wall. Added by MK for weapons, if you extend it to other types, do it completely!
# define OF_ATTACHED 16 // this object is a fireball attached to another object
# define OF_HARMLESS 32 // this object does no damage. Added to make quad lasers do 1.5 damage as normal lasers.
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
# define OF_PLAYER_DROPPED 64 // this object was dropped by the player...
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
// Different Weapon ID types...
# define WEAPON_ID_LASER 0
# define WEAPON_ID_MISSLE 1
# define WEAPON_ID_CANNONBALL 2
// Object Initial shields...
# define OBJECT_INITIAL_SHIELDS F1_0 / 2
// physics flags
# define PF_TURNROLL 0x01 // roll when turning
# define PF_LEVELLING 0x02 // level object with closest side
# define PF_BOUNCE 0x04 // bounce (not slide) when hit will
# define PF_WIGGLE 0x08 // wiggle while flying
# define PF_STICK 0x10 // object sticks (stops moving) when hits wall
# define PF_PERSISTENT 0x20 // object keeps going even after it hits another object (eg, fusion cannon)
# define PF_USES_THRUST 0x40 // this object uses its thrust
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
# define PF_BOUNCED_ONCE 0x80 // Weapon has bounced once.
# define PF_FREE_SPINNING 0x100 // Drag does not apply to rotation of this object
# define PF_BOUNCES_TWICE 0x200 // This weapon bounces twice, then dies
2013-03-03 01:03:33 +00:00
# define PF_SPAT_BY_PLAYER 1 //this powerup was spat by the player
# endif
2006-03-20 17:12:09 +00:00
# define IMMORTAL_TIME 0x3fffffff // Time assigned to immortal objects, about 32768 seconds, or about 9 hours.
// List of objects rendered last frame in order. Created at render
// time, used by homing missiles in laser.c
# define MAX_RENDERED_OBJECTS 50
/*
* STRUCTURES
*/
2013-03-24 20:32:01 +00:00
# if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
extern char Object_type_names [ MAX_OBJECT_TYPES ] [ 9 ] ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
# define MAX_CONTROLCEN_GUNS 4
# define MAX_RENDERED_WINDOWS 1
# elif defined(DXX_BUILD_DESCENT_II)
2013-03-23 19:09:44 +00:00
# define MAX_CONTROLCEN_GUNS 8
2013-03-03 01:03:33 +00:00
# define MAX_RENDERED_WINDOWS 3
# endif
2013-03-23 19:09:44 +00:00
struct reactor_static {
/* Location of the gun on the reactor object */
vms_vector gun_pos [ MAX_CONTROLCEN_GUNS ] ;
/* Orientation of the gun on the reactor object */
vms_vector gun_dir [ MAX_CONTROLCEN_GUNS ] ;
} ;
2013-03-24 20:32:01 +00:00
# endif
2013-03-23 19:09:44 +00:00
2007-12-29 14:18:49 +00:00
// A compressed form for sending crucial data
2006-03-20 17:12:09 +00:00
typedef struct shortpos {
sbyte bytemat [ 9 ] ;
short xo , yo , zo ;
short segment ;
short velx , vely , velz ;
} __pack__ shortpos ;
2012-05-21 15:06:50 +00:00
// Another compressed form for object position, velocity, orientation and rotvel using quaternion
typedef struct quaternionpos {
vms_quaternion orient ;
vms_vector pos ;
vms_vector vel ;
vms_vector rotvel ;
} __pack__ quaternionpos ;
2006-03-20 17:12:09 +00:00
// This is specific to the shortpos extraction routines in gameseg.c.
# define RELPOS_PRECISION 10
# define MATRIX_PRECISION 9
# define MATRIX_MAX 0x7f // This is based on MATRIX_PRECISION, 9 => 0x7f
// information for physics sim for an object
typedef struct physics_info {
vms_vector velocity ; // velocity vector of this object
vms_vector thrust ; // constant force applied to this object
fix mass ; // the mass of this object
fix drag ; // how fast this slows down
fix brakes ; // how much brakes applied
vms_vector rotvel ; // rotational velecity (angles)
vms_vector rotthrust ; // rotational acceleration
fixang turnroll ; // rotation caused by turn banking
ushort flags ; // misc physics flags
} __pack__ physics_info ;
// stuctures for different kinds of simulation
typedef struct laser_info {
short parent_type ; // The type of the parent of this object
short parent_num ; // The object's parent's number
int parent_signature ; // The object's parent's signature...
2010-12-22 00:17:59 +00:00
fix64 creation_time ; // Absolute time of creation.
2010-12-22 09:41:25 +00:00
short last_hitobj ; // For persistent weapons (survive object collision), object it most recently hit.
ubyte hitobj_list [ MAX_OBJECTS ] ; // list of all objects persistent weapon has already damaged (useful in case it's in contact with two objects at the same time)
2006-03-20 17:12:09 +00:00
short track_goal ; // Object this object is tracking.
fix multiplier ; // Power if this is a fusion bolt (or other super weapon to be added).
2013-08-07 22:29:56 +00:00
fix track_turn_time ;
2013-08-24 22:09:58 +00:00
# if defined(DXX_BUILD_DESCENT_II)
fix64 last_afterburner_time ; // Time at which this object last created afterburner blobs.
# endif
2006-03-20 17:12:09 +00:00
} __pack__ laser_info ;
2010-12-22 00:17:59 +00:00
// Same as above but structure Savegames/Multiplayer objects expect
typedef struct laser_info_rw {
short parent_type ; // The type of the parent of this object
short parent_num ; // The object's parent's number
int parent_signature ; // The object's parent's signature...
fix creation_time ; // Absolute time of creation.
2010-12-22 09:41:25 +00:00
short last_hitobj ; // For persistent weapons (survive object collision), object it most recently hit.
2010-12-22 00:17:59 +00:00
short track_goal ; // Object this object is tracking.
fix multiplier ; // Power if this is a fusion bolt (or other super weapon to be added).
} __pack__ laser_info_rw ;
2006-03-20 17:12:09 +00:00
typedef struct explosion_info {
fix spawn_time ; // when lifeleft is < this, spawn another
fix delete_time ; // when to delete object
short delete_objnum ; // and what object to delete
short attach_parent ; // explosion is attached to this object
short prev_attach ; // previous explosion in attach list
short next_attach ; // next explosion in attach list
} __pack__ explosion_info ;
typedef struct light_info {
fix intensity ; // how bright the light is
} __pack__ light_info ;
typedef struct powerup_info {
int count ; // how many/much we pick up (vulcan cannon only?)
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2010-12-22 00:17:59 +00:00
fix64 creation_time ; // Absolute time of creation.
2006-03-20 17:12:09 +00:00
int flags ; // spat by player?
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
} __pack__ powerup_info ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I)
typedef powerup_info powerup_info_rw ;
# elif defined(DXX_BUILD_DESCENT_II)
2010-12-22 00:17:59 +00:00
// Same as above but structure Savegames/Multiplayer objects expect
typedef struct powerup_info_rw {
int count ; // how many/much we pick up (vulcan cannon only?)
fix creation_time ; // Absolute time of creation.
int flags ; // spat by player?
} __pack__ powerup_info_rw ;
2013-03-03 01:03:33 +00:00
# endif
2010-12-22 00:17:59 +00:00
2006-03-20 17:12:09 +00:00
typedef struct vclip_info {
int vclip_num ;
fix frametime ;
sbyte framenum ;
} __pack__ vclip_info ;
// structures for different kinds of rendering
typedef struct polyobj_info {
int model_num ; // which polygon model
vms_angvec anim_angles [ MAX_SUBMODELS ] ; // angles for each subobject
int subobj_flags ; // specify which subobjs to draw
int tmap_override ; // if this is not -1, map all face to this
int alt_textures ; // if not -1, use these textures instead
} __pack__ polyobj_info ;
2013-03-24 20:32:01 +00:00
struct object ;
struct object_rw ;
typedef struct object object ;
# if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
struct object {
2006-03-20 17:12:09 +00:00
int signature ; // Every object ever has a unique signature...
ubyte type ; // what type of object this is... robot, weapon, hostage, powerup, fireball
ubyte id ; // which form of object...which powerup, robot, etc.
# ifdef WORDS_NEED_ALIGNMENT
short pad ;
# endif
short next , prev ; // id of next and previous connected object in Objects, -1 = no connection
ubyte control_type ; // how this object is controlled
ubyte movement_type ; // how this object moves
ubyte render_type ; // how this object renders
ubyte flags ; // misc flags
short segnum ; // segment number containing object
short attached_obj ; // number of attached fireball object
vms_vector pos ; // absolute x,y,z coordinate of center of object
vms_matrix orient ; // orientation of object in world
fix size ; // 3d size of object - for collision detection
fix shields ; // Starts at maximum, when <0, object dies..
vms_vector last_pos ; // where object was last frame
sbyte contains_type ; // Type of object this object contains (eg, spider contains powerup)
sbyte contains_id ; // ID of object this object contains (eg, id = blue type = key)
sbyte contains_count ; // number of objects of type:id this object contains
sbyte matcen_creator ; // Materialization center that created this object, high bit set if matcen-created
fix lifeleft ; // how long until goes away, or 7fff if immortal
// -- Removed, MK, 10/16/95, using lifeleft instead: int lightlevel;
// movement info, determined by MOVEMENT_TYPE
union {
physics_info phys_info ; // a physics object
vms_vector spin_rate ; // for spinning objects
2012-04-17 09:15:09 +00:00
} __pack__ mtype ;
2006-03-20 17:12:09 +00:00
// control info, determined by CONTROL_TYPE
union {
2012-11-02 17:13:04 +00:00
struct laser_info laser_info ;
struct explosion_info expl_info ; // NOTE: debris uses this also
struct light_info light_info ; // why put this here? Didn't know what else to do with it.
struct powerup_info powerup_info ;
2013-03-24 20:32:01 +00:00
struct ai_static ai_info ;
2013-03-23 19:09:44 +00:00
struct reactor_static reactor_info ;
2006-10-20 23:33:26 +00:00
} __pack__ ctype ;
2006-03-20 17:12:09 +00:00
// render info, determined by RENDER_TYPE
union {
2012-11-02 17:13:04 +00:00
struct polyobj_info pobj_info ; // polygon model
struct vclip_info vclip_info ; // vclip
2006-10-20 23:33:26 +00:00
} __pack__ rtype ;
2006-03-20 17:12:09 +00:00
# ifdef WORDS_NEED_ALIGNMENT
short pad2 ;
# endif
2013-03-24 20:32:01 +00:00
} ;
2006-03-20 17:12:09 +00:00
2010-12-22 00:17:59 +00:00
// Same as above but structure Savegames/Multiplayer objects expect
typedef struct object_rw {
int signature ; // Every object ever has a unique signature...
ubyte type ; // what type of object this is... robot, weapon, hostage, powerup, fireball
ubyte id ; // which form of object...which powerup, robot, etc.
# ifdef WORDS_NEED_ALIGNMENT
short pad ;
# endif
short next , prev ; // id of next and previous connected object in Objects, -1 = no connection
ubyte control_type ; // how this object is controlled
ubyte movement_type ; // how this object moves
ubyte render_type ; // how this object renders
ubyte flags ; // misc flags
short segnum ; // segment number containing object
short attached_obj ; // number of attached fireball object
vms_vector pos ; // absolute x,y,z coordinate of center of object
vms_matrix orient ; // orientation of object in world
fix size ; // 3d size of object - for collision detection
fix shields ; // Starts at maximum, when <0, object dies..
vms_vector last_pos ; // where object was last frame
sbyte contains_type ; // Type of object this object contains (eg, spider contains powerup)
sbyte contains_id ; // ID of object this object contains (eg, id = blue type = key)
sbyte contains_count ; // number of objects of type:id this object contains
sbyte matcen_creator ; // Materialization center that created this object, high bit set if matcen-created
fix lifeleft ; // how long until goes away, or 7fff if immortal
// -- Removed, MK, 10/16/95, using lifeleft instead: int lightlevel;
// movement info, determined by MOVEMENT_TYPE
union {
physics_info phys_info ; // a physics object
vms_vector spin_rate ; // for spinning objects
} __pack__ mtype ;
// control info, determined by CONTROL_TYPE
union {
laser_info_rw laser_info ;
explosion_info expl_info ; // NOTE: debris uses this also
ai_static_rw ai_info ;
2012-11-02 17:13:04 +00:00
struct light_info light_info ; // why put this here? Didn't know what else to do with it.
2010-12-22 00:17:59 +00:00
powerup_info_rw powerup_info ;
} __pack__ ctype ;
// render info, determined by RENDER_TYPE
union {
2011-04-12 01:02:51 +00:00
polyobj_info pobj_info ; // polygon model
2012-11-02 17:13:04 +00:00
struct vclip_info vclip_info ; // vclip
2012-04-17 09:15:09 +00:00
} __pack__ rtype ;
2010-12-22 00:17:59 +00:00
# ifdef WORDS_NEED_ALIGNMENT
short pad2 ;
# endif
} __pack__ object_rw ;
2013-03-24 20:32:01 +00:00
# endif
2010-12-22 00:17:59 +00:00
2006-03-20 17:12:09 +00:00
typedef struct obj_position {
vms_vector pos ; // absolute x,y,z coordinate of center of object
vms_matrix orient ; // orientation of object in world
short segnum ; // segment number containing object
} obj_position ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
typedef struct {
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2012-05-14 17:06:28 +00:00
fix64 time ;
2006-03-20 17:12:09 +00:00
object * viewer ;
int rear_view ;
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
int num_objects ;
short rendered_objects [ MAX_RENDERED_OBJECTS ] ;
} window_rendered_data ;
extern window_rendered_data Window_rendered_data [ MAX_RENDERED_WINDOWS ] ;
2013-03-24 20:32:01 +00:00
extern ubyte CollisionResult [ MAX_OBJECT_TYPES ] [ MAX_OBJECT_TYPES ] ;
// ie CollisionResult[a][b]== what happens to a when it collides with b
extern object Objects [ ] ;
# endif
2006-03-20 17:12:09 +00:00
/*
* VARIABLES
*/
extern int Object_next_signature ; // The next signature for the next newly created object
extern int Highest_object_index ; // highest objnum
2009-02-17 11:34:16 +00:00
extern int num_objects ;
2006-03-20 17:12:09 +00:00
extern char * robot_names [ ] ; // name of each robot
extern int Num_robot_types ;
extern object * ConsoleObject ; // pointer to the object that is the player
extern object * Viewer ; // which object we are seeing from
extern object * Dead_player_camera ;
extern object Follow ;
extern int Player_is_dead ; // !0 means player is dead!
extern int Player_exploded ;
2011-01-14 14:13:29 +00:00
extern int Player_eggs_dropped ;
2006-03-20 17:12:09 +00:00
extern int Death_sequence_aborted ;
extern int Player_fired_laser_this_frame ;
/*
* FUNCTIONS
*/
// do whatever setup needs to be done
void init_objects ( ) ;
// returns segment number object is in. Searches out from object's current
// seg, so this shouldn't be called if the object has "jumped" to a new seg
int obj_get_new_seg ( object * obj ) ;
// when an object has moved into a new segment, this function unlinks it
// from its old segment, and links it into the new segment
void obj_relink ( int objnum , int newsegnum ) ;
2012-04-17 09:15:09 +00:00
// for getting out of messed up linking situations (i.e. caused by demo playback)
void obj_relink_all ( void ) ;
2006-03-20 17:12:09 +00:00
// move an object from one segment to another. unlinks & relinks
void obj_set_new_seg ( int objnum , int newsegnum ) ;
// links an object into a segment's list of objects.
// takes object number and segment number
void obj_link ( int objnum , int segnum ) ;
// unlinks an object from a segment's list of objects
void obj_unlink ( int objnum ) ;
// initialize a new object. adds to the list for the given segment
// returns the object number
2013-06-08 22:24:17 +00:00
int obj_create ( enum object_type_t type , ubyte id , int segnum , const vms_vector * pos ,
const vms_matrix * orient , fix size ,
2006-03-20 17:12:09 +00:00
ubyte ctype , ubyte mtype , ubyte rtype ) ;
// make a copy of an object. returs num of new object
int obj_create_copy ( int objnum , vms_vector * new_pos , int newsegnum ) ;
// remove object from the world
void obj_delete ( int objnum ) ;
// called after load. Takes number of objects, and objects should be
// compressed
void reset_objects ( int n_objs ) ;
// make object array non-sparse
void compress_objects ( void ) ;
// Render an object. Calls one of several routines based on type
void render_object ( object * obj ) ;
// Draw a blob-type object, like a fireball
void draw_object_blob ( object * obj , bitmap_index bitmap ) ;
// draw an object that is a texture-mapped rod
void draw_object_tmap_rod ( object * obj , bitmap_index bitmap , int lighted ) ;
// Deletes all objects that have been marked for death.
void obj_delete_all_that_should_be_dead ( ) ;
// Toggles whether or not lock-boxes draw.
void object_toggle_lock_targets ( ) ;
// move all objects for the current frame
void object_move_all ( ) ; // moves all objects
// set viewer object to next object in array
void object_goto_next_viewer ( ) ;
// draw target boxes for nearby robots
void object_render_targets ( void ) ;
// move an object for the current frame
void object_move_one ( object * obj ) ;
// make object0 the player, setting all relevant fields
void init_player_object ( ) ;
// check if object is in object->segnum. if not, check the adjacent
// segs. if not any of these, returns false, else sets obj->segnum &
// returns true callers should really use find_vector_intersection()
// Note: this function is in gameseg.c
extern int update_object_seg ( struct object * obj ) ;
// Finds what segment *obj is in, returns segment number. If not in
// any segment, returns -1. Note: This function is defined in
// gameseg.h, but object.h depends on gameseg.h, and object.h is where
// object is defined...get it?
extern int find_object_seg ( object * obj ) ;
// go through all objects and make sure they have the correct segment
// numbers used when debugging is on
void fix_object_segs ( ) ;
// Drops objects contained in objp.
int object_create_egg ( object * objp ) ;
// Interface to object_create_egg, puts count objects of type type, id
// = id in objp and then drops them.
int call_object_create_egg ( object * objp , int count , int type , int id ) ;
extern void dead_player_end ( void ) ;
// Extract information from an object (objp->orient, objp->pos,
// objp->segnum), stuff in a shortpos structure. See typedef
// shortpos.
extern void create_shortpos ( shortpos * spp , object * objp , int swap_bytes ) ;
// Extract information from a shortpos, stuff in objp->orient
// (matrix), objp->pos, objp->segnum
extern void extract_shortpos ( object * objp , shortpos * spp , int swap_bytes ) ;
2012-05-21 15:06:50 +00:00
// create and extract quaternion structure from object data which greatly saves bytes by using quaternion instead or orientation matrix
void create_quaternionpos ( quaternionpos * qpp , object * objp , int swap_bytes ) ;
void extract_quaternionpos ( object * objp , quaternionpos * qpp , int swap_bytes ) ;
2006-03-20 17:12:09 +00:00
// delete objects, such as weapons & explosions, that shouldn't stay
// between levels if clear_all is set, clear even proximity bombs
void clear_transient_objects ( int clear_all ) ;
2010-01-28 15:26:27 +00:00
// Returns a new, unique signature for a new object
int obj_get_signature ( ) ;
2006-03-20 17:12:09 +00:00
// returns the number of a free object, updating Highest_object_index.
// Generally, obj_create() should be called to get an object, since it
// fills in important fields and does the linking. returns -1 if no
// free objects
int obj_allocate ( void ) ;
// frees up an object. Generally, obj_delete() should be called to
// get rid of an object. This function deallocates the object entry
// after the object has been unlinked
void obj_free ( int objnum ) ;
// after calling init_object(), the network code has grabbed specific
// object slots without allocating them. Go though the objects &
// build the free list, then set the apporpriate globals Don't call
// this function if you don't know what you're doing.
void special_reset_objects ( void ) ;
// attaches an object, such as a fireball, to another object, such as
// a robot
void obj_attach ( object * parent , object * sub ) ;
extern void create_small_fireball_on_object ( object * objp , fix size_scale , int sound_flag ) ;
2013-03-03 01:03:33 +00:00
# if defined(DXX_BUILD_DESCENT_II)
2006-03-20 17:12:09 +00:00
// returns object number
int drop_marker_object ( vms_vector * pos , int segnum , vms_matrix * orient , int marker_num ) ;
extern void wake_up_rendered_objects ( object * gmissp , int window_num ) ;
void reset_player_object ( void ) ;
2013-03-03 01:03:33 +00:00
# endif
2006-03-20 17:12:09 +00:00
2013-03-24 20:32:01 +00:00
extern void object_rw_swap ( struct object_rw * obj_rw , int swap ) ;
2009-10-05 02:51:37 +00:00
2006-03-20 17:12:09 +00:00
# endif