whitespace
[btb/d2x.git] / main / weapon.h
1 /* $Id: weapon.h,v 1.4 2002-08-02 04:57:19 btb Exp $ */
2 /*
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
13 */
14
15 #ifndef _WEAPON_H
16 #define _WEAPON_H
17
18 #include "inferno.h"
19 #include "gr.h"
20 #include "game.h"
21 #include "piggy.h"
22 #include "cfile.h"
23
24 //weapon info flags
25 #define WIF_PLACABLE        1       //can be placed by level designer
26
27 typedef struct v2_weapon_info {
28         byte    render_type;        // How to draw 0=laser, 1=blob, 2=object
29         byte    persistent;         //  0 = dies when it hits something, 1 = continues (eg, fusion cannon)
30         short   model_num;          // Model num if rendertype==2.
31         short   model_num_inner;    // Model num of inner part if rendertype==2.
32
33         byte    flash_vclip;        // What vclip to use for muzzle flash
34         byte    robot_hit_vclip;    // What vclip for impact with robot
35         short   flash_sound;        // What sound to play when fired
36
37         byte    wall_hit_vclip;     // What vclip for impact with wall
38         byte    fire_count;         //  Number of bursts fired from EACH GUN per firing.  For weapons which fire from both sides, 3*fire_count shots will be fired.
39         short   robot_hit_sound;    // What sound for impact with robot
40
41         byte    ammo_usage;         //  How many units of ammunition it uses.
42         byte    weapon_vclip;       //  Vclip to render for the weapon, itself.
43         short   wall_hit_sound;     // What sound for impact with wall
44
45         byte    destroyable;        //  If !0, this weapon can be destroyed by another weapon.
46         byte    matter;             //  Flag: set if this object is matter (as opposed to energy)
47         byte    bounce;             //  1==always bounces, 2=bounces twice
48         byte    homing_flag;        //  Set if this weapon can home in on a target.
49
50         ubyte   speedvar;           //  allowed variance in speed below average, /128: 64 = 50% meaning if speed = 100, can be 50..100
51
52         ubyte   flags;              // see values above
53
54         byte    flash;              //  Flash effect
55         byte    afterburner_size;   //  Size of blobs in F1_0/16 units, specify in bitmaps.tbl as floating point.  Player afterburner size = 2.5.
56
57         fix energy_usage;           //  How much fuel is consumed to fire this weapon.
58         fix fire_wait;              //  Time until this weapon can be fired again.
59
60         bitmap_index bitmap;        // Pointer to bitmap if rendertype==0 or 1.
61
62         fix blob_size;              // Size of blob if blob type
63         fix flash_size;             // How big to draw the flash
64         fix impact_size;            // How big of an impact
65         fix strength[NDL];          // How much damage it can inflict
66         fix speed[NDL];             // How fast it can move, difficulty level based.
67         fix mass;                   // How much mass it has
68         fix drag;                   // How much drag it has
69         fix thrust;                 //  How much thrust it has
70         fix po_len_to_width_ratio;  // For polyobjects, the ratio of len/width. (10 maybe?)
71         fix light;                  //  Amount of light this weapon casts.
72         fix lifetime;               //  Lifetime in seconds of this weapon.
73         fix damage_radius;          //  Radius of damage caused by weapon, used for missiles (not lasers) to apply to damage to things it did not hit
74 //-- unused--   fix damage_force;           //  Force of damage caused by weapon, used for missiles (not lasers) to apply to damage to things it did not hit
75 // damage_force was a real mess.  Wasn't Difficulty_level based, and was being applied instead of weapon's actual strength.  Now use 2*strength instead. --MK, 01/19/95
76         bitmap_index    picture;    // a picture of the weapon for the cockpit
77 } v2_weapon_info;
78
79 typedef struct weapon_info {
80         byte    render_type;        // How to draw 0=laser, 1=blob, 2=object
81         byte    persistent;         //  0 = dies when it hits something, 1 = continues (eg, fusion cannon)
82         short   model_num;          // Model num if rendertype==2.
83         short   model_num_inner;    // Model num of inner part if rendertype==2.
84
85         byte    flash_vclip;        // What vclip to use for muzzle flash
86         byte    robot_hit_vclip;    // What vclip for impact with robot
87         short   flash_sound;        // What sound to play when fired
88
89         byte    wall_hit_vclip;     // What vclip for impact with wall
90         byte    fire_count;         //  Number of bursts fired from EACH GUN per firing.  For weapons which fire from both sides, 3*fire_count shots will be fired.
91         short   robot_hit_sound;    // What sound for impact with robot
92
93         byte    ammo_usage;         //  How many units of ammunition it uses.
94         byte    weapon_vclip;       //  Vclip to render for the weapon, itself.
95         short   wall_hit_sound;     // What sound for impact with wall
96
97         byte    destroyable;        //  If !0, this weapon can be destroyed by another weapon.
98         byte    matter;             //  Flag: set if this object is matter (as opposed to energy)
99         byte    bounce;             //  1==always bounces, 2=bounces twice
100         byte    homing_flag;        //  Set if this weapon can home in on a target.
101
102         ubyte   speedvar;           //  allowed variance in speed below average, /128: 64 = 50% meaning if speed = 100, can be 50..100
103
104         ubyte   flags;              // see values above
105
106         byte    flash;              //  Flash effect
107         byte    afterburner_size;   //  Size of blobs in F1_0/16 units, specify in bitmaps.tbl as floating point.  Player afterburner size = 2.5.
108
109         /* not present in shareware datafiles */
110         byte    children;           //  ID of weapon to drop if this contains children.  -1 means no children.
111
112         fix energy_usage;           //  How much fuel is consumed to fire this weapon.
113         fix fire_wait;              //  Time until this weapon can be fired again.
114
115         /* not present in shareware datafiles */
116         fix multi_damage_scale;     //  Scale damage by this amount when applying to player in multiplayer.  F1_0 means no change.
117
118         bitmap_index bitmap;        // Pointer to bitmap if rendertype==0 or 1.
119
120         fix blob_size;              // Size of blob if blob type
121         fix flash_size;             // How big to draw the flash
122         fix impact_size;            // How big of an impact
123         fix strength[NDL];          // How much damage it can inflict
124         fix speed[NDL];             // How fast it can move, difficulty level based.
125         fix mass;                   // How much mass it has
126         fix drag;                   // How much drag it has
127         fix thrust;                 //  How much thrust it has
128         fix po_len_to_width_ratio;  // For polyobjects, the ratio of len/width. (10 maybe?)
129         fix light;                  //  Amount of light this weapon casts.
130         fix lifetime;               //  Lifetime in seconds of this weapon.
131         fix damage_radius;          //  Radius of damage caused by weapon, used for missiles (not lasers) to apply to damage to things it did not hit
132 //-- unused--   fix damage_force;           //  Force of damage caused by weapon, used for missiles (not lasers) to apply to damage to things it did not hit
133 // damage_force was a real mess.  Wasn't Difficulty_level based, and was being applied instead of weapon's actual strength.  Now use 2*strength instead. --MK, 01/19/95
134         bitmap_index    picture;    // a picture of the weapon for the cockpit
135         /* not present in shareware datafiles */
136         bitmap_index    hires_picture;  // a hires picture of the above
137 } __pack__ weapon_info;
138
139 #define REARM_TIME                  (F1_0)
140
141 #define WEAPON_DEFAULT_LIFETIME     (F1_0*12)   //  Lifetime of an object if a bozo forgets to define it.
142
143 #define WEAPON_TYPE_WEAK_LASER      0
144 #define WEAPON_TYPE_STRONG_LASER    1
145 #define WEAPON_TYPE_CANNON_BALL     2
146 #define WEAPON_TYPE_MISSILE         3
147
148 #define MAX_WEAPON_TYPES            70
149
150 #define WEAPON_RENDER_NONE          -1
151 #define WEAPON_RENDER_LASER         0
152 #define WEAPON_RENDER_BLOB          1
153 #define WEAPON_RENDER_POLYMODEL     2
154 #define WEAPON_RENDER_VCLIP         3
155
156 #define MAX_PRIMARY_WEAPONS         10
157 #define MAX_SECONDARY_WEAPONS       10
158
159 //given a weapon index, return the flag value
160 #define  HAS_FLAG(index)  (1<<(index))
161
162 //  Weapon flags, if player->weapon_flags & WEAPON_FLAG is set, then the player has this weapon
163 #define HAS_LASER_FLAG      HAS_FLAG(LASER_INDEX)
164 #define HAS_VULCAN_FLAG     HAS_FLAG(VULCAN_INDEX)
165 #define HAS_SPREADFIRE_FLAG HAS_FLAG(SPREADFIRE_INDEX)
166 #define HAS_PLASMA_FLAG     HAS_FLAG(PLASMA_INDEX)
167 #define HAS_FUSION_FLAG     HAS_FLAG(FUSION_INDEX)
168
169 #define HAS_CONCUSSION_FLAG HAS_FLAG(CONCUSSION_INDEX)
170 #define HAS_HOMING_FLAG     HAS_FLAG(HOMING_INDEX)
171 #define HAS_PROXIMITY_FLAG  HAS_FLAG(PROXIMITY_INDEX)
172 #define HAS_SMART_FLAG      HAS_FLAG(SMART_INDEX)
173 #define HAS_MEGA_FLAG       HAS_FLAG(MEGA_INDEX)
174
175 #define CLASS_PRIMARY       0
176 #define CLASS_SECONDARY     1
177
178 #define LASER_INDEX         0
179 #define VULCAN_INDEX        1
180 #define SPREADFIRE_INDEX    2
181 #define PLASMA_INDEX        3
182 #define FUSION_INDEX        4
183 #define SUPER_LASER_INDEX   5
184 #define GAUSS_INDEX         6
185 #define HELIX_INDEX         7
186 #define PHOENIX_INDEX       8
187 #define OMEGA_INDEX         9
188
189 #define CONCUSSION_INDEX    0
190 #define HOMING_INDEX        1
191 #define PROXIMITY_INDEX     2
192 #define SMART_INDEX         3
193 #define MEGA_INDEX          4
194 #define SMISSILE1_INDEX     5
195 #define GUIDED_INDEX        6
196 #define SMART_MINE_INDEX    7
197 #define SMISSILE4_INDEX     8
198 #define SMISSILE5_INDEX     9
199
200 #define SUPER_WEAPON        5
201
202 #define VULCAN_AMMO_SCALE   0xcc163 //(0x198300/2)      //multiply ammo by this before displaying
203
204 #define NUM_SMART_CHILDREN  6   //  Number of smart children created by default.
205
206 extern weapon_info Weapon_info[];
207 extern int N_weapon_types;
208 extern void do_weapon_select(int weapon_num, int secondary_flag);
209 extern void show_weapon_status(void);
210
211 extern byte Primary_weapon, Secondary_weapon;
212
213 extern ubyte Primary_weapon_to_weapon_info[MAX_PRIMARY_WEAPONS];
214 extern ubyte Secondary_weapon_to_weapon_info[MAX_SECONDARY_WEAPONS];
215
216 //for each Secondary weapon, which gun it fires out of
217 extern ubyte Secondary_weapon_to_gun_num[MAX_SECONDARY_WEAPONS];
218
219 //for each primary weapon, what kind of powerup gives weapon
220 extern ubyte Primary_weapon_to_powerup[MAX_SECONDARY_WEAPONS];
221
222 //for each Secondary weapon, what kind of powerup gives weapon
223 extern ubyte Secondary_weapon_to_powerup[MAX_SECONDARY_WEAPONS];
224
225 //flags whether the last time we use this weapon, it was the 'super' version
226 extern ubyte Primary_last_was_super[MAX_PRIMARY_WEAPONS];
227 extern ubyte Secondary_last_was_super[MAX_SECONDARY_WEAPONS];
228
229 extern void auto_select_weapon(int weapon_type);        //parm is primary or secondary
230 extern void select_weapon(int weapon_num, int secondary_flag, int print_message,int wait_for_rearm);
231
232 extern char *Primary_weapon_names_short[];
233 extern char *Secondary_weapon_names_short[];
234 extern char *Primary_weapon_names[];
235 extern char *Secondary_weapon_names[];
236 extern int  Primary_ammo_max[MAX_PRIMARY_WEAPONS];
237 extern ubyte    Secondary_ammo_max[MAX_SECONDARY_WEAPONS];
238 extern byte Weapon_is_energy[MAX_WEAPON_TYPES];
239
240 #define HAS_WEAPON_FLAG 1
241 #define HAS_ENERGY_FLAG 2
242 #define HAS_AMMO_FLAG       4
243 #define  HAS_ALL (HAS_WEAPON_FLAG|HAS_ENERGY_FLAG|HAS_AMMO_FLAG)
244
245 //-----------------------------------------------------------------------------
246 //  Return:
247 // Bits set:
248 //      HAS_WEAPON_FLAG
249 //      HAS_ENERGY_FLAG
250 //      HAS_AMMO_FLAG
251 //      HAS_SUPER_FLAG
252 extern int player_has_weapon(int weapon_num, int secondary_flag);
253
254 //called when one of these weapons is picked up
255 //when you pick up a secondary, you always get the weapon & ammo for it
256 int pick_up_secondary(int weapon_index,int count);
257
258 //called when a primary weapon is picked up
259 //returns true if actually picked up
260 int pick_up_primary(int weapon_index);
261
262 //called when ammo (for the vulcan cannon) is picked up
263 int pick_up_ammo(int class_flag,int weapon_index,int ammo_count);
264
265 extern int attempt_to_steal_item(object *objp, int player_num);
266
267 //this function is for when the player intentionally drops a powerup
268 extern int spit_powerup(object *spitter, int id, int seed);
269
270 #define SMEGA_ID    40
271
272 extern void rock_the_mine_frame(void);
273 extern void smega_rock_stuff(void);
274 extern void init_smega_detonates(void);
275 extern void tactile_set_button_jolt (void);
276
277 /*
278  * reads n weapon_info structs from a CFILE
279  */
280 extern int weapon_info_read_n(weapon_info *wi, int n, CFILE *fp, int file_version);
281
282 #endif