portable-izing file loading routines
[btb/d2x.git] / main / weapon.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 #ifndef _WEAPON_H
15 #define _WEAPON_H
16
17 #include "inferno.h"
18 #include "gr.h"
19 #include "game.h"
20 #include "piggy.h"
21 #include "cfile.h"
22
23 //weapon info flags
24 #define WIF_PLACABLE            1               //can be placed by level designer
25
26 typedef struct weapon_info {
27         byte    render_type;                            // How to draw 0=laser, 1=blob, 2=object
28         byte    persistent;                                     //      0 = dies when it hits something, 1 = continues (eg, fusion cannon)
29         short   model_num;                                      // Model num if rendertype==2.
30         short   model_num_inner;                        // Model num of inner part if rendertype==2.
31
32         byte    flash_vclip;                            // What vclip to use for muzzle flash
33         byte    robot_hit_vclip;                        // What vclip for impact with robot
34         short   flash_sound;                            // What sound to play when fired
35
36         byte    wall_hit_vclip;                 // What vclip for impact with wall
37         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.
38         short   robot_hit_sound;                        // What sound for impact with robot
39
40         byte    ammo_usage;                                     //      How many units of ammunition it uses.
41         byte    weapon_vclip;                           //      Vclip to render for the weapon, itself.
42         short   wall_hit_sound;                 // What sound for impact with wall
43
44         byte    destroyable;                            //      If !0, this weapon can be destroyed by another weapon.
45         byte    matter;                                         //      Flag: set if this object is matter (as opposed to energy)
46         byte    bounce;                                         //      1==always bounces, 2=bounces twice 
47         byte    homing_flag;                            //      Set if this weapon can home in on a target.
48
49         ubyte   speedvar;                                       //      allowed variance in speed below average, /128: 64 = 50% meaning if speed = 100, can be 50..100
50
51         ubyte   flags;                                          // see values above
52
53         byte    flash;                                          //      Flash effect
54         byte    afterburner_size;                       //      Size of blobs in F1_0/16 units, specify in bitmaps.tbl as floating point.  Player afterburner size = 2.5.
55
56 #ifndef SHAREWARE
57         byte    children;                                       //      ID of weapon to drop if this contains children.  -1 means no children.
58 #endif
59
60         fix     energy_usage;                           //      How much fuel is consumed to fire this weapon.
61         fix     fire_wait;                                      //      Time until this weapon can be fired again.
62
63 #ifndef SHAREWARE
64         fix     multi_damage_scale;             //      Scale damage by this amount when applying to player in multiplayer.  F1_0 means no change.
65 #endif
66
67         bitmap_index bitmap;                            // Pointer to bitmap if rendertype==0 or 1.
68
69         fix     blob_size;                                      // Size of blob if blob type
70         fix     flash_size;                                     // How big to draw the flash
71         fix     impact_size;                            // How big of an impact
72         fix     strength[NDL];                          // How much damage it can inflict
73         fix     speed[NDL];                                     // How fast it can move, difficulty level based.
74         fix     mass;                                                   // How much mass it has
75         fix     drag;                                                   // How much drag it has
76         fix     thrust;                                         //      How much thrust it has
77         fix     po_len_to_width_ratio;  // For polyobjects, the ratio of len/width. (10 maybe?)
78         fix     light;                                          //      Amount of light this weapon casts.
79         fix     lifetime;                                       //      Lifetime in seconds of this weapon.
80         fix     damage_radius;                          //      Radius of damage caused by weapon, used for missiles (not lasers) to apply to damage to things it did not hit
81 //-- 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
82 // 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
83         bitmap_index    picture;                                // a picture of the weapon for the cockpit
84 #ifndef SHAREWARE
85         bitmap_index    hires_picture;          // a hires picture of the above
86 #endif
87 } weapon_info;
88
89 #define REARM_TIME                                      (F1_0)
90
91 #define WEAPON_DEFAULT_LIFETIME (F1_0*12)       //      Lifetime of an object if a bozo forgets to define it.
92
93 #define WEAPON_TYPE_WEAK_LASER  0
94 #define WEAPON_TYPE_STRONG_LASER        1
95 #define WEAPON_TYPE_CANNON_BALL 2
96 #define WEAPON_TYPE_MISSILE             3
97
98 #define MAX_WEAPON_TYPES                        70
99
100 #define WEAPON_RENDER_NONE                      -1
101 #define WEAPON_RENDER_LASER             0
102 #define WEAPON_RENDER_BLOB                      1
103 #define WEAPON_RENDER_POLYMODEL 2
104 #define WEAPON_RENDER_VCLIP             3
105
106 #define MAX_PRIMARY_WEAPONS             10
107 #define MAX_SECONDARY_WEAPONS   10
108
109 //given a weapon index, return the flag value
110 #define  HAS_FLAG(index)  (1<<(index))
111
112 //      Weapon flags, if player->weapon_flags & WEAPON_FLAG is set, then the player has this weapon
113 #define HAS_LASER_FLAG                          HAS_FLAG(LASER_INDEX)
114 #define HAS_VULCAN_FLAG                 HAS_FLAG(VULCAN_INDEX)
115 #define HAS_SPREADFIRE_FLAG             HAS_FLAG(SPREADFIRE_INDEX)
116 #define HAS_PLASMA_FLAG                 HAS_FLAG(PLASMA_INDEX)
117 #define HAS_FUSION_FLAG                 HAS_FLAG(FUSION_INDEX)
118
119 #define HAS_CONCUSSION_FLAG             HAS_FLAG(CONCUSSION_INDEX)
120 #define HAS_HOMING_FLAG                 HAS_FLAG(HOMING_INDEX)
121 #define HAS_PROXIMITY_FLAG              HAS_FLAG(PROXIMITY_INDEX)
122 #define HAS_SMART_FLAG                          HAS_FLAG(SMART_INDEX)
123 #define HAS_MEGA_FLAG                           HAS_FLAG(MEGA_INDEX)
124
125 #define CLASS_PRIMARY                           0
126 #define CLASS_SECONDARY                 1
127
128 #define LASER_INDEX                                     0
129 #define VULCAN_INDEX                            1
130 #define SPREADFIRE_INDEX                        2
131 #define PLASMA_INDEX                            3
132 #define FUSION_INDEX                            4
133 #define SUPER_LASER_INDEX                       5
134 #define GAUSS_INDEX                                     6
135 #define HELIX_INDEX                                     7
136 #define PHOENIX_INDEX                           8
137 #define OMEGA_INDEX                                     9
138
139 #define CONCUSSION_INDEX                        0
140 #define HOMING_INDEX                            1
141 #define PROXIMITY_INDEX                 2
142 #define SMART_INDEX                                     3
143 #define MEGA_INDEX                                      4
144 #define SMISSILE1_INDEX                 5
145 #define GUIDED_INDEX                            6
146 #define SMART_MINE_INDEX                        7
147 #define SMISSILE4_INDEX                 8
148 #define SMISSILE5_INDEX                 9
149
150 #define SUPER_WEAPON                            5
151
152 #define VULCAN_AMMO_SCALE               0xcc163 //(0x198300/2)          //multiply ammo by this before displaying
153
154 #define NUM_SMART_CHILDREN      6               //      Number of smart children created by default.
155
156 extern weapon_info Weapon_info[];
157 extern int N_weapon_types;
158 extern void do_weapon_select(int weapon_num, int secondary_flag);
159 extern void show_weapon_status(void);
160
161 extern byte     Primary_weapon, Secondary_weapon;
162
163 extern ubyte Primary_weapon_to_weapon_info[MAX_PRIMARY_WEAPONS];
164 extern ubyte Secondary_weapon_to_weapon_info[MAX_SECONDARY_WEAPONS];
165
166 //for each Secondary weapon, which gun it fires out of
167 extern ubyte Secondary_weapon_to_gun_num[MAX_SECONDARY_WEAPONS];
168
169 //for each primary weapon, what kind of powerup gives weapon
170 extern ubyte Primary_weapon_to_powerup[MAX_SECONDARY_WEAPONS];
171
172 //for each Secondary weapon, what kind of powerup gives weapon
173 extern ubyte Secondary_weapon_to_powerup[MAX_SECONDARY_WEAPONS];
174
175 //flags whether the last time we use this weapon, it was the 'super' version
176 extern ubyte Primary_last_was_super[MAX_PRIMARY_WEAPONS];
177 extern ubyte Secondary_last_was_super[MAX_SECONDARY_WEAPONS];
178
179 extern void auto_select_weapon(int weapon_type);                //parm is primary or secondary
180 extern void select_weapon(int weapon_num, int secondary_flag, int print_message,int wait_for_rearm);
181
182 extern char     *Primary_weapon_names_short[];
183 extern char     *Secondary_weapon_names_short[];
184 extern char     *Primary_weapon_names[];
185 extern char     *Secondary_weapon_names[];
186 extern int      Primary_ammo_max[MAX_PRIMARY_WEAPONS];
187 extern ubyte    Secondary_ammo_max[MAX_SECONDARY_WEAPONS];
188 extern byte     Weapon_is_energy[MAX_WEAPON_TYPES];
189
190 #define HAS_WEAPON_FLAG 1
191 #define HAS_ENERGY_FLAG 2
192 #define HAS_AMMO_FLAG           4
193 #define  HAS_ALL (HAS_WEAPON_FLAG|HAS_ENERGY_FLAG|HAS_AMMO_FLAG)
194
195 //      ------------------------------------------------------------------------------------
196 //      Return:
197 // Bits set:
198 //              HAS_WEAPON_FLAG
199 //              HAS_ENERGY_FLAG
200 //              HAS_AMMO_FLAG   
201 //              HAS_SUPER_FLAG
202 extern int player_has_weapon(int weapon_num, int secondary_flag);
203
204 //called when one of these weapons is picked up
205 //when you pick up a secondary, you always get the weapon & ammo for it
206 int pick_up_secondary(int weapon_index,int count);
207
208 //called when a primary weapon is picked up
209 //returns true if actually picked up
210 int pick_up_primary(int weapon_index);
211
212 //called when ammo (for the vulcan cannon) is picked up
213 int pick_up_ammo(int class_flag,int weapon_index,int ammo_count);
214
215 extern int attempt_to_steal_item(object *objp, int player_num);
216
217 //this function is for when the player intentionally drops a powerup
218 extern int spit_powerup(object *spitter, int id, int seed);
219
220 #define SMEGA_ID        40
221
222 extern void rock_the_mine_frame(void);
223 extern void smega_rock_stuff(void);
224 extern void init_smega_detonates(void);
225 extern void tactile_set_button_jolt (void);
226
227 /*
228  * reads a weapon_info structure from a CFILE
229  */
230 extern void weapon_info_read(weapon_info *wi, CFILE *fp);
231
232 #endif