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