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