123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- /*
- 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: f:/miner/source/main/rcs/object.h $
- * $Revision: 1.75 $
- * $Author: matt $
- * $Date: 1994/08/03 21:06:19 $
- *
- * object system definitions
- *
- * $Log: object.h $
- * Revision 1.75 1994/08/03 21:06:19 matt
- * Added prototype for fix_object_segs(), and renamed now-unused spawn_pos
- *
- * Revision 1.74 1994/08/02 12:30:27 matt
- * Added support for spinning objects
- *
- * Revision 1.73 1994/07/27 20:53:25 matt
- * Added rotational drag & thrust, so turning now has momemtum like moving
- *
- * Revision 1.72 1994/07/27 19:44:21 mike
- * Objects containing objects.
- *
- * Revision 1.71 1994/07/22 20:43:29 matt
- * Fixed flares, by adding a physics flag that makes them stick to walls.
- *
- * Revision 1.70 1994/07/21 12:42:10 mike
- * Prototype new find_object_seg and update_object_seg.
- *
- * Revision 1.69 1994/07/19 15:26:39 mike
- * New ai_static structure.
- *
- * Revision 1.68 1994/07/13 00:15:06 matt
- * Moved all (or nearly all) of the values that affect player movement to
- * bitmaps.tbl
- *
- * Revision 1.67 1994/07/12 12:40:12 matt
- * Revamped physics system
- *
- * Revision 1.66 1994/07/06 15:26:23 yuan
- * Added chase mode.
- *
- * Revision 1.65 1994/06/29 19:43:31 matt
- * Made powerup animation not happen in render routine
- *
- * Revision 1.64 1994/06/27 18:31:09 mike
- * Add flares.
- *
- * Revision 1.63 1994/06/14 21:15:21 matt
- * Made rod objects draw lighted or not depending on a parameter, so the
- * materialization effect no longer darkens.
- *
- * Revision 1.62 1994/06/14 16:55:00 matt
- * Got rid of physics_object speed field
- *
- * Revision 1.61 1994/06/09 16:24:58 matt
- * Fixed confusion with two constants, MAX_SUBOBJS & MAX_SUBMODELS, which
- * were used for the same things, but had different values.
- *
- * Revision 1.60 1994/06/08 10:56:44 matt
- * Improved debris: now get submodel size from new POF files; debris now has
- * limited life; debris can now be blown up.
- *
- * Revision 1.59 1994/06/02 19:30:49 matt
- * Moved texture-mapped rod drawing stuff (used for hostage & now for the
- * materialization center) to object.c
- *
- * Revision 1.58 1994/05/30 22:50:20 matt
- * Added morph effect for robots
- *
- * Revision 1.57 1994/05/30 19:46:47 mike
- * Move MAX_SUBOBJS from here to inferno.h
- *
- * Revision 1.56 1994/05/30 00:03:19 matt
- * Got rid of robot render type, and generally cleaned up polygon model
- * render objects.
- *
- * Revision 1.55 1994/05/26 21:08:44 matt
- * Moved robot stuff out of polygon model and into robot_info struct
- * Made new file, robot.c, to deal with robots
- *
- * Revision 1.54 1994/05/20 11:56:59 matt
- * Cleaned up find_vector_intersection() interface
- * Killed check_point_in_seg(), check_player_seg(), check_object_seg()
- *
- * Revision 1.53 1994/05/19 18:53:18 yuan
- * Changing player structure...
- *
- * Revision 1.52 1994/05/17 12:36:16 matt
- * Changed parms to obj_create() and cleaned up object creation code
- *
- * Revision 1.51 1994/05/17 11:53:45 yuan
- * Adding Player_init, which saves position of player at beginning of level.
- *
- * Revision 1.50 1994/05/17 10:37:08 matt
- * Added new parm to reset_objects(), made Num_objects not public, added
- * Highest_object_index().
- *
- * Revision 1.49 1994/05/16 16:48:14 yuan
- * Added symbolic constant OBJECT_INITIAL_SHIELDS
- *
- * Revision 1.48 1994/05/16 16:17:47 john
- * Bunch of stuff on my Inferno Task list May16-23
- *
- * Revision 1.47 1994/05/16 10:12:12 matt
- * Added prototype for init_player_object()
- *
- * Revision 1.46 1994/05/14 17:15:06 matt
- * Got rid of externs in source (non-header) files
- *
- * Revision 1.45 1994/05/13 20:27:37 john
- * Version II of John's new object code.
- *
- * Revision 1.44 1994/05/12 14:44:39 mike
- * Add ai_info to object structure.
- *
- * Revision 1.43 1994/05/11 23:33:08 mike
- * Make RESULT_KILLS directional with RESULT_KILLS_1_2 and RESULT_KILLS_2_1.
- *
- * Revision 1.42 1994/05/10 18:02:16 mike
- * Increase MAX_OBJECTS from 100 to 200
- *
- * Revision 1.41 1994/05/07 16:42:07 matt
- * Changed name of turnbank to turnroll
- *
- * Revision 1.40 1994/05/06 10:12:39 matt
- * Added new function, obj_create_copy()
- *
- * Revision 1.39 1994/05/05 20:39:33 matt
- * Made physics code more general-purpose; moved code from object.c to
- * physics.c; renamed routines; made behavior such as levelling and turn
- * banking controllable by flags.
- *
- * Revision 1.38 1994/05/05 16:41:12 matt
- * Cleaned up repair center code, and moved some from object.c to fuelcen.c
- *
- * Revision 1.37 1994/05/03 19:33:40 matt
- * Cleaned up usage of rotvel field from physics_info structure
- *
- * Revision 1.36 1994/05/02 18:34:14 matt
- * Changed parms to obj_link(), added a little more error checking, changed
- * a few fields in object physics_info, and probably a few other little things.
- *
- * Revision 1.35 1994/05/02 16:30:31 john
- * Added object flag OF_SHOULD_BE_DEAD which fixed the bug
- * that caused very close robots to die 10 seconds after they
- * actually got shot.
- *
- * Revision 1.34 1994/04/29 09:18:08 matt
- * Added support for multiple-piece explosions
- *
- * Revision 1.33 1994/04/07 16:28:07 yuan
- * Added SUPERPIG the robot with 200 hit points.
- * Now robots can take multiple hits before blowing up.
- *
- * Revision 1.32 1994/04/07 13:44:13 yuan
- * Added powerup_info to object structure.
- *
- * Revision 1.31 1994/04/01 13:34:15 matt
- * Cleaned up explosion and laser code; added mutliple-stage explosions.
- *
- * Revision 1.30 1994/04/01 11:15:07 yuan
- * Added multiple bitmap functionality to all objects...
- * (hostages, powerups, lasers, etc.)
- * Hostages and powerups are implemented in the object system,
- * just need to finish function call to "affect" player.
- *
- * Revision 1.29 1994/03/31 09:07:43 matt
- * Made last_pos a field of all objects, not just lasers
- *
- * Revision 1.28 1994/03/30 21:14:33 yuan
- * Minor name change for object->damage...
- * object->lifeleft now.
- *
- * Revision 1.27 1994/03/28 20:57:36 yuan
- * *** empty log message ***
- *
- * Revision 1.26 1994/03/25 17:30:13 yuan
- * Checking in hostage stuff... (start of it)
- *
- * Revision 1.25 1994/03/25 16:54:55 matt
- * polyobj_info field of object structure now has data for object animation
- *
- * Revision 1.24 1994/02/17 11:32:50 matt
- * Changes in object system
- *
- *
- *
- */
- #ifndef _OBJECT_H
- #define _OBJECT_H
- #include "types.h"
- #include "vecmat.h"
- #include "segment.h"
- #include "gameseg.h"
- #include "aistruct.h"
- #include "gr.h"
- /*
- * CONSTANTS
- */
- #define MAX_OBJECTS 200 //total number of objects in world
- //Object types
- #define OBJ_NONE 255 //unused object
- #define OBJ_WALL 0 //A wall... not really an object, but used for collisions
- #define OBJ_FIREBALL 1 //a fireball, part of an explosion
- #define OBJ_ROBOT 2 //an evil enemy
- #define OBJ_HOSTAGE 3 //a hostage you need to rescue
- #define OBJ_PLAYER 4 //the player on the console
- #define OBJ_WEAPON 5 //a laser, missile, etc
- #define OBJ_CAMERA 6 //a camera to slew around with
- #define OBJ_POWERUP 7 //a powerup you can pick up
- #define OBJ_DEBRIS 8 //a piece of robot
- #define OBJ_CNTRLCEN 9 //the control center
- #define OBJ_FLARE 10 //the control center
- #define MAX_OBJECT_TYPES 11
- //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_MULTIPLAYER 3 //via serial or network
- #define CT_FLYING 4 //the player is flying
- #define CT_SLEW 5 //slewing
- #define CT_FLYTHROUGH 6 //the flythrough system
- #define CT_DEMO 7 //recorded demo playing back
- //#define CT_ROBOT_FLYTHROUGH 8 //special flythrough for robots
- #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
- //Movement types
- #define MT_NONE 0 //doesn't move
- #define MT_PHYSICS 1 //moves by physics
- #define MT_MULTIPLAYER 2 //another player (maybe just interpolation?)
- #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
- //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.
- //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 1 //roll when turning
- #define PF_LEVELLING 2 //level object with closest side
- #define PF_BOUNCE 4 //bounce (not slide) when hit will
- #define PF_WIGGLE 8 //wiggle while flying
- #define PF_STICK 16 //object sticks (stops moving) when hits wall
- /*
- * STRUCTURES
- */
- //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
- } physics_info;
- //information on remotely-controlled object
- typedef struct mplayer_info {
- int dummy; //what will be here?
- } mplayer_info;
- //stuctures for different kinds of simulation
- typedef struct laser_info {
- fix lifeleft; // decreased by FrameTime each frame, if > 0 don't decrease.
- 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...
- vms_vector extra_vec1; // Used to draw the proper width of laser bolt. (Offset)
- } laser_info;
- typedef struct explosion_info {
- fix lifeleft; // decreased by FrameTime each frame, if > 0 don't decrease.
- vms_vector unused; // was spawn_pos
- fix spawn_time; // when lifeleft is < this, spawn another
- fix delete_time; // when to delete object
- short delete_objnum; // and what object to delete
- } explosion_info;
- typedef struct flythrough_info {
- vms_angvec angle_step; // Used in flythrough
- vms_vector heading; // Where we want to be heading...
- int ft_mode;
- } flythrough_info;
- typedef struct powerup_info {
- fix frametime;
- byte framenum;
- } powerup_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
- } polyobj_info;
- typedef struct object {
- int signature; // Every robot 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.
- 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
- segmasks segmasks; // does obj poke into other segs?
- 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
- byte contains_type; // Type of object this object contains (eg, spider contains powerup)
- byte contains_id; // ID of object this object contains (eg, id = blue type = key)
- byte contains_count; // number of objects of type:id this object contains
- byte dum1; // Unused.
- //movement info, determined by MOVEMENT_TYPE
- union {
- physics_info phys_info; //a physics object
- mplayer_info mplayer_info; //controled by remote player
- vms_vector spin_rate; //for spinning objects
- };
- //control info, determined by CONTROL_TYPE
- union {
- laser_info laser_info;
- explosion_info expl_info; //NOTE: debris uses this also
- ai_static ai_info;
- };
- //render info, determined by RENDER_TYPE
- union {
- polyobj_info pobj_info; //polygon model
- powerup_info powerup_info; //powerup (vclip)
- };
- } object;
- 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;
- /*
- * VARIABLES
- */
- extern int Object_next_signature; // The next signature for the next newly created object
- extern ubyte CollisionResult[MAX_OBJECT_TYPES][MAX_OBJECT_TYPES];
- // ie CollisionResult[a][b]== what happens to a when it collides with b
- extern int Player_objnum;
- extern object Objects[];
- extern int Highest_object_index; //highest objnum
- extern int num_objects; //not really a public, included for
- extern grs_bitmap *robot_bms[]; //all bitmaps for all robots
- extern int robot_bm_nums[]; //starting bitmap num for each robot
- extern int robot_n_bitmaps[]; //how many bitmaps for each robot
- extern char *robot_names[]; //name of each robot
- extern int Num_robot_types;
- extern short free_obj_list[MAX_OBJECTS];
- extern object *Player; //pointer to the object that is the player
- extern object *Viewer; //which object we are seeing from
- extern object Follow;
- extern obj_position Player_init;
- /*
- * 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(short objnum,int newsegnum);
- //move an object from one segment to another. unlinks & relinks
- void obj_set_new_seg(short 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
- short obj_create(ubyte type,ubyte id,short segnum,vms_vector *pos,
- vms_matrix *orient,fix size,ubyte ctype,ubyte mtype,ubyte rtype);
- //make a copy of an object. returs num of new object
- short obj_create_copy(int objnum, vms_vector *new_pos, int newsegnum);
- //remove object from the world
- void obj_delete(short 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,grs_bitmap *bitmap);
- //draw an object that is a texture-mapped rod
- void draw_object_tmap_rod(object *obj,grs_bitmap *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
- 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 );
- // Calls find_object_seg and relinks object if segment has changed.
- extern int update_object_seg(object * obj );
- //go through all objects and make sure they have the correct segment numbers
- //used when debugging is on
- fix_object_segs();
- #endif
|