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