1 #include "Map_Screen_Interface_Border.h"
2 #include "Assignments.h"
3 #include "Campaign_Types.h"
4 #include "Debug.h"
5 #include "Directories.h"
6 #include "Interface.h"
7 #include "Map_Screen_Helicopter.h"
8 #include "Map_Screen_Interface.h"
9 #include "Map_Screen_Interface_Map.h"
10 #include "Map_Screen_Interface_Map_Inventory.h"
11 #include "MapScreen.h"
12 #include "MouseSystem.h"
13 #include "SysUtil.h"
14 #include "Text.h"
15 #include "UILayout.h"
16 #include "Video.h"
17 #include "VObject.h"
18 #include "VSurface.h"
19 #include <string_theory/string>
20
21 struct BUTTON_PICS;
22
23 #define MAP_BORDER_FILE INTERFACEDIR "/mbs.sti"
24 #define BTN_TOWN_X (STD_SCREEN_X + 299)
25 #define BTN_MINE_X (STD_SCREEN_X + 342)
26 #define BTN_TEAMS_X (STD_SCREEN_X + 385)
27 #define BTN_MILITIA_X (STD_SCREEN_X + 428)
28 #define BTN_AIR_X (STD_SCREEN_X + 471)
29 #define BTN_ITEM_X (STD_SCREEN_X + 514)
30
31 #define MAP_LEVEL_MARKER_X (STD_SCREEN_X + 565)
32 #define MAP_LEVEL_MARKER_Y (STD_SCREEN_Y + 323)
33 #define MAP_LEVEL_MARKER_DELTA 8
34 #define MAP_LEVEL_MARKER_WIDTH 55
35
36
37 #define MAP_BORDER_X (STD_SCREEN_X + 261)
38 #define MAP_BORDER_Y (STD_SCREEN_Y + 0)
39
40 #define MAP_BORDER_CORNER_X (STD_SCREEN_X + 584)
41 #define MAP_BORDER_CORNER_Y (STD_SCREEN_Y + 279)
42
43
44 // mouse levels
45 static MOUSE_REGION LevelMouseRegions[4];
46
47 // graphics
48 static SGPVObject* guiLEVELMARKER; // the white rectangle highlighting the current level on the map border
49 static SGPVObject* guiMapBorder;
50 static SGPVObject* guiMapBorderEtaPopUp; // the map border eta pop up
51 //static SGPVObject* guiMapBorderCorner;
52
53
54 // scroll direction
55 INT32 giScrollButtonState = -1;
56
57 // flags
58 BOOLEAN fShowTownFlag = FALSE;
59 BOOLEAN fShowMineFlag = FALSE;
60 BOOLEAN fShowTeamFlag = FALSE;
61 BOOLEAN fShowMilitia = FALSE;
62 BOOLEAN fShowAircraftFlag = FALSE;
63 BOOLEAN fShowItemsFlag = FALSE;
64
65
66 // buttons & button images
67 GUIButtonRef giMapBorderButtons[6];
68 static BUTTON_PICS* giMapBorderButtonsImage[6];
69
70 extern void CancelMapUIMessage( void );
71
72
LoadMapBorderGraphics(void)73 void LoadMapBorderGraphics(void)
74 {
75 // this procedure will load the graphics needed for the map border
76 guiLEVELMARKER = AddVideoObjectFromFile(INTERFACEDIR "/greenarr.sti");
77 guiMapBorder = AddVideoObjectFromFile(MAP_BORDER_FILE);
78 guiMapBorderEtaPopUp = AddVideoObjectFromFile(INTERFACEDIR "/eta_pop_up.sti");
79 }
80
81
DeleteMapBorderGraphics(void)82 void DeleteMapBorderGraphics( void )
83 {
84 // procedure will delete graphics loaded for map border
85 DeleteVideoObject(guiLEVELMARKER);
86 DeleteVideoObject(guiMapBorder);
87 DeleteVideoObject(guiMapBorderEtaPopUp);
88 }
89
90
91 static void DisplayCurrentLevelMarker(void);
92
93
RenderMapBorder(void)94 void RenderMapBorder( void )
95 {
96 if( fShowMapInventoryPool )
97 {
98 // render background, then leave
99 BlitInventoryPoolGraphic( );
100 return;
101 }
102
103 BltVideoObject(guiSAVEBUFFER, guiMapBorder, 0, MAP_BORDER_X, MAP_BORDER_Y);
104
105 // show the level marker
106 DisplayCurrentLevelMarker( );
107 }
108
RenderMapBorderEtaPopUp(void)109 void RenderMapBorderEtaPopUp( void )
110 {
111 if( fShowMapInventoryPool )
112 {
113 return;
114 }
115
116 if (fPlotForHelicopter)
117 {
118 DisplayDistancesForHelicopter( );
119 return;
120 }
121
122 BltVideoObject(FRAME_BUFFER, guiMapBorderEtaPopUp, 0, MAP_BORDER_X + 215, STD_SCREEN_Y + 291);
123
124 InvalidateRegion( MAP_BORDER_X + 215, (STD_SCREEN_Y + 291), MAP_BORDER_X + 215 + 100 , (STD_SCREEN_Y + 310));
125 }
126
127
MakeButton(UINT idx,UINT gfx,INT16 x,GUI_CALLBACK click,const ST::string & help)128 static void MakeButton(UINT idx, UINT gfx, INT16 x, GUI_CALLBACK click, const ST::string& help)
129 {
130 BUTTON_PICS* const img = LoadButtonImage(INTERFACEDIR "/map_border_buttons.sti", gfx, gfx + 9);
131 giMapBorderButtonsImage[idx] = img;
132 GUIButtonRef const btn = QuickCreateButtonNoMove(img, x, (STD_SCREEN_Y + 323), MSYS_PRIORITY_HIGH, click);
133 giMapBorderButtons[idx] = btn;
134 btn->SetFastHelpText(help);
135 btn->SetCursor(MSYS_NO_CURSOR);
136 }
137
138
139 static void BtnAircraftCallback(GUI_BUTTON* btn, INT32 reason);
140 static void BtnItemCallback(GUI_BUTTON* btn, INT32 reason);
141 static void BtnMilitiaCallback(GUI_BUTTON* btn, INT32 reason);
142 static void BtnMineCallback(GUI_BUTTON* btn, INT32 reason);
143 static void BtnTeamCallback(GUI_BUTTON* btn, INT32 reason);
144 static void BtnTownCallback(GUI_BUTTON* btn, INT32 reason);
145 static void InitializeMapBorderButtonStates(void);
146
147
CreateButtonsForMapBorder(void)148 void CreateButtonsForMapBorder(void)
149 {
150 // will create the buttons needed for the map screen border region
151
152 MakeButton(MAP_BORDER_TOWN_BTN, 5, BTN_TOWN_X, BtnTownCallback, pMapScreenBorderButtonHelpText[0]); // towns
153 MakeButton(MAP_BORDER_MINE_BTN, 4, BTN_MINE_X, BtnMineCallback, pMapScreenBorderButtonHelpText[1]); // mines
154 MakeButton(MAP_BORDER_TEAMS_BTN, 3, BTN_TEAMS_X, BtnTeamCallback, pMapScreenBorderButtonHelpText[2]); // people
155 MakeButton(MAP_BORDER_MILITIA_BTN, 8, BTN_MILITIA_X, BtnMilitiaCallback, pMapScreenBorderButtonHelpText[5]); // militia
156 MakeButton(MAP_BORDER_AIRSPACE_BTN, 2, BTN_AIR_X, BtnAircraftCallback, pMapScreenBorderButtonHelpText[3]); // airspace
157 MakeButton(MAP_BORDER_ITEM_BTN, 1, BTN_ITEM_X, BtnItemCallback, pMapScreenBorderButtonHelpText[4]); // items
158
159 InitializeMapBorderButtonStates( );
160 }
161
162
DeleteMapBorderButtons(void)163 void DeleteMapBorderButtons( void )
164 {
165 UINT8 ubCnt;
166
167 RemoveButton( giMapBorderButtons[ 0 ]);
168 RemoveButton( giMapBorderButtons[ 1 ]);
169 RemoveButton( giMapBorderButtons[ 2 ]);
170 RemoveButton( giMapBorderButtons[ 3 ]);
171 RemoveButton( giMapBorderButtons[ 4 ]);
172 RemoveButton( giMapBorderButtons[ 5 ]);
173
174 // images
175 UnloadButtonImage( giMapBorderButtonsImage[ 0 ] );
176 UnloadButtonImage( giMapBorderButtonsImage[ 1 ] );
177 UnloadButtonImage( giMapBorderButtonsImage[ 2 ] );
178 UnloadButtonImage( giMapBorderButtonsImage[ 3 ] );
179 UnloadButtonImage( giMapBorderButtonsImage[ 4 ] );
180 UnloadButtonImage( giMapBorderButtonsImage[ 5 ] );
181
182
183 for ( ubCnt = 0; ubCnt < 6; ubCnt++ )
184 {
185 giMapBorderButtonsImage[ubCnt] = NULL;
186 }
187 }
188
189
190 // callbacks
191
192 static void CommonBtnCallbackBtnDownChecks(void);
193
194
BtnMilitiaCallback(GUI_BUTTON * btn,INT32 reason)195 static void BtnMilitiaCallback(GUI_BUTTON* btn, INT32 reason)
196 {
197 if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
198 {
199 CommonBtnCallbackBtnDownChecks();
200 ToggleShowMilitiaMode( );
201 }
202 else if(reason & MSYS_CALLBACK_REASON_RBUTTON_DWN )
203 {
204 CommonBtnCallbackBtnDownChecks();
205 }
206 }
207
208
BtnTeamCallback(GUI_BUTTON * btn,INT32 reason)209 static void BtnTeamCallback(GUI_BUTTON* btn, INT32 reason)
210 {
211 if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
212 {
213 CommonBtnCallbackBtnDownChecks();
214 ToggleShowTeamsMode();
215 }
216 else if(reason & MSYS_CALLBACK_REASON_RBUTTON_DWN )
217 {
218 CommonBtnCallbackBtnDownChecks();
219 }
220 }
221
222
BtnTownCallback(GUI_BUTTON * btn,INT32 reason)223 static void BtnTownCallback(GUI_BUTTON* btn, INT32 reason)
224 {
225 if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
226 {
227 CommonBtnCallbackBtnDownChecks();
228 ToggleShowTownsMode();
229 }
230 else if(reason & MSYS_CALLBACK_REASON_RBUTTON_DWN )
231 {
232 CommonBtnCallbackBtnDownChecks();
233 }
234 }
235
236
BtnMineCallback(GUI_BUTTON * btn,INT32 reason)237 static void BtnMineCallback(GUI_BUTTON* btn, INT32 reason)
238 {
239 if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
240 {
241 CommonBtnCallbackBtnDownChecks();
242 ToggleShowMinesMode();
243 }
244 else if(reason & MSYS_CALLBACK_REASON_RBUTTON_DWN )
245 {
246 CommonBtnCallbackBtnDownChecks();
247 }
248 }
249
250
BtnAircraftCallback(GUI_BUTTON * btn,INT32 reason)251 static void BtnAircraftCallback(GUI_BUTTON* btn, INT32 reason)
252 {
253 if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
254 {
255 CommonBtnCallbackBtnDownChecks();
256
257 ToggleAirspaceMode();
258 }
259 else if(reason & MSYS_CALLBACK_REASON_RBUTTON_DWN )
260 {
261 CommonBtnCallbackBtnDownChecks();
262 }
263 }
264
265
BtnItemCallback(GUI_BUTTON * btn,INT32 reason)266 static void BtnItemCallback(GUI_BUTTON* btn, INT32 reason)
267 {
268 if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
269 {
270 CommonBtnCallbackBtnDownChecks();
271
272 ToggleItemsFilter();
273 }
274 else if(reason & MSYS_CALLBACK_REASON_RBUTTON_DWN )
275 {
276 CommonBtnCallbackBtnDownChecks();
277 }
278 }
279
280 static void MapBorderButtonOff(UINT8 ubBorderButtonIndex);
281 static void MapBorderButtonOn(UINT8 ubBorderButtonIndex);
282
283
ToggleShowTownsMode(void)284 void ToggleShowTownsMode( void )
285 {
286 if (fShowTownFlag)
287 {
288 fShowTownFlag = FALSE;
289 MapBorderButtonOff( MAP_BORDER_TOWN_BTN );
290 }
291 else
292 {
293 fShowTownFlag = TRUE;
294 MapBorderButtonOn( MAP_BORDER_TOWN_BTN );
295
296 if (fShowMineFlag)
297 {
298 fShowMineFlag = FALSE;
299 MapBorderButtonOff( MAP_BORDER_MINE_BTN );
300 }
301
302 if (fShowAircraftFlag)
303 {
304 fShowAircraftFlag = FALSE;
305 MapBorderButtonOff( MAP_BORDER_AIRSPACE_BTN );
306 }
307
308 if (fShowItemsFlag)
309 {
310 fShowItemsFlag = FALSE;
311 MapBorderButtonOff( MAP_BORDER_ITEM_BTN );
312 }
313 }
314
315 fMapPanelDirty = TRUE;
316 }
317
318
ToggleShowMinesMode(void)319 void ToggleShowMinesMode( void )
320 {
321 if (fShowMineFlag)
322 {
323 fShowMineFlag = FALSE;
324 MapBorderButtonOff( MAP_BORDER_MINE_BTN );
325 }
326 else
327 {
328 fShowMineFlag = TRUE;
329 MapBorderButtonOn( MAP_BORDER_MINE_BTN );
330
331 if (fShowTownFlag)
332 {
333 fShowTownFlag = FALSE;
334 MapBorderButtonOff( MAP_BORDER_TOWN_BTN );
335 }
336
337 if (fShowAircraftFlag)
338 {
339 fShowAircraftFlag = FALSE;
340 MapBorderButtonOff( MAP_BORDER_AIRSPACE_BTN );
341 }
342
343 if (fShowItemsFlag)
344 {
345 fShowItemsFlag = FALSE;
346 MapBorderButtonOff( MAP_BORDER_ITEM_BTN );
347 }
348 }
349
350 fMapPanelDirty = TRUE;
351 }
352
353
354 static bool DoesPlayerHaveAnyMilitia();
355
356
ToggleShowMilitiaMode(void)357 void ToggleShowMilitiaMode( void )
358 {
359 if (fShowMilitia)
360 {
361 fShowMilitia = FALSE;
362 MapBorderButtonOff( MAP_BORDER_MILITIA_BTN );
363 }
364 else
365 {
366 // toggle militia ON
367 fShowMilitia = TRUE;
368 MapBorderButtonOn( MAP_BORDER_MILITIA_BTN );
369
370 // if Team is ON, turn it OFF
371 if (fShowTeamFlag)
372 {
373 fShowTeamFlag = FALSE;
374 MapBorderButtonOff( MAP_BORDER_TEAMS_BTN );
375 }
376
377 /*
378 // if Airspace is ON, turn it OFF
379 if (fShowAircraftFlag)
380 {
381 fShowAircraftFlag = FALSE;
382 MapBorderButtonOff( MAP_BORDER_AIRSPACE_BTN );
383 }
384 */
385
386 if (fShowItemsFlag)
387 {
388 fShowItemsFlag = FALSE;
389 MapBorderButtonOff( MAP_BORDER_ITEM_BTN );
390 }
391
392
393 // check if player has any militia
394 if (!DoesPlayerHaveAnyMilitia())
395 {
396 ST::string pwString;
397
398 // no - so put up a message explaining how it works
399
400 // if he's already training some
401 if( IsAnyOneOnPlayersTeamOnThisAssignment( TRAIN_TOWN ) )
402 {
403 // say they'll show up when training is completed
404 pwString = pMapErrorString[ 28 ];
405 }
406 else
407 {
408 // say you need to train them first
409 pwString = zMarksMapScreenText[ 1 ];
410 }
411
412 BeginMapUIMessage(0, pwString);
413 }
414 }
415
416 fMapPanelDirty = TRUE;
417 }
418
419
ToggleShowTeamsMode(void)420 void ToggleShowTeamsMode( void )
421 {
422 if (fShowTeamFlag)
423 {
424 // turn show teams OFF
425 fShowTeamFlag = FALSE;
426 MapBorderButtonOff( MAP_BORDER_TEAMS_BTN );
427
428 // dirty regions
429 fMapPanelDirty = TRUE;
430 fTeamPanelDirty = TRUE;
431 fCharacterInfoPanelDirty = TRUE;
432 }
433 else
434 { // turn show teams ON
435 TurnOnShowTeamsMode();
436 }
437 }
438
439
ToggleAirspaceMode(void)440 void ToggleAirspaceMode( void )
441 {
442 if (fShowAircraftFlag)
443 {
444 // turn airspace OFF
445 fShowAircraftFlag = FALSE;
446 MapBorderButtonOff( MAP_BORDER_AIRSPACE_BTN );
447
448 if (fPlotForHelicopter)
449 {
450 AbortMovementPlottingMode( );
451 }
452
453 // dirty regions
454 fMapPanelDirty = TRUE;
455 fTeamPanelDirty = TRUE;
456 fCharacterInfoPanelDirty = TRUE;
457 }
458 else
459 { // turn airspace ON
460 TurnOnAirSpaceMode();
461 }
462 }
463
464
465 static void TurnOnItemFilterMode(void);
466
467
ToggleItemsFilter(void)468 void ToggleItemsFilter( void )
469 {
470 if (fShowItemsFlag)
471 {
472 // turn items OFF
473 fShowItemsFlag = FALSE;
474 MapBorderButtonOff( MAP_BORDER_ITEM_BTN );
475
476 // dirty regions
477 fMapPanelDirty = TRUE;
478 fTeamPanelDirty = TRUE;
479 fCharacterInfoPanelDirty = TRUE;
480 }
481 else
482 {
483 // turn items ON
484 TurnOnItemFilterMode();
485 }
486 }
487
DisplayCurrentLevelMarker(void)488 static void DisplayCurrentLevelMarker(void)
489 {
490 // display the current level marker on the map border
491 /*
492 if( fDisabledMapBorder )
493 {
494 return;
495 }
496 */
497
498 // it's actually a white rectangle, not a green arrow!
499 BltVideoObject(guiSAVEBUFFER, guiLEVELMARKER, 0, MAP_LEVEL_MARKER_X, MAP_LEVEL_MARKER_Y + MAP_LEVEL_MARKER_DELTA * iCurrentMapSectorZ);
500 }
501
502
503 static void LevelMarkerBtnCallback(MOUSE_REGION* pRegion, INT32 iReason);
504
505
CreateMouseRegionsForLevelMarkers(void)506 void CreateMouseRegionsForLevelMarkers(void)
507 {
508 for (UINT sCounter = 0; sCounter < 4 ; ++sCounter)
509 {
510 MOUSE_REGION* const r = &LevelMouseRegions[sCounter];
511 const UINT16 x = MAP_LEVEL_MARKER_X;
512 const UINT16 y = MAP_LEVEL_MARKER_Y + MAP_LEVEL_MARKER_DELTA * sCounter;
513 const UINT16 w = MAP_LEVEL_MARKER_WIDTH;
514 const UINT16 h = MAP_LEVEL_MARKER_DELTA;
515 MSYS_DefineRegion(r, x, y, x + w, y + h, MSYS_PRIORITY_HIGH, MSYS_NO_CURSOR, MSYS_NO_CALLBACK, LevelMarkerBtnCallback);
516
517 MSYS_SetRegionUserData(r, 0, sCounter);
518
519 ST::string sString = ST::format("{} {}", zMarksMapScreenText[0], sCounter + 1);
520 r->SetFastHelpText(sString);
521 }
522 }
523
524
DeleteMouseRegionsForLevelMarkers()525 void DeleteMouseRegionsForLevelMarkers()
526 {
527 FOR_EACH(MOUSE_REGION, i, LevelMouseRegions) MSYS_RemoveRegion(&*i);
528 }
529
530
LevelMarkerBtnCallback(MOUSE_REGION * pRegion,INT32 iReason)531 static void LevelMarkerBtnCallback(MOUSE_REGION* pRegion, INT32 iReason)
532 {
533 // btn callback handler for assignment screen mask region
534 INT32 iCounter = 0;
535
536 iCounter = MSYS_GetRegionUserData( pRegion, 0 );
537
538 if( ( iReason & MSYS_CALLBACK_REASON_LBUTTON_UP ) )
539 {
540 JumpToLevel( iCounter );
541 }
542 }
543
544
545 /*
546 void DisableMapBorderRegion( void )
547 {
548 // will shutdown map border region
549
550 if( fDisabledMapBorder )
551 {
552 // checked, failed
553 return;
554 }
555
556 // get rid of graphics and mouse regions
557 DeleteMapBorderGraphics( );
558
559
560 fDisabledMapBorder = TRUE;
561 }
562
563 void EnableMapBorderRegion( void )
564 {
565 // will re-enable mapborder region
566
567 if (!fDisabledMapBorder)
568 {
569 // checked, failed
570 return;
571 }
572
573 // re load graphics and buttons
574 LoadMapBorderGraphics( );
575
576 fDisabledMapBorder = FALSE;
577
578 }
579 */
580
581
TurnOnShowTeamsMode(void)582 void TurnOnShowTeamsMode( void )
583 {
584 // if mode already on, leave, else set and redraw
585
586 if (!fShowTeamFlag)
587 {
588 fShowTeamFlag = TRUE;
589 MapBorderButtonOn( MAP_BORDER_TEAMS_BTN );
590
591 if (fShowMilitia)
592 {
593 fShowMilitia = FALSE;
594 MapBorderButtonOff( MAP_BORDER_MILITIA_BTN );
595 }
596
597 /*
598 if (fShowAircraftFlag)
599 {
600 fShowAircraftFlag = FALSE;
601 MapBorderButtonOff( MAP_BORDER_AIRSPACE_BTN );
602 }
603 */
604
605 if (fShowItemsFlag)
606 {
607 fShowItemsFlag = FALSE;
608 MapBorderButtonOff( MAP_BORDER_ITEM_BTN );
609 }
610
611 // dirty regions
612 fMapPanelDirty = TRUE;
613 fTeamPanelDirty = TRUE;
614 fCharacterInfoPanelDirty = TRUE;
615 }
616 }
617
618
619
TurnOnAirSpaceMode(void)620 void TurnOnAirSpaceMode( void )
621 {
622 // if mode already on, leave, else set and redraw
623
624 if (!fShowAircraftFlag)
625 {
626 fShowAircraftFlag = TRUE;
627 MapBorderButtonOn( MAP_BORDER_AIRSPACE_BTN );
628
629
630 // Turn off towns & mines (mostly because town/mine names overlap SAM site names)
631 if (fShowTownFlag)
632 {
633 fShowTownFlag = FALSE;
634 MapBorderButtonOff( MAP_BORDER_TOWN_BTN );
635 }
636
637 if (fShowMineFlag)
638 {
639 fShowMineFlag = FALSE;
640 MapBorderButtonOff( MAP_BORDER_MINE_BTN );
641 }
642
643 /*
644 // Turn off teams and militia
645 if (fShowTeamFlag)
646 {
647 fShowTeamFlag = FALSE;
648 MapBorderButtonOff( MAP_BORDER_TEAMS_BTN );
649 }
650
651 if (fShowMilitia)
652 {
653 fShowMilitia = FALSE;
654 MapBorderButtonOff( MAP_BORDER_MILITIA_BTN );
655 }
656 */
657
658 // Turn off items
659 if (fShowItemsFlag)
660 {
661 fShowItemsFlag = FALSE;
662 MapBorderButtonOff( MAP_BORDER_ITEM_BTN );
663 }
664
665 if ( bSelectedDestChar != -1 )
666 {
667 AbortMovementPlottingMode( );
668 }
669
670
671 // if showing underground
672 if ( iCurrentMapSectorZ != 0 )
673 {
674 // switch to the surface
675 JumpToLevel( 0 );
676 }
677
678 // dirty regions
679 fMapPanelDirty = TRUE;
680 fTeamPanelDirty = TRUE;
681 fCharacterInfoPanelDirty = TRUE;
682 }
683 }
684
685
TurnOnItemFilterMode(void)686 static void TurnOnItemFilterMode(void)
687 {
688 // if mode already on, leave, else set and redraw
689
690 if (!fShowItemsFlag)
691 {
692 fShowItemsFlag = TRUE;
693 MapBorderButtonOn( MAP_BORDER_ITEM_BTN );
694
695
696 // Turn off towns, mines, teams, militia & airspace if any are on
697 if (fShowTownFlag)
698 {
699 fShowTownFlag = FALSE;
700 MapBorderButtonOff( MAP_BORDER_TOWN_BTN );
701 }
702
703 if (fShowMineFlag)
704 {
705 fShowMineFlag = FALSE;
706 MapBorderButtonOff( MAP_BORDER_MINE_BTN );
707 }
708
709 if (fShowTeamFlag)
710 {
711 fShowTeamFlag = FALSE;
712 MapBorderButtonOff( MAP_BORDER_TEAMS_BTN );
713 }
714
715 if (fShowMilitia)
716 {
717 fShowMilitia = FALSE;
718 MapBorderButtonOff( MAP_BORDER_MILITIA_BTN );
719 }
720
721 if (fShowAircraftFlag)
722 {
723 fShowAircraftFlag = FALSE;
724 MapBorderButtonOff( MAP_BORDER_AIRSPACE_BTN );
725 }
726
727 if (bSelectedDestChar != -1 || fPlotForHelicopter)
728 {
729 AbortMovementPlottingMode( );
730 }
731
732 // dirty regions
733 fMapPanelDirty = TRUE;
734 fTeamPanelDirty = TRUE;
735 fCharacterInfoPanelDirty = TRUE;
736 }
737 }
738
739
740 // set button states to match map flags
InitializeMapBorderButtonStates(void)741 static void InitializeMapBorderButtonStates(void)
742 {
743 if( fShowItemsFlag )
744 {
745 MapBorderButtonOn( MAP_BORDER_ITEM_BTN );
746 }
747 else
748 {
749 MapBorderButtonOff( MAP_BORDER_ITEM_BTN );
750 }
751
752 if( fShowTownFlag )
753 {
754 MapBorderButtonOn( MAP_BORDER_TOWN_BTN );
755 }
756 else
757 {
758 MapBorderButtonOff( MAP_BORDER_TOWN_BTN );
759 }
760
761 if( fShowMineFlag )
762 {
763 MapBorderButtonOn( MAP_BORDER_MINE_BTN );
764 }
765 else
766 {
767 MapBorderButtonOff( MAP_BORDER_MINE_BTN );
768 }
769
770 if( fShowTeamFlag )
771 {
772 MapBorderButtonOn( MAP_BORDER_TEAMS_BTN );
773 }
774 else
775 {
776 MapBorderButtonOff( MAP_BORDER_TEAMS_BTN );
777 }
778
779 if( fShowAircraftFlag )
780 {
781 MapBorderButtonOn( MAP_BORDER_AIRSPACE_BTN );
782 }
783 else
784 {
785 MapBorderButtonOff( MAP_BORDER_AIRSPACE_BTN );
786 }
787
788 if( fShowMilitia )
789 {
790 MapBorderButtonOn( MAP_BORDER_MILITIA_BTN );
791 }
792 else
793 {
794 MapBorderButtonOff( MAP_BORDER_MILITIA_BTN );
795 }
796 }
797
798
DoesPlayerHaveAnyMilitia()799 static bool DoesPlayerHaveAnyMilitia()
800 {
801 FOR_EACH(SECTORINFO const, i, SectorInfo)
802 {
803 UINT8 const (&n)[MAX_MILITIA_LEVELS] = i->ubNumberOfCivsAtLevel;
804 if (n[GREEN_MILITIA] + n[REGULAR_MILITIA] + n[ELITE_MILITIA] != 0) return true;
805 }
806 return false;
807 }
808
809
CommonBtnCallbackBtnDownChecks(void)810 static void CommonBtnCallbackBtnDownChecks(void)
811 {
812 // any click cancels MAP UI messages, unless we're in confirm map move mode
813 if (g_ui_message_overlay != NULL && !gfInConfirmMapMoveMode)
814 {
815 CancelMapUIMessage( );
816 }
817 }
818
819
820
InitMapScreenFlags(void)821 void InitMapScreenFlags( void )
822 {
823 fShowTownFlag = TRUE;
824 fShowMineFlag = FALSE;
825
826 fShowTeamFlag = TRUE;
827 fShowMilitia = FALSE;
828
829 fShowAircraftFlag = FALSE;
830 fShowItemsFlag = FALSE;
831 }
832
833
MapBorderButtonOff(UINT8 ubBorderButtonIndex)834 static void MapBorderButtonOff(UINT8 ubBorderButtonIndex)
835 {
836 Assert( ubBorderButtonIndex < 6 );
837
838 if( fShowMapInventoryPool )
839 {
840 return;
841 }
842
843 // if button doesn't exist, return
844 GUIButtonRef const b = giMapBorderButtons[ubBorderButtonIndex];
845 if (b) b->uiFlags &= ~BUTTON_CLICKED_ON;
846 }
847
848
MapBorderButtonOn(UINT8 ubBorderButtonIndex)849 static void MapBorderButtonOn(UINT8 ubBorderButtonIndex)
850 {
851 Assert( ubBorderButtonIndex < 6 );
852
853 if( fShowMapInventoryPool )
854 {
855 return;
856 }
857
858 GUIButtonRef const b = giMapBorderButtons[ubBorderButtonIndex];
859 if (b) b->uiFlags |= BUTTON_CLICKED_ON;
860 }
861