/*
* $Id: mech.h,v 1.10 2005/08/10 14:09:34 av1-op Exp $
*
* Author: Markus Stenberg <fingon@iki.fi>
*
* Copyright (c) 1996 Markus Stenberg
* Copyright (c) 1998-2002 Thomas Wouters
* Copyright (c) 2000-2002 Cord Awtry
* Copyright (c) 1999-2005 Kevin Stevens
* All rights reserved
*
* Last modified: Tue Jul 28 10:17:10 1998 fingon
*
*/
#include "config.h"
#ifndef MECH_H
#define MECH_H
#include "externs.h"
#include "db.h"
#include "attrs.h"
#include "powers.h"
#include "mech.stat.h"
#include "muxevent.h"
#include "p.event.h"
#include "btconfig.h"
#include "mymath.h"
#define NUM_ITEMS 1024
#define NUM_ITEMS_M 512
#define NUM_BAYS 4
#define NUM_TURRETS 3
#define C3I_NETWORK_SIZE 5
#define C3_NETWORK_SIZE 11 /* Constant for the max size of the network */
#define BRANDCOUNT 5
#define LEFTSIDE 1
#define RIGHTSIDE 2
#define FRONT 3
#define BACK 4
#define STAND 1
#define FALL 0
#define TURN 30 /* 30 sec turn */
#define KPH_PER_MP 10.75
#define MP_PER_KPH 0.0930233 /* 1/KPH_PER_MP */
#define MP_PER_UPDATE_PER_KPH 0.003100777 /* MP_PER_KPH/30 */
#define SCALEMAP 322.5 /* 1/update */
#define HEXLEVEL 5 /* levels/hex */
#define ZSCALE 64.5 /* scalemap/hexlevel */
#define XSCALE 0.1547 /* hex constant */
#define YSCALE2 9.61482e-6 /* update**2 */
#define MP1 10.75 /* 2*MS_PER_MP */
#define MP2 21.50 /* 2*MS_PER_MP */
#define MP3 32.25 /* 3*MS_PER_MP */
#define MP4 43.00 /* 4*MS_PER_MP */
#define MP5 53.75 /* 5*MS_PER_MP */
#define MP6 64.50 /* 6*MS_PER_MP */
#define MP9 96.75 /* 9*MS_PER_MP */
#define DELTAFACING 1440.0
#define DEFAULT_FREQS 5
#define FREQS 16
#define FREQ_DIGITAL 1
#define FREQ_MUTE 2 /* For digital transmissions */
#define FREQ_RELAY 4 /* For digital transmissions */
#define FREQ_INFO 8 /* For digital transmissions */
#define FREQ_SCAN 16
#define FREQ_REST 32
#define RADIO_RELAY 1 /* ability to relay things */
#define RADIO_INFO 2 /* ability to see where (digital) message comes from */
#define RADIO_SCAN 4 /* ability to scan for frequencies */
#define RADIO_NODIGITAL 8 /* lacks the ability to hear or set digital freqs */
#define CHTITLELEN 15
#define NOT_FOUND -1
#define NUM_CRITICALS 12
#define ARMOR 1
#define INTERNAL 2
#define REAR 3
#define NOARC 0
#define FORWARDARC 1
#define LSIDEARC 2
#define RSIDEARC 4
#define REARARC 8
#define TURRETARC 16
/*
Critical Types
0 Empty
1-192 Weapons
193-384 Ammo
385-394 Bombs (Aero/VTOL droppable)
395-511 Special startings...
*/
/* Critical Types... */
#define NUM_WEAPONS 192
#define NUM_BOMBS 9
#define EMPTY 0
#define WEAPON_BASE_INDEX 1
#define AMMO_BASE_INDEX (WEAPON_BASE_INDEX + NUM_WEAPONS) /* 193 */
#define BOMB_BASE_INDEX (AMMO_BASE_INDEX + NUM_WEAPONS) /* 385 */
#define SPECIAL_BASE_INDEX (BOMB_BASE_INDEX + NUM_BOMBS) /* 394 */
#define OSPECIAL_BASE_INDEX 220
#define CARGO_BASE_INDEX 512
#ifdef BT_ADVANCED_ECON
#define SPECIALCOST_SIZE (CARGO_BASE_INDEX - SPECIAL_BASE_INDEX)
#define AMMOCOST_SIZE NUM_WEAPONS
#define WEAPCOST_SIZE NUM_WEAPONS
#define CARGOCOST_SIZE (NUM_ITEMS - NUM_ITEMS_M)
#define BOMBCOST_SIZE NUM_BOMBS
#endif
#define IsAmmo(a) ((a) >= AMMO_BASE_INDEX && (a) < BOMB_BASE_INDEX)
#define IsBomb(a) ((a) >= BOMB_BASE_INDEX && (a) < SPECIAL_BASE_INDEX)
#define IsSpecial(a) ((a) >= SPECIAL_BASE_INDEX && (a) < CARGO_BASE_INDEX)
#define IsCargo(a) ((a) >= CARGO_BASE_INDEX)
#define IsActuator(a) (IsSpecial(a) && a <= I2Special(HAND_OR_FOOT_ACTUATOR))
#define IsWeapon(a) ((a) >= WEAPON_BASE_INDEX && (a) < AMMO_BASE_INDEX)
#define IsArtillery(a) (MechWeapons[a].type==TARTILLERY)
#define IsMissile(a) (MechWeapons[a].type==TMISSILE)
#define IsBallistic(a) (MechWeapons[a].type==TAMMO)
#define IsEnergy(a) (MechWeapons[a].type==TBEAM)
/* Fun Weapons that do affects */
#define IsFlamer(a) (strstr(MechWeapons[a].name, "Flamer"))
#define IsCoolant(a) (strstr(MechWeapons[a].name, "Coolant"))
#define IsAcid(a) (strstr(MechWeapons[a].name, "Acid"))
#ifdef BT_EXILE_MW3STATS
#endif
#define GunRangeWithCheck(mech,sec,a) (SectionUnderwater(mech,sec) > 0 ? GunWaterRange(a) : IsArtillery(a)?(ARTILLERY_MAPSHEET_SIZE * MechWeapons[a].longrange):(MechWeapons[a].longrange))
#define EGunRangeWithCheck(mech,sec,a) ((SectionUnderwater(mech,sec) > 0) ? EGunWaterRange(a) : (mudconf.btech_erange && (MechWeapons[a].medrange * 2) > GunRange(a)) ? (MechWeapons[a].medrange * 2) : GunRange(a))
#define GunRange(a) (IsArtillery(a)?(ARTILLERY_MAPSHEET_SIZE * MechWeapons[a].longrange):(MechWeapons[a].longrange))
#define EGunRange(a) ((mudconf.btech_erange && (MechWeapons[a].medrange * 2) > GunRange(a)) ? (MechWeapons[a].medrange * 2) : GunRange(a))
#define GunWaterRange(a) (MechWeapons[a].longrange_water > 0 ? MechWeapons[a].longrange_water : MechWeapons[a].medrange_water > 0 ? MechWeapons[a].medrange_water : MechWeapons[a].shortrange_water > 0 ? MechWeapons[a].shortrange_water : 0)
#define EGunWaterRange(a) ((mudconf.btech_erange && ((MechWeapons[a].medrange_water * 2) > GunWaterRange(a)) && (MechWeapons[a].longrange_water > 0)) ? (MechWeapons[a].medrange_water * 2) : GunWaterRange(a))
#define SectionUnderwater(mech,sec) (MechZ(mech) >= 0 ? 0 : (MechZ(mech) < -1) || (Fallen(mech)) ? 1 : ((sec == LLEG) || (sec == RLEG)) || (MechIsQuad(mech) && ((sec == LARM) || (sec == RARM))) ? 1 : 0)
#define Ammo2WeaponI(a) ((a) - AMMO_BASE_INDEX)
#define Ammo2Weapon(a) Ammo2WeaponI(a)
#define Ammo2I(a) Ammo2Weapon(a)
#define Bomb2I(a) ((a) - BOMB_BASE_INDEX)
#define Special2I(a) ((a) - SPECIAL_BASE_INDEX)
#define Cargo2I(a) ((a) - CARGO_BASE_INDEX)
#define Weapon2I(a) ((a) - WEAPON_BASE_INDEX)
#define I2Bomb(a) ((a) + BOMB_BASE_INDEX)
#define I2Weapon(a) ((a) + WEAPON_BASE_INDEX)
#define I2Ammo(a) ((a) + AMMO_BASE_INDEX)
#define I2Special(a) ((a) + SPECIAL_BASE_INDEX)
#define I2Cargo(a) ((a) + CARGO_BASE_INDEX)
#define Special I2Special
#define Cargo I2Cargo
/* To define one of these-> x=SPECIAL_BASE_INDEX+SHOULDER_OR_HIP */
#define SHOULDER_OR_HIP 0
#define UPPER_ACTUATOR 1
#define LOWER_ACTUATOR 2
#define HAND_OR_FOOT_ACTUATOR 3
#define LIFE_SUPPORT 4
#define SENSORS 5
#define COCKPIT 6
#define ENGINE 7
#define GYRO 8
#define HEAT_SINK 9
#define JUMP_JET 10
#define CASE 11
#define FERRO_FIBROUS 12
#define ENDO_STEEL 13
#define TRIPLE_STRENGTH_MYOMER 14
#define TARGETING_COMPUTER 15
#define MASC 16
#define C3_MASTER 17
#define C3_SLAVE 18
#define BEAGLE_PROBE 19
#define ARTEMIS_IV 20
#define ECM 21
#define AXE 22
#define SWORD 23
#define MACE 24
#define CLAW 25
#define DS_AERODOOR 26
#define DS_MECHDOOR 27
#define FUELTANK 28
#define TAG 29
#define DS_TANKDOOR 30
#define DS_CARGODOOR 31
#define LAMEQUIP 32
#define CASE_II 33
#define STEALTH_ARMOR 34
#define NULL_SIGNATURE_SYSTEM 35
#define C3I 36
#define ANGELECM 37
#define HVY_FERRO_FIBROUS 38
#define LT_FERRO_FIBROUS 39
#define BLOODHOUND_PROBE 40
#define PURIFIER_ARMOR 41
#define KAGE_STEALTH_UNIT 42
#define ACHILEUS_STEALTH_UNIT 43
#define INFILTRATOR_STEALTH_UNIT 44
#define INFILTRATORII_STEALTH_UNIT 45
#define SUPERCHARGER 46
#define LBX2_AMMO 0
#define LBX5_AMMO 1
#define LBX10_AMMO 2
#define LBX20_AMMO 3
#define LRM_AMMO 4
#define SRM_AMMO 5
#define SSRM_AMMO 6
#define NARC_LRM_AMMO 7
#define NARC_SRM_AMMO 8
#define NARC_SSRM_AMMO 9
#define ARTEMIS_LRM_AMMO 10
#define ARTEMIS_SRM_AMMO 11
#define ARTEMIS_SSRM_AMMO 12
#define PETROLEUM 13
#define PHOSPHORUS 14
#define HYDROGEN 15
#define GOLD 16
#define NATURAL_EXTRACTS 17
#define MARIJUANA 18
#define SULFUR 19
#define SODIUM 20
#define PLUTONIUM 21
#define ORE 22
#define METAL 23
#define PLASTICS 24
#define MEDICAL_SUPPLIES 25
#define COMPUTERS 26
#define EXPLOSIVES 27
#define ES_INTERNAL 28
#define FF_ARMOR 29
#define XL_ENGINE 30
#define DOUBLE_HEAT_SINK 31
#define IC_ENGINE 32
#define S_ELECTRONIC 33
#define S_INTERNAL 34
#define S_ARMOR 35
#define S_ACTUATOR 36
#define S_AERO_FUEL 37
#define S_DS_FUEL 38
#define S_VTOL_FUEL 39
#define SWARM_LRM_AMMO 40
#define SWARM1_LRM_AMMO 41
#define INFERNO_SRM_AMMO 42
#define XXL_ENGINE 43
#define COMP_ENGINE 44
#define HD_ARMOR 45
#define RE_INTERNAL 46
#define CO_INTERNAL 47
#define MRM_AMMO 48
#define LIGHT_ENGINE 49
#define CASEII 50
#define STH_ARMOR 51
#define NULLSIGSYS 52
#define SILICON 53
#define HVY_FF_ARMOR 54
#define LT_FF_ARMOR 55
#define INARC_EXPLO_AMMO 56
#define INARC_HAYWIRE_AMMO 57
#define INARC_ECM_AMMO 58
#define INARC_NEMESIS_AMMO 59
#define AC2_AP_AMMO 60
#define AC5_AP_AMMO 61
#define AC10_AP_AMMO 62
#define AC20_AP_AMMO 63
#define LAC2_AP_AMMO 64
#define LAC5_AP_AMMO 65
#define AC2_FLECHETTE_AMMO 66
#define AC5_FLECHETTE_AMMO 67
#define AC10_FLECHETTE_AMMO 68
#define AC20_FLECHETTE_AMMO 69
#define LAC2_FLECHETTE_AMMO 70
#define LAC5_FLECHETTE_AMMO 71
#define AC2_INCENDIARY_AMMO 72
#define AC5_INCENDIARY_AMMO 73
#define AC10_INCENDIARY_AMMO 74
#define AC20_INCENDIARY_AMMO 75
#define LAC2_INCENDIARY_AMMO 76
#define LAC5_INCENDIARY_AMMO 77
#define AC2_PRECISION_AMMO 78
#define AC5_PRECISION_AMMO 79
#define AC10_PRECISION_AMMO 80
#define AC20_PRECISION_AMMO 81
#define LAC2_PRECISION_AMMO 82
#define LAC5_PRECISION_AMMO 83
#define LR_DFM_AMMO 84
#define SR_DFM_AMMO 85
#define SLRM_AMMO 86
#define ELRM_AMMO 87
#define BSUIT_SENSOR 88
#define BSUIT_LIFESUPPORT 89
#define BSUIT_ELECTRONIC 90
#define CARGO_OIL 91
#define CARGO_WATER 92
#define CARGO_EARTH 93
#define CARGO_OXYGEN 94
#define CARGO_NITROGEN 95
#define CARGO_NICKEL 96
#define CARGO_STEEL 97
#define CARGO_IRON 98
#define CARGO_BRASS 99
#define CARGO_PLATINUM 100
#define CARGO_COPPER 101
#define CARGO_ALUMINUM 102
#define CARGO_CONSUMER_GOOD 103
#define CARGO_MACHINERY 104
#define CARGO_SLAVES 105
#define CARGO_TIMBIQUI_DARK 106
#define CARGO_COCAINE 107
#define CARGO_HEROINE 108
#define CARGO_MARBLE 109
#define CARGO_GLASS 110
#define CARGO_DIAMOND 111
#define CARGO_COAL 112
#define CARGO_FOOD 113
#define CARGO_ZINC 114
#define CARGO_FABRIC 115
#define CARGO_CLOTHING 116
#define CARGO_WOOD 117
#define CARGO_PULP 118
#define CARGO_LUMBER 119
#define CARGO_RUBBER 120
#define CARGO_SEEDS 121
#define CARGO_FERTILIZER 122
#define CARGO_SALT 123
#define CARGO_LITHIUM 124
#define CARGO_HELIUM 125
#define CARGO_LARIUM 126
#define CARGO_URANIUM 127
#define CARGO_IRIDIUM 128
#define CARGO_TITANIUM 129
#define CARGO_CONCRETE 130
#define CARGO_FERROCRETE 131
#define CARGO_BUILDING_SUPPLIES 132
#define CARGO_KEVLAR 133
#define CARGO_WASTE 134
#define CARGO_LIVESTOCK 135
#define CARGO_PAPER 136
#define XL_GYRO 137
#define HD_GYRO 138
#define COMP_GYRO 139
#define COMPACT_HEAT_SINK 140
#define AMMO_LRM_STINGER 141
#ifdef BT_COMPLEXREPAIRS
#define TON_SENSORS_FIRST 142
#define TON_SENSORS_LAST (TON_SENSORS_FIRST + 9)
#define TON_MYOMER_FIRST (TON_SENSORS_LAST + 1)
#define TON_MYOMER_LAST (TON_MYOMER_FIRST + 9)
#define TON_TRIPLEMYOMER_FIRST (TON_MYOMER_LAST + 1)
#define TON_TRIPLEMYOMER_LAST (TON_TRIPLEMYOMER_FIRST + 9)
#define TON_INTERNAL_FIRST (TON_TRIPLEMYOMER_LAST + 1)
#define TON_INTERNAL_LAST (TON_INTERNAL_FIRST + 9)
#define TON_ESINTERNAL_FIRST (TON_INTERNAL_LAST + 1)
#define TON_ESINTERNAL_LAST (TON_ESINTERNAL_FIRST + 9)
#define TON_JUMPJET_FIRST (TON_ESINTERNAL_LAST + 1)
#define TON_JUMPJET_LAST (TON_JUMPJET_FIRST + 9)
#define TON_ARMUPPER_FIRST (TON_JUMPJET_LAST + 1)
#define TON_ARMUPPER_LAST (TON_ARMUPPER_FIRST + 9)
#define TON_ARMLOWER_FIRST (TON_ARMUPPER_LAST + 1)
#define TON_ARMLOWER_LAST (TON_ARMLOWER_FIRST + 9)
#define TON_ARMHAND_FIRST (TON_ARMLOWER_LAST + 1)
#define TON_ARMHAND_LAST (TON_ARMHAND_FIRST + 9)
#define TON_LEGUPPER_FIRST (TON_ARMHAND_LAST + 1)
#define TON_LEGUPPER_LAST (TON_LEGUPPER_FIRST + 9)
#define TON_LEGLOWER_FIRST (TON_LEGUPPER_LAST + 1)
#define TON_LEGLOWER_LAST (TON_LEGLOWER_FIRST + 9)
#define TON_LEGFOOT_FIRST (TON_LEGLOWER_LAST + 1)
#define TON_LEGFOOT_LAST (TON_LEGFOOT_FIRST + 9)
#define TON_ENGINE_FIRST (TON_LEGFOOT_LAST + 1)
#define TON_ENGINE_LAST (TON_ENGINE_FIRST + 19)
#define TON_ENGINE_XL_FIRST (TON_ENGINE_LAST + 1)
#define TON_ENGINE_XL_LAST (TON_ENGINE_XL_FIRST + 19)
#define TON_ENGINE_ICE_FIRST (TON_ENGINE_XL_LAST + 1)
#define TON_ENGINE_ICE_LAST (TON_ENGINE_ICE_FIRST + 19)
#define TON_ENGINE_LIGHT_FIRST (TON_ENGINE_ICE_LAST + 1)
#define TON_ENGINE_LIGHT_LAST (TON_ENGINE_LIGHT_FIRST + 19)
#define TON_COINTERNAL_FIRST (TON_ENGINE_LIGHT_LAST + 1)
#define TON_COINTERNAL_LAST (TON_COINTERNAL_FIRST + 9)
#define TON_REINTERNAL_FIRST (TON_COINTERNAL_LAST + 1)
#define TON_REINTERNAL_LAST (TON_REINTERNAL_FIRST + 9)
#define TON_GYRO_FIRST (TON_REINTERNAL_LAST + 1)
#define TON_GYRO_LAST (TON_GYRO_FIRST + 3)
#define TON_XLGYRO_FIRST (TON_GYRO_LAST + 1)
#define TON_XLGYRO_LAST (TON_XLGYRO_FIRST + 3)
#define TON_HDGYRO_FIRST (TON_XLGYRO_LAST + 1)
#define TON_HDGYRO_LAST (TON_HDGYRO_FIRST + 3)
#define TON_CGYRO_FIRST (TON_HDGYRO_LAST + 1)
#define TON_CGYRO_LAST (TON_CGYRO_FIRST + 3)
#define TON_ENGINE_XXL_FIRST (TON_CGYRO_LAST + 1)
#define TON_ENGINE_XXL_LAST (TON_ENGINE_XXL_FIRST + 19)
#define TON_ENGINE_COMP_FIRST (TON_ENGINE_XXL_LAST + 1)
#define TON_ENGINE_COMP_LAST (TON_ENGINE_COMP_FIRST + 19)
#endif
/* Weapons structure and array... */
#define TBEAM 0
#define TMISSILE 1
#define TARTILLERY 2
#define TAMMO 3
#define THAND 4
/* Tic status */
#define TIC_NUM_DESTROYED -2
#define TIC_NUM_RELOADING -3
#define TIC_NUM_RECYCLING -4
#define TIC_NUM_PHYSICAL -5
/* This is the max weapons per area- assuming 12 critical location and */
/* the smallest weapon requires 1 */
#define MAX_WEAPS_SECTION 12
struct weapon_struct {
char *name;
char vrt;
char type;
char heat;
char damage;
char min;
int shortrange;
int medrange;
int longrange;
char min_water;
int shortrange_water;
int medrange_water;
int longrange_water;
char criticals;
unsigned char ammoperton;
unsigned short weight; /* in 1/100ths tons */
short explosiondamage; /* Damage done when exploding (GR/LGR/HGR) */
long special;
int battlevalue;
};
/* special weapon effects */
#define NONE 0x00000000
#define PULSE 0x00000001 /* Pulse laser */
#define LBX 0x00000002 /* LBX AC */
#define ULTRA 0x00000004 /* Ultra AC */
#define STREAK 0x00000008 /* Streak missile */
#define GAUSS 0x00000010 /* Gauss weapon */
#define NARC 0x00000020 /* NARC launcher */
#define IDF 0x00000040 /* Can be used w/ IDF */
#define DAR 0x00000080 /* Has artillery-level delay on hit (1sec/2hex) */
#define HYPER 0x00000100 /* Hyper AC */
#define A_POD 0x00000200 /* Anti-infantry Pod */
#define CLAT 0x00000400 /* Clan-tech */
#define NOSPA 0x00000800 /* Does not allow special ammo (swarm, etc) */
#define PC_HEAT 0x00001000 /* Heat-based PC weapon (laser/inferno/..) */
#define PC_IMPA 0x00002000 /* Impact (weapons) */
#define PC_SHAR 0x00004000 /* Shrapnel / slash (various kinds of weapons) */
#define AMS 0x00008000 /* AntiMissileSystem */
#define NOBOOM 0x00010000 /* No ammo boom */
#define CASELESS 0x00020000 /* Caseless AC */
#define DFM 0x00040000 /* DFM - 2 worst rolls outta 3 for missiles */
#define ELRM 0x00080000 /* ELRM - 2 worst rolls outta 3 for missiles under */
#define MRM 0x00100000 /* MRM - +1 BTH */
#define CHEAT 0x00200000 /* Can cause heat or damage */
#define HVYW 0x00400000 /* Clam HeavyWeapons (call 'm so cuz FA$A will undoubtly bring more variants to the lasers) */
#define RFAC 0x00800000 /* Rapid fire ACs */
#define GMG 0x01000000 /* Gattling MGs */
#define INARC 0x02000000 /* iNARC launcher */
#define RAC 0x04000000 /* Rotary AC */
#define HVYGAUSS 0x08000000 /* Heavy Gauss */
#define ROCKET 0x10000000 /* Rocket launchers. +1 to hit, one shot wonders */
#define PCOMBAT (PC_HEAT|PC_IMPA|PC_SHAR)
#define MAX_ROLL 11
struct missile_hit_table_struct {
char *name;
int key;
int num_missiles[MAX_ROLL];
};
/* Section #defs... */
/* The unusual order is related to the locations of weapons of high */
/* magnitude versus weapons of low mag */
#define LARM 0
#define RARM 1
#define LTORSO 2
#define RTORSO 3
#define CTORSO 4
#define LLEG 5
#define RLEG 6
#define HEAD 7
#define NUM_SECTIONS 8
/* These defs are for Vehicles */
#define LSIDE 0
#define RSIDE 1
#define FSIDE 2
#define BSIDE 3
#define TURRET 4
#define ROTOR 5
#define NUM_VEH_SECTIONS 6
/* Aerofighter */
#define AERO_NOSE 0
#define AERO_LWING 1
#define AERO_RWING 2
#define AERO_FUSEL 3
#define AERO_COCKPIT 4
#define AERO_ENGINE 5
#define NUM_AERO_SECTIONS 6
#define NUM_BSUIT_MEMBERS 8
#define DS_RWING 0 /* Right Front Side / Right Wing */
#define DS_LWING 1 /* Left Front Side / Left Wing */
#define DS_LRWING 2 /* Left Rear Side */
#define DS_RRWING 3 /* Right Rear Side / Right Wing */
#define DS_AFT 4
#define DS_NOSE 5
#define NUM_DS_SECTIONS 6
#define SpheroidDS(a) (MechType(a)==CLASS_SPHEROID_DS)
#define SpheroidToRear(mech,a) \
if (MechType(mech) == CLASS_SPHEROID_DS) \
(a) = ((a) == DS_LWING ? DS_LRWING : DS_RRWING)
#define NUM_TICS 4
#define MAX_WEAPONS_PER_MECH 96 /* Thanks to crit limits */
#define SINGLE_TICLONG_SIZE 32
#define TICLONGS (MAX_WEAPONS_PER_MECH / SINGLE_TICLONG_SIZE)
/* structure for each critical hit section */
struct critical_slot {
unsigned char brand; /* Hold brand number, and damage (upper 4 bits) */
unsigned char data; /* Holds information like ammo remaining, etc */
unsigned short type; /* Type of item that this is a critical for */
unsigned int firemode; /* Holds info like rear mount, ultra mode... */
unsigned int ammomode; /* Holds info for the special ammo type in use */
unsigned int weapDamageFlags; /* Holds the enhanced critical damage flags */
short desiredAmmoLoc; /* Location of the desired ammo bin */
// unsigned int recycle; /* time when it will finish recycling */
};
/* Fire modes */
#define DESTROYED_MODE 0x00000001 /* the part is destroyed */
#define DISABLED_MODE 0x00000002 /* the part is disabled */
#define BROKEN_MODE 0x00000004 /* the part is part of a destroyed weapon/item */
#define DAMAGED_MODE 0x00000008 /* the part is damaged from an enhanced critical */
#define ON_TC 0x00000010 /* Set if the wepons mounted with TC */
#define REAR_MOUNT 0x00000020 /* set if weapon is rear mounted */
#define HOTLOAD_MODE 0x00000040 /* Weapon's being hotloaded */
#define HALFTON_MODE 0x00000080 /* Weapon is in halfton mode */
#define OS_MODE 0x00000100 /* In weapon itself : Weapon's one-shot */
#define OS_USED 0x00000200 /* One-shot ammo _has_ been already used */
#define ULTRA_MODE 0x00000400 /* set if weapon is in Ultra firing mode */
#define RFAC_MODE 0x00000800 /* the weapon is set as a rapid fire AC */
#define GATTLING_MODE 0x00001000 /* For Gattling MGs */
#define RAC_TWOSHOT_MODE 0x00002000 /* RAC in two shot mode */
#define RAC_FOURSHOT_MODE 0x00004000 /* RAC in four shot mode */
#define RAC_SIXSHOT_MODE 0x00008000 /* RAC in six shot mode */
#define HEAT_MODE 0x00010000 /* Toggle a flamer into heat mode */
#define WILL_JETTISON_MODE 0x00020000 /* Set if the slot will get destroyed during a backpack jettison (BSuits) */
#define IS_JETTISONED_MODE 0x00040000 /* Set if the slot has been jettisoned (BSuits) */
#define OMNI_BASE_MODE 0x00080000 /* Set if the slot part of the base config of an omni mech */
#define ROCKET_FIRED 0x00100000 /* Set if the slot's rocket launcher has been fired */
#define RAC_MODES (RAC_TWOSHOT_MODE|RAC_FOURSHOT_MODE|RAC_SIXSHOT_MODE)
#define FIRE_MODES (HOTLOAD_MODE|ULTRA_MODE|RFAC_MODE|GATTLING_MODE|RAC_MODES|HEAT_MODE)
/* Ammo modes */
#define LBX_MODE 0x00000001 /* set if weapon is firing LBX ammo */
#define ARTEMIS_MODE 0x00000002 /* artemis compatible missiles/laucher */
#define NARC_MODE 0x00000004 /* narc compatible missiles/launcher */
#define CLUSTER_MODE 0x00000008 /* Set if weapon is firing cluster ammo */
#define MINE_MODE 0x00000010 /* Set if weapon's firing mines */
#define SMOKE_MODE 0x00000020 /* Set if weapon's firing smoke rounds */
#define INFERNO_MODE 0x00000040 /* SRM's loaded with Inferno rounds (cause heat) */
#define SWARM_MODE 0x00000080 /* LRM's loaded with Swarm rounds */
#define SWARM1_MODE 0x00000100 /* LRM's loaded with Swarm1 rounds (FoF) */
#define INARC_EXPLO_MODE 0x00000200 /* inarc launcher firing explosive pods */
#define INARC_HAYWIRE_MODE 0x00000400 /* inarc launcher firing haywire pods */
#define INARC_ECM_MODE 0x00000800 /* inarc launcher firing ecm pods */
#define INARC_NEMESIS_MODE 0x00001000 /* inarc launcher firing nemesis pods */
#define AC_AP_MODE 0x00002000 /* autocannon firing armor piercing rounds */
#define AC_FLECHETTE_MODE 0x00004000 /* autocannon firing flechette rounds */
#define AC_INCENDIARY_MODE 0x00008000 /* autocannon firing incendiary rounds */
#define AC_PRECISION_MODE 0x00010000 /* autocannon firing precision rounds */
#define STINGER_MODE 0x00020000 /* AntiAir LRM */
#define ARTILLERY_MODES (CLUSTER_MODE|MINE_MODE|SMOKE_MODE)
#define INARC_MODES (INARC_EXPLO_MODE|INARC_HAYWIRE_MODE|INARC_ECM_MODE|INARC_NEMESIS_MODE)
#define MISSILE_MODES (ARTEMIS_MODE|NARC_MODE|INFERNO_MODE|SWARM_MODE|SWARM1_MODE|STINGER_MODE)
#define AC_MODES (AC_AP_MODE|AC_FLECHETTE_MODE|AC_INCENDIARY_MODE|AC_PRECISION_MODE)
#define AMMO_MODES (LBX_MODE|AC_MODES|MISSILE_MODES|INARC_MODES|ARTILLERY_MODES)
/* Enhanced critical damage flags */
#define WEAP_DAM_MODERATE 0x00000001 /* +1 to hit */
#define WEAP_DAM_EN_FOCUS 0x00000002 /* Energy weapons: Focus misaligned. -1 damage, +1 BTH at med and long range */
#define WEAP_DAM_EN_CRYSTAL 0x00000004 /* Energy weapons: Crystal damaged. +1 heat. Roll of 2 results in ammo like explosion */
#define WEAP_DAM_BALL_BARREL 0x00000008 /* Ballistic weapons: Barrel damaged. Roll of 2 results in weapon jam */
#define WEAP_DAM_BALL_AMMO 0x00000010 /* Ballistic weapons: Ammo feed damaged. Can not switch ammo type. Roll of 2 results in ammo explosion */
#define WEAP_DAM_MSL_RANGING 0x00000020 /* Missile weapons: Ranging system hit. +1 BTH at med and long ranges */
#define WEAP_DAM_MSL_AMMO 0x00000040 /* Missile weapons: Ammo feed damaged. Can not switch ammo type. Roll of 2 results in ammo explosion */
/* Structure for each of the 8 sections */
struct section_struct {
unsigned char armor; /* External armor value */
unsigned char internal; /* Internal armor value */
unsigned char rear; /* Rear armor value */
unsigned char armor_orig;
unsigned char internal_orig;
unsigned char rear_orig;
char basetohit; /* Holds to hit modifiers for weapons in section */
char config; /* flags for CASE, etc. */
char recycle; /* after physical attack, set counter */
unsigned short specials; /* specials for this section, like attached NARC pods, etc... */
struct critical_slot criticals[NUM_CRITICALS]; /* Criticals */
};
/* Section configurations */
#define CASE_TECH 0x01 /* section has CASE technology */
#define SECTION_DESTROYED 0x02 /* section has been destroyed */
#define SECTION_BREACHED 0x04 /* section has been exposed to vacuum */
#define SECTION_FLOODED 0x08 /* section has been flooded with water - Kipsta. 8/3/99 */
#define AXED 0x10 /* arm was used to axe/sword someone */
#define STABILIZERS_DESTROYED 0x20 /* vehicle only. Double attacker mod for weapons from the section */
#define CASEII_TECH 0x40 /* section has CASE II technology */
/* Section specials */
#define NARC_ATTACHED 0x00000001 /* set if mech has a NARC beacon attached. */
#define INARC_HOMING_ATTACHED 0x00000002 /* set if mech has an iNARC homing beacon attached. */
#define INARC_HAYWIRE_ATTACHED 0x00000004 /* set if mech has an iNARC haywire beacon attached. */
#define INARC_ECM_ATTACHED 0x00000008 /* set if mech has an iNARC ecm beacon attached. */
#define INARC_NEMESIS_ATTACHED 0x00000010 /* set if mech has an iNARC nemesis beacon attached. */
#define CARRYING_CLUB 0x00000020 /* carrying a club in this location */
/* ground combat types */
#define CLASS_MECH 0
#define CLASS_VEH_GROUND 1
#define CLASS_VEH_NAVAL 3
/* Air types */
#define CLASS_VTOL 2
#define CLASS_SPHEROID_DS 4 /* Spheroid DropShip */
#define CLASS_AERO 5
#define CLASS_MW 6 /* Ejected MechWarrior */
#define CLASS_DS 7 /* AeroDyne DropShip */
#define CLASS_BSUIT 8
#define CLASS_LAST 8
#define DropShip(a) ((a)==CLASS_DS || (a)==CLASS_SPHEROID_DS)
#define IsDS(m) (DropShip(MechType(m)))
/* ground movement types */
#define MOVE_BIPED 0
#define MOVE_QUAD 8
#define MOVE_TRACK 1
#define MOVE_WHEEL 2
#define MOVE_HOVER 3
#define MOVE_HULL 5
#define MOVE_FOIL 6
#define MOVE_SUB 9
/* Air movenement types */
#define MOVE_VTOL 4
#define MOVE_FLY 7
#define MOVE_NONE 10 /* Stationary, for one reason or another */
#define MOVENEMENT_LAST 10
/* Mech Preferences list */
#define MECHPREF_PKILL 0x01 /* Kill MWs anyway */
#define MECHPREF_SLWARN 0x02 /* Warn when lit by slite */
#define MECHPREF_AUTOFALL 0x04 /* Jump off cliffs (don't try to avoid) */
#define MECHPREF_NOARMORWARN 0x08 /* Don't warn when armor is getting low */
#define MECHPREF_NOAMMOWARN 0x10 /* Don't warn when ammo is getting low */
#define MECHPREF_STANDANYWAY 0x20 /* Try to stand even when BTH too high */
#define MECHPREF_AUTOCON_SD 0x40 /* Autocon on non-started units */
#define MECHPREF_NOFRIENDLYFIRE 0x80 /* Disallow firing on teammates */
#define MECHPREF_TURNMODE 0x100 /* Tight or Normal for Maneuvering Ace */
typedef struct {
char mech_name[31]; /* Holds the 30 char ID for the mech */
char mech_type[15]; /* Holds the mechref for the mech */
char type; /* The type of this unit */
char move; /* The movement type of this unit */
char tac_range; /* Tactical range for sensors */
char lrs_range; /* Long range for sensors */
char scan_range; /* Range for scanners */
char numsinks; /* number of heatsinks (also engine */
char computer; /* Partially replaces tac/lrs/scan/radiorange */
char radio;
unsigned char radioinfo;
/* crits ( - from heatsinks) ) */
char si; /* Structural integrity of a craft */
char si_orig; /* maximum struct. int */
short radio_range; /* Can read/write comfortably at that distance */
struct section_struct sections[NUM_SECTIONS]; /* armor */
int fuel; /* Fuel left */
int fuel_orig; /* Fuel tank capacity */
int tons; /* How much I weigh */
int walkspeed; /* Future expansion to do speed correctly */
int runspeed;
float maxspeed; /* Maxspeed (running) in KPH */
int mechbv; /* Fasa BattleValue of this unit */
int cargospace; /* Assigned cargo space * 100 for half and quarter tons */
#ifndef BT_CALCULATE_BV
int unused[8]; /* Space for future expansion */
#else
int mechbv_last; /* BV caclulation cacher */
#endif
char targcomp; /* Targeting comp mode. */
char unused_char[3];
char carmaxton; /* Max Tonnage variable for carrier sizing */
} mech_ud;
typedef struct {
char jumptop; /* How many MPs we've left for vertical stuff? */
char aim; /* section of target aimed at */
char basetohit; /* total to hit modifiers from critical hits */
char pilotskillbase; /* holds constant skills mods */
char engineheat; /* +5 per critical hit there */
char masc_value; /* MASC roll .. updated up/down as needed */
char aim_type; /* Type we aim at */
char sensor[2]; /* Primary mode, secondary mode */
byte fire_adjustment; /* For artillery mostly */
char vis_mod; /* Should be in range of 0 to 100 ; basically, this
is used as _base_ of random element in each sensor type, altered
once every heat update (and when mech's sensor mode changes) */
char chargetimer; /* # of movement ticks since 'charge' command */
float chargedist; /* # of hexes moved since 'charge' command */
char staggerstamp; /* When in last turn this 'mech staggered */
short mech_prefs; /* Mech preferences */
short jumplength; /* in real coords (for jump and goto) */
short goingx, goingy; /* in map coords (for jump and goto) */
short desiredfacing; /* You are turning if this != facing */
short angle; /* For DS / Aeros */
short jumpheading; /* Jumping head */
short targx, targy, targz; /* in map coords, target squares */
short turretfacing; /* Jumping head */
short turndamage; /* holds damge taken in 5 sec interval */
short lateral; /* Quad lateral move mode */
short num_seen; /* Number of enemies seen */
short lx, ly;
dbref chgtarget; /* My CHARGE target */
dbref dfatarget; /* My DFA target */
dbref target; /* My default target */
dbref swarming; /* Swarm target */
dbref carrying; /* Who are we lugging about? */
dbref spotter; /* Who's spotting for us? */
float heat; /* Heat index */
float weapheat; /* Weapon heat factor-> see manifesto */
float plus_heat; /* how much heat I am producing */
float minus_heat; /* how much heat I can dissipate */
float startfx, startfy; /* in real coords (for jump and goto) */
float startfz, endfz; /* startstuff's also aeros' speed */
float verticalspeed; /* VTOL vertical speed in KPH */
float speed; /* Speed in KPH */
float desired_speed; /* Desired speed in KPH */
float jumpspeed; /* Jumping distance or current height in km */
int critstatus; /* see key below */
int status; /* see key below */
int status2; /* see key below */
int specials; /* see key below */
int specials2; /* More tech specials */
int specialsstatus; /* status element specials, like ECM, etc... */
int tankcritstatus; /* status element for crits that are specific to vehicles. see key below */
time_t last_weapon_recycle; /* This updated only on 'as needed' basis ;
basically, all weapon recycling events
compare the current time to the
last_weapon_recycle, and send recycled-messages
for all recycled weapons. */
int cargo_weight; /* How much stuff do we have? */
/* BTHRandomization stuff (rok) ;) */
int lastrndu;
int rnd;
int last_ds_msg; /* Used for DS-spam */
int boom_start; /* Used for Stackpole-effect */
int maxfuel; /* How much fuel fits to this thing anyway? */
int lastused; /* Idle timeout thing */
int cocoon; /* OOD cocoon */
int commconv; /* Evil magic related to commconv, p1 */
int commconv_last; /* Evil magic related to commconv, p2 */
int onumsinks; /* Original HS (?) */
int disabled_hs; /* Disabled (on purpose, not destroyed) HS */
int autopilot_num;
int heatboom_last;
int sspin; /* Start of aero spin */
int can_see;
int row; /* _Own_ weight */
int rcw; /* _Carried_ weight */
float rspd;
int erat;
int per;
int wxf;
int last_startup; /* timestamp of last 'startup' */
int maxsuits; /* Maximum number of bsuits in this unit */
int infantry_specials; /* Infantry related specials */
char scharge_value; /* Supercharger roll .. updated up/down as needed */
int staggerDamage; /* Damage for Stagger MkII */
int lastStaggerNotify; /* The level that we were last notified of a stagger */
int unused[5]; /* Space for future expansion */
} mech_rd;
typedef struct {
char pilotstatus; /* damage pilot has taken */
char terrain; /* Terrain I am in */
char elev; /* Elevation I am at */
short hexes_walked; /* Hexes walked counter */
short facing; /* 0-359.. */
short x, y, z; /* hex quantized x,y,z on the map in MP (hexes) */
short last_x, last_y; /* last hex entered */
float fx, fy, fz; /* exact x, y and z on the map */
int team; /* Only for internal use */
int unusable_arcs; /* Horrid kludge for disallowing use of some arcs' guns */
int stall; /* is this mech in a repair stall? */
dbref pilot; /* My pilot */
dbref bay[NUM_BAYS];
dbref turret[NUM_TURRETS];
} mech_pd;
typedef struct {
char C3ChanTitle[CHTITLELEN + 1]; /* applies to C3 and C3i */
dbref C3iNetwork[C3I_NETWORK_SIZE]; /* other mechs in the C3i network */
int wC3iNetworkSize; /* Current size of our network */
dbref C3Network[C3_NETWORK_SIZE]; /* The whole network. We're sacrificing memory for speed. */
int wC3NetworkSize; /* Current size of the C3Network */
int wTotalC3Masters; /* How many masters are on this mech? */
int wWorkingC3Masters; /* How many working masters are on this mech? */
int C3FreqMode; /* applies to C3 and C3i */
dbref tagTarget; /* dbref of the target we're tagging */
dbref taggedBy; /* dbref of the person tagging us */
} mech_sd;
typedef struct {
char ID[2]; /* Only for internal use */
char brief; /* toggle brievity */
char chantitle[FREQS][CHTITLELEN + 1]; /* Channel titles */
dbref mynum; /* My dbref */
int mapnumber; /* My number on the map */
dbref mapindex; /* 0..MAX_MAPS (dbref of map object) */
unsigned long tic[NUM_TICS][TICLONGS]; /* tics.. */
int freq[FREQS]; /* channel frequencies */
int freqmodes[FREQS]; /* flags for the freq */
mech_ud ud; /* UnitData (mostly not bzero'able) */
mech_pd pd; /* PositionData(mostly not bzero'able) */
mech_rd rd; /* RSdata (mostly bzero'able) */
mech_sd sd; /* SpecialsData (mostly not bzero'able) */
} MECH;
struct spot_data {
float tarFX;
float tarFY;
float mechFX;
float mechFY;
MECH *target;
};
struct repair_data {
int delta;
int time;
int target;
int code;
};
/* status element... */
#define LANDED 0x01 /* For VTOL use only */
#define TORSO_RIGHT 0x02 /* Torso heading -= 60 degrees */
#define TORSO_LEFT 0x04 /* Torso heading += 60 degrees */
#define STARTED 0x08 /* Mech is warmed up */
#define PARTIAL_COVER 0x10
#define DESTROYED 0x20
#define JUMPING 0x40 /* Handled in UPDATE */
#define FALLEN 0x80
#define DFA_ATTACK 0x100
#define PERFORMING_ACTION 0x200 /* Set if the unit is performing some sort of action. Controlled by SCode */
#define FLIPPED_ARMS 0x400
#define AMS_ENABLED 0x800 /* only settable if mech has ANTI-MISSILE_TECH */
/* unused 0x1000 */
#define UNCONSCIOUS 0x2000 /* Pilot is unconscious */
#define TOWED 0x4000 /* Someone's towing us */
#define LOCK_TARGET 0x8000 /* We mean business */
#define LOCK_BUILDING 0x10000 /* Hit building */
#define LOCK_HEX 0x20000 /* Hit hex (clear / ignite, d'pend on weapon) */
#define LOCK_HEX_IGN 0x40000
#define LOCK_HEX_CLR 0x80000
#define MASC_ENABLED 0x100000 /* Using MASC */
#define BLINDED 0x200000 /* Pilot has been blinded momentarily by something */
#define COMBAT_SAFE 0x400000 /* Can't be hurt */
#define AUTOCON_WHEN_SHUTDOWN 0x800000 /* Autocon sees it even when shutdown */
#define FIRED 0x1000000 /* Fired at something */
#define SCHARGE_ENABLED 0x2000000
#define HULLDOWN 0x4000000
#define UNDERSPECIAL 0x8000000
#define UNDERGRAVITY 0x10000000
#define UNDERTEMPERATURE 0x20000000
#define UNDERVACUUM 0x40000000
#define CONDITIONS (UNDERSPECIAL | UNDERGRAVITY | UNDERTEMPERATURE | UNDERVACUUM)
#define LOCK_MODES (LOCK_TARGET|LOCK_BUILDING|LOCK_HEX|LOCK_HEX_IGN|LOCK_HEX_CLR)
/* status2 element */
/* Specials status element */
#define ECM_ENABLED 0x00000001 /* set if this unit is using ECM */
#define ECCM_ENABLED 0x00000002 /* set if this unit is using ECCM */
#define ECM_DISTURBANCE 0x00000004 /* set if this unit is disturbed by ECM */
#define ECM_PROTECTED 0x00000008 /* set if this unit is protected by ECM */
#define ECM_COUNTERED 0x00000010 /* set if this units ECM is countered by
ECCM. This only happens if an enemy ECCM
is within range. */
#define SLITE_ON 0x00000020 /* See if this person's SLITE is on */
#define STH_ARMOR_ON 0x00000040 /* see if this unit is using stealth armor */
#define NULLSIGSYS_ON 0x00000080 /* see if this unit is using a null signature system */
#define ANGEL_ECM_ENABLED 0x00000100 /* set if this unit is using ECM */
#define ANGEL_ECCM_ENABLED 0x00000200 /* set if this unit is using ECCM */
#define ANGEL_ECM_PROTECTED 0x00000400 /* set if this unit is protected by an Angel ECM suite */
#define ANGEL_ECM_DISTURBED 0x00000800 /* set if this unit is disturbed by an Angel ECM suite */
#define PER_ECM_ENABLED 0x00001000 /* set if this unit is using Personal ECM */
#define PER_ECCM_ENABLED 0x00002000 /* set if this unit is using Personal ECCM */
#define AUTOTURN_TURRET 0x00004000 /* auto-turn the turret to the locked target */
#define SPRINTING 0x00010000 /* set if this unit is sprinting */
#define EVADING 0x00020000 /* set if this unit is evading */
#define DODGING 0x00040000 /* set if this unit is dodging */
#define ATTACKEMIT_MECH 0x00080000 /* set to be able to watch a unit and what it attacks */
/* Grouping masks */
#define MOVE_MODES (SPRINTING|EVADING|DODGING)
#define MOVE_MODES_LOCK (SPRINTING|EVADING)
/* Flags for mode handling */
#define MODE_EVADE 0x1
#define MODE_SPRINT 0x2
#define MODE_ON 0x4
#define MODE_OFF 0x8
#define MODE_DODGE 0x10
#define MODE_DG_USED 0x20
/* MechFullRecycle check flags */
#define CHECK_WEAPS 0x1
#define CHECK_PHYS 0x2
#define CHECK_BOTH (CHECK_WEAPS|CHECK_PHYS)
#define MechLockFire(mech) \
((MechStatus(mech) & LOCK_TARGET) && \
!(MechStatus(mech) & (LOCK_BUILDING|LOCK_HEX|LOCK_HEX_IGN|LOCK_HEX_CLR)))
/* Macros for accessing some parts */
#define Blinded(a) (MechStatus(a) & BLINDED)
#define Started(a) (MechStatus(a) & STARTED)
#define Uncon(a) (MechStatus(a) & UNCONSCIOUS)
/* critstatus element */
#define GYRO_DESTROYED 0x00000001
#define SENSORS_DAMAGED 0x00000002
#define TAG_DESTROYED 0x00000004
#define HIDDEN 0x00000008
#define GYRO_DAMAGED 0x00000010
#define HIP_DAMAGED 0x00000020
#define LIFE_SUPPORT_DESTROYED 0x00000040
#define ANGEL_ECM_DESTROYED 0x00000080
#define C3I_DESTROYED 0x00000100
#define NSS_DESTROYED 0x00000200
#define SLITE_DEST 0x00000400
#define SLITE_LIT 0x00000800
#define LOAD_OK 0x00001000 /* Carried load recalculated */
#define OWEIGHT_OK 0x00002000 /* Own weight recalculated */
#define SPEED_OK 0x00004000 /* Total speed recalculated */
#define HEATCUTOFF 0x00008000
#define TOWABLE 0x00010000
#define HIP_DESTROYED 0x00020000
#define TC_DESTROYED 0x00040000
#define C3_DESTROYED 0x00080000
#define ECM_DESTROYED 0x00100000
#define BEAGLE_DESTROYED 0x00200000
#define JELLIED 0x00400000 /* Got inferno gel on us */
#define PC_INITIALIZED 0x00800000 /* PC-initialization done already */
#define SPINNING 0x01000000
#define CLAIRVOYANT 0x02000000 /* See everything, regardless of blocked */
#define INVISIBLE 0x04000000 /* Unable to be seen by anyone */
#define CHEAD 0x08000000 /* Altered heading */
#define OBSERVATORIC 0x10000000
#define BLOODHOUND_DESTROYED 0x20000000
#define MECH_STUNNED 0x40000000 /* Is the mech stunned (Exile stun code) */
/* unused 0x80000000 */
/* tankcritstatus element */
#define TURRET_LOCKED 0x01
#define TURRET_JAMMED 0x02 /* can be fixed by player */
#define DUG_IN 0x04
#define DIGGING_IN 0x08
#define CREW_STUNNED 0x10 /* can't go over cruise speed, make any attacks at all, use radio. IE, can't do jack but turn */
#define TAIL_ROTOR_DESTROYED 0x20
/* specials element: used to tell quickly what type of tech the mech has */
#define TRIPLE_MYOMER_TECH 0x01
#define CL_ANTI_MISSILE_TECH 0x02
#define IS_ANTI_MISSILE_TECH 0x04
#define DOUBLE_HEAT_TECH 0x08
#define MASC_TECH 0x10
#define CLAN_TECH 0x20
#define FLIPABLE_ARMS 0x40
#define C3_MASTER_TECH 0x80
#define C3_SLAVE_TECH 0x100
#define ARTEMIS_IV_TECH 0x200
#define ECM_TECH 0x400
#define BEAGLE_PROBE_TECH 0x800
#define SALVAGE_TECH 0x1000 /* 2x 'mech carrying capacity */
#define CARGO_TECH 0x2000 /* 2x cargo carrying capacity */
#define SLITE_TECH 0x4000
#define LOADER_TECH 0x8000
#define AA_TECH 0x10000
#define NS_TECH 0x20000
#define SS_ABILITY 0x40000 /* Has sixth sense */
#define FF_TECH 0x80000 /* Has ferro-fib. armor */
#define ES_TECH 0x100000 /* Has endo-steel internals */
#define XL_TECH 0x200000
#define ICE_TECH 0x400000 /* ICE engine */
#define LIFTER_TECH 0x800000
#define LE_TECH 0x1000000 /* Light engine */
#define XXL_TECH 0x2000000
#define CE_TECH 0x4000000
#define REINFI_TECH 0x8000000
#define COMPI_TECH 0x10000000
#define HARDA_TECH 0x20000000
#define CRITPROOF_TECH 0x40000000
/* 0x80000000 can not be used. */
/* specials2 element: used to tell quickly what type of tech the mech has */
#define STEALTH_ARMOR_TECH 0x01 /* Stealth armor */
#define HVY_FF_ARMOR_TECH 0x02 /* Heavy FF. 1.24 armor multi. 21 slots. */
#define LASER_REF_ARMOR_TECH 0x04 /* Not yet implemented */
#define REACTIVE_ARMOR_TECH 0x08 /* Not yet implemented */
#define NULLSIGSYS_TECH 0x10 /* Null signature system */
#define C3I_TECH 0x20 /* Improved C3 */
#define SUPERCHARGER_TECH 0x40 /* Not yet implemented */
#define IMPROVED_JJ_TECH 0x80 /* Not yet implemented */
#define MECHANICAL_JJ_TECH 0x100 /* Not yet implemented */
#define COMPACT_HS_TECH 0x200 /* Not yet implemented */
#define LASER_HS_TECH 0x400 /* Not yet implemented */
#define BLOODHOUND_PROBE_TECH 0x800 /* BLoodhound Active Probe */
#define ANGEL_ECM_TECH 0x1000 /* Angel ECM suite */
#define WATCHDOG_TECH 0x2000 /* Not yet implemented */
#define LT_FF_ARMOR_TECH 0x4000 /* Heavy FF. 1.06 armor multi. 7 slots. */
#define TAG_TECH 0x8000 /* Target Aquisition Gear */
#define OMNIMECH_TECH 0x10000 /* Is an omni mech */
#define ARTEMISV_TECH 0x20000 /* Not yet implemented */
#define CAMO_TECH 0x40000 /* Allows any unit to 'hide' */
#define CARRIER_TECH 0x80000 /* Can be used as a carrier of mechs */
#define WATERPROOF_TECH 0x100000 /* Can the unit go underwater without problems
for use with tanks */
#define XLGYRO_TECH 0x200000
#define HDGYRO_TECH 0x400000
#define CGYRO_TECH 0x800000
/* Infantry specials */
#define INF_SWARM_TECH 0x01 /* Infantry/BSuits can swarm unfriendlies */
#define INF_MOUNT_TECH 0x02 /* Infantry/BSuits can mount friendlies */
#define INF_ANTILEG_TECH 0x04 /* Infantry/BSuits can make anti-leg attacks */
#define CS_PURIFIER_STEALTH_TECH 0x08 /* CS Purifier stealth technology. +3 at 0MP, +2 at 1MP, +1 at 2MP, +3 at 3+MP. */
#define DC_KAGE_STEALTH_TECH 0x10 /* DC stealth technology. +3 at med, +6 at long. No BAP. */
#define FWL_ACHILEUS_STEALTH_TECH 0x20 /* FWL stealth technology. +1 at short, +4 at medium, +7 at long. No BAP. */
#define FC_INFILTRATOR_STEALTH_TECH 0x40 /* FC stealth technology. +3 at med, +6 at long. No BAP. */
#define FC_INFILTRATORII_STEALTH_TECH 0x80 /* FC stealth II technology. +1 at short, +3 at med, +6 at long. No BAP. ECM in same hex. */
#define MUST_JETTISON_TECH 0x100 /* Special considerations for some suits. Must jettison backpack before they can jump/swarm/anti-leg */
#define CAN_JETTISON_TECH 0x200 /* Whether or not the unit can jettison its backpack */
#define STEALTH_TECH (CS_PURIFIER_STEALTH_TECH|DC_KAGE_STEALTH_TECH|FWL_ACHILEUS_STEALTH_TECH|FC_INFILTRATOR_STEALTH_TECH|FC_INFILTRATORII_STEALTH_TECH)
/* TargComp types */
#define TARGCOMP_NORMAL 0
#define TARGCOMP_SHORT 1
#define TARGCOMP_LONG 2
#define TARGCOMP_MULTI 3
#define TARGCOMP_AA 4
/*
Notes on unimplemented stuff:
- Laser Reflective Armor:
- made for better protection against energy weapons
- 10 crits for IS, 5 for Clan
- 1 vehicle items for IS, 1 for Clan
- 16 pts/ton
- Absorbs 2 pts of damager per pt of armor from energy weapon attacks.
- Single pt attacks still use up 1 pt of armor.
- Due to brittleness, double damage from physical and falling
- Does not apply to unarmored sections
- Reactive Armor:
- made for better protection against missile attacks
- 14 crits for IS, 7 for Clan
- 2 vehicle items for IS, 1 for Clan
- 16 pts/ton
- Can not be mounted on OmniMechs
- Absorbs 2 pts of damager per pt of armor from missile weapon attacks.
- Single pt attacks still use up 1 pt of armor.
- Critical hits on reactive armor slots should be re-rolled, but also
roll 2d6. On roll of 2 chain reaction occurs and destroys all remaining
armor on section (front and back) and cases 1 point of internal damage with
normal chance of critical hit.
- Does not apply to unarmored sections
- Improved JJs
- Weigh twice as much as std JJs
- Take up twice as many crits slots as std JJs
- Can jump as high as running movement
- Heat produced by jumping is 1 pt per 2 hexes
- Minimum of 3 heat
- Mechanical Jump Boosters (Mattress Springs Of Doom)
- Water does not affect them -- can jump out of water
- System takes up all crits slots in all legs
- Any critical hit disabled whole system
- Weighs 5 percent of mech's tonnage * jumping range
- Range not limited by walking/running movement
- Mech can not turn while jumping
- Can not DFA
- Can mount std JJs and mechanical, but can not use both at the same time
- Compact HS
- Weighs 1.5 tons
- Can fit 2 in each crit slot
- Still gets 10 'free heatsinks'
- Number of HS 'in engine' is doubled
- Critical hit destroys both HS
- IS only
- Can not be used by vehicles
- Laser HS
- Not affected by water
- Act as DHS for heat dissipation
- Add 1 to ammo explosion roll
- At night/dusk
- If mech takes any action to generate heat, subtract 1 from
night/dusk modifier
- If mech overheats, remove night/dusk modifier
- Can not be used by vehicles
- Clan only
- Watchdog System
- Clan only
- Acts as ECM suite and active probe
- 1 ton, 1 crit
- Artemis V
- Clan only
- Just like ArtemisIV
- Weighs 1.5 tons and takes up 2 crit slots
- Not compatible with ArtemisIV
- -1 BTH
- Add 3 to missile hit roll
- Blocked by ECM
- iNarc Nemesis pods
- If friendly mech fires SemiGuided or NARC missiles...
- If Nemesis'd unit between firer and target, resolve attack
as if it was fired at the Nemesis'd unit. Add +1 BTH. If attack misses
missiles continue on to normal target.
- If multiple Nemesis'd units are between firer and target, resolve
attack on each in succession from closest unit until all shots hit
or attack continues on to real target
*/
/* Status stuff for common_checks function */
#define MECH_STARTED 0x1
#define MECH_PILOT 0x2
#define MECH_PILOT_CON 0x4
#define MECH_MAP 0x8
#define MECH_CONSISTENT 0x10
#define MECH_PILOTONLY 0x20
#define MECH_USUAL (MECH_CONSISTENT|MECH_MAP|MECH_PILOT_CON|MECH_PILOT|MECH_STARTED)
#define MECH_USUALS (MECH_CONSISTENT|MECH_MAP|MECH_PILOT_CON|MECH_PILOT)
#define MECH_USUALSP (MECH_CONSISTENT|MECH_MAP|MECH_PILOT_CON)
#define MECH_USUALSM (MECH_CONSISTENT|MECH_PILOT_CON|MECH_PILOT)
#define MECH_USUALM (MECH_CONSISTENT|MECH_PILOT_CON|MECH_PILOT|MECH_STARTED)
#define MECH_USUALO (MECH_CONSISTENT|MECH_MAP|MECH_PILOT_CON|MECH_PILOT|MECH_STARTED|MECH_PILOTONLY)
#define MECH_USUALSO (MECH_CONSISTENT|MECH_MAP|MECH_PILOT_CON|MECH_PILOT|MECH_PILOTONLY)
#define MECH_USUALSPO (MECH_CONSISTENT|MECH_MAP|MECH_PILOT_CON|MECH_PILOTONLY)
#define MECH_USUALSMO (MECH_CONSISTENT|MECH_PILOT_CON|MECH_PILOT|MECH_PILOTONLY)
#define MECH_USUALMO (MECH_CONSISTENT|MECH_PILOT_CON|MECH_PILOT|MECH_STARTED|MECH_PILOTONLY)
extern struct weapon_struct MechWeapons[];
extern struct missile_hit_table_struct MissileHitTable[];
#define TELE_ALL 1 /* Tele all, not just mortals */
#define TELE_SLAVE 2 /* Make slaves in progress (not of wizzes, though) */
#define TELE_LOUD 4 /* Loudly teleport */
#define TELE_XP 8 /* Lose 1/3 XP */
#define MINE_STEP 1 /* Someone steps to a hex */
#define MINE_LAND 2 /* Someone lands in a hex */
#define MINE_FALL 3 /* Someone falls in the hex */
#define MINE_DROP 4 /* Someone drops to ground in the hex */
extern void *FindObjectsData(dbref key);
#ifndef ECMD
#define ECMD(a) extern void a (dbref player, void *data, char *buffer)
#endif
#define destroy_object(obj) destroy_thing(obj)
#define create_object(name) create_obj(GOD, TYPE_THING, name, 1)
#define A_MECHREF A_MECHTYPE
#define MECH_PATH mudconf.mech_db
#define MAP_PATH mudconf.map_db
#define WSDUMP_MASK_ER "%-24s %2d %2d %2d %2d %2d %3d %3d %2d"
#define WSDUMP_MASK_NOER "%-24s %2d %2d %2d %2d %2d %3d %2d"
#define WSDUMP_MASKS_ER "%%cgWeapon Name Heat Damage Range: Min Short Med Long Ext VRT"
#define WSDUMP_MASKS_NOER "%%cgWeapon Name Heat Damage Range: Min Short Med Long VRT"
#define WDUMP_MASK "%-24s %2d %2d %2d %2d %2d %3d %2d %2d %d"
#define WDUMP_MASKS "%%cgWeapon Name Heat Damage Range: Min Short Med Long VRT C ApT"
#include "btmacros.h"
#include "p.glue.hcode.h"
#include "map.h"
#include "map.coding.h"
#include "glue.h"
#include "p.glue.h"
#include "mech.notify.h"
/* For mech.lostracer.c's TraceLOS() */
typedef struct {
int x;
int y;
} lostrace_info;
#endif /* MECH_H */