]> icculus.org git repositories - btb/d2x.git/blob - main/robot.h
use the orientation parameter of g3_draw_bitmap
[btb/d2x.git] / main / robot.h
1 /*
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.
12 */
13
14 /*
15  *
16  * Header for robot.c
17  *
18  */
19
20 #ifndef _ROBOT_H
21 #define _ROBOT_H
22
23 #include "vecmat.h"
24 #include "object.h"
25 #include "game.h"
26 #include "cfile.h"
27
28 #define MAX_GUNS 8      //should be multiple of 4 for ubyte array
29
30 //Animation states
31 #define AS_REST         0
32 #define AS_ALERT        1
33 #define AS_FIRE         2
34 #define AS_RECOIL       3
35 #define AS_FLINCH       4
36 #define N_ANIM_STATES   5
37
38 #define RI_CLOAKED_NEVER            0
39 #define RI_CLOAKED_ALWAYS           1
40 #define RI_CLOAKED_EXCEPT_FIRING    2
41
42 //describes the position of a certain joint
43 typedef struct jointpos {
44         short jointnum;
45         vms_angvec angles;
46 } __pack__ jointpos;
47
48 //describes a list of joint positions
49 typedef struct jointlist {
50         short n_joints;
51         short offset;
52 } jointlist;
53
54 //robot info flags
55 #define RIF_BIG_RADIUS  1   //pad the radius to fix robots firing through walls
56 #define RIF_THIEF       2   //this guy steals!
57
58 //  Robot information
59 typedef struct robot_info {
60         int     model_num;                  // which polygon model?
61         vms_vector  gun_points[MAX_GUNS];   // where each gun model is
62         ubyte   gun_submodels[MAX_GUNS];    // which submodel is each gun in?
63
64         short   exp1_vclip_num;
65         short   exp1_sound_num;
66
67         short   exp2_vclip_num;
68         short   exp2_sound_num;
69
70         sbyte   weapon_type;
71         sbyte   weapon_type2;   //  Secondary weapon number, -1 means none, otherwise gun #0 fires this weapon.
72         sbyte   n_guns;         // how many different gun positions
73         sbyte   contains_id;    //  ID of powerup this robot can contain.
74
75         sbyte   contains_count; //  Max number of things this instance can contain.
76         sbyte   contains_prob;  //  Probability that this instance will contain something in N/16
77         sbyte   contains_type;  //  Type of thing contained, robot or powerup, in bitmaps.tbl, !0=robot, 0=powerup
78         sbyte   kamikaze;       //  !0 means commits suicide when hits you, strength thereof. 0 means no.
79
80         short   score_value;    //  Score from this robot.
81         sbyte   badass;         //  Dies with badass explosion, and strength thereof, 0 means NO.
82         sbyte   energy_drain;   //  Points of energy drained at each collision.
83
84         fix     lighting;       // should this be here or with polygon model?
85         fix     strength;       // Initial shields of robot
86
87         fix     mass;           // how heavy is this thing?
88         fix     drag;           // how much drag does it have?
89
90         fix     field_of_view[NDL]; // compare this value with forward_vector.dot.vector_to_player, if field_of_view <, then robot can see player
91         fix     firing_wait[NDL];   //  time in seconds between shots
92         fix     firing_wait2[NDL];  //  time in seconds between shots
93         fix     turn_time[NDL];     // time in seconds to rotate 360 degrees in a dimension
94 // -- unused, mk, 05/25/95  fix fire_power[NDL];    //  damage done by a hit from this robot
95 // -- unused, mk, 05/25/95  fix shield[NDL];        //  shield strength of this robot
96         fix     max_speed[NDL];         //  maximum speed attainable by this robot
97         fix     circle_distance[NDL];   //  distance at which robot circles player
98
99         sbyte   rapidfire_count[NDL];   //  number of shots fired rapidly
100         sbyte   evade_speed[NDL];       //  rate at which robot can evade shots, 0=none, 4=very fast
101         sbyte   cloak_type;     //  0=never, 1=always, 2=except-when-firing
102         sbyte   attack_type;    //  0=firing, 1=charge (like green guy)
103
104         ubyte   see_sound;      //  sound robot makes when it first sees the player
105         ubyte   attack_sound;   //  sound robot makes when it attacks the player
106         ubyte   claw_sound;     //  sound robot makes as it claws you (attack_type should be 1)
107         ubyte   taunt_sound;    //  sound robot makes after you die
108
109         sbyte   boss_flag;      //  0 = not boss, 1 = boss.  Is that surprising?
110         sbyte   companion;      //  Companion robot, leads you to things.
111         sbyte   smart_blobs;    //  how many smart blobs are emitted when this guy dies!
112         sbyte   energy_blobs;   //  how many smart blobs are emitted when this guy gets hit by energy weapon!
113
114         sbyte   thief;          //  !0 means this guy can steal when he collides with you!
115         sbyte   pursuit;        //  !0 means pursues player after he goes around a corner.  4 = 4/2 pursue up to 4/2 seconds after becoming invisible if up to 4 segments away
116         sbyte   lightcast;      //  Amount of light cast. 1 is default.  10 is very large.
117         sbyte   death_roll;     //  0 = dies without death roll. !0 means does death roll, larger = faster and louder
118
119         //boss_flag, companion, thief, & pursuit probably should also be bits in the flags byte.
120         ubyte   flags;          // misc properties
121         ubyte   pad[3];         // alignment
122
123         ubyte   deathroll_sound;    // if has deathroll, what sound?
124         ubyte   glow;               // apply this light to robot itself. stored as 4:4 fixed-point
125         ubyte   behavior;           //  Default behavior.
126         ubyte   aim;                //  255 = perfect, less = more likely to miss.  0 != random, would look stupid.  0=45 degree spread.  Specify in bitmaps.tbl in range 0.0..1.0
127
128         //animation info
129         jointlist anim_states[MAX_GUNS+1][N_ANIM_STATES];
130
131         int     always_0xabcd;      // debugging
132
133 } __pack__ robot_info;
134
135
136 #define MAX_ROBOT_TYPES 85      // maximum number of robot types
137
138 #define ROBOT_NAME_LENGTH   16
139 extern char Robot_names[MAX_ROBOT_TYPES][ROBOT_NAME_LENGTH];
140
141 //the array of robots types
142 extern robot_info Robot_info[];     // Robot info for AI system, loaded from bitmaps.tbl.
143
144 //how many kinds of robots
145 extern  int N_robot_types;      // Number of robot types.  We used to assume this was the same as N_polygon_models.
146
147 //test data for one robot
148 #define MAX_ROBOT_JOINTS 1600
149 extern jointpos Robot_joints[MAX_ROBOT_JOINTS];
150 extern int  N_robot_joints;
151
152 //given an object and a gun number, return position in 3-space of gun
153 //fills in gun_point
154 void calc_gun_point(vms_vector *gun_point,object *obj,int gun_num);
155 //void calc_gun_point(vms_vector *gun_point,int objnum,int gun_num);
156
157 //  Tells joint positions for a gun to be in a specified state.
158 //  A gun can have associated with it any number of joints.  In order to tell whether a gun is a certain
159 //  state (such as FIRE or ALERT), you should call this function and check the returned joint positions
160 //  against the robot's gun's joint positions.  This function should also be called to determine how to
161 //  move a gun into a desired position.
162 //  For now (May 30, 1994), it is assumed that guns will linearly interpolate from one joint position to another.
163 //  There is no ordering of joint movement, so it's impossible to guarantee that a strange starting position won't
164 //  cause a gun to move through a robot's body, for example.
165
166 //  Given:
167 //      jp_list_ptr     pointer to list of joint angles, on exit, this is pointing at a static array
168 //      robot_type      type of robot for which to get joint information.  A particular type, not an instance of a robot.
169 //      gun_num         gun number.  If in 0..Robot_info[robot_type].n_guns-1, then it is a gun, else it refers to non-animating parts of robot.
170 //      state           state about which to get information.  Legal states in range 0..N_ANIM_STATES-1, defined in robot.h, are:
171 //                          AS_REST, AS_ALERT, AS_FIRE, AS_RECOIL, AS_FLINCH
172
173 //  On exit:
174 //      Returns number of joints in list.
175 //      jp_list_ptr is stuffed with a pointer to a static array of joint positions.  This pointer is valid forever.
176 extern int robot_get_anim_state(jointpos **jp_list_ptr,int robot_type,int gun_num,int state);
177
178 #ifdef FAST_FILE_IO
179 #define robot_info_read_n(ri, n, fp) cfread(ri, sizeof(robot_info), n, fp)
180 #define jointpos_read_n(jp, n, fp) cfread(jp, sizeof(jointpos), n, fp)
181 #else
182 /*
183  * reads n robot_info structs from a CFILE
184  */
185 extern int robot_info_read_n(robot_info *ri, int n, CFILE *fp);
186
187 /*
188  * reads n jointpos structs from a CFILE
189  */
190 extern int jointpos_read_n(jointpos *jp, int n, CFILE *fp);
191 #endif
192
193 #endif