1 #include "Cursors.h"
2 #include "Directories.h"
3 #include "Font.h"
4 #include "Laptop.h"
5 #include "AIM.h"
6 #include "VObject.h"
7 #include "Timer_Control.h"
8 #include "WordWrap.h"
9 #include "EMail.h"
10 #include "Game_Clock.h"
11 #include "Text.h"
12 #include "LaptopSave.h"
13 #include "Multi_Language_Graphic_Utils.h"
14 #include "Video.h"
15 #include "VSurface.h"
16 #include "Button_System.h"
17 #include "Font_Control.h"
18 
19 #include "ContentManager.h"
20 #include "GameInstance.h"
21 
22 #include <string_theory/string>
23 
24 
25 UINT8			AimMercArray[ MAX_NUMBER_MERCS ];
26 
27 static LaptopMode const gCurrentAimPage[NUM_AIM_SCREENS] =
28 {
29 	LAPTOP_MODE_AIM,
30 	LAPTOP_MODE_AIM_MEMBERS_SORTED_FILES,
31 	LAPTOP_MODE_AIM_MEMBERS_ARCHIVES,
32 	LAPTOP_MODE_AIM_POLICIES,
33 	LAPTOP_MODE_AIM_HISTORY,
34 	LAPTOP_MODE_AIM_LINKS
35 };
36 
37 
38 //
39 //***  Defines **
40 //
41 
42 
43 #define BOBBYR_UNDER_CONSTRUCTION_AD_FONT	FONT14HUMANIST//FONT16ARIAL
44 #define BOBBYR_UNDER_CONSTRUCTION_AD_COLOR	FONT_MCOLOR_DKRED//FONT_MCOLOR_WHITE
45 
46 
47 // Link Images
48 #define LINK_SIZE_X				101
49 #define LINK_SIZE_Y				76
50 
51 #define MEMBERCARD_X				IMAGE_OFFSET_X + 118
52 #define MEMBERCARD_Y				IMAGE_OFFSET_Y + 190
53 
54 #define POLICIES_X				IMAGE_OFFSET_X + 284
55 #define POLICIES_Y				MEMBERCARD_Y
56 
57 #define HISTORY_X				MEMBERCARD_X
58 #define HISTORY_Y				IMAGE_OFFSET_Y + 279
59 
60 #define LINKS_X					POLICIES_X
61 #define LINKS_Y					HISTORY_Y
62 
63 #define WARNING_X				IMAGE_OFFSET_X + 126
64 #define WARNING_Y				IMAGE_OFFSET_Y + 80 -1
65 
66 #define MEMBERS_TEXT_Y				MEMBERCARD_Y + 77
67 #define HISTORY_TEXT_Y				HISTORY_Y + 77
68 #define POLICIES_TEXT_Y				MEMBERS_TEXT_Y
69 #define LINK_TEXT_Y				HISTORY_TEXT_Y
70 
71 #define AIM_WARNING_TEXT_X			WARNING_X + 15
72 #define AIM_WARNING_TEXT_Y			WARNING_Y + 46
73 #define AIM_WARNING_TEXT_WIDTH			220
74 
75 #define AIM_FLOWER_LINK_TEXT_Y			AIM_WARNING_TEXT_Y + 25
76 
77 #define AIM_BOBBYR1_LINK_TEXT_X			WARNING_X + 20
78 #define AIM_BOBBYR1_LINK_TEXT_Y			WARNING_Y + 20
79 
80 #define AIM_BOBBYR2_LINK_TEXT_X			WARNING_X + 50
81 #define AIM_BOBBYR2_LINK_TEXT_Y			WARNING_Y + 58
82 
83 #define AIM_BOBBYR3_LINK_TEXT_X			WARNING_X + 20
84 #define AIM_BOBBYR3_LINK_TEXT_Y			WARNING_Y + 20
85 
86 
87 
88 #define AIM_AD_TOP_LEFT_X			WARNING_X
89 #define AIM_AD_TOP_LEFT_Y			WARNING_Y
90 #define AIM_AD_BOTTOM_RIGHT_X			AIM_AD_TOP_LEFT_X + 248
91 #define AIM_AD_BOTTOM_RIGHT_Y			AIM_AD_TOP_LEFT_Y + 110
92 
93 #define AIM_COPYRIGHT_X				(160 + STD_SCREEN_X)
94 #define AIM_COPYRIGHT_Y				(396 + LAPTOP_SCREEN_WEB_DELTA_Y + STD_SCREEN_Y)
95 #define AIM_COPYRIGHT_WIDTH			400
96 #define AIM_COPYRIGHT_GAP			9
97 
98 //#define AIM_WARNING_TIME			100
99 #define AIM_WARNING_TIME			10000
100 
101 //#define AIM_FLOWER_AD_DELAY			15
102 #define AIM_FLOWER_AD_DELAY			150
103 #define AIM_FLOWER_NUM_SUBIMAGES		16
104 
105 
106 #define AIM_AD_FOR_ADS_DELAY			150
107 //#define AIM_AD_FOR_ADS_DELAY			15
108 #define AIM_AD_FOR_ADS__NUM_SUBIMAGES		13
109 
110 #define AIM_AD_INSURANCE_AD_DELAY		150
111 #define AIM_AD_INSURANCE_AD__NUM_SUBIMAGES	10
112 
113 #define AIM_AD_FUNERAL_AD_DELAY	250
114 #define AIM_AD_FUNERAL_AD__NUM_SUBIMAGES	9
115 
116 #define AIM_AD_BOBBYR_AD_STARTS			2
117 #define AIM_AD_DAY_FUNERAL_AD_STARTS		4
118 #define AIM_AD_DAY_FLOWER_AD_STARTS		7
119 #define AIM_AD_DAY_INSURANCE_AD_STARTS		12
120 
121 #define AIM_AD_BOBBYR_AD_DELAY			300
122 #define AIM_AD_BOBBYR_AD__NUM_SUBIMAGES		21
123 #define AIM_AD_BOBBYR_AD_NUM_DUCK_SUBIMAGES	6
124 
125 
126 //#define
127 
128 enum
129 {
130 	AIM_AD_NOT_DONE,
131 	AIM_AD_DONE,
132 	AIM_AD_WARNING_BOX,
133 	AIM_AD_FOR_ADS,
134 	AIM_AD_BOBBY_RAY_AD,
135 	AIM_AD_FUNERAL_ADS,
136 	AIM_AD_FLOWER_SHOP,
137 	AIM_AD_INSURANCE_AD,
138 	AIM_AD_LAST_AD
139 };
140 
141 
142 // Aim Screen Handle
143 static SGPVObject* guiAimSymbol;
144 static SGPVObject* guiRustBackGround;
145 static SGPVObject* guiMemberCard;
146 static SGPVObject* guiPolicies;
147 static SGPVObject* guiHistory;
148 static SGPVObject* guiLinks;
149 static SGPVObject* guiWarning;
150 static SGPVObject* guiFlowerAdvertisement;
151 static SGPVObject* guiAdForAdsImages;
152 static SGPVObject* guiInsuranceAdImages;
153 static SGPVObject* guiFuneralAdImages;
154 static SGPVObject* guiBobbyRAdImages;
155 
156 
157 static UINT8 gubCurrentAdvertisment;
158 
159 static BOOLEAN gfInitAdArea;
160 
161 // MemberCard
162 static MOUSE_REGION gSelectedMemberCardRegion;
163 
164 
165 // Policies
166 static MOUSE_REGION gSelectedPoliciesRegion;
167 
168 //History
169 static MOUSE_REGION gSelectedHistoryRegion;
170 
171 //Links
172 static MOUSE_REGION gSelectedLinksRegion;
173 
174 //Bottom Buttons
175 static GUIButtonRef guiBottomButtons[NUM_AIM_SCREENS];
176 static BUTTON_PICS* guiBottomButtonImage;
177 
178 //Banner Area
179 static MOUSE_REGION gSelectedBannerRegion;
180 
181 //Aim logo click
182 static MOUSE_REGION gSelectedAimLogo;
183 
184 
185 static BOOLEAN fFirstTimeIn = TRUE;
186 
187 
188 static void LaptopInitAim(void);
189 
190 
GameInitAIM()191 void GameInitAIM()
192 {
193 	LaptopInitAim();
194 }
195 
196 
197 static void SelectBannerRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
198 static void SelectHistoryRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
199 static void SelectLinksRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
200 static void SelectMemberCardRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
201 static void SelectPoliciesRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
202 
203 
EnterAIM()204 void EnterAIM()
205 {
206 	gubCurrentAdvertisment = AIM_AD_WARNING_BOX;
207 	LaptopInitAim();
208 
209 	InitAimDefaults();
210 
211 	// load the MemberShipcard graphic and add it
212 	guiMemberCard = AddVideoObjectFromFile(LAPTOPDIR "/membercard.sti");
213 
214 	// load the Policies graphic and add it
215 	guiPolicies = AddVideoObjectFromFile(LAPTOPDIR "/policies.sti");
216 
217 	// load the Links graphic and add it
218 	guiLinks = AddVideoObjectFromFile(LAPTOPDIR "/links.sti");
219 
220 	const char* ImageFile;
221 
222 	// load the History graphic and add it
223 	ImageFile = GetMLGFilename(MLG_HISTORY);
224 	guiHistory = AddVideoObjectFromFile(ImageFile);
225 
226 	// load the Wanring graphic and add it
227 	ImageFile = GetMLGFilename(MLG_WARNING);
228 	guiWarning = AddVideoObjectFromFile(ImageFile);
229 
230 	// load the flower advertisment and add it
231 	guiFlowerAdvertisement = AddVideoObjectFromFile(LAPTOPDIR "/flowerad_16.sti");
232 
233 	// load the your ad advertisment and add it
234 	ImageFile = GetMLGFilename(MLG_YOURAD13);
235 	guiAdForAdsImages = AddVideoObjectFromFile(ImageFile);
236 
237 	// load the insurance advertisment and add it
238 	ImageFile = GetMLGFilename(MLG_INSURANCEAD10);
239 	guiInsuranceAdImages = AddVideoObjectFromFile(ImageFile);
240 
241 	// load the funeral advertisment and add it
242 	ImageFile = GetMLGFilename(MLG_FUNERALAD9);
243 	guiFuneralAdImages = AddVideoObjectFromFile(ImageFile);
244 
245 	// load the funeral advertisment and add it
246 	ImageFile = GetMLGFilename(MLG_BOBBYRAYAD21);
247 	guiBobbyRAdImages = AddVideoObjectFromFile(ImageFile);
248 
249 
250 	//** Mouse Regions **
251 
252 	//Mouse region for the MebershipCard
253 	MSYS_DefineRegion(&gSelectedMemberCardRegion, MEMBERCARD_X, MEMBERCARD_Y,
254 				(MEMBERCARD_X + LINK_SIZE_X), (MEMBERCARD_Y + LINK_SIZE_Y),
255 				MSYS_PRIORITY_HIGH, CURSOR_WWW, MSYS_NO_CALLBACK,
256 				SelectMemberCardRegionCallBack);
257 
258 	//Mouse region for the Policies
259 	MSYS_DefineRegion(&gSelectedPoliciesRegion, POLICIES_X, POLICIES_Y,
260 				(POLICIES_X + LINK_SIZE_X), (POLICIES_Y + LINK_SIZE_Y),
261 				MSYS_PRIORITY_HIGH, CURSOR_WWW, MSYS_NO_CALLBACK,
262 				SelectPoliciesRegionCallBack);
263 
264 	//Mouse region for the History
265 	MSYS_DefineRegion(&gSelectedHistoryRegion, HISTORY_X, HISTORY_Y,
266 				(HISTORY_X + LINK_SIZE_X), (HISTORY_Y + LINK_SIZE_Y),
267 				MSYS_PRIORITY_HIGH, CURSOR_WWW, MSYS_NO_CALLBACK,
268 				SelectHistoryRegionCallBack);
269 
270 	//Mouse region for the Links
271 	MSYS_DefineRegion(&gSelectedLinksRegion, LINKS_X, LINKS_Y ,
272 				(LINKS_X + LINK_SIZE_X), (LINKS_Y + LINK_SIZE_Y),
273 				MSYS_PRIORITY_HIGH, CURSOR_WWW, MSYS_NO_CALLBACK,
274 				SelectLinksRegionCallBack);
275 
276 	//Mouse region for the Links
277 	MSYS_DefineRegion(&gSelectedBannerRegion, AIM_AD_TOP_LEFT_X, AIM_AD_TOP_LEFT_Y,
278 				AIM_AD_BOTTOM_RIGHT_X, AIM_AD_BOTTOM_RIGHT_Y,
279 				MSYS_PRIORITY_HIGH, CURSOR_WWW, MSYS_NO_CALLBACK,
280 				SelectBannerRegionCallBack);
281 
282 	// disable the region because only certain banners will be 'clickable'
283 	gSelectedBannerRegion.Disable();
284 
285 	fFirstTimeIn = FALSE;
286 	RenderAIM();
287 }
288 
289 
LaptopInitAim(void)290 static void LaptopInitAim(void)
291 {
292 	gfInitAdArea = TRUE;
293 }
294 
295 
ExitAIM()296 void ExitAIM()
297 {
298 	RemoveAimDefaults();
299 
300 	DeleteVideoObject(guiMemberCard);
301 	DeleteVideoObject(guiPolicies);
302 	DeleteVideoObject(guiLinks);
303 	DeleteVideoObject(guiHistory);
304 	DeleteVideoObject(guiWarning);
305 	DeleteVideoObject(guiFlowerAdvertisement);
306 	DeleteVideoObject(guiAdForAdsImages);
307 	DeleteVideoObject(guiInsuranceAdImages);
308 	DeleteVideoObject(guiFuneralAdImages);
309 	DeleteVideoObject(guiBobbyRAdImages);
310 
311 	// Remove Mouse Regions
312 	MSYS_RemoveRegion( &gSelectedMemberCardRegion);
313 	MSYS_RemoveRegion( &gSelectedPoliciesRegion);
314 	MSYS_RemoveRegion( &gSelectedLinksRegion);
315 	MSYS_RemoveRegion( &gSelectedHistoryRegion);
316 	MSYS_RemoveRegion( &gSelectedBannerRegion);
317 }
318 
319 
320 static void HandleAdAndWarningArea(BOOLEAN fInit, BOOLEAN fRedraw);
321 
322 
HandleAIM()323 void HandleAIM()
324 {
325 	HandleAdAndWarningArea( gfInitAdArea, FALSE );
326 	gfInitAdArea = FALSE;
327 }
328 
RenderAIM()329 void RenderAIM()
330 {
331 //	UINT16	x,y, uiPosX, uiPosY;
332 
333 	DrawAimDefaults();
334 
335 	BltVideoObject(FRAME_BUFFER, guiMemberCard, 0, MEMBERCARD_X, MEMBERCARD_Y);
336 	BltVideoObject(FRAME_BUFFER, guiPolicies,   0, POLICIES_X,   POLICIES_Y);
337 	BltVideoObject(FRAME_BUFFER, guiLinks,      0, LINKS_X,      LINKS_Y);
338 	BltVideoObject(FRAME_BUFFER, guiHistory,    0, HISTORY_X,    HISTORY_Y);
339 
340 	// Draw the aim slogan under the symbol
341 	DisplayAimSlogan();
342 
343 	DisplayAimCopyright();
344 
345 	//Draw text under boxes
346 	// members
347 	DrawTextToScreen(AimBottomMenuText[AIM_MEMBERS], MEMBERCARD_X, MEMBERS_TEXT_Y, LINK_SIZE_X, FONT12ARIAL, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
348 	// Policies
349 	DrawTextToScreen(AimBottomMenuText[AIM_POLICIES], POLICIES_X, POLICIES_TEXT_Y, LINK_SIZE_X, FONT12ARIAL, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
350 	// History
351 	DrawTextToScreen(AimBottomMenuText[AIM_HISTORY], HISTORY_X, HISTORY_TEXT_Y, LINK_SIZE_X, FONT12ARIAL, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
352 	// Links
353 	DrawTextToScreen(AimBottomMenuText[AIM_LINKS], LINKS_X, LINK_TEXT_Y, LINK_SIZE_X, FONT12ARIAL, AIM_FONT_MCOLOR_WHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
354 
355 	HandleAdAndWarningArea( gfInitAdArea, TRUE );
356 
357 	RenderWWWProgramTitleBar( );
358 
359 	InvalidateRegion(LAPTOP_SCREEN_UL_X,LAPTOP_SCREEN_WEB_UL_Y,LAPTOP_SCREEN_LR_X,LAPTOP_SCREEN_WEB_LR_Y);
360 }
361 
362 
SelectMemberCardRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)363 static void SelectMemberCardRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
364 {
365 	if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
366 	{
367 		if(!fFirstTimeIn)
368 			guiCurrentLaptopMode = LAPTOP_MODE_AIM_MEMBERS_SORTED_FILES;
369 	}
370 }
371 
372 
SelectPoliciesRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)373 static void SelectPoliciesRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
374 {
375 	if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
376 	{
377 		guiCurrentLaptopMode = LAPTOP_MODE_AIM_POLICIES;
378 	}
379 }
380 
381 
SelectHistoryRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)382 static void SelectHistoryRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
383 {
384 	if(iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
385 	{
386 		guiCurrentLaptopMode = LAPTOP_MODE_AIM_HISTORY;
387 	}
388 }
389 
390 
SelectLinksRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)391 static void SelectLinksRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
392 {
393 	if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
394 	{
395 		guiCurrentLaptopMode = LAPTOP_MODE_AIM_LINKS;
396 	}
397 }
398 
399 
400 static void SelectAimLogoRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason);
401 
402 
InitAimDefaults()403 void InitAimDefaults()
404 {
405 	// load the Rust bacground graphic and add it
406 	guiRustBackGround = AddVideoObjectFromFile(LAPTOPDIR "/rustbackground.sti");
407 
408 	// load the Aim Symbol graphic and add it
409 	const char* const ImageFile = GetMLGFilename(MLG_AIMSYMBOL);
410 	guiAimSymbol = AddVideoObjectFromFile(ImageFile);
411 
412 	//Mouse region for the Links
413 	MSYS_DefineRegion(&gSelectedAimLogo, AIM_SYMBOL_X, AIM_SYMBOL_Y,
414 				AIM_SYMBOL_X+AIM_SYMBOL_WIDTH, AIM_SYMBOL_Y+AIM_SYMBOL_HEIGHT,
415 				MSYS_PRIORITY_HIGH, CURSOR_WWW, MSYS_NO_CALLBACK,
416 				SelectAimLogoRegionCallBack);
417 }
418 
419 
RemoveAimDefaults()420 void RemoveAimDefaults()
421 {
422 	DeleteVideoObject(guiRustBackGround);
423 	DeleteVideoObject(guiAimSymbol);
424 	MSYS_RemoveRegion( &gSelectedAimLogo);
425 }
426 
427 
DrawAimDefaults()428 void DrawAimDefaults()
429 {
430 	UINT16	x,y, uiPosX, uiPosY;
431 
432 	uiPosY = RUSTBACKGROUND_1_Y;
433 	for(y=0; y<4; y++)
434 	{
435 		uiPosX = RUSTBACKGROUND_1_X;
436 		for(x=0; x<4; x++)
437 		{
438 			BltVideoObject(FRAME_BUFFER, guiRustBackGround, 0, uiPosX, uiPosY);
439 			uiPosX += RUSTBACKGROUND_SIZE_X;
440 		}
441 		uiPosY += RUSTBACKGROUND_SIZE_Y;
442 	}
443 
444 	BltVideoObject(FRAME_BUFFER, guiAimSymbol, 0, AIM_SYMBOL_X, AIM_SYMBOL_Y);
445 }
446 
447 
SelectAimLogoRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)448 static void SelectAimLogoRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
449 {
450 	if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
451 	{
452 		guiCurrentLaptopMode = LAPTOP_MODE_AIM;
453 	}
454 }
455 
456 
LoadAIMText(UINT32 entry)457 static ST::string LoadAIMText(UINT32 entry)
458 {
459 	return GCM->loadEncryptedString(AIMHISTORYFILE, AIM_HISTORY_LINE_SIZE * entry, AIM_HISTORY_LINE_SIZE);
460 }
461 
462 
DisplayAimSlogan()463 void DisplayAimSlogan()
464 {
465 	ST::string sSlogan = LoadAIMText(0);
466 	//Display Aim Text under the logo
467 	DisplayWrappedString(AIM_LOGO_TEXT_X, AIM_LOGO_TEXT_Y, AIM_LOGO_TEXT_WIDTH, 2, AIM_LOGO_FONT, AIM_FONT_MCOLOR_WHITE, sSlogan, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
468 }
469 
470 
DisplayAimCopyright()471 void DisplayAimCopyright()
472 {
473 	ST::string sSlogan;
474 
475 	//Load and Display the copyright notice
476 
477 	sSlogan = LoadAIMText(AIM_COPYRIGHT_1);
478 	DrawTextToScreen(sSlogan, AIM_COPYRIGHT_X, AIM_COPYRIGHT_Y, AIM_COPYRIGHT_WIDTH, AIM_COPYRIGHT_FONT, FONT_MCOLOR_DKWHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
479 
480 	sSlogan = LoadAIMText(AIM_COPYRIGHT_2);
481 	DrawTextToScreen(sSlogan, AIM_COPYRIGHT_X, AIM_COPYRIGHT_Y + AIM_COPYRIGHT_GAP, AIM_COPYRIGHT_WIDTH, AIM_COPYRIGHT_FONT, FONT_MCOLOR_DKWHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
482 
483 	sSlogan = LoadAIMText(AIM_COPYRIGHT_3);
484 	DrawTextToScreen(sSlogan, AIM_COPYRIGHT_X, AIM_COPYRIGHT_Y + AIM_COPYRIGHT_GAP * 2, AIM_COPYRIGHT_WIDTH, AIM_COPYRIGHT_FONT, FONT_MCOLOR_DKWHITE, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
485 }
486 
487 
488 static void BtnAimBottomButtonsCallback(GUI_BUTTON* btn, INT32 reason);
489 
490 
InitAimMenuBar()491 void InitAimMenuBar()
492 {
493 	BUTTON_PICS* const gfx = LoadButtonImage(LAPTOPDIR "/bottombuttons2.sti", 0, 1);
494 	guiBottomButtonImage = gfx;
495 
496 	UINT16             x    = BOTTOM_BUTTON_START_X;
497 	UINT16     const   y    = BOTTOM_BUTTON_START_Y;
498 	const ST::string* text = AimBottomMenuText;
499 	LaptopMode const*  page = gCurrentAimPage;
500 	FOR_EACHX(GUIButtonRef, i, guiBottomButtons, x += BOTTOM_BUTTON_START_WIDTH)
501 	{
502 		GUIButtonRef const b = CreateIconAndTextButton(gfx, *text++, FONT10ARIAL, AIM_BUTTON_ON_COLOR, DEFAULT_SHADOW, AIM_BUTTON_OFF_COLOR, DEFAULT_SHADOW, x, y, MSYS_PRIORITY_HIGH, BtnAimBottomButtonsCallback);
503 		b->SetCursor(CURSOR_LAPTOP_SCREEN);
504 		b->SetUserData(*page++);
505 		*i = b;
506 	}
507 }
508 
509 
ExitAimMenuBar()510 void ExitAimMenuBar()
511 {
512 	FOR_EACH(GUIButtonRef, i, guiBottomButtons) RemoveButton(*i);
513 	UnloadButtonImage(guiBottomButtonImage);
514 }
515 
516 
517 static void ResetAimButtons(GUIButtonRef* Buttons, UINT16 uNumberOfButtons);
518 
519 
BtnAimBottomButtonsCallback(GUI_BUTTON * btn,INT32 reason)520 static void BtnAimBottomButtonsCallback(GUI_BUTTON *btn, INT32 reason)
521 {
522 	if (reason & MSYS_CALLBACK_REASON_LBUTTON_UP)
523 	{
524 		ResetAimButtons(guiBottomButtons, NUM_AIM_BOTTOMBUTTONS);
525 		guiCurrentLaptopMode = static_cast<LaptopMode>(btn->GetUserData());
526 	}
527 	DisableAimButton();
528 }
529 
530 
ResetAimButtons(GUIButtonRef * const Buttons,UINT16 const uNumberOfButtons)531 static void ResetAimButtons(GUIButtonRef* const Buttons, UINT16 const uNumberOfButtons)
532 {
533 	UINT32 cnt;
534 
535 	for ( cnt = 0; cnt < uNumberOfButtons; cnt++ )
536 	{
537 		Buttons[cnt]->uiFlags &= ~(BUTTON_CLICKED_ON);
538 	}
539 }
540 
DisableAimButton()541 void DisableAimButton()
542 {
543 	int i=0;
544 
545 	for(i=0; i<NUM_AIM_BOTTOMBUTTONS; i++)
546 	{
547 		if( gCurrentAimPage[i] == guiCurrentLaptopMode)
548 			guiBottomButtons[i]->uiFlags |= BUTTON_CLICKED_ON;
549 	}
550 }
551 
552 
553 static BOOLEAN DisplayAd(BOOLEAN fInit, BOOLEAN fRedraw, UINT16 usDelay, UINT16 usNumberOfSubImages, const SGPVObject* ad_image);
554 static BOOLEAN DisplayBobbyRAd(BOOLEAN fInit, BOOLEAN fRedraw);
555 static BOOLEAN DisplayFlowerAd(BOOLEAN fInit, BOOLEAN fRedraw);
556 static BOOLEAN DrawWarningBox(BOOLEAN fInit, BOOLEAN fRedraw);
557 static UINT8 GetNextAimAd(UINT8 ubCurrentAd);
558 
559 
HandleAdAndWarningArea(BOOLEAN fInit,BOOLEAN fRedraw)560 static void HandleAdAndWarningArea(BOOLEAN fInit, BOOLEAN fRedraw)
561 {
562 	static UINT8 ubPreviousAdvertisment;
563 
564 	if( fInit )
565 		gubCurrentAdvertisment = AIM_AD_WARNING_BOX;
566 	else
567 	{
568 		if( ubPreviousAdvertisment == AIM_AD_DONE )
569 		{
570 			gubCurrentAdvertisment = GetNextAimAd( gubCurrentAdvertisment );
571 
572 			fInit = TRUE;
573 
574 /*
575 			UINT32	uiDay = GetWorldDay();
576 			BOOLEAN	fSkip=FALSE;
577 			gubCurrentAdvertisment++;
578 
579 			//if the add should be for Bobby rays
580 			if( gubCurrentAdvertisment == AIM_AD_BOBBY_RAY_AD )
581 			{
582 				//if the player has NOT ever been to drassen
583 				if( !LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
584 				{
585 					//advance to the next add
586 					gubCurrentAdvertisment++;
587 				}
588 				else
589 				{
590 					fSkip = TRUE;
591 					fInit = TRUE;
592 				}
593 			}
594 			else
595 				fSkip = FALSE;
596 
597 
598 			if( !fSkip )
599 			{
600 				//if the current ad is not supposed to be available, loop back to the first ad
601 				switch( gubCurrentAdvertisment )
602 				{
603 					case AIM_AD_FUNERAL_ADS:
604 						if( uiDay < AIM_AD_DAY_FUNERAL_AD_STARTS )
605 							gubCurrentAdvertisment = AIM_AD_WARNING_BOX;
606 						break;
607 
608 					case AIM_AD_FLOWER_SHOP:
609 						if( uiDay < AIM_AD_DAY_FLOWER_AD_STARTS )
610 							gubCurrentAdvertisment = AIM_AD_WARNING_BOX;
611 						break;
612 
613 					case AIM_AD_INSURANCE_AD:
614 						if( uiDay < AIM_AD_DAY_INSURANCE_AD_STARTS )
615 							gubCurrentAdvertisment = AIM_AD_WARNING_BOX;
616 						break;
617 				}
618 				fInit = TRUE;
619 			}
620 */
621 		}
622 
623 		if( gubCurrentAdvertisment >= AIM_AD_LAST_AD)
624 		{
625 			gubCurrentAdvertisment = AIM_AD_WARNING_BOX;
626 		}
627 	}
628 
629 	switch( gubCurrentAdvertisment )
630 	{
631 		case 	AIM_AD_WARNING_BOX:
632 			gSelectedBannerRegion.Disable();
633 			ubPreviousAdvertisment = DrawWarningBox( fInit, fRedraw );
634 			break;
635 
636 		case AIM_AD_FLOWER_SHOP:
637 			ubPreviousAdvertisment = DisplayFlowerAd( fInit, fRedraw );
638 			break;
639 
640 		case AIM_AD_FOR_ADS:
641 			// disable the region because only certain banners will be 'clickable'
642 			gSelectedBannerRegion.Disable();
643 			ubPreviousAdvertisment = DisplayAd( fInit, fRedraw, AIM_AD_FOR_ADS_DELAY, AIM_AD_FOR_ADS__NUM_SUBIMAGES, guiAdForAdsImages );
644 			break;
645 
646 		case AIM_AD_INSURANCE_AD:
647 			gSelectedBannerRegion.Enable();
648 			ubPreviousAdvertisment = DisplayAd( fInit, fRedraw, AIM_AD_INSURANCE_AD_DELAY, AIM_AD_INSURANCE_AD__NUM_SUBIMAGES, guiInsuranceAdImages );
649 			break;
650 
651 		case AIM_AD_FUNERAL_ADS:
652 			gSelectedBannerRegion.Enable();
653 			ubPreviousAdvertisment = DisplayAd( fInit, fRedraw, AIM_AD_FUNERAL_AD_DELAY, AIM_AD_FUNERAL_AD__NUM_SUBIMAGES, guiFuneralAdImages );
654 			break;
655 
656 		case AIM_AD_BOBBY_RAY_AD:
657 			gSelectedBannerRegion.Enable();
658 			//ubPreviousAdvertisment = DisplayAd( fInit, fRedraw, AIM_AD_BOBBYR_AD_DELAY, AIM_AD_BOBBYR_AD__NUM_SUBIMAGES, guiBobbyRAdImages );
659 			ubPreviousAdvertisment = DisplayBobbyRAd( fInit, fRedraw );
660 			break;
661 	}
662 }
663 
664 
DisplayFlowerAd(BOOLEAN fInit,BOOLEAN fRedraw)665 static BOOLEAN DisplayFlowerAd(BOOLEAN fInit, BOOLEAN fRedraw)
666 {
667 	static UINT32 uiLastTime;
668 	static UINT8	ubSubImage=0;
669 	static UINT8	ubCount=0;
670 	UINT32 uiCurTime = GetJA2Clock();
671 
672 	if( fInit )
673 	{
674 		uiLastTime = 0;
675 		ubSubImage = 0;
676 		ubCount = 0;
677 		gSelectedBannerRegion.Enable();
678 	}
679 
680 	if( ((uiCurTime - uiLastTime) > AIM_FLOWER_AD_DELAY) || fRedraw)
681 	{
682 		if( ubSubImage == AIM_FLOWER_NUM_SUBIMAGES)
683 		{
684 			if(ubCount == 0 || fRedraw)
685 			{
686 				BltVideoObject(FRAME_BUFFER, guiFlowerAdvertisement, 0, WARNING_X, WARNING_Y);
687 
688 				// redraw new mail warning, and create new mail button, if nessacary
689 				fReDrawNewMailFlag = TRUE;
690 
691 				//Display Aim Warning Text
692 				DisplayWrappedString(AIM_WARNING_TEXT_X, AIM_WARNING_TEXT_Y, AIM_WARNING_TEXT_WIDTH, 2, FONT14ARIAL, FONT_GREEN, AimScreenText[AIM_INFO_6], FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
693 
694 				//Display Aim Warning Text
695 				SetFontShadow( FONT_MCOLOR_WHITE );
696 				DisplayWrappedString(AIM_WARNING_TEXT_X, AIM_FLOWER_LINK_TEXT_Y, AIM_WARNING_TEXT_WIDTH, 2, FONT12ARIAL, 2, AimScreenText[AIM_INFO_7], FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
697 				SetFontShadow( DEFAULT_SHADOW );
698 
699 				InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
700 			}
701 
702 			uiLastTime = GetJA2Clock();
703 
704 			ubCount++;
705 			if( ubCount > 40 )
706 			{
707 				return( AIM_AD_DONE );
708 			}
709 			else
710 				return( AIM_AD_NOT_DONE );
711 
712 		}
713 		else
714 		{
715 			BltVideoObject(FRAME_BUFFER, guiFlowerAdvertisement, ubSubImage, WARNING_X, WARNING_Y);
716 
717 			// redraw new mail warning, and create new mail button, if nessacary
718 			fReDrawNewMailFlag = TRUE;
719 
720 			ubSubImage++;
721 		}
722 
723 		uiLastTime = GetJA2Clock();
724 		InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
725 	}
726 	return( AIM_AD_NOT_DONE );
727 }
728 
729 
DrawWarningBox(BOOLEAN fInit,BOOLEAN fRedraw)730 static BOOLEAN DrawWarningBox(BOOLEAN fInit, BOOLEAN fRedraw)
731 {
732 	static UINT32 uiLastTime;
733 	UINT32 uiCurTime = GetJA2Clock();
734 
735 
736 	if( fInit || fRedraw)
737 	{
738 		BltVideoObject(FRAME_BUFFER, guiWarning, 0, WARNING_X, WARNING_Y);
739 
740 		//Display Aim Warning Text
741 		ST::string sText = LoadAIMText(AIM_WARNING_1);
742 		DisplayWrappedString(AIM_WARNING_TEXT_X, AIM_WARNING_TEXT_Y, AIM_WARNING_TEXT_WIDTH, 2, AIM_WARNING_FONT, FONT_RED, sText, FONT_MCOLOR_BLACK, CENTER_JUSTIFIED);
743 
744 		InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
745 
746 		// redraw new mail warning, and create new mail button, if nessacary
747 		fReDrawNewMailFlag = TRUE;
748 
749 		if( fInit )
750 			uiLastTime = uiCurTime;
751 	}
752 
753 	if( (uiCurTime - uiLastTime) > AIM_WARNING_TIME)
754 		return(AIM_AD_DONE);
755 	else
756 	{
757 		return(AIM_AD_NOT_DONE);
758 	}
759 }
760 
761 
SelectBannerRegionCallBack(MOUSE_REGION * pRegion,INT32 iReason)762 static void SelectBannerRegionCallBack(MOUSE_REGION* pRegion, INT32 iReason)
763 {
764 	if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
765 	{
766 		if( gubCurrentAdvertisment == AIM_AD_FLOWER_SHOP )
767 			GoToWebPage( FLORIST_BOOKMARK );
768 		else if( gubCurrentAdvertisment == AIM_AD_INSURANCE_AD )
769 			GoToWebPage( INSURANCE_BOOKMARK );
770 		else if( gubCurrentAdvertisment == AIM_AD_FUNERAL_ADS )
771 			GoToWebPage( FUNERAL_BOOKMARK );
772 		else if( gubCurrentAdvertisment == AIM_AD_BOBBY_RAY_AD )
773 			GoToWebPage( BOBBYR_BOOKMARK );
774 	}
775 }
776 
777 
778 static void HandleTextOnAimAdd(UINT8 ubCurSubImage);
779 
780 
DisplayAd(const BOOLEAN fInit,const BOOLEAN fRedraw,const UINT16 usDelay,const UINT16 usNumberOfSubImages,const SGPVObject * const ad_image)781 static BOOLEAN DisplayAd(const BOOLEAN fInit, const BOOLEAN fRedraw, const UINT16 usDelay, const UINT16 usNumberOfSubImages, const SGPVObject* const ad_image)
782 {
783 	static UINT32 uiLastTime;
784 	static UINT8	ubSubImage=0;
785 	static UINT8	ubCount=0;
786 	UINT32 uiCurTime = GetJA2Clock();
787 	UINT8	ubRetVal = 0;
788 
789 	if( fInit )
790 	{
791 		uiLastTime = 0;
792 		ubSubImage = 0;
793 		ubCount = 0;
794 	}
795 
796 	if( ((uiCurTime - uiLastTime) > usDelay) || fRedraw)
797 	{
798 		if( ubSubImage == 0 )
799 		{
800 			if(ubCount == 0 || fRedraw)
801 			{
802 				//Blit the ad
803 				BltVideoObject(FRAME_BUFFER, ad_image, 0, WARNING_X, WARNING_Y);
804 
805 				// redraw new mail warning, and create new mail button, if nessacary
806 				fReDrawNewMailFlag = TRUE;
807 
808 				InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
809 			}
810 
811 			uiLastTime = GetJA2Clock();
812 
813 			//display first frame longer then rest
814 			ubCount++;
815 			if( ubCount > 12 )
816 			{
817 				ubCount=0;
818 				ubSubImage++;
819 			}
820 
821 			ubRetVal = AIM_AD_NOT_DONE;
822 
823 		}
824 		else if( ubSubImage == usNumberOfSubImages-1 )
825 		{
826 			if(ubCount == 0 || fRedraw)
827 			{
828 				//Blit the ad
829 				BltVideoObject(FRAME_BUFFER, ad_image, ubSubImage, WARNING_X, WARNING_Y);
830 
831 				// redraw new mail warning, and create new mail button, if nessacary
832 				fReDrawNewMailFlag = TRUE;
833 
834 				InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
835 			}
836 
837 			uiLastTime = GetJA2Clock();
838 
839 			//display first frame longer then rest
840 			ubCount++;
841 			if( ubCount > 12 )
842 			{
843 				ubRetVal = AIM_AD_DONE;
844 			}
845 		}
846 		else
847 		{
848 			BltVideoObject(FRAME_BUFFER, ad_image, ubSubImage, WARNING_X, WARNING_Y);
849 
850 			// redraw new mail warning, and create new mail button, if nessacary
851 			fReDrawNewMailFlag = TRUE;
852 
853 			ubSubImage++;
854 		}
855 
856 		//if the add it to have text on it, then put the text on it.
857 		HandleTextOnAimAdd( ubSubImage );
858 
859 		uiLastTime = GetJA2Clock();
860 		InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
861 	}
862 	return( ubRetVal );
863 }
864 
865 
HandleTextOnAimAdd(UINT8 ubCurSubImage)866 static void HandleTextOnAimAdd(UINT8 ubCurSubImage)
867 {
868 	switch( gubCurrentAdvertisment )
869 	{
870 		case 	AIM_AD_WARNING_BOX:
871 			break;
872 
873 		case AIM_AD_FLOWER_SHOP:
874 			break;
875 
876 		case AIM_AD_FOR_ADS:
877 			break;
878 
879 		case AIM_AD_INSURANCE_AD:
880 			break;
881 
882 		case AIM_AD_FUNERAL_ADS:
883 			break;
884 
885 		case AIM_AD_BOBBY_RAY_AD:
886 
887 			//if the subimage is the first couple
888 			if( ubCurSubImage <= AIM_AD_BOBBYR_AD_NUM_DUCK_SUBIMAGES )
889 			{
890 				//Display Aim Warning Text
891 				SetFontShadow( 2 );
892 				DisplayWrappedString(AIM_BOBBYR1_LINK_TEXT_X, AIM_BOBBYR1_LINK_TEXT_Y, AIM_WARNING_TEXT_WIDTH, 2, BOBBYR_UNDER_CONSTRUCTION_AD_FONT, BOBBYR_UNDER_CONSTRUCTION_AD_COLOR, AimScreenText[AIM_BOBBYR_ADD1], FONT_MCOLOR_BLACK, LEFT_JUSTIFIED | INVALIDATE_TEXT);
893 				SetFontShadow( DEFAULT_SHADOW );
894 			}
895 
896 
897 			else if( ubCurSubImage >= AIM_AD_BOBBYR_AD__NUM_SUBIMAGES-5 )
898 			{
899 				//Display Aim Warning Text
900 				SetFontShadow( 2 );
901 				DisplayWrappedString(AIM_BOBBYR2_LINK_TEXT_X, AIM_BOBBYR2_LINK_TEXT_Y, AIM_WARNING_TEXT_WIDTH, 2, BOBBYR_UNDER_CONSTRUCTION_AD_FONT, BOBBYR_UNDER_CONSTRUCTION_AD_COLOR, AimScreenText[AIM_BOBBYR_ADD2], FONT_MCOLOR_BLACK, LEFT_JUSTIFIED | INVALIDATE_TEXT);
902 				SetFontShadow( DEFAULT_SHADOW );
903 			}
904 /*
905 			else
906 			{
907 				//Display Aim Warning Text
908 				SetFontShadow( 2 );
909 //				DisplayWrappedString(AIM_BOBBYR3_LINK_TEXT_X, AIM_BOBBYR3_LINK_TEXT_Y, AIM_WARNING_TEXT_WIDTH, 2, BOBBYR_UNDER_CONSTRUCTION_AD_FONT, FONT_MCOLOR_WHITE, AimScreenText[AIM_BOBBYR_ADD3], FONT_MCOLOR_BLACK, LEFT_JUSTIFIED | INVALIDATE_TEXT);
910 				SetFontShadow( DEFAULT_SHADOW );
911 			}
912 */
913 			break;
914 	}
915 }
916 
917 
DisplayBobbyRAd(BOOLEAN fInit,BOOLEAN fRedraw)918 static BOOLEAN DisplayBobbyRAd(BOOLEAN fInit, BOOLEAN fRedraw)
919 {
920 	static UINT32 uiLastTime;
921 	static UINT8	ubSubImage=0;
922 	static UINT8	ubDuckCount=0;
923 	static UINT8	ubCount=0;
924 	UINT32 uiCurTime = GetJA2Clock();
925 	UINT8	ubRetVal = 0;
926 	UINT16	usDelay = AIM_AD_BOBBYR_AD_DELAY;
927 
928 
929 	if( fInit )
930 	{
931 		ubDuckCount = 0;
932 		uiLastTime = 0;
933 		ubSubImage = 0;
934 		ubCount = 0;
935 	}
936 
937 	if( ((uiCurTime - uiLastTime) > usDelay) || fRedraw)
938 	{
939 		//Loop through the first 6 images twice, then start into the later ones
940 		BltVideoObject(FRAME_BUFFER, guiBobbyRAdImages, ubSubImage, WARNING_X, WARNING_Y);
941 		//if we are still looping through the first 6 animations
942 		if( ubDuckCount < 2 )
943 		{
944 			ubSubImage ++;
945 
946 			InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
947 
948 			// if we do the first set of images
949 			if( ubSubImage > AIM_AD_BOBBYR_AD_NUM_DUCK_SUBIMAGES )
950 			{
951 				ubDuckCount++;
952 
953 				if( ubDuckCount < 2 )
954 					ubSubImage = 0;
955 				else
956 					ubSubImage = AIM_AD_BOBBYR_AD_NUM_DUCK_SUBIMAGES+1;
957 			}
958 			ubRetVal = AIM_AD_NOT_DONE;
959 		}
960 
961 		else
962 		{
963 			ubSubImage ++;
964 
965 			if( ubSubImage >= AIM_AD_BOBBYR_AD__NUM_SUBIMAGES-1 )
966 			{
967 				//display last frame longer then rest
968 				ubCount++;
969 				if( ubCount > 12 )
970 				{
971 					ubRetVal = AIM_AD_DONE;
972 				}
973 
974 				ubSubImage = AIM_AD_BOBBYR_AD__NUM_SUBIMAGES - 1;
975 			}
976 
977 			// redraw new mail warning, and create new mail button, if nessacary
978 			fReDrawNewMailFlag = TRUE;
979 
980 			InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
981 		}
982 
983 		//if the add it to have text on it, then put the text on it.
984 		HandleTextOnAimAdd( ubSubImage );
985 
986 
987 		uiLastTime = GetJA2Clock();
988 		InvalidateRegion(AIM_AD_TOP_LEFT_X,AIM_AD_TOP_LEFT_Y, AIM_AD_BOTTOM_RIGHT_X	,AIM_AD_BOTTOM_RIGHT_Y);
989 	}
990 
991 	return( ubRetVal );
992 }
993 
994 
GetNextAimAd(UINT8 ubCurrentAd)995 static UINT8 GetNextAimAd(UINT8 ubCurrentAd)
996 {
997 	UINT8 ubNextAd;
998 	UINT32	uiDay = GetWorldDay();
999 
1000 	if( ubCurrentAd == AIM_AD_WARNING_BOX )
1001 	{
1002 		if( uiDay < AIM_AD_BOBBYR_AD_STARTS )
1003 		{
1004 			//if the player has NOT ever been to drassen
1005 			if( !LaptopSaveInfo.fBobbyRSiteCanBeAccessed )
1006 			{
1007 				ubNextAd = AIM_AD_FOR_ADS;
1008 			}
1009 			else
1010 			{
1011 				ubNextAd = AIM_AD_BOBBY_RAY_AD;
1012 			}
1013 		}
1014 
1015 		else if( uiDay < AIM_AD_DAY_FUNERAL_AD_STARTS )
1016 			ubNextAd = AIM_AD_FUNERAL_ADS;
1017 
1018 		else if( uiDay < AIM_AD_DAY_FLOWER_AD_STARTS )
1019 			ubNextAd = AIM_AD_FLOWER_SHOP;
1020 
1021 		else //if( uiDay < AIM_AD_DAY_INSURANCE_AD_STARTS )
1022 			ubNextAd = AIM_AD_INSURANCE_AD;
1023 	}
1024 	else
1025 	{
1026 		ubNextAd = AIM_AD_WARNING_BOX;
1027 	}
1028 
1029 	return( ubNextAd );
1030 }
1031