1 #ifndef _ASSIGNMENTS_H
2 #define _ASSIGNMENTS_H
3 
4 // header for assignment manipulation/updating for characters
5 
6 #include "Types.h"
7 struct GROUP;
8 struct PopUpBox;
9 struct SOLDIERTYPE;
10 
11 
12 // this distinguishes whether we're only looking for patients healable THIS HOUR (those that have been on their assignment
13 // long enough), or those that will be healable EVER (regardless of whether they're getting healed during this hour)
14 #define HEALABLE_EVER				0
15 #define HEALABLE_THIS_HOUR			1
16 
17 
18 // merc collapses from fatigue if max breath drops to this.  Can't go any lower!
19 #define BREATHMAX_ABSOLUTE_MINIMUM		10
20 #define BREATHMAX_GOTTA_STOP_MOVING		30
21 #define BREATHMAX_PRETTY_TIRED			50
22 #define BREATHMAX_CANCEL_COLLAPSE		60
23 #define BREATHMAX_CANCEL_TIRED			75
24 #define BREATHMAX_FULLY_RESTED			95
25 
26 
27 #define VEHICLE_REPAIR_POINTS_DIVISOR		10
28 
29 
30 // Assignments Defines
31 enum{
32 	SQUAD_1 =0,
33 	SQUAD_2,
34 	SQUAD_3,
35 	SQUAD_4,
36 	SQUAD_5,
37 	SQUAD_6,
38 	SQUAD_7,
39 	SQUAD_8,
40 	SQUAD_9,
41 	SQUAD_10,
42 	SQUAD_11,
43 	SQUAD_12,
44 	SQUAD_13,
45 	SQUAD_14,
46 	SQUAD_15,
47 	SQUAD_16,
48 	SQUAD_17,
49 	SQUAD_18,
50 	SQUAD_19,
51 	SQUAD_20,
52 	ON_DUTY,
53 	DOCTOR,
54 	PATIENT,
55 	VEHICLE,
56 	IN_TRANSIT,
57 	REPAIR,
58 	TRAIN_SELF,
59 	TRAIN_TOWN,
60 	TRAIN_TEAMMATE,
61 	TRAIN_BY_OTHER,
62 	ASSIGNMENT_DEAD,
63 	ASSIGNMENT_UNCONCIOUS, // unused
64 	ASSIGNMENT_POW,
65 	ASSIGNMENT_HOSPITAL,
66 	ASSIGNMENT_EMPTY,
67 };
68 
69 #define NO_ASSIGNMENT		127 //used when no pSoldier->ubDesiredSquad
70 
71 // Train stats defines (must match ATTRIB_MENU_ defines, and pAttributeMenuStrings )
72 enum{
73 	STRENGTH = 0,
74 	DEXTERITY,
75 	AGILITY,
76 	HEALTH,
77 	MARKSMANSHIP,
78 	MEDICAL,
79 	MECHANICAL,
80 	LEADERSHIP,
81 	EXPLOSIVE_ASSIGN,
82 	NUM_TRAINABLE_STATS
83 	// NOTE: Wisdom isn't trainable!
84 };
85 
86 
87 struct TOWN_TRAINER_TYPE
88 {
89 	SOLDIERTYPE *pSoldier;
90 	INT16	sTrainingPts;
91 };
92 
93 
94 // can character train militia?
95 BOOLEAN CanCharacterTrainMilitia(const SOLDIERTYPE* s);
96 
97 // if merc could train militia here, do they have sufficient loyalty?
98 BOOLEAN DoesSectorMercIsInHaveSufficientLoyaltyToTrainMilitia(const SOLDIERTYPE* s);
99 
100 // is the character in transit?
101 bool IsCharacterInTransit(SOLDIERTYPE const&);
102 
103 // handler for assignments -- called once per hour via event
104 void UpdateAssignments(void);
105 
106 void MakeSoldiersTacticalAnimationReflectAssignment( SOLDIERTYPE *pSoldier );
107 
108 // build list of sectors with mercs
109 void BuildSectorsWithSoldiersList( void );
110 
111 // init sectors with soldiers list
112 void InitSectorsWithSoldiersList( void );
113 
114 // is there a soldier in this sector?..only use after BuildSectorsWithSoldiersList is called
115 BOOLEAN IsThereASoldierInThisSector( INT16 sSectorX, INT16 sSectorY, INT8 bSectorZ );
116 
117 void CheckIfSoldierUnassigned( SOLDIERTYPE *pSoldier );
118 
119 // figure out the assignment menu pop up box positions
120 void DetermineBoxPositions( void );
121 
122 // set x,y position in tactical
123 void SetTacticalPopUpAssignmentBoxXY( void );
124 
125 // get number of pts that are being used this strategic turn
126 INT16 GetTownTrainPtsForCharacter(const SOLDIERTYPE* pTrainer, UINT16* pusMaxPts);
127 
128 
129 // find number of healing pts
130 UINT16 CalculateHealingPointsForDoctor(SOLDIERTYPE *pSoldier, UINT16 *pusMaxPts, BOOLEAN fMakeSureKitIsInHand );
131 
132 // find number of repair pts repairman has available
133 UINT8 CalculateRepairPointsForRepairman(SOLDIERTYPE *pSoldier, UINT16 *pusMaxPts, BOOLEAN fMakeSureKitIsInHand );
134 
135 
136 // get bonus tarining pts due to an instructor for this student
137 INT16 GetBonusTrainingPtsDueToInstructor(const SOLDIERTYPE* pInstructor, const SOLDIERTYPE* pStudent, INT8 bTrainStat, BOOLEAN fAtGunRange, UINT16* pusMaxPts);
138 
139 // get training pts for this soldier
140 INT16 GetSoldierTrainingPts(const SOLDIERTYPE* s, INT8 bTrainStat, BOOLEAN fAtGunRange, UINT16* pusMaxPts);
141 
142 // pts for being a student for this soldier
143 INT16 GetSoldierStudentPts(const SOLDIERTYPE* s, INT8 bTrainStat, BOOLEAN fAtGunRange, UINT16* pusMaxPts);
144 
145 // Handle assignment done
146 void AssignmentDone( SOLDIERTYPE *pSoldier, BOOLEAN fSayQuote, BOOLEAN fMeToo );
147 
148 void FatigueCharacter(SOLDIERTYPE& s);
149 
150 extern PopUpBox* ghAssignmentBox;
151 extern PopUpBox* ghEpcBox;
152 extern PopUpBox* ghSquadBox;
153 extern PopUpBox* ghRepairBox;
154 extern PopUpBox* ghTrainingBox;
155 extern PopUpBox* ghAttributeBox;
156 extern PopUpBox* ghRemoveMercAssignBox;
157 extern PopUpBox* ghContractBox;
158 extern PopUpBox* ghMoveBox;
159 
160 
161 extern BOOLEAN fShownContractMenu;
162 extern BOOLEAN fShownAssignmentMenu;
163 extern BOOLEAN fShowRepairMenu;
164 
165 extern BOOLEAN fFirstClickInAssignmentScreenMask;
166 
167 extern BOOLEAN gfReEvaluateEveryonesNothingToDo;
168 
169 
170 void CreateDestroyMouseRegionsForContractMenu( void );
171 void HandleShadingOfLinesForAssignmentMenus( void );
172 void CreateDestroyScreenMaskForAssignmentAndContractMenus( void );
173 
174 
175 void CreateDestroyAssignmentPopUpBoxes();
176 void SetSoldierAssignmentHospital(SOLDIERTYPE&);
177 void SetSoldierAssignmentRepair(SOLDIERTYPE&, BOOLEAN robot, INT8 vehicle_id);
178 
179 // set merc asleep and awake under the new sleep system implemented June 29, 1998
180 // if give warning is false, the function can be used as an internal function
181 BOOLEAN SetMercAwake( SOLDIERTYPE *pSoldier, BOOLEAN fGiveWarning, BOOLEAN fForceHim );
182 bool SetMercAsleep(SOLDIERTYPE&, bool give_warning);
183 void PutMercInAsleepState(SOLDIERTYPE&);
184 BOOLEAN PutMercInAwakeState( SOLDIERTYPE *pSoldier );
185 
186 // set what time this merc undertook this assignment
187 void SetTimeOfAssignmentChangeForMerc( SOLDIERTYPE *pSoldier );
188 
189 // check if any merc in group is too tired to keep moving
190 BOOLEAN AnyMercInGroupCantContinueMoving(GROUP const&);
191 
192 // handle selected group of mercs being put to sleep
193 BOOLEAN HandleSelectedMercsBeingPutAsleep( BOOLEAN fWakeUp, BOOLEAN fDisplayWarning );
194 
195 // is any one on the team on this assignment?
196 BOOLEAN IsAnyOneOnPlayersTeamOnThisAssignment( INT8 bAssignment );
197 
198 // rebuild assignments box
199 void RebuildAssignmentsBox( void );
200 
201 void BandageBleedingDyingPatientsBeingTreated(void);
202 
203 void ReEvaluateEveryonesNothingToDo(void);
204 
205 // set assignment for list of characters
206 void SetAssignmentForList( INT8 bAssignment, INT8 bParam );
207 
208 // function where we actually set someone's assignment so we can trap certain situations
209 void ChangeSoldiersAssignment( SOLDIERTYPE *pSoldier, INT8 bAssignment );
210 
211 void UnEscortEPC( SOLDIERTYPE *pSoldier );
212 
213 SOLDIERTYPE *AnyDoctorWhoCanHealThisPatient( SOLDIERTYPE *pPatient, BOOLEAN fThisHour );
214 
215 void DetermineWhichAssignmentMenusCanBeShown(void);
216 void ResumeOldAssignment(SOLDIERTYPE* pSoldier);
217 bool PlayerSoldierTooTiredToTravel(SOLDIERTYPE&);
218 
219 void CreateContractBox(const SOLDIERTYPE* s);
220 
221 // screen mask for pop up menus
222 void ClearScreenMaskForMapScreenExit(void);
223 
224 void CreateMercRemoveAssignBox(void);
225 
226 #endif
227