1 /* $Id: weapon.h,v 1.4 2002-08-02 04:57:19 btb Exp $ */
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.
25 #define WIF_PLACABLE 1 //can be placed by level designer
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.
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
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
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
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.
50 ubyte speedvar; // allowed variance in speed below average, /128: 64 = 50% meaning if speed = 100, can be 50..100
52 ubyte flags; // see values above
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.
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.
60 bitmap_index bitmap; // Pointer to bitmap if rendertype==0 or 1.
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
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.
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
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
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
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.
102 ubyte speedvar; // allowed variance in speed below average, /128: 64 = 50% meaning if speed = 100, can be 50..100
104 ubyte flags; // see values above
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.
109 /* not present in shareware datafiles */
110 byte children; // ID of weapon to drop if this contains children. -1 means no children.
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.
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.
118 bitmap_index bitmap; // Pointer to bitmap if rendertype==0 or 1.
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;
139 #define REARM_TIME (F1_0)
141 #define WEAPON_DEFAULT_LIFETIME (F1_0*12) // Lifetime of an object if a bozo forgets to define it.
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
148 #define MAX_WEAPON_TYPES 70
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
156 #define MAX_PRIMARY_WEAPONS 10
157 #define MAX_SECONDARY_WEAPONS 10
159 //given a weapon index, return the flag value
160 #define HAS_FLAG(index) (1<<(index))
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)
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)
175 #define CLASS_PRIMARY 0
176 #define CLASS_SECONDARY 1
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
189 #define CONCUSSION_INDEX 0
190 #define HOMING_INDEX 1
191 #define PROXIMITY_INDEX 2
192 #define SMART_INDEX 3
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
200 #define SUPER_WEAPON 5
202 #define VULCAN_AMMO_SCALE 0xcc163 //(0x198300/2) //multiply ammo by this before displaying
204 #define NUM_SMART_CHILDREN 6 // Number of smart children created by default.
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);
211 extern byte Primary_weapon, Secondary_weapon;
213 extern ubyte Primary_weapon_to_weapon_info[MAX_PRIMARY_WEAPONS];
214 extern ubyte Secondary_weapon_to_weapon_info[MAX_SECONDARY_WEAPONS];
216 //for each Secondary weapon, which gun it fires out of
217 extern ubyte Secondary_weapon_to_gun_num[MAX_SECONDARY_WEAPONS];
219 //for each primary weapon, what kind of powerup gives weapon
220 extern ubyte Primary_weapon_to_powerup[MAX_SECONDARY_WEAPONS];
222 //for each Secondary weapon, what kind of powerup gives weapon
223 extern ubyte Secondary_weapon_to_powerup[MAX_SECONDARY_WEAPONS];
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];
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);
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];
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)
245 //-----------------------------------------------------------------------------
252 extern int player_has_weapon(int weapon_num, int secondary_flag);
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);
258 //called when a primary weapon is picked up
259 //returns true if actually picked up
260 int pick_up_primary(int weapon_index);
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);
265 extern int attempt_to_steal_item(object *objp, int player_num);
267 //this function is for when the player intentionally drops a powerup
268 extern int spit_powerup(object *spitter, int id, int seed);
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);
278 * reads n weapon_info structs from a CFILE
280 extern int weapon_info_read_n(weapon_info *wi, int n, CFILE *fp, int file_version);