1 #ifndef LOS_H 2 #define LOS_H 3 4 #include "JA2Types.h" 5 6 //#define LOS_DEBUG 7 8 9 // fixed-point arithmetic definitions start here 10 11 typedef INT32 FIXEDPT; 12 // rem 1 signed bit at the top 13 #define FIXEDPT_WHOLE_BITS 11 14 #define FIXEDPT_FRACTIONAL_BITS 20 15 #define FIXEDPT_FRACTIONAL_RESOLUTION 1048576 16 17 #define INT32_TO_FIXEDPT( n ) ( (n) << FIXEDPT_FRACTIONAL_BITS ) 18 #define FIXEDPT_TO_INT32( n ) ( (n) / FIXEDPT_FRACTIONAL_RESOLUTION ) 19 20 #define FIXEDPT_TO_TILE_NUM( n ) (FIXEDPT_TO_INT32( (n) ) / CELL_X_SIZE) 21 #define FIXEDPT_TO_LOS_INDEX( n ) (CONVERT_WITHINTILE_TO_INDEX( FIXEDPT_TO_INT32( (n) ) % CELL_X_SIZE)) 22 23 // fixed-point arithmetic definitions end here 24 25 #define OK_CHANCE_TO_GET_THROUGH 10 26 27 enum CollisionEnums 28 { 29 COLLISION_NONE, 30 COLLISION_GROUND, 31 COLLISION_MERC, 32 COLLISION_WINDOW_SOUTHEAST, 33 COLLISION_WINDOW_SOUTHWEST, 34 COLLISION_WINDOW_NORTHEAST, 35 COLLISION_WINDOW_NORTHWEST, 36 COLLISION_WINDOW_NORTH, 37 COLLISION_WALL_SOUTHEAST, 38 COLLISION_WALL_SOUTHWEST, 39 COLLISION_WALL_NORTHEAST, 40 COLLISION_WALL_NORTHWEST, 41 COLLISION_STRUCTURE, 42 COLLISION_ROOF, 43 COLLISION_INTERIOR_ROOF, 44 COLLISION_STRUCTURE_Z, 45 COLLISION_WATER 46 }; 47 48 49 INT32 CheckForCollision(FLOAT dX, FLOAT dY, FLOAT dZ, FLOAT dDeltaX, FLOAT dDeltaY, FLOAT dDeltaZ, UINT16* pusStructureID, FLOAT* pdNormalX, FLOAT* pdNormalY, FLOAT* pdNormalZ); 50 51 INT8 FireBulletGivenTarget( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY, FLOAT dEndZ, UINT16 usHandItem, INT16 sHitBy, BOOLEAN fBuckshot, BOOLEAN fFake ); 52 53 INT32 SoldierToSoldierLineOfSightTest(const SOLDIERTYPE* pStartSoldier, const SOLDIERTYPE* pEndSoldier, UINT8 ubTileSightLimit, INT8 bAware); 54 INT32 SoldierToLocationLineOfSightTest( SOLDIERTYPE * pStartSoldier, INT16 sGridNo, UINT8 ubSightLimit, INT8 bAware ); 55 INT32 SoldierTo3DLocationLineOfSightTest(const SOLDIERTYPE* pStartSoldier, INT16 sGridNo, INT8 bLevel, INT8 bCubeLevel, UINT8 ubTileSightLimit, INT8 bAware); 56 INT32 SoldierToBodyPartLineOfSightTest( const SOLDIERTYPE * pStartSoldier, INT16 sGridNo, INT8 bLevel, UINT8 ubAimLocation, UINT8 ubTileSightLimit, INT8 bAware ); 57 INT32 SoldierToVirtualSoldierLineOfSightTest(const SOLDIERTYPE* pStartSoldier, INT16 sGridNo, INT8 bLevel, INT8 bStance, UINT8 ubTileSightLimit, INT8 bAware); 58 UINT8 SoldierToSoldierBodyPartChanceToGetThrough(SOLDIERTYPE* pStartSoldier, const SOLDIERTYPE* pEndSoldier, UINT8 ubAimLocation); 59 UINT8 AISoldierToSoldierChanceToGetThrough(SOLDIERTYPE* pStartSoldier, const SOLDIERTYPE* pEndSoldier); 60 UINT8 AISoldierToLocationChanceToGetThrough( SOLDIERTYPE * pStartSoldier, INT16 sGridNo, INT8 bLevel, INT8 bCubeLevel ); 61 UINT8 SoldierToLocationChanceToGetThrough(SOLDIERTYPE* pStartSoldier, INT16 sGridNo, INT8 bLevel, INT8 bCubeLevel, const SOLDIERTYPE* target); 62 INT16 SoldierToLocationWindowTest(const SOLDIERTYPE* pStartSoldier, INT16 sEndGridNo); 63 INT32 LocationToLocationLineOfSightTest( INT16 sStartGridNo, INT8 bStartLevel, INT16 sEndGridNo, INT8 bEndLevel, UINT8 ubTileSightLimit, INT8 bAware ); 64 65 BOOLEAN CalculateSoldierZPos(const SOLDIERTYPE* pSoldier, UINT8 ubPosType, FLOAT* pdZPos); 66 67 68 #define HEIGHT_UNITS 256 69 #define HEIGHT_UNITS_PER_INDEX (HEIGHT_UNITS / PROFILE_Z_SIZE) 70 #define MAX_STRUCTURE_HEIGHT 50 71 // 5.12 == HEIGHT_UNITS / MAX_STRUCTURE_HEIGHT 72 #define CONVERT_PIXELS_TO_HEIGHTUNITS( n ) ((n) * HEIGHT_UNITS / MAX_STRUCTURE_HEIGHT) 73 #define CONVERT_PIXELS_TO_INDEX( n ) ((n) * HEIGHT_UNITS / MAX_STRUCTURE_HEIGHT / HEIGHT_UNITS_PER_INDEX) 74 #define CONVERT_HEIGHTUNITS_TO_INDEX( n ) ((n) / HEIGHT_UNITS_PER_INDEX) 75 #define CONVERT_HEIGHTUNITS_TO_DISTANCE( n ) ((n) / (HEIGHT_UNITS / CELL_X_SIZE) ) 76 #define CONVERT_HEIGHTUNITS_TO_PIXELS( n ) ((n) * MAX_STRUCTURE_HEIGHT / HEIGHT_UNITS ) 77 #define CONVERT_WITHINTILE_TO_INDEX( n ) ((n) >> 1) 78 #define CONVERT_INDEX_TO_WITHINTILE( n ) ((n) << 1) 79 #define CONVERT_INDEX_TO_PIXELS( n ) ((n) * MAX_STRUCTURE_HEIGHT * HEIGHT_UNITS_PER_INDEX / HEIGHT_UNITS) 80 81 82 enum { 83 LOS_POS, 84 FIRING_POS, 85 TARGET_POS, 86 HEAD_TARGET_POS, 87 TORSO_TARGET_POS, 88 LEGS_TARGET_POS, 89 HEIGHT 90 }; 91 92 // 191 is 6' (structures of height 3) 93 // 127 is 4' (structures of height 2) 94 // 63 is 2' (structures of height 1) 95 96 97 #define STANDING_HEIGHT 191.0f 98 #define STANDING_LOS_POS 175.0f 99 #define STANDING_FIRING_POS 175.0f 100 #define STANDING_HEAD_TARGET_POS 175.0f 101 #define STANDING_HEAD_BOTTOM_POS 159.0f 102 #define STANDING_TORSO_TARGET_POS 127.0f 103 #define STANDING_TORSO_BOTTOM_POS 95.0f 104 #define STANDING_LEGS_TARGET_POS 47.0f 105 #define STANDING_TARGET_POS STANDING_HEAD_TARGET_POS 106 107 #define CROUCHED_HEIGHT 130.0f 108 #define CROUCHED_LOS_POS 111.0f 109 #define CROUCHED_FIRING_POS 111.0f 110 111 #define CROUCHED_HEAD_TARGET_POS 111.0f 112 #define CROUCHED_HEAD_BOTTOM_POS 95.0f 113 #define CROUCHED_TORSO_TARGET_POS 71.0f 114 #define CROUCHED_TORSO_BOTTOM_POS 47.0f 115 #define CROUCHED_LEGS_TARGET_POS 31.0f 116 #define CROUCHED_TARGET_POS CROUCHED_HEAD_TARGET_POS 117 118 #define PRONE_HEIGHT 63.0f 119 #define PRONE_LOS_POS 31.0f 120 #define PRONE_FIRING_POS 31.0f 121 #define PRONE_TORSO_TARGET_POS 31.0f 122 #define PRONE_HEAD_TARGET_POS 31.0f 123 #define PRONE_LEGS_TARGET_POS 31.0f 124 #define PRONE_TARGET_POS PRONE_HEAD_TARGET_POS 125 126 #define WALL_HEIGHT_UNITS HEIGHT_UNITS 127 #define WINDOW_BOTTOM_HEIGHT_UNITS 87 128 #define WINDOW_TOP_HEIGHT_UNITS 220 129 130 #define CLOSE_TO_FIRER 25 131 #define VERY_CLOSE_TO_FIRER 21 132 133 #ifdef LOS_DEBUG 134 struct LOSResults 135 { 136 BOOLEAN fLOSTestPerformed; 137 BOOLEAN fLOSClear; 138 BOOLEAN fOutOfRange; 139 INT32 iDistance; 140 INT32 iMaxDistance; 141 UINT8 ubTreeSpotsHit; 142 INT32 iStartX; 143 INT32 iStartY; 144 INT32 iStartZ; 145 INT32 iEndX; 146 INT32 iEndY; 147 INT32 iEndZ; 148 INT32 iStoppedX; 149 INT32 iStoppedY; 150 INT32 iStoppedZ; 151 INT32 iCurrCubesZ; 152 UINT8 ubChanceToGetThrough; 153 }; 154 155 extern LOSResults gLOSTestResults; 156 157 #endif 158 159 void MoveBullet(BULLET* b); 160 161 #endif 162