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