1 #include "Cursors.h"
2 #include "Directories.h"
3 #include "HImage.h"
4 #include "Laptop.h"
5 #include "AIMFacialIndex.h"
6 #include "MercPortrait.h"
7 #include "Merc_Hiring.h"
8 #include "Soldier_Control.h"
9 #include "VObject.h"
10 #include "WordWrap.h"
11 #include "AIM.h"
12 #include "Soldier_Profile.h"
13 #include "Text.h"
14 #include "AIMSort.h"
15 #include "Assignments.h"
16 #include "Button_System.h"
17 #include "Video.h"
18 #include "VSurface.h"
19 #include "Font_Control.h"
20
21 #include <string_theory/string>
22
23
24 extern UINT8 gbCurrentIndex;
25
26
27 static SGPVObject* guiMugShotBorder;
28 static SGPVObject* guiAimFiFace[MAX_NUMBER_MERCS];
29
30
31
32 #define AIM_FI_NUM_MUHSHOTS_X 8
33 #define AIM_FI_NUM_MUHSHOTS_Y 5
34
35 #define AIM_FI_PORTRAIT_WIDTH 52
36 #define AIM_FI_PORTRAIT_HEIGHT 48
37
38 #define AIM_FI_FIRST_MUGSHOT_X IMAGE_OFFSET_X + 6
39 #define AIM_FI_FIRST_MUGSHOT_Y IMAGE_OFFSET_Y + 69//67//70 //68 //65
40 #define AIM_FI_MUGSHOT_GAP_X 10
41 #define AIM_FI_MUGSHOT_GAP_Y 13
42 #define AIM_FI_FACE_OFFSET 2
43
44 #define AIM_FI_NNAME_OFFSET_X 2
45 #define AIM_FI_NNAME_OFFSET_Y AIM_FI_PORTRAIT_HEIGHT+1
46 #define AIM_FI_NNAME_WIDTH AIM_FI_PORTRAIT_WIDTH+4
47
48 #define AIM_FI_MEMBER_TEXT_X IMAGE_OFFSET_X + 155
49 #define AIM_FI_MEMBER_TEXT_Y AIM_SYMBOL_Y + AIM_SYMBOL_SIZE_Y + 1
50 #define AIM_FI_MEMBER_TEXT_WIDTH 190
51
52 #define AIM_FI_AWAY_TEXT_OFFSET_X 3
53 #define AIM_FI_AWAY_TEXT_OFFSET_Y 23//3//36
54 #define AIM_FI_AWAY_TEXT_OFFSET_WIDTH 48
55
56
57 //Mouse Regions
58
59 //Face regions
60 static MOUSE_REGION gMercFaceMouseRegions[MAX_NUMBER_MERCS];
61
62 //Screen region, used to right click to go back to previous page
63 static MOUSE_REGION gScreenMouseRegions;
64
65
66 static void SelectMercFaceMoveRegionCallBack(MOUSE_REGION* pRegion, INT32 reason);
67 static void SelectMercFaceRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
68 static void SelectScreenRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
69
70
EnterAimFacialIndex()71 void EnterAimFacialIndex()
72 {
73 UINT8 i;
74 UINT16 usPosX, usPosY, x,y;
75
76 // load the Portait graphic and add it
77 guiMugShotBorder = AddVideoObjectFromFile(LAPTOPDIR "/mugshotborder3.sti");
78
79 usPosX = AIM_FI_FIRST_MUGSHOT_X;
80 usPosY = AIM_FI_FIRST_MUGSHOT_Y;
81 i=0;
82 for(y=0; y<AIM_FI_NUM_MUHSHOTS_Y; y++)
83 {
84 for(x=0; x<AIM_FI_NUM_MUHSHOTS_X; x++)
85 {
86
87 MSYS_DefineRegion(&gMercFaceMouseRegions[ i ], usPosX, usPosY,
88 (INT16)(usPosX + AIM_FI_PORTRAIT_WIDTH),
89 (INT16)(usPosY + AIM_FI_PORTRAIT_HEIGHT),
90 MSYS_PRIORITY_HIGH,
91 CURSOR_WWW, SelectMercFaceMoveRegionCallBack,
92 SelectMercFaceRegionCallBack);
93 MSYS_SetRegionUserData( &gMercFaceMouseRegions[ i ], 0, i);
94
95 guiAimFiFace[i] = LoadSmallPortrait(GetProfile(AimMercArray[i]));
96
97 usPosX += AIM_FI_PORTRAIT_WIDTH + AIM_FI_MUGSHOT_GAP_X;
98 i++;
99 }
100 usPosX = AIM_FI_FIRST_MUGSHOT_X;
101 usPosY += AIM_FI_PORTRAIT_HEIGHT + AIM_FI_MUGSHOT_GAP_Y;
102 }
103
104 MSYS_DefineRegion(&gScreenMouseRegions, LAPTOP_SCREEN_UL_X, LAPTOP_SCREEN_WEB_UL_Y,
105 LAPTOP_SCREEN_LR_X, LAPTOP_SCREEN_WEB_LR_Y, MSYS_PRIORITY_HIGH-1,
106 CURSOR_LAPTOP_SCREEN, MSYS_NO_CALLBACK, SelectScreenRegionCallBack);
107
108 InitAimMenuBar();
109 InitAimDefaults();
110
111 RenderAimFacialIndex();
112 }
113
114
ExitAimFacialIndex()115 void ExitAimFacialIndex()
116 {
117 RemoveAimDefaults();
118
119 DeleteVideoObject(guiMugShotBorder);
120
121 FOR_EACH(SGPVObject*, i, guiAimFiFace) DeleteVideoObject(*i);
122 FOR_EACH(MOUSE_REGION, i, gMercFaceMouseRegions) MSYS_RemoveRegion(&*i);
123 ExitAimMenuBar();
124
125 MSYS_RemoveRegion(&gScreenMouseRegions);
126 }
127
128
129 static void DrawMercsFaceToScreen(UINT8 ubMercID, UINT16 usPosX, UINT16 usPosY, UINT8 ubImage);
130
131
RenderAimFacialIndex()132 void RenderAimFacialIndex()
133 {
134 UINT16 usPosX, usPosY, x,y;
135 ST::string sString;
136 UINT8 i;
137
138 DrawAimDefaults();
139
140 //Display the 'A.I.M. Members Sorted Ascending By Price' type string
141 if( gubCurrentListMode == AIM_ASCEND )
142 sString = st_format_printf(AimFiText[ AIM_FI_AIM_MEMBERS_SORTED_ASCENDING ], AimFiText[gubCurrentSortMode]);
143 else
144 sString = st_format_printf(AimFiText[ AIM_FI_AIM_MEMBERS_SORTED_DESCENDING ], AimFiText[gubCurrentSortMode]);
145
146 DrawTextToScreen(sString, AIM_FI_MEMBER_TEXT_X, AIM_FI_MEMBER_TEXT_Y, AIM_FI_MEMBER_TEXT_WIDTH, AIM_MAINTITLE_FONT, AIM_MAINTITLE_COLOR, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
147
148
149 //Draw the mug shot border and face
150 usPosX = AIM_FI_FIRST_MUGSHOT_X;
151 usPosY = AIM_FI_FIRST_MUGSHOT_Y;
152
153 i=0;
154 for(y=0; y<AIM_FI_NUM_MUHSHOTS_Y; y++)
155 {
156 for(x=0; x<AIM_FI_NUM_MUHSHOTS_X; x++)
157 {
158 DrawMercsFaceToScreen(i, usPosX, usPosY, 1);
159 DrawTextToScreen(gMercProfiles[AimMercArray[i]].zNickname, usPosX - AIM_FI_NNAME_OFFSET_X, usPosY + AIM_FI_NNAME_OFFSET_Y, AIM_FI_NNAME_WIDTH, AIM_FONT12ARIAL, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
160
161 usPosX += AIM_FI_PORTRAIT_WIDTH + AIM_FI_MUGSHOT_GAP_X;
162 i++;
163 }
164 usPosX = AIM_FI_FIRST_MUGSHOT_X;
165 usPosY += AIM_FI_PORTRAIT_HEIGHT + AIM_FI_MUGSHOT_GAP_Y;
166 }
167
168 DisableAimButton();
169
170 //display the 'left and right click' onscreen help msg
171 DrawTextToScreen(AimFiText[AIM_FI_LEFT_CLICK], AIM_FI_LEFT_CLICK_TEXT_X, AIM_FI_LEFT_CLICK_TEXT_Y, AIM_FI_CLICK_TEXT_WIDTH, AIM_FI_HELP_TITLE_FONT, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
172 DrawTextToScreen(AimFiText[AIM_FI_TO_SELECT], AIM_FI_LEFT_CLICK_TEXT_X, AIM_FI_LEFT_CLICK_TEXT_Y + AIM_FI_CLICK_DESC_TEXT_Y_OFFSET, AIM_FI_CLICK_TEXT_WIDTH, AIM_FI_HELP_FONT, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
173
174 DrawTextToScreen(AimFiText[AIM_FI_RIGHT_CLICK], AIM_FI_RIGHT_CLICK_TEXT_X, AIM_FI_LEFT_CLICK_TEXT_Y, AIM_FI_CLICK_TEXT_WIDTH, AIM_FI_HELP_TITLE_FONT, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
175 DrawTextToScreen(AimFiText[AIM_FI_TO_ENTER_SORT_PAGE], AIM_FI_RIGHT_CLICK_TEXT_X, AIM_FI_LEFT_CLICK_TEXT_Y + AIM_FI_CLICK_DESC_TEXT_Y_OFFSET, AIM_FI_CLICK_TEXT_WIDTH, AIM_FI_HELP_FONT, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
176
177 MarkButtonsDirty( );
178
179 RenderWWWProgramTitleBar( );
180
181 InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_WEB_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_WEB_LR_Y);
182 }
183
184
SelectMercFaceRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)185 static void SelectMercFaceRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
186 {
187 if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
188 {
189 guiCurrentLaptopMode = LAPTOP_MODE_AIM_MEMBERS;
190 gbCurrentIndex = (UINT8) MSYS_GetRegionUserData( pRegion, 0 );
191 }
192 else if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
193 {
194 guiCurrentLaptopMode = LAPTOP_MODE_AIM_MEMBERS_SORTED_FILES;
195 }
196 }
197
198
SelectScreenRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)199 static void SelectScreenRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
200 {
201 if (iReason & MSYS_CALLBACK_REASON_RBUTTON_UP)
202 {
203 guiCurrentLaptopMode = LAPTOP_MODE_AIM_MEMBERS_SORTED_FILES;
204 }
205 }
206
207
SelectMercFaceMoveRegionCallBack(MOUSE_REGION * pRegion,INT32 reason)208 static void SelectMercFaceMoveRegionCallBack(MOUSE_REGION* pRegion, INT32 reason)
209 {
210 UINT8 ubMercNum;
211 UINT16 usPosX, usPosY;
212
213 ubMercNum = (UINT8) MSYS_GetRegionUserData( pRegion, 0 );
214
215 usPosY = ubMercNum / AIM_FI_NUM_MUHSHOTS_X;
216 usPosY = AIM_FI_FIRST_MUGSHOT_Y + (AIM_FI_PORTRAIT_HEIGHT + AIM_FI_MUGSHOT_GAP_Y) * usPosY;
217
218 usPosX = ubMercNum % AIM_FI_NUM_MUHSHOTS_X;
219 usPosX = AIM_FI_FIRST_MUGSHOT_X + (AIM_FI_PORTRAIT_WIDTH + AIM_FI_MUGSHOT_GAP_X) * usPosX;
220
221 //fReDrawNewMailFlag = TRUE;
222
223 if( reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
224 {
225 DrawMercsFaceToScreen(ubMercNum, usPosX, usPosY, 1);
226 InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
227 }
228 else if( reason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
229 {
230 DrawMercsFaceToScreen(ubMercNum, usPosX, usPosY, 0);
231 InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
232 }
233 }
234
235
DrawMercsFaceToScreen(const UINT8 ubMercID,const UINT16 usPosX,const UINT16 usPosY,const UINT8 ubImage)236 static void DrawMercsFaceToScreen(const UINT8 ubMercID, const UINT16 usPosX, const UINT16 usPosY, const UINT8 ubImage)
237 {
238 const ProfileID id = AimMercArray[ubMercID];
239 const SOLDIERTYPE* const s = FindSoldierByProfileIDOnPlayerTeam(id);
240
241 //Blt the portrait background
242 BltVideoObject(FRAME_BUFFER, guiMugShotBorder, ubImage, usPosX, usPosY);
243
244 SGPVObject* const face = guiAimFiFace[ubMercID];
245
246 BOOLEAN shaded;
247 ST::string text;
248 MERCPROFILESTRUCT const& p = GetProfile(id);
249 if (IsMercDead(p))
250 {
251 // the merc is dead, so shade the face red
252 face->pShades[0] = Create16BPPPaletteShaded(face->Palette(), DEAD_MERC_COLOR_RED, DEAD_MERC_COLOR_GREEN, DEAD_MERC_COLOR_BLUE, TRUE);
253 face->CurrentShade(0);
254 shaded = FALSE;
255 text = AimFiText[AIM_FI_DEAD];
256 }
257 else if (p.bMercStatus == MERC_FIRED_AS_A_POW || (s && s->bAssignment == ASSIGNMENT_POW))
258 {
259 // the merc is currently a POW or, the merc was fired as a pow
260 shaded = TRUE;
261 text = pPOWStrings[0];
262 }
263 else if (s != NULL)
264 {
265 // the merc is on our team
266 shaded = TRUE;
267 text = MercInfo[MERC_FILES_ALREADY_HIRED];
268 }
269 else if (!IsMercHireable(p))
270 {
271 // the merc is away, shadow his/her face and blit 'away' over top
272 shaded = TRUE;
273 text = AimFiText[AIM_FI_DEAD + 1];
274 }
275 else
276 {
277 shaded = FALSE;
278 text = ST::null;
279 }
280
281 BltVideoObject(FRAME_BUFFER, face, 0, usPosX + AIM_FI_FACE_OFFSET, usPosY + AIM_FI_FACE_OFFSET);
282
283 if (shaded)
284 {
285 FRAME_BUFFER->ShadowRect(usPosX + AIM_FI_FACE_OFFSET, usPosY + AIM_FI_FACE_OFFSET, usPosX + 48 + AIM_FI_FACE_OFFSET, usPosY + 43 + AIM_FI_FACE_OFFSET);
286 }
287
288 if (text != NULL)
289 {
290 DrawTextToScreen(text, usPosX + AIM_FI_AWAY_TEXT_OFFSET_X, usPosY + AIM_FI_AWAY_TEXT_OFFSET_Y, AIM_FI_AWAY_TEXT_OFFSET_WIDTH, FONT10ARIAL, 145, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
291 }
292 }
293