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