Files
source/Tactical/Militia Control.cpp
T
Overhaul 9d71fc89f0 Massive effort to reign in militia problem. Still has issues :(
Fix:  If only some of mercs go to a lower level (mine, basement, etc) but do not choose to "GO TO SECTOR", sector is still inaccessible from strategic map.  However, watch for triggers that might happen on first visit to a sector, that fail.


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1076 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2007-07-19 08:33:17 +00:00

2366 lines
67 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Tactical All.h"
#include "PreBattle Interface.h"
#else
#include "Soldier Control.h"
#include "Militia Control.h"
#include "Town Militia.h"
#include "Soldier Init List.h"
#include "Campaign Types.h"
#include "Overhead.h"
#include "strategicmap.h"
#include "PreBattle Interface.h"
#include "Map Screen Interface.h"
#include "Queen Command.h"
#include "strategic.h"
#include "popupbox.h"
#include "interface control.h"
#include "Map Screen Interface Map.h"
#include "renderworld.h"
#include "Text.h"
#include "utilities.h"
#include "Interface.h"
#include "GameSettings.h"
#include "Input.h"
#include "opplist.h"
#include "los.h"
#include "Items.h"
#include "Animation Control.h"
#include "points.h"
#include "Campaign.h"
#include "ai.h"
#include "Isometric Utils.h"
#endif
#include "MilitiaSquads.h"
BOOLEAN gfStrategicMilitiaChangesMade = FALSE;
BOOLEAN fFirstClickInMilitiaControlScreenMask = FALSE;
BOOLEAN gfMSResetMilitia = FALSE;
// render pre battle interface?
extern BOOLEAN gfRenderPBInterface;
extern BOOLEAN fMapScreenBottomDirty;
// PopUp Box Handles
INT32 ghMilitiaControlBox = -1;
//INT32 ghTalkToAllBox = -1;
// the x,y position of assignment pop up in tactical
INT16 gsMilitiaControlBoxesX, gsMilitiaControlBoxesY;
//INT16 gsTalkToAllBoxesX, gsTalkToAllBoxesY;
// assignment menu mouse regions
MOUSE_REGION gMilitiaControlMenuRegion[ MAX_MILCON_STRING_COUNT ];
//MOUSE_REGION gTalkToAllMenuRegion[ MAX_TRAIN_STRING_COUNT ];
MOUSE_REGION gMilitiaControlScreenMaskRegion;
// pop up menu mouse regions
void CreateDestroyMouseRegionsForMilitiaControlMenu( void );
void MilitiaControlMenuMvtCallBack(MOUSE_REGION * pRegion, INT32 iReason );
void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason );
//void CreateDestroyMouseRegionsForTalkToAllMenu( void );
//void TalkToAllMenuMvtCallBack(MOUSE_REGION * pRegion, INT32 iReason );
//void TalkToAllMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason );
// assignment screen mask
void MilitiaControlScreenMaskBtnCallback(MOUSE_REGION * pRegion, INT32 iReason );
void CreateDestroyScreenMaskForMilitiaControlMenus( void );
// misc assignment GUI functions
void HandleShadingOfLinesForMilitiaControlMenu( void );
//void HandleShadingOfLinesForTalkToAllMenu( void );
void PositionCursorForMilitiaControlBox( void );
void RepositionMouseRegionsForMilitiaControl( void );
void CheckAndUpdateTacticalMilitiaControlPopUpPositions( void );
// create assignments box
void CreateMilitiaControlBox( void );
//void CreateTalkToAllBox( void );
// rebuild assignments box
void RebuildMilitiaControlBox( void );
//funktions for soldier control
extern INT8 SearchForItems( SOLDIERTYPE * pSoldier, INT8 bReason, UINT16 usItem );
extern SOLDIERTYPE *GetSelectedAssignSoldier( BOOLEAN fNullOK );
extern SOLDIERTYPE *pTMilitiaSoldier;
extern BOOLEAN SoldierCanAffordNewStance( SOLDIERTYPE *pSoldier, UINT8 ubDesiredStance );
void ResetMilitia()
{
BOOLEAN fBattleInProgress = FALSE;
UINT8 ubNumGreen = 0;
UINT8 ubNumReg = 0;
UINT8 ubNumVet = 0;
UINT32 cnt;
// if ( gWorldSectorX !=0 && gWorldSectorY != 0 && NumEnemiesInSector( gWorldSectorX, gWorldSectorY ) )
// fBattleInProgress = TRUE;
// 0verhaul: Instead of relying on the "changes made" flag, which isn't even saved in a saved game and therefore not
// reliable, we'll just do this the hard way, by taking inventory.
// gfStrategicMilitiaChangesMade = FALSE;
// for (cnt = gTacticalStatus.Team[MILITIA_TEAM].bFirstID; cnt <= gTacticalStatus.Team[MILITIA_TEAM].bLastID; cnt++)
// {
// if (!MercPtrs[cnt]->bActive)
// {
// continue;
// }
//
// switch (MercPtrs[cnt]->ubSoldierClass)
// {
// case SOLDIER_CLASS_GREEN_MILITIA: ubNumGreen++; break;
// case SOLDIER_CLASS_REG_MILITIA: ubNumReg++; break;
// case SOLDIER_CLASS_ELITE_MILITIA: ubNumVet++; break;
// default: ;
// }
// }
// if (MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, GREEN_MILITIA) != ubNumGreen ||
// MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, REGULAR_MILITIA) != ubNumReg ||
// MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, ELITE_MILITIA) != ubNumVet)
// {
// gfStrategicMilitiaChangesMade = TRUE;
// }
//
if (gfStrategicMilitiaChangesMade)
{
// I truly hope that we remove such inane control methods from the soldier create code when we break the merc slot barrier
// Hacks like this really depress me.
UINT32 cs = guiCurrentScreen;
// Make sure we aren't on the AUTORESOLVE screen for this. Even if we are. We are removing and creating soldiers for
// tactical here, not autoresolve. In my opinion the CreateSoldierXXX and TacticalRemoveSoldierXXX functions should take
// a flag for autoresolve if different initialization or destruction is desired.
guiCurrentScreen = GAME_SCREEN;
RemoveMilitiaFromTactical();
ubNumGreen = MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, GREEN_MILITIA);
ubNumReg = MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, REGULAR_MILITIA);
ubNumVet = MilitiaInSectorOfRank(gWorldSectorX, gWorldSectorY, ELITE_MILITIA);
AddSoldierInitListMilitia( ubNumGreen, ubNumReg, ubNumVet );
// Now restore the original screen setting so the game doesn't go wacky.
guiCurrentScreen = cs;
gfStrategicMilitiaChangesMade = FALSE;
}
// if( ( gfStrategicMilitiaChangesMade && !fBattleInProgress ) || gTacticalStatus.uiFlags & LOADING_SAVED_GAME || gfMSResetMilitia )
// if(gfMSResetMilitia )
// {
// if( !gfMSResetMilitia )
// RemoveMilitiaFromTactical();
// PrepareMilitiaForTactical();
// gfMSResetMilitia = FALSE;
// }
}
void RemoveMilitiaFromTactical()
{
SOLDIERINITNODE *curr;
INT32 i;
for( i = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID; i <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; i++ )
{
if( MercPtrs[ i ]->bActive )
{
TacticalRemoveSoldier( MercPtrs[ i ]->ubID );
}
}
curr = gSoldierInitHead;
while( curr )
{
if( curr->pBasicPlacement->bTeam == MILITIA_TEAM )
{
curr->pSoldier = NULL;
}
curr = curr->next;
}
}
void PrepareMilitiaForTactical()
{
SECTORINFO *pSector;
INT32 x;
UINT8 ubGreen, ubRegs, ubElites;
if( gbWorldSectorZ > 0 )
return;
// Do we have a loaded sector?
if ( gWorldSectorX ==0 && gWorldSectorY == 0 )
return;
pSector = &SectorInfo[ SECTOR( gWorldSectorX, gWorldSectorY ) ];
ubGreen = pSector->ubNumberOfCivsAtLevel[ GREEN_MILITIA ];
ubRegs = pSector->ubNumberOfCivsAtLevel[ REGULAR_MILITIA ];
ubElites = pSector->ubNumberOfCivsAtLevel[ ELITE_MILITIA ];
if(guiDirNumber)
{
for( x = 0 ; x < guiDirNumber ; ++x )
{
#if 0
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%ld,%ld,%ld,%ld", gpAttackDirs[ x ][ 0 ], gpAttackDirs[ x ][1], gpAttackDirs[ x ][2], gpAttackDirs[ x ][3] );
if( gfMSResetMilitia )
{
if( gpAttackDirs[ x ][ 3 ] != INSERTION_CODE_CENTER )
{
AddSoldierInitListMilitiaOnEdge( gpAttackDirs[ x ][ 3 ], gpAttackDirs[ x ][0], gpAttackDirs[ x ][1], gpAttackDirs[ x ][2] );
ubGreen -= gpAttackDirs[ x ][0];
ubRegs -= gpAttackDirs[ x ][1];
ubElites -= gpAttackDirs[ x ][2];
}
}
else
{
#endif
if( gpAttackDirs[ x ][ 3 ] == INSERTION_CODE_CENTER )
{
AddSoldierInitListMilitia( gpAttackDirs[ x ][0], gpAttackDirs[ x ][1], gpAttackDirs[ x ][2] );
}
else
{
AddSoldierInitListMilitiaOnEdge( gpAttackDirs[ x ][ 3 ], gpAttackDirs[ x ][0], gpAttackDirs[ x ][1], gpAttackDirs[ x ][2] );
}
// }
}
}
else
{
AddSoldierInitListMilitia( ubGreen, ubRegs, ubElites );
}
// for( i = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID; i <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; i++ )
// {
// if( MercPtrs[ i ]->bInSector )
// {
// MercPtrs[ i ]->bOrders = SEEKENEMY;
//// MercPtrs[ i ]->bAttitude = AGGRESSIVE;
// }
// }
guiDirNumber = 0;
memset( gpAttackDirs, 0, sizeof( gpAttackDirs));
}
void HandleMilitiaPromotions( void )
{
UINT8 cnt;
UINT8 ubMilitiaRank;
SOLDIERTYPE * pTeamSoldier;
UINT8 ubPromotions;
gbGreenToElitePromotions = 0;
gbGreenToRegPromotions = 0;
gbRegToElitePromotions = 0;
gbMilitiaPromotions = 0;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bLife > 0 )
{
if ( pTeamSoldier->ubMilitiaKills > 0 )
{
ubMilitiaRank = SoldierClassToMilitiaRank( pTeamSoldier->ubSoldierClass );
ubPromotions = CheckOneMilitiaForPromotion( gWorldSectorX, gWorldSectorY, ubMilitiaRank, pTeamSoldier->ubMilitiaKills );
if( ubPromotions )
{
if( ubPromotions == 2 )
{
gbGreenToElitePromotions++;
gbMilitiaPromotions++;
}
else if( pTeamSoldier->ubSoldierClass == SOLDIER_CLASS_GREEN_MILITIA )
{
gbGreenToRegPromotions++;
gbMilitiaPromotions++;
}
else if( pTeamSoldier->ubSoldierClass == SOLDIER_CLASS_REG_MILITIA )
{
gbRegToElitePromotions++;
gbMilitiaPromotions++;
}
}
pTeamSoldier->ubMilitiaKills = 0;
}
}
}
if( gbMilitiaPromotions )
{
// ATE: Problems here with bringing up message box...
// CHAR16 str[ 512 ];
// BuildMilitiaPromotionsString( str );
// DoScreenIndependantMessageBox( str, MSG_BOX_FLAG_OK, NULL );
}
if (gfStrategicMilitiaChangesMade)
{
ResetMilitia();
}
}
//lal
void RebuildMilitiaControlBox( void )
{
// destroy and recreate MilitiaControls box
if ( ghMilitiaControlBox != -1 )
{
RemoveBox( ghMilitiaControlBox );
ghMilitiaControlBox = -1;
}
CreateMilitiaControlBox( );
}
void MilitiaControlMenuMvtCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
// mvt callback handler for MilitiaControl region
INT32 iValue = -1;
iValue = MSYS_GetRegionUserData( pRegion, 0 );
if (iReason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
// highlight string
if( GetBoxShadeFlag( ghMilitiaControlBox, iValue ) == FALSE )
{
// get the string line handle
HighLightBoxLine( ghMilitiaControlBox, iValue );
}
}
else if (iReason & MSYS_CALLBACK_REASON_LOST_MOUSE )
{
// unhighlight all strings in box
UnHighLightBox( ghMilitiaControlBox );
}
}
void DetermineWhichMilitiaControlMenusCanBeShown( void )
{
BOOLEAN fCharacterNoLongerValid = FALSE;
SOLDIERTYPE *pSoldier = NULL;
if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) )
{
if( fShowMapScreenMovementList == TRUE )
{
if( bSelectedDestChar == -1 )
{
fCharacterNoLongerValid = TRUE;
//HandleShowingOfMovementBox( ); //laltodo
}
else
{
fShowMapScreenMovementList = FALSE;
fCharacterNoLongerValid = TRUE;
}
}
else if( bSelectedAssignChar == -1 )
{
fCharacterNoLongerValid = TRUE;
}
// update the assignment positions
UpdateMapScreenMilitiaControlPositions( );
}
//ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"start DetermineWhichMilitiaControlMenusCanBeShown" );
// determine which assign menu needs to be shown
if( ( ( fShowMilitiaControlMenu == FALSE ) )||( fCharacterNoLongerValid == TRUE ) )
{
// reset show MilitiaControl menu
fShowMilitiaControlMenu = FALSE;
//fShowTalkToAllMenu = FALSE;
//ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"ShowMilitiaControlMenu = FALSE" );
// destroy mask, if needed
CreateDestroyScreenMaskForMilitiaControlMenus( );
// destroy menu if needed
CreateDestroyMouseRegionsForMilitiaControlMenu( );
//CreateDestroyMouseRegionsForTalkToAllMenu( );
if ( IsBoxShown( ghMilitiaControlBox ) )
{
HideBox( ghMilitiaControlBox );
fTeamPanelDirty = TRUE;
gfRenderPBInterface = TRUE;
}
//if ( IsBoxShown( ghTalkToAllBox ) )
//{
// HideBox( ghTalkToAllBox );
// fTeamPanelDirty = TRUE;
// gfRenderPBInterface = TRUE;
//}
// no menus, leave
return;
}
// update the assignment positions
UpdateMapScreenMilitiaControlPositions( );
// create mask, if needed
CreateDestroyScreenMaskForMilitiaControlMenus( );
// created assignment menu if needed
CreateDestroyMouseRegionsForMilitiaControlMenu( );
//CreateDestroyMouseRegionsForTalkToAllMenu( );
// Militia Command menu
if( fShowMilitiaControlMenu == TRUE )
{
HandleShadingOfLinesForMilitiaControlMenu( );
ShowBox( ghMilitiaControlBox );
}
else
{
if( IsBoxShown( ghMilitiaControlBox ) )
{
HideBox( ghMilitiaControlBox );
fTeamPanelDirty = TRUE;
fMapPanelDirty = TRUE;
gfRenderPBInterface = TRUE;
}
}
// Talk to all menu
//if( fShowTalkToAllMenu == TRUE )
//{
// HandleShadingOfLinesForTalkToAllMenu( );
// ShowBox( ghTalkToAllBox );
//}
//else
//{
// if( IsBoxShown( ghTalkToAllBox ) )
// {
// HideBox( ghTalkToAllBox );
// fTeamPanelDirty = TRUE;
// fMapPanelDirty = TRUE;
// gfRenderPBInterface = TRUE;
// }
//}
return;
}
void CreateDestroyScreenMaskForMilitiaControlMenus( void )
{
static BOOLEAN fCreated = FALSE;
// will create a screen mask to catch mouse input to disable MilitiaControl menus
// not created, create
if( ( fCreated == FALSE ) && ( fShowMilitiaControlMenu == TRUE ) )
{
MSYS_DefineRegion( &gMilitiaControlScreenMaskRegion, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, MSYS_PRIORITY_HIGHEST - 4 ,
MSYS_NO_CURSOR, MSYS_NO_CALLBACK, MilitiaControlScreenMaskBtnCallback );
// created
fCreated = TRUE;
if ( !(guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) )
{
MSYS_ChangeRegionCursor( &gMilitiaControlScreenMaskRegion, 0 );
}
}
else if( ( fCreated == TRUE ) && ( fShowMilitiaControlMenu == FALSE ) )
{
// created, get rid of it
MSYS_RemoveRegion( &gMilitiaControlScreenMaskRegion );
// not created
fCreated = FALSE;
}
return;
}
void MilitiaControlScreenMaskBtnCallback(MOUSE_REGION * pRegion, INT32 iReason )
{
// btn callback handler for MilitiaControl screen mask region
if( ( iReason & MSYS_CALLBACK_REASON_LBUTTON_UP ) || ( iReason & MSYS_CALLBACK_REASON_RBUTTON_UP ) )
{
if( fFirstClickInMilitiaControlScreenMask == TRUE )
{
fFirstClickInMilitiaControlScreenMask = FALSE;
return;
}
// button event, stop showing menus
fShowMilitiaControlMenu = FALSE;
// update mapscreen
fTeamPanelDirty = TRUE;
fCharacterInfoPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
gfRenderPBInterface = TRUE;
SetRenderFlags( RENDER_FLAG_FULL );
}
return;
}
void CreateDestroyMouseRegionsForMilitiaControlMenu( void )
{
static BOOLEAN fCreated = FALSE;
UINT32 iCounter = 0;
INT32 iFontHeight = 0;
INT32 iBoxXPosition = 0;
INT32 iBoxYPosition = 0;
SOLDIERTYPE *pSoldier = NULL;
SGPPoint pPosition;
INT32 iBoxWidth = 0;
SGPRect pDimensions;
static BOOLEAN fShowRemoveMenu = FALSE;
// will create/destroy mouse regions for the map screen assignment main menu
// check if we can only remove character from team..not assign
//if( ( bSelectedAssignChar != -1 ) || ( fShowRemoveMenu == TRUE ) )
//{
// if( fShowRemoveMenu == TRUE )
// {
// // dead guy handle menu stuff
// fShowRemoveMenu = fShowMilitiaControlMenu | fShowContractMenu;
//
// CreateDestroyMouseRegionsForRemoveMenu( );
// return;
// }
// if( ( Menptr[gCharactersList[bSelectedAssignChar].usSolID].bLife == 0 ) || ( Menptr[gCharactersList[bSelectedAssignChar].usSolID].bMilitiaControl == MilitiaControl_POW ) )
// {
// // dead guy handle menu stuff
// fShowRemoveMenu = fShowMilitiaControlMenu | fShowContractMenu;
//
// CreateDestroyMouseRegionsForRemoveMenu( );
// return;
// }
//}
if( ( fShowMilitiaControlMenu == TRUE ) && ( fCreated == FALSE ) )
{
gfIgnoreScrolling = FALSE;
if( ( fShowMilitiaControlMenu ) && ( guiCurrentScreen == MAP_SCREEN ) )
{
SetBoxPosition( ghMilitiaControlBox, MilitiaControlPosition );
}
//pSoldier = GetSelectedAssignSoldier( FALSE );
//if( pSoldier -> ubWhatKindOfMercAmI != MERC_TYPE__EPC ) //laltodo
{
// grab height of font
iFontHeight = GetLineSpace( ghMilitiaControlBox ) + GetFontHeight( GetBoxFont( ghMilitiaControlBox ) );
// get x.y position of box
GetBoxPosition( ghMilitiaControlBox, &pPosition);
// grab box x and y position
iBoxXPosition = pPosition.iX;
iBoxYPosition = pPosition.iY;
// get dimensions..mostly for width
GetBoxSize( ghMilitiaControlBox, &pDimensions );
// get width
iBoxWidth = pDimensions.iRight;
SetCurrentBox( ghMilitiaControlBox );
}
// define regions
for( iCounter = 0; iCounter < GetNumberOfLinesOfTextInBox( ghMilitiaControlBox ); iCounter++ )
{
// add mouse region for each line of text..and set user data
MSYS_DefineRegion( &gMilitiaControlMenuRegion[ iCounter ], ( INT16 )( iBoxXPosition ), ( INT16 )( iBoxYPosition + GetTopMarginSize( ghMilitiaControlBox ) + ( iFontHeight ) * iCounter ), ( INT16 )( iBoxXPosition + iBoxWidth ), ( INT16 )( iBoxYPosition + GetTopMarginSize( ghMilitiaControlBox ) + ( iFontHeight ) * ( iCounter + 1 ) ), MSYS_PRIORITY_HIGHEST - 4 ,
MSYS_NO_CURSOR, MilitiaControlMenuMvtCallBack, MilitiaControlMenuBtnCallBack );
MSYS_SetRegionUserData( &gMilitiaControlMenuRegion[ iCounter ], 0, iCounter );
}
// created
fCreated = TRUE;
// unhighlight all strings in box
UnHighLightBox( ghMilitiaControlBox );
CheckAndUpdateTacticalMilitiaControlPopUpPositions( );
//PositionCursorForMilitiaControlBox( );
}
else if( ( fShowMilitiaControlMenu == FALSE ) && ( fCreated == TRUE ) )
{
// destroy
for( iCounter = 0; iCounter < GetNumberOfLinesOfTextInBox( ghMilitiaControlBox ); iCounter++ )
{
MSYS_RemoveRegion( &gMilitiaControlMenuRegion[ iCounter ] );
}
// not created
fCreated = FALSE;
SetRenderFlags( RENDER_FLAG_FULL );
}
}
void CreateMilitiaControlBox( void )
{
UINT32 hStringHandle;
UINT32 uiCounter;
CHAR16 sString[ 128 ];
//SOLDIERTYPE *pSoldier = NULL;
// will create attribute pop up menu for mapscreen MilitiaControls
MilitiaControlPosition.iX = OrigMilitiaControlPosition.iX;
if( giBoxY != 0 )
{
MilitiaControlPosition.iY = giBoxY;
}
//pSoldier = GetSelectedAssignSoldier( TRUE );
// pSoldier NULL is legal here! Gets called during every mapscreen initialization even when nobody is assign char
// create basic box
CreatePopUpBox(&ghMilitiaControlBox, MilitiaControlDimensions, MilitiaControlPosition, (POPUP_BOX_FLAG_CLIP_TEXT|POPUP_BOX_FLAG_CENTER_TEXT|POPUP_BOX_FLAG_RESIZE ));
// which buffer will box render to
SetBoxBuffer(ghMilitiaControlBox, FRAME_BUFFER);
// border type?
SetBorderType(ghMilitiaControlBox,guiPOPUPBORDERS);
// background texture
SetBackGroundSurface(ghMilitiaControlBox, guiPOPUPTEX);
// margin sizes
SetMargins(ghMilitiaControlBox, 6, 6, 4, 4 );
// space between lines
SetLineSpace(ghMilitiaControlBox, 2);
// set current box to this one
SetCurrentBox( ghMilitiaControlBox );
// add strings for box
for(uiCounter=0; uiCounter < MAX_MILCON_STRING_COUNT; uiCounter++)
{
swprintf( sString, pMilitiaControlMenuStrings[uiCounter] );
AddMonoString(&hStringHandle, sString );
// make sure it is unhighlighted
UnHighLightLine(hStringHandle);
}
// set font type
SetBoxFont(ghMilitiaControlBox, MAP_SCREEN_FONT);
// set highlight color
SetBoxHighLight(ghMilitiaControlBox, FONT_WHITE);
// unhighlighted color
SetBoxForeground(ghMilitiaControlBox, FONT_LTGREEN);
// background color
SetBoxBackground(ghMilitiaControlBox, FONT_BLACK);
// shaded color..for darkened text
SetBoxShade( ghMilitiaControlBox, FONT_GRAY7 );
SetBoxSecondaryShade( ghMilitiaControlBox, FONT_YELLOW );
// resize box to text
ResizeBoxToText( ghMilitiaControlBox );
//DetermineMilitiaControlBoxPositions( ); //laltodo
}
BOOLEAN CreateDestroyMilitiaControlPopUpBoxes( void )
{
static BOOLEAN fCreated= FALSE;
VSURFACE_DESC vs_desc;
VOBJECT_DESC VObjectDesc;
if( ( fShowMilitiaControlMenu == TRUE ) && ( fCreated == FALSE ) )
{
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("INTERFACE\\popup.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiPOPUPBORDERS));
vs_desc.fCreateFlags = VSURFACE_CREATE_FROMFILE | VSURFACE_SYSTEM_MEM_USAGE;
strcpy(vs_desc.ImageFile, "INTERFACE\\popupbackground.pcx");
CHECKF(AddVideoSurface(&vs_desc, &guiPOPUPTEX));
// these boxes are always created while in mapscreen...
CreateMilitiaControlBox( );
//CreateTalkToAllBox( );
UpdateMapScreenMilitiaControlPositions( );
fCreated = TRUE;
}
else if( ( fShowMilitiaControlMenu == FALSE ) && ( fCreated == TRUE ) )
{
DeleteVideoObjectFromIndex(guiPOPUPBORDERS);
DeleteVideoSurfaceFromIndex(guiPOPUPTEX);
RemoveBox(ghMilitiaControlBox);
ghMilitiaControlBox = -1;
//RemoveBox(ghTalkToAllBox);
//ghTalkToAllBox = -1;
fCreated = FALSE;
gfIgnoreScrolling = FALSE;
}
return( TRUE );
}
void DetermineMilitiaControlBoxPositions( void )
{
// depending on how many boxes there are, reposition as needed
SGPPoint pPoint;
SGPPoint pNewPoint;
SGPRect pDimensions;
SOLDIERTYPE *pSoldier = NULL;
if( ( fShowMilitiaControlMenu == FALSE ) || ( ghMilitiaControlBox == -1 ) )
{
return;
}
pSoldier = GetSelectedAssignSoldier( TRUE );
// pSoldier NULL is legal here! Gets called during every mapscreen initialization even when nobody is assign char
if ( pSoldier == NULL )
{
return;
}
if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) )
{
GetBoxPosition( ghMilitiaControlBox, &pPoint );
gsMilitiaControlBoxesX = ( INT16 )pPoint.iX;
gsMilitiaControlBoxesY = ( INT16 )pPoint.iY;
}
pPoint.iX = gsMilitiaControlBoxesX;
pPoint.iY = gsMilitiaControlBoxesY;
SetBoxPosition( ghMilitiaControlBox, pPoint );
GetBoxSize( ghMilitiaControlBox, &pDimensions );
// hang it right beside the MilitiaControl/EPC box menu
pNewPoint.iX = pPoint.iX + pDimensions.iRight;
pNewPoint.iY = pPoint.iY;
//if( ( fShowTalkToAllMenu == TRUE ) && ( ghTalkToAllBox != -1 ) )
//{
// pNewPoint.iY += ( ( GetFontHeight( MAP_SCREEN_FONT ) + 2 ) * MILCON_MENU_ALL );
// SetBoxPosition( ghTalkToAllBox, pNewPoint );
// TrainPosition.iX = pNewPoint.iX;
// TrainPosition.iY = pNewPoint.iY;
// OrigTrainPosition.iY = pNewPoint.iY;
// OrigTrainPosition.iX = pNewPoint.iX;
// GetBoxSize( ghTalkToAllBox, &pDimensions );
// GetBoxPosition( ghTalkToAllBox, &pPoint );
//}
return;
}
void SetTacticalPopUpMilitiaControlBoxXY( SOLDIERTYPE *pSoldier )
{
INT16 sX, sY;
//SOLDIERTYPE *pSoldier;
//get the soldier
//pSoldier = GetSelectedAssignSoldier( FALSE ); //gives wrong position (0,0) when cursor moved
//if ( !GetSoldier( &pSoldier, gusSelectedSoldier ) )
//{
// //ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"No Soldier" );
// return;
//}
// grab soldier's x,y screen position
GetSoldierScreenPos( pSoldier, &sX, &sY );
//ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"X-Position: %d", sX );
//ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Y-Position: %d", sY );
if( sX < 0 )
{
sX = 0;
}
gsMilitiaControlBoxesX = sX + 30;
if( sY < 0 )
{
sY = 0;
}
gsMilitiaControlBoxesY = sY;
// ATE: Check if we are past tactical viewport....
// Use estimate width's/heights
if ( ( gsMilitiaControlBoxesX + 100 ) > SCREEN_WIDTH )
{
gsMilitiaControlBoxesX = SCREEN_WIDTH - 100;
}
if ( ( gsMilitiaControlBoxesY + 130 ) > SCREEN_HEIGHT )
{
gsMilitiaControlBoxesY = SCREEN_HEIGHT - 190;
}
return;
}
void CheckAndUpdateTacticalMilitiaControlPopUpPositions( void )
{
SGPRect pDimensions2;
SGPPoint pPoint;
//SOLDIERTYPE *pSoldier = NULL;
if( fShowMilitiaControlMenu == FALSE )
{
return;
}
if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) )
{
return;
}
//get the soldier
//pSoldier = GetSelectedAssignSoldier( FALSE );
//if( pSoldier -> ubWhatKindOfMercAmI == MERC_TYPE__EPC ) //laltodo
{
GetBoxSize( ghMilitiaControlBox, &pDimensions2 );
}
// just the MilitiaControl box
if( gsMilitiaControlBoxesX + pDimensions2.iRight >= SCREEN_WIDTH )
{
gsMilitiaControlBoxesX = ( INT16 ) ( SCREEN_WIDTH - 1 - ( pDimensions2.iRight ) );
SetRenderFlags( RENDER_FLAG_FULL );
}
if( gsMilitiaControlBoxesY + pDimensions2.iBottom >= SCREEN_HEIGHT-120 )
{
gsMilitiaControlBoxesY = ( INT16 )( SCREEN_HEIGHT - 121 - ( pDimensions2.iBottom ) );
SetRenderFlags( RENDER_FLAG_FULL );
}
pPoint.iX = gsMilitiaControlBoxesX;
pPoint.iY = gsMilitiaControlBoxesY;
//if( pSoldier -> ubWhatKindOfMercAmI != MERC_TYPE__EPC) //laltodo
{
SetBoxPosition( ghMilitiaControlBox, pPoint );
}
RepositionMouseRegionsForMilitiaControl( );
}
void RepositionMouseRegionsForMilitiaControl( void )
{
INT16 sDeltaX, sDeltaY;
INT32 iCounter = 0;
if( fShowMilitiaControlMenu == TRUE )
{
sDeltaX = gsMilitiaControlBoxesX - gMilitiaControlMenuRegion[ 0 ].RegionTopLeftX;
sDeltaY = ( INT16 ) ( gsMilitiaControlBoxesY - gMilitiaControlMenuRegion[ 0 ].RegionTopLeftY + GetTopMarginSize( ghMilitiaControlBox ) );
// find the delta from the old to the new, and alter values accordingly
for( iCounter = 0; iCounter < ( INT32 )GetNumberOfLinesOfTextInBox( ghMilitiaControlBox ); iCounter++ )
{
gMilitiaControlMenuRegion[ iCounter ].RegionTopLeftX += sDeltaX;
gMilitiaControlMenuRegion[ iCounter ].RegionTopLeftY += sDeltaY;
gMilitiaControlMenuRegion[ iCounter ].RegionBottomRightX += sDeltaX;
gMilitiaControlMenuRegion[ iCounter ].RegionBottomRightY += sDeltaY;
}
gfPausedTacticalRenderFlags = RENDER_FLAG_FULL;
}
}
void PositionCursorForMilitiaControlBox( void )
{
// position cursor over y of on duty in tactical assignments
SGPPoint pPosition;
SGPRect pDimensions;
INT32 iFontHeight;
// get x.y position of box
GetBoxPosition( ghMilitiaControlBox, &pPosition);
// get dimensions..mostly for width
GetBoxSize( ghMilitiaControlBox, &pDimensions );
iFontHeight = GetLineSpace( ghMilitiaControlBox ) + GetFontHeight( GetBoxFont( ghMilitiaControlBox ) );
if( gGameSettings.fOptions[ TOPTION_DONT_MOVE_MOUSE ] == FALSE )
{
SimulateMouseMovement( pPosition.iX + pDimensions.iRight - 6, pPosition.iY + ( iFontHeight / 2 ) + 2 );
}
}
void HandleShadingOfLinesForMilitiaControlMenu( void )
{
SOLDIERTYPE *pSoldier = NULL;
INT16 sDistVisible;
// check if valid
if( ( fShowMilitiaControlMenu == FALSE ) || ( ghMilitiaControlBox == - 1 ) )
{
return;
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
sDistVisible = DistanceVisible( pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->bLevel, pSoldier );
// Check LOS!
if ( SoldierTo3DLocationLineOfSightTest( pSoldier, pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->bLevel, 3, (UINT8) sDistVisible, TRUE ) )
{
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ATTACK );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_HOLD );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_RETREAT );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_COMETOME );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_GETDOWN );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_TAKE_COVER );
}
else
{
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ATTACK );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_HOLD );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_RETREAT );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_COMETOME );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_GETDOWN );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_TAKE_COVER );
}
}
if ( CheckIfRadioIsEquipped() )
{
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_ATTACK );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_HOLD );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_RETREAT );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_COMETOME );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_SPREAD );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_GETDOWN );
UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_TAKE_COVER );
//UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_TAKE_ITEMS );
}
else
{
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_ATTACK );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_HOLD );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_RETREAT );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_COMETOME );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_SPREAD );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_GETDOWN );
ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_TAKE_COVER );
//ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_ALL_TAKE_ITEMS );
}
return;
}
BOOLEAN CheckIfRadioIsEquipped( void )
{
SOLDIERTYPE *pSoldier = NULL;
INT8 bSlot;
// do we have a radio ?
//pSoldier = GetSelectedAssignSoldier( FALSE ); //do not use
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
bSlot = FindObj( pSoldier, EXTENDEDEAR );
//bSlot = FindHearingAid(pSoldier);
//ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Position: %d", bSlot );
}
if (( bSlot == HEAD1POS ) || ( bSlot == HEAD2POS))
{
return TRUE;
}
else
{
return FALSE;
}
}
//INT16 sFacingDir, sXPos, sYPos, sAPCost;
//ConvertGridNoToXY( pTMilitiaSoldier->sGridNo, &sXPos, &sYPos );
//sFacingDir = GetDirectionFromXY( sXPos, sYPos, pTMilitiaSoldier );
//SendSoldierSetDesiredDirectionEvent( pTMilitiaSoldier, sFacingDir );
//SendSoldierSetDesiredDirectionEvent( pTMilitiaSoldier, gOppositeDirection[ sFacingDir ] );
//EVENT_StopMerc( pTMilitiaSoldier, pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->bDirection );
//SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_PRONE );
//SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_CROUCH );
//pTMilitiaSoldier->bNextAction = AI_ACTION_CHANGE_STANCE;
//pTMilitiaSoldier->usActionData = ANIM_PRONE;
//// some orders are more offensive, others more defensive
//switch( pSoldier->bOrders )
//{
// case STATIONARY: swprintf( szOrders, L"STATIONARY" ); break;
// case ONGUARD: swprintf( szOrders, L"ON GUARD" ); break;
// case ONCALL: swprintf( szOrders, L"ON CALL" ); break;
// case SEEKENEMY: swprintf( szOrders, L"SEEK ENEMY" ); break;
// case CLOSEPATROL: swprintf( szOrders, L"CLOSE PATROL" ); break;
// case FARPATROL: swprintf( szOrders, L"FAR PATROL" ); break;
// case POINTPATROL: swprintf( szOrders, L"POINT PATROL" ); break;
// case RNDPTPATROL: swprintf( szOrders, L"RND PT PATROL" ); break;
// default: swprintf( szOrders, L"UNKNOWN" ); break;
//}
//switch( pSoldier->bAttitude )
//{
// case DEFENSIVE: swprintf( szAttitude, L"DEFENSIVE" ); break;
// case BRAVESOLO: swprintf( szAttitude, L"BRAVE SOLO" ); break;
// case BRAVEAID: swprintf( szAttitude, L"BRAVE AID" ); break;
// case AGGRESSIVE: swprintf( szAttitude, L"AGGRESSIVE" ); break;
// case CUNNINGSOLO: swprintf( szAttitude, L"CUNNING SOLO" ); break;
// case CUNNINGAID: swprintf( szAttitude, L"CUNNING AID" ); break;
// default: swprintf( szAttitude, L"UNKNOWN" ); break;
//}
//MILCON_MENU_ATTACK,
//MILCON_MENU_HOLD,
//MILCON_MENU_RETREAT,
//MILCON_MENU_COMETOME,
//MILCON_MENU_GETDOWN,
//MILCON_MENU_ALL_ATTACK,
//MILCON_MENU_ALL_HOLD,
//MILCON_MENU_ALL_RETREAT,
//MILCON_MENU_ALL_COMETOME,
//MILCON_MENU_ALL_GETDOWN,
//MILCON_MENU_CANCEL,
//MAX_MILCON_STRING_COUNT,
//AI_ACTION_NONE = 0, // maintain current position & facing
//// actions that involve a move to another tile
//AI_ACTION_RANDOM_PATROL, // move towards a random destination
//AI_ACTION_SEEK_FRIEND, // move towards friend in trouble
//AI_ACTION_SEEK_OPPONENT, // move towards a reported opponent
//AI_ACTION_TAKE_COVER, // run for nearest cover from threat
//AI_ACTION_GET_CLOSER, // move closer to a strategic location
//AI_ACTION_POINT_PATROL, // move towards next patrol point
//AI_ACTION_LEAVE_WATER_GAS, // seek nearest spot of ungassed land
//AI_ACTION_SEEK_NOISE, // seek most important noise heard
//AI_ACTION_ESCORTED_MOVE, // go where told to by escortPlayer
//AI_ACTION_RUN_AWAY, // run away from nearby opponent(s)
//AI_ACTION_KNIFE_MOVE, // preparing to stab an opponent
//AI_ACTION_APPROACH_MERC, // move up to a merc in order to talk with them; RT
//AI_ACTION_TRACK, // track a scent
//AI_ACTION_EAT, // monster eats corpse
//AI_ACTION_PICKUP_ITEM, // grab things lying on the ground
//AI_ACTION_SCHEDULE_MOVE, // move according to schedule
//AI_ACTION_WALK, // walk somewhere (NPC stuff etc)
//AI_ACTION_RUN, // run somewhere (NPC stuff etc)
//AI_ACTION_WITHDRAW, // back off
//AI_ACTION_FLANK_LEFT, // move to the left
//AI_ACTION_FLANK_RIGHT, // move to the right
//AI_ACTION_MOVE_TO_CLIMB, // move to edge of roof/building
//// miscellaneous movement actions
//AI_ACTION_CHANGE_FACING, // turn to face a different direction
//AI_ACTION_CHANGE_STANCE, // stand, crouch, or go prone
//// actions related to items and attacks
//AI_ACTION_YELLOW_ALERT, // tell friends opponent(s) heard
//AI_ACTION_RED_ALERT, // tell friends opponent(s) seen
//AI_ACTION_CREATURE_CALL, // creature communication
//AI_ACTION_PULL_TRIGGER, // go off to activate a panic trigger
//AI_ACTION_USE_DETONATOR, // grab detonator and set off bomb(s)
//AI_ACTION_FIRE_GUN, // shoot at nearby opponent
//AI_ACTION_TOSS_PROJECTILE, // throw grenade at/near opponent(s)
//AI_ACTION_KNIFE_STAB, // during the actual knifing attack
//AI_ACTION_THROW_KNIFE, // throw a knife
//AI_ACTION_GIVE_AID, // help injured/dying friend
//AI_ACTION_WAIT, // RT: don't do anything for a certain length of time
//AI_ACTION_PENDING_ACTION, // RT: wait for pending action (pickup, door open, etc) to finish
//AI_ACTION_DROP_ITEM, // duh
//AI_ACTION_COWER, // for civilians: cower in fear and stay there!
//AI_ACTION_STOP_COWERING, // stop cowering
//AI_ACTION_OPEN_OR_CLOSE_DOOR, // schedule-provoked; open or close door
//AI_ACTION_UNLOCK_DOOR, // schedule-provoked; unlock door (don't open)
//AI_ACTION_LOCK_DOOR, // schedule-provoked; lock door (close if necessary)
//AI_ACTION_LOWER_GUN, // lower gun prior to throwing knife
//AI_ACTION_ABSOLUTELY_NONE, // like "none" but can't be converted to a wait by realtime
//AI_ACTION_CLIMB_ROOF, // climb up or down roof
//AI_ACTION_END_TURN, // end turn (after final stance change)
//AI_ACTION_END_COWER_AND_MOVE, // sort of dummy value, special for civilians who are to go somewhere at end of battle
//AI_ACTION_TRAVERSE_DOWN, // move down a level
//AI_ACTION_OFFER_SURRENDER, // offer surrender to the player
//// stand up!
//pSoldier->bAction = AI_ACTION_CHANGE_STANCE;
//pSoldier->usActionData = ANIM_STAND;
//
//
//pSoldier->bAction = pSoldier->bNextAction;
//pSoldier->usActionData = pSoldier->usNextActionData;
//pSoldier->bTargetLevel = pSoldier->bNextTargetLevel;
//pSoldier->bNextAction = AI_ACTION_NONE;
//pSoldier->usNextActionData = 0;
//pSoldier->bNextTargetLevel = 0;
//
//EV_S_CHANGESTATE SChangeState;
//EV_S_CHANGEDEST SChangeDest;
//EV_S_SETPOSITION SSetPosition;
//EV_S_GETNEWPATH SGetNewPath;
//EV_S_BEGINTURN SBeginTurn;
//EV_S_CHANGESTANCE SChangeStance;
//EV_S_SETDIRECTION SSetDirection;
//EV_S_SETDESIREDDIRECTION SSetDesiredDirection;
//EV_S_BEGINFIREWEAPON SBeginFireWeapon;
//EV_S_FIREWEAPON SFireWeapon;
//EV_S_WEAPONHIT SWeaponHit;
//EV_S_STRUCTUREHIT SStructureHit;
//EV_S_WINDOWHIT SWindowHit;
//EV_S_MISS SMiss;
//EV_S_NOISE SNoise;
//EV_S_STOP_MERC SStopMerc;
//EV_S_SENDPATHTONETWORK SUpdateNetworkSoldier;
void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason )
{
// btn callback handler for MilitiaControl region
INT32 iValue = -1;
SOLDIERTYPE * pSoldier = NULL;
UINT8 ubVolume = 10;
//pSoldier = GetSelectedAssignSoldier( FALSE );
iValue = MSYS_GetRegionUserData( pRegion, 0 );
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
//if( ( fShowTalkToAllMenu ) )
//{
// return;
//}
UnHighLightBox( ghMilitiaControlBox );
//if( pSoldier -> ubWhatKindOfMercAmI != MERC_TYPE__EPC ) //laltodo
{
switch( iValue )
{
case( MILCON_MENU_ATTACK ):
{
if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->bLife >= OKLIFE) )
{
// Attack !!!
pTMilitiaSoldier->bOrders = SEEKENEMY;
pTMilitiaSoldier->bAttitude = AGGRESSIVE;
pTMilitiaSoldier->usUIMovementMode = RUNNING;
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
//ubVolume = CalcScreamVolume( pSoldier, 10 );
MakeNoise( pSoldier->ubID, pSoldier->sGridNo, pSoldier->bLevel, pSoldier->bOverTerrainType, ubVolume, NOISE_SCREAM);
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_HOLD ):
{
if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->bLife >= OKLIFE) )
{
//Hold Position !!!
//ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Hold Position" );
pTMilitiaSoldier->bOrders = STATIONARY;
//pTMilitiaSoldier->bAttitude = DEFENSIVE;
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_RETREAT ):
{
if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->bLife >= OKLIFE) )
{
INT16 sActionGridNo;
pTMilitiaSoldier->bOrders = FARPATROL;
pTMilitiaSoldier->bAttitude = DEFENSIVE;
pTMilitiaSoldier->usUIMovementMode = RUNNING;
// set up next action to run away
sActionGridNo = FindSpotMaxDistFromOpponents( pTMilitiaSoldier );
pTMilitiaSoldier->usNextActionData = sActionGridNo;
if ( pTMilitiaSoldier->usNextActionData != NOWHERE )
{
pTMilitiaSoldier->bNextAction = AI_ACTION_RUN_AWAY;
pTMilitiaSoldier->usActionData = ANIM_STAND;
// SEND PENDING ACTION
pTMilitiaSoldier->sPendingActionData2 = sActionGridNo;
pTMilitiaSoldier->ubPendingActionAnimCount = 0;
}
if ( pTMilitiaSoldier->sGridNo != sActionGridNo )
{
SendGetNewSoldierPathEvent( pTMilitiaSoldier, sActionGridNo, pTMilitiaSoldier->usUIMovementMode );
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_COMETOME ):
{
if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->bLife >= OKLIFE) )
{
INT16 sActionGridNo, sGridNo, sAdjustedGridNo;
UINT8 ubDirection;
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
// OK, find an adjacent gridno....
sGridNo = pSoldier->sGridNo;
// See if we can get there
sActionGridNo = FindAdjacentGridEx( pSoldier, sGridNo, &ubDirection, &sAdjustedGridNo, TRUE, FALSE );
if ( sActionGridNo != -1 )
{
// SEND PENDING ACTION
//pTMilitiaSoldier->ubPendingAction = MERC_STEAL;
pTMilitiaSoldier->sPendingActionData2 = pSoldier->sGridNo;
//pTMilitiaSoldier->bPendingActionData3 = ubDirection;
pTMilitiaSoldier->ubPendingActionAnimCount = 0;
pTMilitiaSoldier->usUIMovementMode = RUNNING;
// CHECK IF WE ARE AT THIS GRIDNO NOW
if ( pTMilitiaSoldier->sGridNo != sActionGridNo )
{
// WALK UP TO DEST FIRST
SendGetNewSoldierPathEvent( pTMilitiaSoldier, sActionGridNo, pTMilitiaSoldier->usUIMovementMode );
}
}
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_GETDOWN ):
{
if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->bLife >= OKLIFE) )
{
//if ( SoldierCanAffordNewStance( pTeamSoldier, ANIM_PRONE ) )
{
SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_PRONE );
//SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_CROUCH );
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_TAKE_COVER ):
{
if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->bLife >= OKLIFE) )
{
INT16 sActionGridNo;
INT32 iDummy;
sActionGridNo = FindBestNearbyCover(pTMilitiaSoldier,pTMilitiaSoldier->bAIMorale,&iDummy);
if ( sActionGridNo != NOWHERE )
{
// SEND PENDING ACTION
pTMilitiaSoldier->sPendingActionData2 = sActionGridNo;
pTMilitiaSoldier->ubPendingActionAnimCount = 0;
pTMilitiaSoldier->usUIMovementMode = RUNNING;
// CHECK IF WE ARE AT THIS GRIDNO NOW
if ( pTMilitiaSoldier->sGridNo != sActionGridNo )
{
SendGetNewSoldierPathEvent( pTMilitiaSoldier, sActionGridNo, pTMilitiaSoldier->usUIMovementMode );
}
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_ALL_ATTACK ):
{
UINT8 cnt;
SOLDIERTYPE *pTeamSoldier;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->bLife >= OKLIFE) )
{
pTeamSoldier->bOrders = SEEKENEMY;
pTeamSoldier->bAttitude = AGGRESSIVE;
pTeamSoldier->usUIMovementMode = RUNNING;
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_ALL_HOLD ):
{
UINT8 cnt;
SOLDIERTYPE *pTeamSoldier;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->bLife >= OKLIFE) )
{
pTeamSoldier->bOrders = STATIONARY;
pTeamSoldier->bAttitude = DEFENSIVE;
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_ALL_RETREAT ):
{
UINT8 cnt;
INT16 sActionGridNo;
SOLDIERTYPE *pTeamSoldier;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->bLife >= OKLIFE) )
{
pTeamSoldier->bOrders = FARPATROL;
pTeamSoldier->bAttitude = DEFENSIVE;
pTeamSoldier->usUIMovementMode = RUNNING;
//// set up next action to run away
//pTeamSoldier->usNextActionData = FindSpotMaxDistFromOpponents( pTeamSoldier );
//if ( pTeamSoldier->usNextActionData != NOWHERE )
//{
// pTeamSoldier->bNextAction = AI_ACTION_RUN_AWAY;
// pTeamSoldier->usActionData = ANIM_STAND;
//}
// set up next action to run away
sActionGridNo = FindSpotMaxDistFromOpponents( pTeamSoldier );
pTeamSoldier->usNextActionData = sActionGridNo;
if ( pTeamSoldier->usNextActionData != NOWHERE )
{
pTeamSoldier->bNextAction = AI_ACTION_RUN_AWAY;
pTeamSoldier->usActionData = ANIM_STAND;
// SEND PENDING ACTION
pTeamSoldier->sPendingActionData2 = sActionGridNo;
pTeamSoldier->ubPendingActionAnimCount = 0;
}
if ( pTeamSoldier->sGridNo != sActionGridNo )
{
SendGetNewSoldierPathEvent( pTeamSoldier, sActionGridNo, pTeamSoldier->usUIMovementMode );
}
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_ALL_COMETOME ):
{
UINT8 cnt, ubDirection;
INT16 sActionGridNo, sGridNo, sAdjustedGridNo;
SOLDIERTYPE *pTeamSoldier;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->bLife >= OKLIFE) )
{
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
// OK, find an adjacent gridno....
sGridNo = pSoldier->sGridNo;
// See if we can get there
sActionGridNo = FindAdjacentGridEx( pSoldier, sGridNo, &ubDirection, &sAdjustedGridNo, TRUE, FALSE );
if ( sActionGridNo != -1 )
{
// SEND PENDING ACTION
pTeamSoldier->sPendingActionData2 = pSoldier->sGridNo;
//pTeamSoldier->bPendingActionData3 = ubDirection;
pTeamSoldier->ubPendingActionAnimCount = 0;
pTeamSoldier->usUIMovementMode = RUNNING;
// CHECK IF WE ARE AT THIS GRIDNO NOW
if ( pTeamSoldier->sGridNo != sActionGridNo )
{
// WALK UP TO DEST FIRST
SendGetNewSoldierPathEvent( pTeamSoldier, sActionGridNo, pTeamSoldier->usUIMovementMode );
}
}
}
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_ALL_SPREAD ):
{
UINT8 cnt;
INT16 sActionGridNo;
SOLDIERTYPE *pTeamSoldier;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->bLife >= OKLIFE) )
{
// See if we can get there
sActionGridNo = RandDestWithinRange( pTeamSoldier );
if ( sActionGridNo != -1 )
{
// SEND PENDING ACTION
pTeamSoldier->sPendingActionData2 = sActionGridNo;
//pTeamSoldier->bPendingActionData3 = ubDirection;
pTeamSoldier->ubPendingActionAnimCount = 0;
pTeamSoldier->usUIMovementMode = RUNNING;
// CHECK IF WE ARE AT THIS GRIDNO NOW
if ( pTeamSoldier->sGridNo != sActionGridNo )
{
// WALK UP TO DEST FIRST
SendGetNewSoldierPathEvent( pTeamSoldier, sActionGridNo, pTeamSoldier->usUIMovementMode );
}
}
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_ALL_GETDOWN ):
{
UINT8 cnt;
SOLDIERTYPE *pTeamSoldier;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->bLife >= OKLIFE) )
{
//if ( SoldierCanAffordNewStance( pTeamSoldier, ANIM_PRONE ) )
{
SendChangeSoldierStanceEvent( pTeamSoldier, ANIM_PRONE );
//SendChangeSoldierStanceEvent( pTeamSoldier, ANIM_CROUCH );
}
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
case( MILCON_MENU_ALL_TAKE_COVER ):
{
//UINT8 cnt;
//SOLDIERTYPE *pTeamSoldier;
//INT32 iDummy;
//cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
//for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
//{
// if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bLife > 0 )
// {
// pTeamSoldier->usActionData = FindBestNearbyCover(pTeamSoldier,pTeamSoldier->bAIMorale,&iDummy);
//
// pTeamSoldier->usNextActionData = FindBestNearbyCover(pTeamSoldier,pTeamSoldier->bAIMorale,&iDummy);
//
// //if ( pTeamSoldier->usNextActionData != NOWHERE )
// {
// pTeamSoldier->bNextAction = AI_ACTION_TAKE_COVER;
// pTeamSoldier->usActionData = ANIM_STAND;
// }
// }
//}
UINT8 cnt;
INT16 sActionGridNo;
INT32 iDummy;
SOLDIERTYPE *pTeamSoldier;
cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
{
if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->bLife >= OKLIFE) )
{
// See if we can get there
sActionGridNo = FindBestNearbyCover(pTeamSoldier,pTeamSoldier->bAIMorale,&iDummy);
if ( sActionGridNo != NOWHERE )
{
// SEND PENDING ACTION
pTeamSoldier->sPendingActionData2 = sActionGridNo;
//pTeamSoldier->bPendingActionData3 = ubDirection;
pTeamSoldier->ubPendingActionAnimCount = 0;
pTeamSoldier->usUIMovementMode = RUNNING;
// CHECK IF WE ARE AT THIS GRIDNO NOW
if ( pTeamSoldier->sGridNo != sActionGridNo )
{
// WALK UP TO DEST FIRST
SendGetNewSoldierPathEvent( pTeamSoldier, sActionGridNo, pTeamSoldier->usUIMovementMode );
}
}
}
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
DeductPoints( pSoldier, AP_TALK, 0 );
StatChange( pSoldier, LDRAMT, 1, FALSE );
}
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
}
break;
//case( MILCON_MENU_ALL_TAKE_ITEMS ):
//{
// UINT8 cnt;
// SOLDIERTYPE *pTeamSoldier;
//
// cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
// for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
// {
// if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bLife > 0 )
// {
// //CREATURE_IMMOBILE = 2
// if ( (pTeamSoldier->bMobility != 2) && (pTeamSoldier->bActionPoints >= MinPtsToMove(pTeamSoldier)) )
// {
// //SEARCH_GENERAL_ITEMS=0
// pTeamSoldier->bAction = SearchForItems( pTeamSoldier, 0, pTeamSoldier->inv[HANDPOS].usItem );
// pTeamSoldier->usNextActionData = SearchForItems( pTeamSoldier, 0, pTeamSoldier->inv[HANDPOS].usItem );
// //if ( pTeamSoldier->usNextActionData != NOWHERE )
// {
// pTeamSoldier->bNextAction = AI_ACTION_PICKUP_ITEM;
// //pTeamSoldier->usActionData = ANIM_STAND;
// }
// if (pTeamSoldier->bAction == AI_ACTION_PICKUP_ITEM)
// {
// // the item pool index was stored in the special data field
// pTeamSoldier->uiPendingActionData1 = pTeamSoldier->iNextActionSpecialData;
// }
// //if (pTeamSoldier->bAction != AI_ACTION_NONE)
// //{
// // return( pTeamSoldier->bAction );
// //}
// }
// }
// }
//if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
//{
// DeductPoints( pSoldier, AP_TALK, 0 );
//}
// // stop showing menu
// fShowMilitiaControlMenu = FALSE;
// giAssignHighLine = -1;
// // set dirty flag
// fTeamPanelDirty = TRUE;
// fMapScreenBottomDirty = TRUE;
//}
//break;
case( MILCON_MENU_CANCEL ):
{
//Cancel
//ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Cancel" );
// stop showing menu
fShowMilitiaControlMenu = FALSE;
giAssignHighLine = -1;
// set dirty flag
fTeamPanelDirty = TRUE;
fMapScreenBottomDirty = TRUE;
// reset list of characters
ResetSelectedListForMapScreen( );
}
break;
}
}
gfRenderPBInterface = TRUE;
}
else if( iReason & MSYS_CALLBACK_REASON_RBUTTON_UP )
{
//if( ( fShowTalkToAllMenu ) )
//{
// fShowTalkToAllMenu = FALSE;
// // rerender tactical stuff
// gfRenderPBInterface = TRUE;
// // set dirty flag
// fTeamPanelDirty = TRUE;
// fMapScreenBottomDirty = TRUE;
// return;
//}
}
}
//
//
//void CreateTalkToAllBox( void )
//{
// UINT32 hStringHandle;
// UINT32 uiCounter;
//
// // will create attribute pop up menu for mapscreen assignments
//
// TalkToAllPosition.iX = OrigTalkToAllPosition.iX;
//
// if( giBoxY != 0 )
// {
// TalkToAllPosition.iY = giBoxY + ( MILCON_MENU_ALL * GetFontHeight( MAP_SCREEN_FONT ) );
// }
//
// // create basic box
// CreatePopUpBox(&ghTalkToAllBox, TalkToAllDimensions, TalkToAllPosition, (POPUP_BOX_FLAG_CLIP_TEXT|POPUP_BOX_FLAG_CENTER_TEXT|POPUP_BOX_FLAG_RESIZE ));
//
// // which buffer will box render to
// SetBoxBuffer(ghTalkToAllBox, FRAME_BUFFER);
//
// // border type?
// SetBorderType(ghTalkToAllBox,guiPOPUPBORDERS);
//
// // background texture
// SetBackGroundSurface(ghTalkToAllBox, guiPOPUPTEX);
//
// // margin sizes
// SetMargins(ghTalkToAllBox, 6, 6, 4, 4 );
//
// // space between lines
// SetLineSpace(ghTalkToAllBox, 2);
//
// // set current box to this one
// SetCurrentBox( ghTalkToAllBox );
//
//
// // add strings for box
// for(uiCounter=0; uiCounter < MAX_TTALL_STRING_COUNT; uiCounter++)
// {
// AddMonoString(&hStringHandle, pTalkToAllMenuStrings[uiCounter]);
//
// // make sure it is unhighlighted
// UnHighLightLine(hStringHandle);
// }
//
// // set font type
// SetBoxFont(ghTalkToAllBox, MAP_SCREEN_FONT);
//
// // set highlight color
// SetBoxHighLight(ghTalkToAllBox, FONT_WHITE);
//
// // unhighlighted color
// SetBoxForeground(ghTalkToAllBox, FONT_LTGREEN);
//
// // background color
// SetBoxBackground(ghTalkToAllBox, FONT_BLACK);
//
// // shaded color..for darkened text
// SetBoxShade( ghTalkToAllBox, FONT_GRAY7 );
//
// // resize box to text
// ResizeBoxToText( ghTalkToAllBox );
//
// DetermineMilitiaControlBoxPositions( );
//
//}
//
//
//
//
//void CreateDestroyMouseRegionsForTalkToAllMenu( void )
//{
// static BOOLEAN fCreated = FALSE;
// UINT32 iCounter = 0;
// INT32 iFontHeight = 0;
// INT32 iBoxXPosition = 0;
// INT32 iBoxYPosition = 0;
// SGPPoint pPosition;
// INT32 iBoxWidth = 0;
// SGPRect pDimensions;
//
// // will create/destroy mouse regions for the map screen assignment main menu
//
// if( ( fShowTalkToAllMenu == TRUE ) && ( fCreated == FALSE ) )
// {
//
// if( ( fShowTalkToAllMenu ) && ( guiCurrentScreen == MAP_SCREEN ) ) //laltodo
// {
// SetBoxPosition( ghTalkToAllBox, TalkToAllPosition );
// }
//
// HandleShadingOfLinesForTalkToAllMenu( );
//
// CheckAndUpdateTacticalMilitiaControlPopUpPositions( );
//
// // grab height of font
// iFontHeight = GetLineSpace( ghTalkToAllBox ) + GetFontHeight( GetBoxFont( ghTalkToAllBox ) );
//
// // get x.y position of box
// GetBoxPosition( ghTalkToAllBox, &pPosition);
//
// // grab box x and y position
// iBoxXPosition = pPosition.iX;
// iBoxYPosition = pPosition.iY;
//
// // get dimensions..mostly for width
// GetBoxSize( ghTalkToAllBox, &pDimensions );
// SetBoxSecondaryShade( ghTalkToAllBox, FONT_YELLOW );
//
// // get width
// iBoxWidth = pDimensions.iRight;
//
// SetCurrentBox( ghTalkToAllBox );
//
// // define regions
// for( iCounter = 0; iCounter < GetNumberOfLinesOfTextInBox( ghTalkToAllBox ); iCounter++ )
// {
// // add mouse region for each line of text..and set user data
//
//
// MSYS_DefineRegion( &gTalkToAllMenuRegion[ iCounter ], ( INT16 )( iBoxXPosition ), ( INT16 )( iBoxYPosition + GetTopMarginSize( ghTalkToAllBox ) + ( iFontHeight ) * iCounter ), ( INT16 )( iBoxXPosition + iBoxWidth ), ( INT16 )( iBoxYPosition + GetTopMarginSize( ghTalkToAllBox ) + ( iFontHeight ) * ( iCounter + 1 ) ), MSYS_PRIORITY_HIGHEST - 3 ,
// MSYS_NO_CURSOR, TalkToAllMenuMvtCallBack, TalkToAllMenuBtnCallback );
//
// // set user defines
// MSYS_SetRegionUserData( &gTalkToAllMenuRegion[ iCounter ], 0, iCounter );
// }
//
// // created
// fCreated = TRUE;
//
// // unhighlight all strings in box
// UnHighLightBox( ghTalkToAllBox );
//
// }
// else if( ( ( fShowMilitiaControlMenu == FALSE ) || ( fShowTalkToAllMenu == FALSE ) ) && ( fCreated == TRUE ) )
// {
// // destroy
// for( iCounter = 0; iCounter < GetNumberOfLinesOfTextInBox( ghTalkToAllBox ); iCounter++ )
// {
// MSYS_RemoveRegion( &gTalkToAllMenuRegion[ iCounter ] );
// }
//
// // stop showing TalkToAll menu
// if( fShowMilitiaControlMenu == FALSE )
// {
// fShowTalkToAllMenu = FALSE;
// }
//
// RestorePopUpBoxes( );
//
// fMapPanelDirty = TRUE;
// fCharacterInfoPanelDirty= TRUE;
// fTeamPanelDirty = TRUE;
// fMapScreenBottomDirty = TRUE;
// HideBox( ghTalkToAllBox );
// SetRenderFlags( RENDER_FLAG_FULL );
//
// // not created
// fCreated = FALSE;
//
// if ( fShowMilitiaControlMenu )
// {
// // remove highlight on the parent menu
// UnHighLightBox( ghMilitiaControlBox );
// }
// }
//}
//
//void TalkToAllMenuMvtCallBack(MOUSE_REGION * pRegion, INT32 iReason )
//{
// // mvt callback handler for assignment region
// INT32 iValue = -1;
//
// iValue = MSYS_GetRegionUserData( pRegion, 0 );
//
// //if( HandleAssignmentExpansionAndHighLightForTalkToAllMenu( ) == TRUE )
// //{
// // return;
// //}
//
// if (iReason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
// {
// // highlight string
//
// // do not highlight current balance
// if( GetBoxShadeFlag( ghTalkToAllBox, iValue ) == FALSE )
// {
// // get the string line handle
// HighLightBoxLine( ghTalkToAllBox, iValue );
// }
// }
// else if (iReason & MSYS_CALLBACK_REASON_LOST_MOUSE )
// {
// // unhighlight all strings in box
// UnHighLightBox( ghTalkToAllBox );
// }
//}
//
//
//
//void TalkToAllMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason )
//{
// // btn callback handler for assignment region
// INT32 iValue = -1;
// SOLDIERTYPE * pSoldier = NULL;
//
// iValue = MSYS_GetRegionUserData( pRegion, 0 );
//
// //if( ( iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) || ( iReason & MSYS_CALLBACK_REASON_RBUTTON_DWN ) )
// //{
// // if ( (guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) && !fShowMapInventoryPool )
// // {
// // UnMarkButtonDirty( giMapBorderButtons[ MAP_BORDER_TOWN_BTN ] );
// // }
// //}
//
// if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
// {
// switch( iValue )
// {
// case( TTALL_MENU_ATTACK ):
// {
// // Attack !!!
// ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Attack" );
//
// pTMilitiaSoldier->bOrders = SEEKENEMY;
// pTMilitiaSoldier->bAttitude = AGGRESSIVE;
//
// // stop showing menu
// fShowMilitiaControlMenu = FALSE;
// //fShowTalkToAllMenu = FALSE;
// giAssignHighLine = -1;
// }
// break;
//
// case( TTALL_MENU_HOLD ):
// {
// //Hold Position !!!
// ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Hold Position" );
//
// pTMilitiaSoldier->bOrders = STATIONARY;
// //pTMilitiaSoldier->bAttitude = DEFENSIVE;
//
// // stop showing menu
// fShowMilitiaControlMenu = FALSE;
// //fShowTalkToAllMenu = FALSE;
// giAssignHighLine = -1;
// }
// break;
//
// case( TTALL_MENU_RETREAT ):
// {
// // Retreat !!!
// ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Retreat" );
//
// pTMilitiaSoldier->bOrders = FARPATROL;
// //pTMilitiaSoldier->bAttitude = DEFENSIVE;
//
// // set up next action to run away
// pTMilitiaSoldier->usNextActionData = FindSpotMaxDistFromOpponents( pTMilitiaSoldier );
// if ( pTMilitiaSoldier->usNextActionData != NOWHERE )
// {
// pTMilitiaSoldier->bNextAction = AI_ACTION_RUN_AWAY;
// pTMilitiaSoldier->usActionData = ANIM_STAND;
// //return( AI_ACTION_STOP_COWERING );
// }
//
// // stop showing menu
// fShowMilitiaControlMenu = FALSE;
// //fShowTalkToAllMenu = FALSE;
// giAssignHighLine = -1;
// }
// break;
//
//
// case( TTALL_MENU_COMETOME ):
// {
// ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Come to me" );
//
// UINT8 cnt;
// SOLDIERTYPE * pTeamSoldier;
// INT16 sActionGridNo, sGridNo, sAdjustedGridNo;
// UINT8 ubDirection;
//
// cnt = gTacticalStatus.Team[ MILITIA_TEAM ].bFirstID;
//
// for ( pTeamSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ MILITIA_TEAM ].bLastID; cnt++, pTeamSoldier++)
// {
// if ( pTeamSoldier->bActive && pTeamSoldier->bInSector && pTeamSoldier->bLife > 0 )
// {
//
// if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
// {
// // OK, find an adjacent gridno....
// sGridNo = pSoldier->sGridNo;
//
// // See if we can get there to punch
// sActionGridNo = FindAdjacentGridEx( pSoldier, sGridNo, &ubDirection, &sAdjustedGridNo, TRUE, FALSE );
// if ( sActionGridNo != -1 )
// {
// // SEND PENDING ACTION
// //pTMilitiaSoldier->ubPendingAction = MERC_STEAL;
// pTeamSoldier->sPendingActionData2 = pSoldier->sGridNo;
// pTeamSoldier->bPendingActionData3 = ubDirection;
// pTeamSoldier->ubPendingActionAnimCount = 0;
//
// // CHECK IF WE ARE AT THIS GRIDNO NOW
// if ( pTeamSoldier->sGridNo != sActionGridNo )
// {
// // WALK UP TO DEST FIRST
// SendGetNewSoldierPathEvent( pTeamSoldier, sActionGridNo, pTeamSoldier->usUIMovementMode );
// }
// }
// }
// }
// }
//
// // stop showing menu
// fShowMilitiaControlMenu = FALSE;
// //fShowTalkToAllMenu = FALSE;
// giAssignHighLine = -1;
// }
// break;
//
// case( TTALL_MENU_GETDOWN ):
// {
// // Get Down !!!
// ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Get Down" );
//
// SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_PRONE );
// //SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_CROUCH );
//
// // stop showing menu
// fShowMilitiaControlMenu = FALSE;
// //fShowTalkToAllMenu = FALSE;
// giAssignHighLine = -1;
// }
// break;
//
// case( TTALL_MENU_CANCEL ):
// {
// //Cancel
// ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Cancel" );
//
// // stop showing menu
// fShowTalkToAllMenu = FALSE;
//
// // unhighlight the assignment box
// UnHighLightBox( ghMilitiaControlBox );
//
// // reset list of characters
// ResetSelectedListForMapScreen( );
// gfRenderPBInterface = TRUE;
// }
// break;
// }
// // set dirty flag
// fTeamPanelDirty = TRUE;
// fMapScreenBottomDirty = TRUE;
// }
//}
//
//
//void HandleShadingOfLinesForTalkToAllMenu( void )
//{
// SOLDIERTYPE *pSoldier = NULL;
// INT32 iCounter = 0;
//
//
// // check if valid
// if( ( fShowTalkToAllMenu == FALSE ) || ( ghTalkToAllBox == - 1 ) )
// {
// return;
// }
//
// //pSoldier = GetSelectedAssignSoldier( FALSE );
//
// //// can character practise?
// //if( CanCharacterPractise( pSoldier ) == FALSE )
// //{
// // ShadeStringInBox( ghTalkToAllBox, TalkToAll_MENU_SELF );
// //}
// //else
// //{
// // UnShadeStringInBox( ghTalkToAllBox, TalkToAll_MENU_SELF );
// //}
//
//
// return;
//}