1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661
|
/*
* Copyright (C) Volition, Inc. 1999. All rights reserved.
*
* All source code herein is the property of Volition, Inc. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#ifndef _WEAPON_H
#define _WEAPON_H
#include "globalincs/systemvars.h"
#include "graphics/2d.h"
#include "globalincs/globals.h"
#include "weapon/trails.h"
#include "weapon/shockwave.h"
#include "graphics/generic.h"
#include "model/model.h"
struct object;
struct ship_subsys;
#define WP_UNUSED -1
#define WP_LASER 0 // PLEASE NOTE that this flag specifies ballistic primaries as well - Goober5000
#define WP_MISSILE 1
#define WP_BEAM 2
extern char *Weapon_subtype_names[];
extern int Num_weapon_subtypes;
#define WRT_NONE -1
#define WRT_LASER 1
#define WRT_POF 2
// Bitflags controlling weapon behavior
#define MAX_WEAPON_FLAGS 18 // Maximum number of different bit flags legal to specify in a single weapons.tbl Flags line
#define WIF_DEFAULT_VALUE 0
#define WIF2_DEFAULT_VALUE 0
#define WIF3_DEFAULT_VALUE 0
#define WIF_HOMING_HEAT (1 << 0) // if set, this weapon homes via seeking heat
#define WIF_HOMING_ASPECT (1 << 1) // if set, this weapon homes via chasing aspect
#define WIF_ELECTRONICS (1 << 2) // Takes out electronics systems.
#define WIF_SPAWN (1 << 3) // Spawns projectiles on detonation.
#define WIF_REMOTE (1 << 4) // Can be remotely detonated by parent.
#define WIF_PUNCTURE (1 << 5) // Punctures armor, damaging subsystems.
#define WIF_SUPERCAP (1 << 6) // This is a weapon which does supercap class damage (meaning, it applies real damage to supercap ships)
#define WIF_CMEASURE (1 << 7) // Weapon acts as a countermeasure
//#define WIF_AREA_EFFECT (1 << 7) // Explosion has an area effect
//#define WIF_SHOCKWAVE (1 << 8) // Explosion has a shockwave
//WMC - These are no longer needed so these spots are free
#define WIF_HOMING_JAVELIN (1 << 8) // WC Saga Javelin HS style heatseeker, locks only on target's engines
#define WIF_TURNS (1 << 9) // Set this if the weapon ever changes heading. If you
// don't set this and the weapon turns, collision detection
// won't work, I promise!
#define WIF_SWARM (1 << 10) // Missile "swarms".. ie changes heading and twists on way to target
#define WIF_TRAIL (1 << 11) // Has a trail
#define WIF_BIG_ONLY (1 << 12) // Only big ships (cruiser, capital, etc.) can arm this weapon
#define WIF_CHILD (1 << 13) // No ship can have this weapon. It gets created by weapon detonations.
#define WIF_BOMB (1 << 14) // Bomb-type missile, can be targeted
#define WIF_HUGE (1 << 15) // Huge damage (generally 500+), probably only fired at huge ships.
#define WIF_NO_DUMBFIRE (1 << 16) // Missile cannot be fired dumbfire (ie requires aspect lock)
#define WIF_THRUSTER (1 << 17) // Has thruster cone and/or glow
#define WIF_IN_TECH_DATABASE (1 << 18)
#define WIF_PLAYER_ALLOWED (1 << 19) // allowed to be on starting wing ships/in weaponry pool
#define WIF_BOMBER_PLUS (1 << 20) // Fire this missile only at a bomber or big ship. But not a fighter.
#define WIF_CORKSCREW (1 << 21) // corkscrew style missile
#define WIF_PARTICLE_SPEW (1 << 22) // spews particles as it travels
#define WIF_EMP (1 << 23) // weapon explodes with a serious EMP effect
#define WIF_ENERGY_SUCK (1 << 24) // energy suck primary (impact effect)
#define WIF_FLAK (1 << 25) // use for big-ship turrets - flak gun
#define WIF_BEAM (1 << 26) // if this is a beam weapon : NOTE - VERY SPECIAL CASE
#define WIF_TAG (1 << 27) // this weapon has a tag effect when it hits
#define WIF_SHUDDER (1 << 28) // causes the weapon to shudder. shudder is proportional to the mass and damage of the weapon
#define WIF_MFLASH (1 << 29) // has muzzle flash
#define WIF_LOCKARM (1 << 30) // if the missile was fired without a lock, it does significanlty less damage on impact
#define WIF_STREAM (1 << 31) // handled by "trigger down/trigger up" instead of "fire - wait - fire - wait"
#define WIF2_BALLISTIC (1 << 0) // ballistic primaries - Goober5000
#define WIF2_PIERCE_SHIELDS (1 << 1) // shield pierceing -Bobboau
#define WIF2_DEFAULT_IN_TECH_DATABASE (1 << 2) // default in tech database - Goober5000
#define WIF2_LOCAL_SSM (1 << 3) // localized ssm. ship that fires ssm is in mission. ssms also warp back in during mission
#define WIF2_TAGGED_ONLY (1 << 4) // can only fire if target is tagged
#define WIF2_CYCLE (1 << 5) // will only fire from (shots (defalts to 1)) points at a time
#define WIF2_SMALL_ONLY (1 << 6) // can only be used against small ships like fighters or bombers
#define WIF2_SAME_TURRET_COOLDOWN (1 << 7) // the weapon has the same cooldown time on turrets
#define WIF2_MR_NO_LIGHTING (1 << 8) // don't render with lighting, regardless of user options
#define WIF2_TRANSPARENT (1 << 9) // render as transparent
#define WIF2_TRAINING (1 << 10) // Weapon does shield/hull damage, but doesn't hurt subsystems, whack you, or put marks on your ship.
#define WIF2_SMART_SPAWN (1 << 11) // Spawn weapon that is fired via turrets like normal weapons
#define WIF2_INHERIT_PARENT_TARGET (1 << 12) // child weapons home in on the target their parent is homing on.
#define WIF2_NO_EMP_KILL (1 << 13) // though weapon has hitpoints it can not be disabled by EMP
#define WIF2_VARIABLE_LEAD_HOMING (1 << 14) // allows user defined scaler to be added to lead (to enable, lead, pure or lag pursuit for missiles)
#define WIF2_UNTARGETED_HEAT_SEEKER (1 << 15) // forces heat seeker to lose target immeadiately (and acquire a random new one)
#define WIF2_HARD_TARGET_BOMB (1 << 16) // removes the radius doubling effect bombs have for collisions
#define WIF2_NON_SUBSYS_HOMING (1 << 17) // spreads fired missiles around the target ships hull
#define WIF2_NO_LIFE_LOST_IF_MISSED (1 << 18) // prevents game from shortening the lifeleft of the missed but still homing missiles
#define WIF2_CUSTOM_SEEKER_STR (1 << 19) // sets the game to use custom seeker strengths instead of default values
#define WIF2_CAN_BE_TARGETED (1 << 20) // allows non-bomb weapons to be targeted
#define WIF2_SHOWN_ON_RADAR (1 << 21) // allows non-bombs be visible on radar
#define WIF2_SHOW_FRIENDLY (1 << 22) // allows friendly weapon radar dots be drawn
#define WIF2_CAPITAL_PLUS (1 << 23) // AI will not use this weapon on fighters or bombers
#define WIF2_EXTERNAL_WEAPON_FP (1 << 24) // will try to use external models FPs if possible
#define WIF2_EXTERNAL_WEAPON_LNCH (1 << 25) // render external secondary as a launcher
#define WIF2_TAKES_BLAST_DAMAGE (1 << 26) // This weapon can take blast damage
#define WIF2_TAKES_SHOCKWAVE_DAMAGE (1 << 27) // This weapon can take shockwave damage
#define WIF2_DONT_SHOW_ON_RADAR (1 << 28) // Force a weapon to not show on radar
#define WIF2_RENDER_FLAK (1 << 29) // Even though this is a flak weapon, render the shell
#define WIF2_CIWS (1 << 30) // This weapons' burst and shockwave damage can damage bombs (Basically, a reverse for TAKES_BLAST/SHOCKWAVE_DAMAGE
#define WIF2_ANTISUBSYSBEAM (1 << 31) // This beam can target subsystems as per normal
#define WIF3_NOLINK (1 << 0) // This weapon can not be linked with others
#define WIF3_USE_EMP_TIME_FOR_CAPSHIP_TURRETS (1 << 1) // override MAX_TURRET_DISRUPT_TIME in emp.cpp - Goober5000
#define WIF_HOMING (WIF_HOMING_HEAT | WIF_HOMING_ASPECT | WIF_HOMING_JAVELIN)
#define WIF_LOCKED_HOMING (WIF_HOMING_ASPECT | WIF_HOMING_JAVELIN)
#define WIF_HURTS_BIG_SHIPS (WIF_BOMB | WIF_BEAM | WIF_HUGE | WIF_BIG_ONLY)
#define WEAPON_EXHAUST_DELTA_TIME 75 // Delay in milliseconds between exhaust blobs
#define WF_LOCK_WARNING_PLAYED (1<<0) // set when a lock warning sound is played for the player
// (needed since we don't want to play multiple lock sounds)
#define WF_ALREADY_APPLIED_STATS (1<<1) // for use in ship_apply_local and ship_apply_global damage functions
// so that we don't record multiple hits (stats) for one impact
#define WF_PLAYED_FLYBY_SOUND (1<<2) // flyby sound has been played for this weapon
#define WF_CONSIDER_FOR_FLYBY_SOUND (1<<3) // consider for flyby
#define WF_DEAD_IN_WATER (1<<4) // a missiles engines have died
#define WF_LOCKED_WHEN_FIRED (1<<5) // fired with a lock
#define WF_DESTROYED_BY_WEAPON (1<<6) // destroyed by damage from other weapon
#define WF_SPAWNED (1<<7) //Spawned from a spawning type weapon
#define WF_HOMING_UPDATE_NEEDED (1<<8) // this is a newly spawned homing weapon which needs to update client machines
// flags for setting burst fire
#define WBF_FAST_FIRING (1<<0) // burst is to use only the firewait to determine firing delays
#define WBF_RANDOM_LENGTH (1<<1) // burst is to fire random length bursts
//particle names go here -nuke
#define PSPEW_NONE -1 //used to disable a spew, useful for xmts
#define PSPEW_DEFAULT 0 //std fs2 pspew
#define PSPEW_HELIX 1 //q2 style railgun trail
#define PSPEW_SPARKLER 2 //random particles in every direction, can be sperical or ovoid
#define PSPEW_RING 3 //outward expanding ring
#define PSPEW_PLUME 4 //spewers arrayed within a radius for thruster style effects, may converge or scatter
#define MAX_PARTICLE_SPEWERS 4 //i figure 4 spewers should be enough for now -nuke
#define MAX_WEP_DAMAGE_SLOTS 32 //Maximum number of ships which can be counted as killer or assits on destroying this weapon
typedef struct weapon {
int weapon_info_index; // index into weapon_info array
int objnum; // object number for this weapon
int team; // The team of the ship that fired this
int species; // The species of the ship that fired thisz
float lifeleft; // life left on this weapon
vec3d start_pos;
int target_num; // Object index of target
int target_sig; // So we know if the target is the same one we've been tracking
float nearest_dist; // nearest distance yet attained to target
fix creation_time; // time at which created, stuffed Missiontime
int weapon_flags; // bit flags defining behavior, see WF_xxxx
object* homing_object; // object this weapon is homing on.
ship_subsys* homing_subsys; // subsystem this weapon is homing on
vec3d homing_pos; // world position missile is homing on
short swarm_index; // index into swarm missile info, -1 if not WIF_SWARM
int missile_list_index; // index for missiles into Missile_obj_list, -1 weapon not missile
trail *trail_ptr; // NULL if no trail, otherwise a pointer to its trail
ship_subsys *turret_subsys; // points to turret that fired weapon, otherwise NULL
int group_id; // Which group this is in.
float det_range; //How far from start_pos it blows up
// Stuff for thruster glows
int thruster_bitmap; // What frame the current thruster bitmap is at for this weapon
float thruster_frame; // Used to keep track of which frame the animation should be on.
int thruster_glow_bitmap; // What frame the current thruster engine glow bitmap is at for this weapon
float thruster_glow_frame; // Used to keep track of which frame the engine glow animation should be on.
float thruster_glow_noise; // Noise for current frame
// laser stuff
float laser_bitmap_frame; // used to keep track of which frame the animation should be on
float laser_glow_bitmap_frame; // used to keep track of which frame the glow animation should be on
int pick_big_attack_point_timestamp; // Timestamp at which to pick a new point to attack.
vec3d big_attack_point; // Target-relative location of attack point.
int cmeasure_ignore_objnum; // Ignoring this countermeasure. It's failed to attract this weapon.
int cmeasure_chase_objnum; // Chasing this countermeasure. Don't maybe ignore in future.
// corkscrew info (taken out for now)
short cscrew_index; // corkscrew info index
// particle spew info
int particle_spew_time[MAX_PARTICLE_SPEWERS]; // time to spew next bunch of particles
float particle_spew_rand; // per weapon randomness value used by some particle spew types -nuke
// flak info
short flak_index; // flak info index
//local ssm stuff
fix lssm_warpout_time; //time at which the missile warps out
fix lssm_warpin_time; //time at which the missile warps back in
int lssm_stage; //what stage its in 1=just launched, 2=warping out. 3=warped out, 4=warping back in, 5=terminal dive
int lssm_warp_idx; //warphole index
float lssm_warp_time; //length of time warphole stays open
float lssm_warp_pct; //how much of the warphole's life should be dedicated to stage 2
vec3d lssm_target_pos;
// weapon transparency info
ubyte alpha_backward; // 1 = move in reverse (ascending in value)
float alpha_current; // the current alpha value
float weapon_max_vel; // might just as well store the data here
bool collisionOccured;
mc_info collisionInfo; // The last collision of this weapon or NULL if it had none
//Scoring stuff
float total_damage_received; // total damage received (for scoring purposes)
float damage_ship[MAX_WEP_DAMAGE_SLOTS]; // damage applied from each player
int damage_ship_id[MAX_WEP_DAMAGE_SLOTS]; // signature of the damager (corresponds to each entry in damage_ship)
int hud_in_flight_snd_sig; // Signature of the sound played while the weapon is in flight
} weapon;
// info specific to beam weapons
typedef struct beam_weapon_section_info {
float width; // width of the section
float flicker; // how much it flickers (0.0 to 1.0)
float z_add; // is this necessary?
float tile_factor; // texture tile factor -Bobboau
int tile_type; // is this beam tiled by it's length, or not
float translation; // makes the beam texture move -Bobboau
generic_anim texture; // texture anim/bitmap
} beam_weapon_section_info;
typedef struct beam_weapon_info {
int beam_type; // beam type
float beam_life; // how long it lasts
int beam_warmup; // how long it takes to warmup (in ms)
int beam_warmdown; // how long it takes to warmdown (in ms)
float beam_muzzle_radius; // muzzle glow radius
int beam_particle_count; // beam spew particle count
float beam_particle_radius; // radius of beam particles
float beam_particle_angle; // angle of beam particle spew cone
generic_anim beam_particle_ani; // particle_ani
float beam_iff_miss_factor[MAX_IFFS][NUM_SKILL_LEVELS]; // magic # which makes beams miss more. by parent iff and player skill level
int beam_loop_sound; // looping beam sound
int beam_warmup_sound; // warmup sound
int beam_warmdown_sound; // warmdown sound
int beam_num_sections; // the # of visible "sections" on the beam
generic_anim beam_glow; // muzzle glow bitmap
int beam_shots; // # of shots the beam takes
float beam_shrink_factor; // what percentage of total beam lifetime when the beam starts shrinking
float beam_shrink_pct; // what percent/second the beam shrinks at
beam_weapon_section_info sections[MAX_BEAM_SECTIONS]; // info on the visible sections of the beam
float range; // how far it will shoot-Bobboau
float damage_threshold; // point at wich damage will start being atenuated from 0.0 to 1.0
float beam_width; // width of the beam (for certain collision checks)
} beam_weapon_info;
typedef struct particle_spew_info { //this will be used for multi spews
// particle spew stuff
int particle_spew_type; //added pspew type field -nuke
int particle_spew_count;
int particle_spew_time;
float particle_spew_vel;
float particle_spew_radius;
float particle_spew_lifetime;
float particle_spew_scale;
float particle_spew_z_scale; //length value for some effects -nuke
float particle_spew_rotation_rate; //rotation rate for some particle effects -nuke
vec3d particle_spew_offset; //offsets and normals, yay!
vec3d particle_spew_velocity;
generic_anim particle_spew_anim;
} particle_spew_info;
typedef struct spawn_weapon_info
{
short spawn_type; // Type of weapon to spawn when detonated.
short spawn_count; // Number of weapons of spawn_type to spawn.
float spawn_angle; // Angle to spawn the child weapons in. default is 180
} spawn_weapon_info;
#define MAX_SPAWN_TYPES_PER_WEAPON 5
// use this to extend a beam to "infinity"
#define BEAM_FAR_LENGTH 30000.0f
extern weapon Weapons[MAX_WEAPONS];
#define WEAPON_TITLE_LEN 48
enum InFlightSoundType
{
TARGETED,
UNTARGETED,
ALWAYS
};
typedef struct weapon_info {
char name[NAME_LENGTH]; // name of this weapon
char alt_name[NAME_LENGTH]; // alt name of this weapon
char title[WEAPON_TITLE_LEN]; // official title of weapon (used by tooltips)
char *desc; // weapon's description (used by tooltips)
int subtype; // one of the WP_* macros above
int render_type; // rendering method, laser, pof, avi
char pofbitmap_name[MAX_FILENAME_LEN]; // Name of the pof representing this if POF, or bitmap filename if bitmap
int model_num; // modelnum of weapon -- -1 if no model
char external_model_name[MAX_FILENAME_LEN]; //the model rendered on the weapon points of a ship
int external_model_num; //the model rendered on the weapon points of a ship
int hud_target_lod; // LOD to use when rendering weapon model to the hud targetbox
int num_detail_levels; // number of LODs defined in table (optional)
int detail_distance[MAX_MODEL_DETAIL_LEVELS]; // LOD distances define in table (optional)
char *tech_desc; // weapon's description (in tech database)
char tech_anim_filename[MAX_FILENAME_LEN]; // weapon's tech room animation
char tech_title[NAME_LENGTH]; // weapon's name (in tech database)
char tech_model[MAX_FILENAME_LEN]; //Image to display in the techroom (TODO) or the weapon selection screen if the ANI isn't specified/missing
vec3d closeup_pos; // position for camera to set an offset for viewing the weapon model
float closeup_zoom; // zoom when using weapon model in closeup view in loadout selection
char hud_filename[MAX_FILENAME_LEN]; //Name of image to display on HUD in place of text
int hud_image_index; //teh index of the image
generic_anim laser_bitmap; // bitmap for a laser
generic_anim laser_glow_bitmap; // optional laser glow bitmap
float laser_length;
color laser_color_1; // for cycling between glow colors
color laser_color_2; // for cycling between glow colors
float laser_head_radius, laser_tail_radius;
float max_speed; // initial speed of the weapon
float free_flight_time;
float mass; // mass of the weapon
float fire_wait; // fire rate -- amount of time before you can refire the weapon
float damage; // damage of weapon (for missile, damage within inner radius)
shockwave_create_info shockwave;
shockwave_create_info dinky_shockwave;
fix arm_time;
float arm_dist;
float arm_radius;
float det_range;
float det_radius; //How far from target or target subsystem it blows up
float flak_detonation_accuracy; //How far away from a target a flak shell will blow up. Standard is 65.0f
float flak_targeting_accuracy; //Determines the amount of jitter applied to flak targeting. USE WITH CAUTION!
float untargeted_flak_range_penalty; //Untargeted flak shells detonate after travelling max range - this parameter. Default 20.0f
float armor_factor, shield_factor, subsystem_factor; // in 0.0..2.0, scale of damage done to type of thing
float life_min;
float life_max;
float max_lifetime ; // How long this weapon will actually live for
float lifetime; // How long the AI thinks this thing lives (used for distance calculations etc)
float energy_consumed; // Energy used up when weapon is fired
int wi_flags; // bit flags defining behavior, see WIF_xxxx
int wi_flags2; // stupid int wi_flags, only 32 bits... argh - Goober5000
int wi_flags3; // stupid int wi_flags2, only 32 bits... argh - The E
float turn_time;
float cargo_size; // cargo space taken up by individual weapon (missiles only)
float rearm_rate; // rate per second at which secondary weapons are loaded during rearming
float weapon_range; // max range weapon can be effectively fired. (May be less than life * speed)
// spawn weapons
int num_spawn_weapons_defined;
int total_children_spawned;
spawn_weapon_info spawn_info[MAX_SPAWN_TYPES_PER_WEAPON];
// swarm count
short swarm_count; // how many swarm missiles are fired for this weapon
// Specific to ASPECT homing missiles.
float min_lock_time; // minimum time (in seconds) to achieve lock
int lock_pixels_per_sec; // pixels/sec moved while locking
int catchup_pixels_per_sec; // pixels/sec moved while catching-up for a lock
int catchup_pixel_penalty; // number of extra pixels to move while locking as a penalty for catching up for a lock
// Specific to HEAT homing missiles.
float fov;
// Seeker strength - for countermeasures overhaul.
float seeker_strength;
int pre_launch_snd;
int pre_launch_snd_min_interval; //Minimum interval in ms between the last time the pre-launch sound was played and the next time it can play, as a limiter in case the player is pumping the trigger
int launch_snd;
int impact_snd;
int disarmed_impact_snd;
int flyby_snd; // whizz-by sound, transmitted through weapon's portable atmosphere.
// Specific to weapons with TRAILS:
trail_info tr_info;
char icon_filename[MAX_FILENAME_LEN]; // filename for icon that is displayed in weapon selection
char anim_filename[MAX_FILENAME_LEN]; // filename for animation that plays in weapon selection
int selection_effect;
int impact_weapon_expl_index; // Index into Weapon_expl_info of which ANI should play when this thing impacts something
float impact_explosion_radius; // How big the explosion should be
int dinky_impact_weapon_expl_index;
float dinky_impact_explosion_radius;
int flash_impact_weapon_expl_index;
float flash_impact_explosion_radius;
int piercing_impact_weapon_expl_index;
float piercing_impact_explosion_radius;
int piercing_impact_particle_count;
float piercing_impact_particle_life;
float piercing_impact_particle_velocity;
float piercing_impact_particle_back_velocity;
float piercing_impact_particle_variance;
// EMP effect
float emp_intensity; // intensity of the EMP effect
float emp_time; // time of the EMP effect
// Energy suck effect
float weapon_reduce; // how much energy removed from weapons systems
float afterburner_reduce; // how much energy removed from weapons systems
// Beam weapon effect
beam_weapon_info b_info; // this must be valid if the weapon is a beam weapon WIF_BEAM or WIF_BEAM_SMALL
// tag stuff
float tag_time; // how long the tag lasts
int tag_level; // tag level (1 - 3)
// muzzle flash
int muzzle_flash; // muzzle flash stuff
// SSM
int SSM_index; // wich entry in the SSM,tbl it uses -Bobboau
// now using new particle spew struct -nuke
particle_spew_info particle_spewers[MAX_PARTICLE_SPEWERS];
// Corkscrew info - phreak 11/9/02
int cs_num_fired;
float cs_radius;
float cs_twist;
int cs_crotate;
int cs_delay;
//electronics info - phreak 5/3/03
int elec_time; //how long it lasts, in milliseconds
float elec_eng_mult; //multiplier on engine subsystem
float elec_weap_mult; //multiplier on weapon subsystem and turrets
float elec_beam_mult; //used instead of elec_weap_mult if turret is a beam turret
float elec_sensors_mult; //multiplier on sensors and awacs
int elec_randomness; //disruption time lasts + or - this value from whats calculated. time in milliseconds
int elec_use_new_style; //use new style electronics parameters
//local ssm info
int lssm_warpout_delay; //delay between launch and warpout (ms)
int lssm_warpin_delay; //delay between warpout and warpin (ms)
float lssm_stage5_vel; //velocity during final stage
float lssm_warpin_radius;
float lssm_lock_range;
float field_of_fire; //cone the weapon will fire in, 0 is strait all the time-Bobboau
float fof_spread_rate; //How quickly the FOF will spread for each shot (primary weapons only, this doesn't really make sense for turrets)
float fof_reset_rate; //How quickly the FOF spread will reset over time (primary weapons only, this doesn't really make sense for turrets)
float max_fof_spread; //The maximum fof increase that the shots can spread to
int shots; //the number of shots that will be fired at a time,
//only realy usefull when used with FOF to make a shot gun effect
//now also used for weapon point cycleing
// Countermeasure information
float cm_aspect_effectiveness;
float cm_heat_effectiveness;
float cm_effective_rad;
// *
int SwarmWait; // *Swarm firewait, default is 150 -Et1
float WeaponMinRange; // *Minimum weapon range, default is 0 -Et1
float weapon_submodel_rotate_accell;
float weapon_submodel_rotate_vel;
int damage_type_idx;
int damage_type_idx_sav; // stored value from table used to reset damage_type_idx
int armor_type_idx; // Weapon armor type
// transparency/alpha info
float alpha_max; // maximum alpha value to use
float alpha_min; // minimum alpha value to use
float alpha_cycle; // cycle between max and min by this much each frame
//WMC - scripting stuff
script_hook sc_collide_ship;
script_hook sc_collide_weapon;
int weapon_hitpoints;
int burst_shots;
float burst_delay;
int burst_flags;
// Thruster effects
generic_anim thruster_flame;
generic_anim thruster_glow;
float thruster_glow_factor;
float target_lead_scaler;
int targeting_priorities[32];
int num_targeting_priorities;
// the optional pattern of weapons that this weapon will fire
SCP_vector<int> weapon_substitution_pattern; //weapon_indexs
SCP_vector<SCP_string> weapon_substitution_pattern_names; // weapon names so that we can generate the indexs after sort
int score; //Optional score for destroying the weapon
int hud_tracking_snd; // Sound played when this weapon tracks a target
int hud_locked_snd; // Sound played when this weapon locked onto a target
int hud_in_flight_snd; // Sound played while the weapon is in flight
InFlightSoundType in_flight_play_type; // The status when the sound should be played
} weapon_info;
// Data structure to track the active missiles
typedef struct missile_obj {
missile_obj *next, *prev;
int flags, objnum;
} missile_obj;
extern missile_obj Missile_obj_list;
// WEAPON EXPLOSION INFO
#define MAX_WEAPON_EXPL_LOD 4
typedef struct weapon_expl_lod {
char filename[MAX_FILENAME_LEN];
int bitmap_id;
int num_frames;
int fps;
weapon_expl_lod( )
: bitmap_id( -1 ), num_frames( 0 ), fps( 0 )
{
filename[ 0 ] = 0;
}
} weapon_expl_lod;
typedef struct weapon_expl_info {
int lod_count;
weapon_expl_lod lod[MAX_WEAPON_EXPL_LOD];
} weapon_expl_info;
class weapon_explosions
{
private:
SCP_vector<weapon_expl_info> ExplosionInfo;
int GetIndex(char *filename);
public:
weapon_explosions();
int Load(char *filename = NULL, int specified_lods = MAX_WEAPON_EXPL_LOD);
int GetAnim(int weapon_expl_index, vec3d *pos, float size);
void PageIn(int idx);
};
extern weapon_explosions Weapon_explosions;
extern weapon_info Weapon_info[MAX_WEAPON_TYPES];
extern int Num_weapon_types; // number of weapons in the game
extern int Num_weapons;
extern int First_secondary_index;
extern int Default_cmeasure_index;
extern int Num_player_weapon_precedence; // Number of weapon types in Player_weapon_precedence
extern int Player_weapon_precedence[MAX_WEAPON_TYPES]; // Array of weapon types, precedence list for player weapon selection
#define WEAPON_INDEX(wp) (wp-Weapons)
#define WEAPON_INFO_INDEX(wip) (wip-Weapon_info)
int weapon_info_lookup(const char *name = NULL);
void weapon_init(); // called at game startup
void weapon_close(); // called at game shutdown
void weapon_level_init(); // called before the start of each level
void weapon_render(object * obj);
void weapon_delete( object * obj );
void weapon_process_pre( object *obj, float frame_time);
void weapon_process_post( object *obj, float frame_time);
//Call before weapons_page_in to mark a weapon as used
void weapon_mark_as_used(int weapon_id);
// Group_id: If you should quad lasers, they should all have the same group id.
// This will be used to optimize lighting, since each group only needs to cast one light.
// Call this to get a new group id, then pass it to each weapon_create call for all the
// weapons in the group. Number will be between 0 and WEAPON_MAX_GROUP_IDS and will
// get reused.
int weapon_create_group_id();
// How many unique groups of weapons there can be at one time.
#define WEAPON_MAX_GROUP_IDS 256
// Passing a group_id of -1 means it isn't in a group. See weapon_create_group_id for more
// help on weapon groups.
int weapon_create( vec3d * pos, matrix * orient, int weapon_type, int parent_obj, int group_id=-1, int is_locked = 0, int is_spawned = 0, float fof_cooldown = 0.0f, ship_subsys * src_turret = NULL);
void weapon_set_tracking_info(int weapon_objnum, int parent_objnum, int target_objnum, int target_is_locked = 0, ship_subsys *target_subsys = NULL);
// for weapons flagged as particle spewers, spew particles. wheee
void weapon_maybe_spew_particle(object *obj);
bool weapon_armed(weapon *wp, bool hit_target);
void weapon_hit( object * weapon_obj, object * other_obj, vec3d * hitpos, int quadrant = -1 );
int cmeasure_name_lookup(char *name);
void spawn_child_weapons( object *objp );
// call to detonate a weapon. essentially calls weapon_hit() with other_obj as NULL, and sends a packet in multiplayer
void weapon_detonate(object *objp);
void weapon_area_apply_blast(vec3d *force_apply_pos, object *ship_objp, vec3d *blast_pos, float blast, int make_shockwave);
int weapon_area_calc_damage(object *objp, vec3d *pos, float inner_rad, float outer_rad, float max_blast, float max_damage,
float *blast, float *damage, float limit);
void missile_obj_list_rebuild(); // called by save/restore code only
missile_obj *missile_obj_return_address(int index);
void find_homing_object_cmeasures();
// THE FOLLOWING FUNCTION IS IN SHIP.CPP!!!!
// JAS - figure out which thruster bitmap will get rendered next
// time around. ship_render needs to have shipp->thruster_bitmap set to
// a valid bitmap number, or -1 if we shouldn't render thrusters.
// This does basically the same thing as ship_do_thruster_frame, except it
// operates on a weapon. This is in the ship code because it needs
// the same thruster animation info as the ship stuff, and I would
// rather extern this one function than all the thruster animation stuff.
void ship_do_weapon_thruster_frame( weapon *weaponp, object *objp, float frametime );
// call to get the "color" of the laser at the given moment (since glowing lasers can cycle colors)
void weapon_get_laser_color(color *c, object *objp);
void weapon_hit_do_sound(object *hit_obj, weapon_info *wip, vec3d *hitpos, bool is_armed);
// return a scale factor for damage which should be applied for 2 collisions
float weapon_get_damage_scale(weapon_info *wip, object *wep, object *target);
// Pauses all running weapon sounds
void weapon_pause_sounds();
// Unpauses all running weapon sounds
void weapon_unpause_sounds();
#endif
|