LOS.h 6.4 KB

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