Files
source/Tactical/Real Time Input.cpp
T

2268 lines
60 KiB
C++

#include <stdio.h>
#include <string.h>
#include "stdlib.h"
#include "debug.h"
#include "math.h"
#include "jascreens.h"
#include "pathai.h"
//#include "Soldier Control.h"
#include "Animation Control.h"
#include "Animation Data.h"
#include "Event Pump.h"
#include "Timer Control.h"
#include "Handle UI.h"
#include "Isometric Utils.h"
#include "input.h"
#include "overhead.h"
#include "Sys Globals.h"
#include "screenids.h"
#include "interface.h"
#include "cursor control.h"
#include "Interactive Tiles.h"
#include "spread burst.h"
#include "world items.h"
#include "interface items.h"
#include "physics.h"
#include "ui cursors.h"
#include "strategicmap.h"
#include "soldier profile.h"
#include "soldier create.h"
#include "soldier add.h"
#include "dialogue control.h"
#include "interface dialogue.h"
#include "interactive tiles.h"
#include "messageboxscreen.h"
#include "gameloop.h"
#include "spread burst.h"
#include "explosion control.h"
#include "message.h"
#include "Strategic Exit GUI.h"
#include "Assignments.h"
#include "Map Screen Interface.h"
#include "renderworld.h"
#include "GameSettings.h"
#include "english.h"
#include "text.h"
#include "soldier macros.h"
#include "render dirty.h"
#include "Militia Control.h"
#include "render dirty.h"
#include "Militia Control.h"
///***dddd
#include "Squads.h"
#include "Interface Panels.h"
#include "Soldier functions.h"
#include "SaveLoadMap.h"
#include "worlddat.h" //for gtileset
#include "Debug Control.h" //for livelog
#include "SkillMenu.h" // sevenfm: need this for TraitsMenu
#include "DisplayCover.h" // added by Sevenfm
#include "Vehicles.h" // anv: for switching from soldier to vehicle
#include "VehicleMenu.h"
//forward declarations of common classes to eliminate includes
class OBJECTTYPE;
class SOLDIERTYPE;
extern UIKEYBOARD_HOOK gUIKeyboardHook;
extern BOOLEAN fRightButtonDown;
extern BOOLEAN fLeftButtonDown;
extern BOOLEAN fIgnoreLeftUp;
extern UINT32 guiCurrentEvent;
extern UINT32 guiCurrentUICursor;
extern void DetermineWhichAssignmentMenusCanBeShown( void );
extern void DetermineWhichMilitiaControlMenusCanBeShown( void );
extern BOOLEAN gfIgnoreOnSelectedGuy;
extern INT32 gsOverItemsGridNo;
extern INT16 gsOverItemsLevel;
extern UINT32 guiUITargetSoldierId;
extern BOOLEAN gfUIShowExitSouth;
//***ddd
extern BOOLEAN fMiddleButtonDown;
extern BOOLEAN fX1ButtonDown;
extern BOOLEAN fX2ButtonDown;
extern SOLDIERTYPE *gpSMCurrentMerc;
BOOLEAN gfStartLookingForRubberBanding = FALSE;
UINT16 gusRubberBandX = 0;
UINT16 gusRubberBandY = 0;
BOOLEAN gfBeginBurstSpreadTracking = FALSE;
BOOLEAN gfRTClickLeftHoldIntercepted = FALSE;
BOOLEAN gfRTHaveClickedRightWhileLeftDown = FALSE;
extern BOOLEAN ValidQuickExchangePosition( );
extern INT32 iSMPanelButtons[ NUM_SM_BUTTONS ];
extern INT32 iTEAMPanelButtons[ NUM_TEAM_BUTTONS ];
extern INT32 giSMStealthButton;
void QueryRTMButton( UINT32 *puiNewEvent );
void QueryRTWheels( UINT32 *puiNewEvent );
void QueryRTX1Button( UINT32 *puiNewEvent );
void QueryRTX2Button( UINT32 *puiNewEvent );
// sevenfm: new mouse commands
void HandleAltMouseRTWheel( void );
void HandleAltMouseRTMButton( UINT32 *puiNewEvent );
void HandleAltMouseRTX1Button( UINT32 *puiNewEvent );
void HandleAltMouseRTX2Button( UINT32 *puiNewEvent );
// sevenfm: original mouse commands functionality
void HandleMouseRTWheel( void );
void HandleMouseRTMButton( UINT32 *puiNewEvent );
void HandleMouseRTX1Button( UINT32 *puiNewEvent );
void HandleMouseRTX2Button( UINT32 *puiNewEvent );
// sevenfm: common functionality
void HandleRTToggleFireMode( void );
void HandleRTJumpThroughWindow( void );
void HandleRTJump( void );
void HandleRTLook( UINT32 *puiNewEvent );
void HandleRTLocateSoldier( void );
extern void SetScopeMode( INT32 usMapPos );
extern void HandleTacticalReload(void);
extern void HandleTacticalTransformItem(void);
extern void HandleTBSelectAllMercs(void);
extern void HandleStealthChangeFromUIKeys( );
extern void HandleTBReloadAll( void );
extern void HandleTBEnterTurnbased( void );
extern void HandleTBToggleSneak( void );
extern void HandleTBSoldierRun( void );
extern void HandleTBPickUpBackpacks( void );
extern void HandleTBDropBackpacks( void );
extern void HandleTBLocatePrevMerc( void );
extern void HandleTBLocateNextMerc( void );
extern void HandleTBLevelDown(void);
extern void HandleTBLevelUp(void);
extern void HandleTBSwapGoogles( void );
extern void HandleTBSwapSidearm( void );
extern void HandleTBSwapKnife( void );
extern void HandleTBSwapGunsling( void );
extern void HandleTBSwapHands( void );
extern void HandleTBChangeLevel( void );
extern void HandleTBCycleThroughKnownEnemies( void );
extern void HandleTBGotoHigherStance( void );
extern void HandleTBCycleThroughVisibleEnemies( void );
extern void HandleTBCycleThroughKnownEnemiesBackward( void );
extern void HandleTBGotoLowerStance( void );
extern void HandleTBCycleThroughVisibleEnemiesBackward( void );
extern void HandleTBLocateSoldier( void );
extern void HandleTBToggleFormation( void );
extern void HandleTBToggleTrapNetworkView( void );
extern void HandleTBShowMines( void );
extern void HandleTBToggleStealthAll( void );
extern void HandleTBShowLOS( void );
extern void HandleTBShowCover( void );
extern void HandleTBReload( void );
extern void HandleTBToggleStealth( void );
void GetRTMouseButtonInput( UINT32 *puiNewEvent )
{
QueryRTLeftButton( puiNewEvent );
QueryRTRightButton( puiNewEvent );
QueryRTMButton( puiNewEvent );
QueryRTWheels( puiNewEvent );
QueryRTX1Button( puiNewEvent );
QueryRTX2Button( puiNewEvent );
}
void QueryRTLeftButton( UINT32 *puiNewEvent )
{
SoldierID usSoldierIndex;
SOLDIERTYPE *pSoldier;
SOLDIERTYPE *pVehicle;
UINT32 uiMercFlags;
static UINT32 uiSingleClickTime;
INT32 usMapPos;
static BOOLEAN fDoubleClickIntercepted = FALSE;
static BOOLEAN fValidDoubleClickPossible = FALSE;
static BOOLEAN fCanCheckForSpeechAdvance = FALSE;
static INT32 sMoveClickGridNo = 0;
UINT16 usSubjectSoldier = gusSelectedSoldier;
// LEFT MOUSE BUTTON
if ( gViewportRegion.uiFlags & MSYS_MOUSE_IN_AREA )
{
if (!GetMouseMapPos( &usMapPos ) && !gfUIShowExitSouth )
{
return;
}
if ( gusSelectedSoldier != NOBODY )
{
if ( gusSelectedSoldier->pTempObject != NULL )
{
return;
}
if ( gusSelectedSoldier->flags.uiStatusFlags & SOLDIER_DRIVER )
{
pVehicle = GetSoldierStructureForVehicle( MercPtrs[ usSubjectSoldier ]->iVehicleId );
usSubjectSoldier = pVehicle->ubID;
}
}
if ( gViewportRegion.ButtonState & MSYS_LEFT_BUTTON )
{
if ( !fLeftButtonDown )
{
fLeftButtonDown = TRUE;
gfRTHaveClickedRightWhileLeftDown = FALSE;
RESETCOUNTER( LMOUSECLICK_DELAY_COUNTER );
RESETCOUNTER( RUBBER_BAND_START_DELAY );
if ( giUIMessageOverlay == -1 )
{
if ( gpItemPointer == NULL )
{
switch( gCurrentUIMode )
{
case ACTION_MODE:
if ( gusSelectedSoldier != NOBODY )
{
if( GetSoldier( &pSoldier, gusSelectedSoldier ) && gpItemPointer == NULL )
{
// OK, check for needing ammo
if ( HandleUIReloading( pSoldier ) )
{
gfRTClickLeftHoldIntercepted = TRUE;
//fLeftButtonDown = FALSE;
}
else
{
if ( pSoldier->bDoBurst )
{
pSoldier->sStartGridNo = usMapPos;
ResetBurstLocations( );
pSoldier->bDoAutofire = 6;
*puiNewEvent = A_CHANGE_TO_CONFIM_ACTION;
}
else
{
gfRTClickLeftHoldIntercepted = TRUE;
if ( UIMouseOnValidAttackLocation( pSoldier ) )
{
// OK< going into confirm will call a function that will automatically move
// us to shoot in most vases ( grenades need a confirm mode regardless )
*puiNewEvent = A_CHANGE_TO_CONFIM_ACTION;
//*puiNewEvent = CA_MERC_SHOOT;
PauseRT( FALSE );
}
}
}
}
}
break;
case MOVE_MODE:
gfUICanBeginAllMoveCycle = TRUE;
if ( !HandleCheckForExitArrowsInput( FALSE ) && gpItemPointer == NULL )
{
if ( gfUIFullTargetFound && ( guiUIFullTargetFlags & OWNED_MERC ) )
{
// Reset , if this guy is selected merc, reset any multi selections...
if ( gusUIFullTargetID == gusSelectedSoldier )
{
ResetMultiSelection( );
}
}
else
{
INT8 bReturnCode;
bReturnCode = HandleMoveModeInteractiveClick( usMapPos, puiNewEvent );
if ( bReturnCode == -1 )
{
//gfRTClickLeftHoldIntercepted = TRUE;
}
else if ( bReturnCode == -2 )
{
//if ( gGameSettings.fOptions[ TOPTION_RTCONFIRM ] )
//{
// *puiNewEvent = C_WAIT_FOR_CONFIRM;
// gfPlotNewMovement = TRUE;
//}/
//else
}
else if ( bReturnCode == -3 )
{
gfRTClickLeftHoldIntercepted = TRUE;
}
else if ( bReturnCode == 0 )
{
{
{
BOOLEAN fResult;
if ( usSubjectSoldier != NOBODY )
{
if ( ( fResult = UIOKMoveDestination( MercPtrs[ usSubjectSoldier ], usMapPos ) ) == 1 )
{
if ( gsCurrentActionPoints != 0 )
{
// We're on terrain in which we can walk, walk
// If we're on terrain,
if ( !gGameSettings.fOptions[ TOPTION_RTCONFIRM ] )
{
*puiNewEvent = C_WAIT_FOR_CONFIRM;
gfPlotNewMovement = TRUE;
}
}
}
}
}
}
}
}
//gfRTClickLeftHoldIntercepted = TRUE;
}
else
{
gfRTClickLeftHoldIntercepted = TRUE;
fIgnoreLeftUp = TRUE;
}
break;
}
}
}
if ( gfUIWaitingForUserSpeechAdvance )
{
fCanCheckForSpeechAdvance = TRUE;
}
}
if ( gpItemPointer == NULL )
{
if ( giUIMessageOverlay == -1 && !gfRTHaveClickedRightWhileLeftDown )
{
// HERE FOR CLICK-DRAG CLICK
switch( gCurrentUIMode )
{
case MOVE_MODE:
case CONFIRM_MOVE_MODE:
// First check if we clicked on a guy, if so, make selected if it's ours
if( FindSoldierFromMouse( &usSoldierIndex, &uiMercFlags ) )
{
// Select guy
if ( (uiMercFlags & SELECTED_MERC) && !( uiMercFlags & UNCONSCIOUS_MERC ) && !( MercPtrs[ usSoldierIndex ]->flags.uiStatusFlags & SOLDIER_VEHICLE ) )
{
*puiNewEvent = M_CHANGE_TO_ADJPOS_MODE;
}
}
else
{
//if ( COUNTERDONE( RUBBER_BAND_START_DELAY ) )
{
// OK, change to rubber banding mode..
// Have we started this yet?
if ( !gfStartLookingForRubberBanding && !gRubberBandActive )
{
gfStartLookingForRubberBanding = TRUE;
gusRubberBandX = gusMouseXPos;
gusRubberBandY = gusMouseYPos;
}
else
{
// Have we moved....?
if ( abs( gusMouseXPos - gusRubberBandX ) > 10 || abs( gusMouseYPos - gusRubberBandY ) > 10 )
{
gfStartLookingForRubberBanding = FALSE;
// Stop scrolling:
gfIgnoreScrolling = TRUE;
// Anchor cursor....
RestrictMouseToXYXY( 0, 0, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
// OK, settup anchor....
gRubberBandRect.iLeft = gusRubberBandX;
gRubberBandRect.iTop = gusRubberBandY;
gRubberBandActive = TRUE;
// ATE: If we have stopped scrolling.....
if ( gfScrollInertia != FALSE )
{
SetRenderFlags( RENDER_FLAG_FULL | RENDER_FLAG_CHECKZ );
// Restore Interface!
RestoreInterface( );
// Delete Topmost blitters saved areas
DeleteVideoOverlaysArea( );
gfScrollInertia = FALSE;
}
*puiNewEvent = RB_ON_TERRAIN;
return;
}
}
}
}
break;
}
}
}
}
else
{
if ( fLeftButtonDown )
{
if ( !fIgnoreLeftUp )
{
// set flag for handling single clicks
// OK , FOR DOUBLE CLICKS - TAKE TIME STAMP & RECORD EVENT
if ( ( GetJA2Clock() - uiSingleClickTime ) < 300 )
{
// CHECK HERE FOR DOUBLE CLICK EVENTS
if ( fValidDoubleClickPossible )
{
if ( gpItemPointer == NULL )
{
fDoubleClickIntercepted = TRUE;
// First check if we clicked on a guy, if so, make selected if it's ours
if( usSubjectSoldier != NOBODY )
{
// Set movement mode
// OK, only change this if we are stationary!
//if ( gAnimControl[ gusSelectedSoldier->usAnimState ].uiFlags & ANIM_STATIONARY )
//if ( gusSelectedSoldier->usAnimState == WALKING )
{
MercPtrs[ usSubjectSoldier ]->flags.fUIMovementFast = TRUE;
*puiNewEvent = C_MOVE_MERC;
}
}
}
}
}
// Capture time!
uiSingleClickTime = GetJA2Clock();
fValidDoubleClickPossible = FALSE;
if ( !fDoubleClickIntercepted )
{
// FIRST CHECK FOR ANYTIME ( NON-INTERVAL ) CLICKS
switch( gCurrentUIMode )
{
case ADJUST_STANCE_MODE:
// If button has come up, change to mocve mode
*puiNewEvent = PADJ_ADJUST_STANCE;
break;
}
// CHECK IF WE CLICKED-HELD
if ( COUNTERDONE( LMOUSECLICK_DELAY_COUNTER ) )
{
// LEFT CLICK-HOLD EVENT
// Switch on UI mode
switch( gCurrentUIMode )
{
case CONFIRM_ACTION_MODE:
if( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
if ( pSoldier->bDoBurst )
{
pSoldier->sEndGridNo = usMapPos;
gfBeginBurstSpreadTracking = FALSE;
if ( pSoldier->sEndGridNo != pSoldier->sStartGridNo )
{
pSoldier->flags.fDoSpread = TRUE;
PickBurstLocations( pSoldier );
*puiNewEvent = CA_MERC_SHOOT;
}
else
{
pSoldier->flags.fDoSpread = FALSE;
}
gfRTClickLeftHoldIntercepted = TRUE;
}
}
break;
}
}
//else
{
//LEFT CLICK NORMAL EVENT
// Switch on UI mode
if ( !gfRTClickLeftHoldIntercepted )
{
if ( giUIMessageOverlay != -1 )
{
EndUIMessage( );
}
else
{
if ( !HandleCheckForExitArrowsInput( TRUE ) )
{
if ( gpItemPointer != NULL )
{
if ( HandleItemPointerClick( usMapPos ) )
{
// getout of mode
EndItemPointer( );
*puiNewEvent = A_CHANGE_TO_MOVE;
}
}
else
{
// Check for wiating for keyboard advance
if ( gfUIWaitingForUserSpeechAdvance && fCanCheckForSpeechAdvance )
{
// We have a key, advance!
DialogueAdvanceSpeech( );
}
else
{
switch( gCurrentUIMode )
{
case MENU_MODE:
// If we get a hit here and we're in menu mode, quit the menu mode
EndMenuEvent( guiCurrentEvent );
break;
case IDLE_MODE:
// First check if we clicked on a guy, if so, make selected if it's ours
if( FindSoldierFromMouse( &usSoldierIndex, &uiMercFlags ) )
{
// Select guy
if ( uiMercFlags & OWNED_MERC )
{
*puiNewEvent = I_SELECT_MERC;
}
}
break;
case HANDCURSOR_MODE:
HandleHandCursorClick( usMapPos, puiNewEvent );
break;
case RADIOCURSOR_MODE:
HandleRadioCursorClick(usMapPos, puiNewEvent);
break;
case ACTION_MODE:
//*puiNewEvent = A_CHANGE_TO_CONFIM_ACTION;
//if( GetSoldier( &pSoldier, gusSelectedSoldier ) )
//{
// pSoldier->sStartGridNo = sMapPos;
// ResetBurstLocations( );
//}
*puiNewEvent = CA_MERC_SHOOT;
break;
case CONFIRM_MOVE_MODE:
if ( usSubjectSoldier != NOBODY )
{
if ( MercPtrs[ usSubjectSoldier ]->usAnimState != RUNNING )
{
*puiNewEvent = C_MOVE_MERC;
}
else
{
MercPtrs[ usSubjectSoldier ]->flags.fUIMovementFast = 2;
*puiNewEvent = C_MOVE_MERC;
}
}
//*puiNewEvent = C_MOVE_MERC;
//if ( gGameSettings.fOptions[ TOPTION_RTCONFIRM ] )
{
fValidDoubleClickPossible = TRUE;
}
break;
case CONFIRM_ACTION_MODE:
// Check if we are stationary
//if ( AimCubeUIClick( ) )
//{
// if ( gusSelectedSoldier != NOBODY )
// {
// if ( !( gAnimControl[ gusSelectedSoldier->usAnimState ].uiFlags & ANIM_STATIONARY ) )
// {
//gUITargetShotWaiting = TRUE;
//gsUITargetShotGridNo = sMapPos;
// }
// else
// {
// *puiNewEvent = CA_MERC_SHOOT;
// }
if (GetSoldier(&pSoldier, gusSelectedSoldier))
{
//shadooow: this fixes merc randomly shooting in different direction than assigned
pSoldier->flags.fDoSpread = 0;
}
*puiNewEvent = CA_MERC_SHOOT;
// }
//}
break;
case MOVE_MODE:
if ( !HandleCheckForExitArrowsInput( FALSE ) && gpItemPointer == NULL )
{
// First check if we clicked on a guy, if so, make selected if it's ours
if ( gfUIFullTargetFound && ( guiUIFullTargetFlags & OWNED_MERC ) )
{
if ( !( guiUIFullTargetFlags & UNCONSCIOUS_MERC ) )
{
// Select guy
if( GetSoldier( &pSoldier, gusUIFullTargetID ) && gpItemPointer == NULL )
{
if( pSoldier->bAssignment >= ON_DUTY && !(pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) )
{
PopupAssignmentMenuInTactical( pSoldier );
}
else
{
if ( !_KeyDown( ALT ) )
{
ResetMultiSelection( );
*puiNewEvent = I_SELECT_MERC;
}
else
{
if ( pSoldier->flags.uiStatusFlags & SOLDIER_MULTI_SELECTED )
{
pSoldier->flags.uiStatusFlags &= (~SOLDIER_MULTI_SELECTED );
}
else
{
pSoldier->flags.uiStatusFlags |= (SOLDIER_MULTI_SELECTED );
// Say Confimation...
if( !gGameSettings.fOptions[ TOPTION_MUTE_CONFIRMATIONS ] )
pSoldier->DoMercBattleSound( BATTLE_SOUND_ATTN1 );
// OK, if we have a selected guy.. make him part too....
if ( gusSelectedSoldier != NOBODY )
{
gusSelectedSoldier->flags.uiStatusFlags |= (SOLDIER_MULTI_SELECTED );
}
}
gfIgnoreOnSelectedGuy = TRUE;
EndMultiSoldierSelection( FALSE );
}
}
}
else
{
if ( !_KeyDown( ALT ) )
{
ResetMultiSelection( );
*puiNewEvent = I_SELECT_MERC;
}
else
{
if ( pSoldier->flags.uiStatusFlags & SOLDIER_MULTI_SELECTED )
{
pSoldier->flags.uiStatusFlags &= (~SOLDIER_MULTI_SELECTED );
}
else
{
pSoldier->flags.uiStatusFlags |= (SOLDIER_MULTI_SELECTED );
// Say Confimation...
if( !gGameSettings.fOptions[ TOPTION_MUTE_CONFIRMATIONS ] )
pSoldier->DoMercBattleSound( BATTLE_SOUND_ATTN1 );
}
// OK, if we have a selected guy.. make him part too....
if ( gusSelectedSoldier != NOBODY )
{
gusSelectedSoldier->flags.uiStatusFlags |= (SOLDIER_MULTI_SELECTED );
}
gfIgnoreOnSelectedGuy = TRUE;
EndMultiSoldierSelection( FALSE );
}
}
}
gfRTClickLeftHoldIntercepted = TRUE;
}
else
{
INT8 bReturnCode;
bReturnCode = HandleMoveModeInteractiveClick( usMapPos, puiNewEvent );
if ( bReturnCode == -1 )
{
gfRTClickLeftHoldIntercepted = TRUE;
}
else if ( bReturnCode == -2 )
{
//if ( gGameSettings.fOptions[ TOPTION_RTCONFIRM ] )
//{
// *puiNewEvent = C_WAIT_FOR_CONFIRM;
// gfPlotNewMovement = TRUE;
//}/
//else
{
INT32 sIntTileGridNo;
if( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
BeginDisplayTimedCursor( GetInteractiveTileCursor( guiCurrentUICursor, TRUE ), 300 );
if ( pSoldier->usAnimState != RUNNING )
{
*puiNewEvent = C_MOVE_MERC;
}
else
{
if ( GetCurInteractiveTileGridNo( &sIntTileGridNo ) != NULL )
{
pSoldier->flags.fUIMovementFast = TRUE;
*puiNewEvent = C_MOVE_MERC;
}
}
fValidDoubleClickPossible = TRUE;
}
}
}
else if ( bReturnCode == 0 )
{
if( GetSoldier( &pSoldier, usSubjectSoldier ) )
{
// First check if we clicked on a guy, if so, make selected if it's ours
if( FindSoldierFromMouse( &usSoldierIndex, &uiMercFlags ) && ( uiMercFlags & OWNED_MERC ) )
{
// Select guy
*puiNewEvent = I_SELECT_MERC;
gfRTClickLeftHoldIntercepted = TRUE;
}
else
{
//if ( FindBestPath( pSoldier, sMapPos, pSoldier->pathing.bLevel, pSoldier->usUIMovementMode, NO_COPYROUTE, 0 ) == 0 )
if (gsCurrentActionPoints == 0 && !gfUIAllMoveOn && !gTacticalStatus.fAtLeastOneGuyOnMultiSelect )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_PATH ] );
gfRTClickLeftHoldIntercepted = TRUE;
}
else
{
BOOLEAN fResult;
if ( usSubjectSoldier != NOBODY )
{
if ( ( fResult = UIOKMoveDestination( MercPtrs[ usSubjectSoldier ], usMapPos ) ) == 1 )
{
if ( gfUIAllMoveOn )
{
// ATE: Select everybody in squad and make move!
{
// Make move!
*puiNewEvent = C_MOVE_MERC;
fValidDoubleClickPossible = TRUE;
}
}
else
{
// We're on terrain in which we can walk, walk
// If we're on terrain,
if ( gGameSettings.fOptions[ TOPTION_RTCONFIRM ] )
{
*puiNewEvent = C_WAIT_FOR_CONFIRM;
gfPlotNewMovement = TRUE;
}
else
{
*puiNewEvent = C_MOVE_MERC;
fValidDoubleClickPossible = TRUE;
}
}
}
else
{
if ( fResult == 2 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NOBODY_USING_REMOTE_STR ] );
}
else
{
//if ( sMapPos != sMoveClickGridNo || pSoldier->flags.uiStatusFlags & SOLDIER_ROBOT )
//{
// sMoveClickGridNo = sMapPos;
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ CANT_MOVE_THERE_STR ] );
// *puiNewEvent = M_CHANGE_TO_HANDMODE;
// gsOverItemsGridNo = sMapPos;
// gsOverItemsLevel = gsInterfaceLevel;
// }
// else
// {
// sMoveClickGridNo = 0;
// *puiNewEvent = M_CHANGE_TO_HANDMODE;
// }
}
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, L"Invalid move destination." );
// Goto hand cursor mode...
//*puiNewEvent = M_CHANGE_TO_HANDMODE;
gfRTClickLeftHoldIntercepted = TRUE;
}
}
}
}
}
}
}
//gfRTClickLeftHoldIntercepted = TRUE;
}
else
{
gfRTClickLeftHoldIntercepted = TRUE;
}
break;
case LOOKCURSOR_MODE:
// If we cannot actually do anything, return to movement mode
*puiNewEvent = LC_LOOK;
break;
case JUMPOVER_MODE:
*puiNewEvent = JP_JUMP;
break;
case TALKCURSOR_MODE:
PauseRT( FALSE );
if ( HandleTalkInit( ) )
{
*puiNewEvent = TA_TALKINGMENU;
}
break;
case GETTINGITEM_MODE:
// Remove menu!
// RemoveItemPickupMenu( );
break;
case TALKINGMENU_MODE:
//HandleTalkingMenuEscape( TRUE );
break;
case EXITSECTORMENU_MODE:
RemoveSectorExitMenu( FALSE );
break;
case OPENDOOR_MENU_MODE:
CancelOpenDoorMenu( );
HandleOpenDoorMenu( );
*puiNewEvent = A_CHANGE_TO_MOVE;
break;
case RUBBERBAND_MODE:
EndRubberBanding( );
*puiNewEvent = A_CHANGE_TO_MOVE;
break;
}
}
}
}
}
}
}
}
}
// Reset flag
fLeftButtonDown = FALSE;
fIgnoreLeftUp = FALSE;
gfRTClickLeftHoldIntercepted = FALSE;
fDoubleClickIntercepted = FALSE;
fCanCheckForSpeechAdvance = FALSE;
gfStartLookingForRubberBanding = FALSE;
// Reset counter
RESETCOUNTER( LMOUSECLICK_DELAY_COUNTER );
}
}
}
else
{
// Set mouse down to false
//fLeftButtonDown = FALSE;
//fCanCheckForSpeechAdvance = FALSE;
// OK, handle special cases like if we are dragging and holding for a burst spread and
// release mouse over another mouse region
if ( gfBeginBurstSpreadTracking )
{
if( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
pSoldier->flags.fDoSpread = FALSE;
}
gfBeginBurstSpreadTracking = FALSE;
}
}
}
void QueryRTRightButton( UINT32 *puiNewEvent )
{
static BOOLEAN fClickHoldIntercepted = FALSE;
static BOOLEAN fClickIntercepted = FALSE;
static UINT32 uiSingleClickTime;
static BOOLEAN fDoubleClickIntercepted = FALSE;
static BOOLEAN fValidDoubleClickPossible = FALSE;
SOLDIERTYPE *pSoldier;
INT32 usMapPos;
if ( gViewportRegion.uiFlags & MSYS_MOUSE_IN_AREA )
{
if (!GetMouseMapPos( &usMapPos ) )
{
return;
}
// RIGHT MOUSE BUTTON
if ( gViewportRegion.ButtonState & MSYS_RIGHT_BUTTON )
{
if ( !fRightButtonDown )
{
fRightButtonDown = TRUE;
RESETCOUNTER( RMOUSECLICK_DELAY_COUNTER );
}
// CHECK COMBINATIONS
if ( fLeftButtonDown )
{
//fIgnoreLeftUp = TRUE;
gfRTHaveClickedRightWhileLeftDown = TRUE;
if ( gpItemPointer == NULL )
{
// ATE:
if ( gusSelectedSoldier != NOBODY )
{
switch( gCurrentUIMode )
{
case CONFIRM_MOVE_MODE:
case MOVE_MODE:
if ( !gfUIAllMoveOn )
{
fValidDoubleClickPossible = TRUE;
// OK, our first right-click is an all-cycle
if ( gfUICanBeginAllMoveCycle )
{
// ATE: Here, check if we can do this....
if ( !UIOKMoveDestination( gusSelectedSoldier, usMapPos ) )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ CANT_MOVE_THERE_STR ] );
gfRTClickLeftHoldIntercepted = TRUE;
}
//else if ( gsCurrentActionPoints == 0 )
//{
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_PATH ] );
// gfRTClickLeftHoldIntercepted = TRUE;
//}
else
{
*puiNewEvent = M_CYCLE_MOVE_ALL;
}
}
fClickHoldIntercepted = TRUE;
}
}
// ATE: Added cancel of burst mode....
if ( gfBeginBurstSpreadTracking )
{
gfBeginBurstSpreadTracking = FALSE;
gfRTClickLeftHoldIntercepted = TRUE;
gusSelectedSoldier->flags.fDoSpread = FALSE;
fClickHoldIntercepted = TRUE;
*puiNewEvent = A_END_ACTION;
gCurrentUIMode = MOVE_MODE;
}
}
}
}
else
{
// IF HERE, DO A CLICK-HOLD IF IN INTERVAL
if ( COUNTERDONE( RMOUSECLICK_DELAY_COUNTER ) && !fClickHoldIntercepted )
{
if ( gpItemPointer == NULL )
{
// Switch on UI mode
switch( gCurrentUIMode )
{
case IDLE_MODE:
case ACTION_MODE:
case HANDCURSOR_MODE:
case RADIOCURSOR_MODE:
case LOOKCURSOR_MODE:
case TALKCURSOR_MODE:
case MOVE_MODE:
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
if ( ( guiUIFullTargetFlags & OWNED_MERC ) && ( guiUIFullTargetFlags & VISIBLE_MERC ) && !( guiUIFullTargetFlags & DEAD_MERC )&&!( pSoldier ? pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE : 0 ) )
{
//if( pSoldier->bAssignment >= ON_DUTY )
{
PopupAssignmentMenuInTactical( pSoldier );
fClickHoldIntercepted = TRUE;
}
break;
}
else
{
fShowAssignmentMenu = FALSE;
CreateDestroyAssignmentPopUpBoxes( );
DetermineWhichAssignmentMenusCanBeShown( );
fShowMilitiaControlMenu = FALSE;
CreateDestroyMilitiaControlPopUpBoxes( );
DetermineWhichMilitiaControlMenusCanBeShown( );
}
// ATE:
if ( !fClickHoldIntercepted )
{
*puiNewEvent = U_MOVEMENT_MENU;
fClickHoldIntercepted = TRUE;
}
break;
}
}
if ( gCurrentUIMode == ACTION_MODE || gCurrentUIMode == TALKCURSOR_MODE )
{
PauseRT( FALSE );
}
}
}
}
}
else
{
if ( fRightButtonDown )
{
// OK , FOR DOUBLE CLICKS - TAKE TIME STAMP & RECORD EVENT
if ( ( GetJA2Clock() - uiSingleClickTime ) < 300 )
{
// CHECK HERE FOR DOUBLE CLICK EVENTS
if ( fValidDoubleClickPossible )
{
fDoubleClickIntercepted = TRUE;
// Do stuff....
// OK, check if left button down...
if ( fLeftButtonDown )
{
if ( gpItemPointer == NULL )
{
if ( !fClickIntercepted && !fClickHoldIntercepted )
{
// ATE:
if ( gusSelectedSoldier != NOBODY )
{
//fIgnoreLeftUp = TRUE;
switch( gCurrentUIMode )
{
case CONFIRM_MOVE_MODE:
case MOVE_MODE:
if ( gfUIAllMoveOn )
{
// OK, now we wish to run!
gfUIAllMoveOn = 2;
}
}
}
}
}
}
}
}
// Capture time!
uiSingleClickTime = GetJA2Clock();
fValidDoubleClickPossible = TRUE;
if ( !fDoubleClickIntercepted )
{
// CHECK COMBINATIONS
if ( fLeftButtonDown )
{
if ( gpItemPointer == NULL )
{
if ( !fClickHoldIntercepted && !fClickIntercepted )
{
// ATE:
if ( gusSelectedSoldier != NOBODY )
{
//fIgnoreLeftUp = TRUE;
switch( gCurrentUIMode )
{
case CONFIRM_MOVE_MODE:
case MOVE_MODE:
if ( gfUIAllMoveOn )
{
gfUIAllMoveOn = FALSE;
gfUICanBeginAllMoveCycle = TRUE;
}
}
}
}
}
}
else
{
if ( !fClickHoldIntercepted && !fClickIntercepted )
{
if ( gpItemPointer == NULL )
{
// ATE:
if ( gusSelectedSoldier != NOBODY )
{
// sevenfm: ALT+RMB - TraitsMenu
if(_KeyDown(ALT))
{
switch( gCurrentUIMode )
{
case MOVE_MODE:
case TALKCURSOR_MODE:
case ACTION_MODE:
case CONFIRM_ACTION_MODE:
case LOOKCURSOR_MODE:
TraitsMenu(usMapPos);
fClickIntercepted = TRUE;
break;
}
}
// anv: CTRL+RMB - VehicleMenu
else if(_KeyDown(CTRL))
{
switch( gCurrentUIMode )
{
case HANDCURSOR_MODE:
HandleHandCursorRightClick( usMapPos, puiNewEvent );
break;
}
}
else
{
// Switch on UI mode
switch( gCurrentUIMode )
{
case IDLE_MODE:
break;
case CONFIRM_MOVE_MODE:
case MOVE_MODE:
case TALKCURSOR_MODE:
// anv: don't switch if passengers are blocked from attacking
pSoldier = gusSelectedSoldier;
if( pSoldier->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) )
{
SOLDIERTYPE *pVehicle = GetSoldierStructureForVehicle( pSoldier->iVehicleId );
INT8 bSeatIndex = GetSeatIndexFromSoldier( pSoldier );
if( gNewVehicle[ pVehicleList[ pSoldier->iVehicleId ].ubVehicleType ].VehicleSeats[bSeatIndex].fBlockedShots == TRUE )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pVehicleSeatsStrings[0] );
break;
}
}
// We have here a change to action mode
*puiNewEvent = M_CHANGE_TO_ACTION;
fClickIntercepted = TRUE;
break;
case ACTION_MODE:
// We have here a change to move mode
*puiNewEvent = A_END_ACTION;
fClickIntercepted = TRUE;
break;
case CONFIRM_ACTION_MODE:
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
HandleRightClickAdjustCursor( pSoldier, usMapPos );
}
fClickIntercepted = TRUE;
break;
case MENU_MODE:
// If we get a hit here and we're in menu mode, quit the menu mode
EndMenuEvent( guiCurrentEvent );
fClickIntercepted = TRUE;
break;
case HANDCURSOR_MODE:
// If we cannot actually do anything, return to movement mode
*puiNewEvent = A_CHANGE_TO_MOVE;
break;
case RADIOCURSOR_MODE:
// If we cannot actually do anything, return to movement mode
*puiNewEvent = A_CHANGE_TO_MOVE;
break;
case LOOKCURSOR_MODE:
// If we cannot actually do anything, return to movement mode
*puiNewEvent = A_CHANGE_TO_MOVE;
break;
}
}
}
}
else
{
if ( gfUIFullTargetFound )
{
gfItemPointerDifferentThanDefault = !gfItemPointerDifferentThanDefault;
}
}
}
}
}
// Reset flag
fRightButtonDown = FALSE;
fClickHoldIntercepted = FALSE;
fClickIntercepted = FALSE;
fDoubleClickIntercepted = FALSE;
// Reset counter
RESETCOUNTER( RMOUSECLICK_DELAY_COUNTER );
}
}
}
}
extern BOOLEAN ConfirmActionCancel( INT32 usMapPos, INT32 usOldMapPos );
extern BOOLEAN gUIActionModeChangeDueToMouseOver;
void GetRTMousePositionInput( UINT32 *puiNewEvent )
{
INT32 usMapPos;
static INT32 usOldMapPos = 0;
static UINT32 uiMoveTargetSoldierId = NOBODY;
SOLDIERTYPE *pSoldier;
static BOOLEAN fOnValidGuy = FALSE;
if (!GetMouseMapPos( &usMapPos ) )
{
return;
}
if ( gViewportRegion.uiFlags & MSYS_MOUSE_IN_AREA )
{
// Handle highlighting stuff
HandleObjectHighlighting( );
// Check if we have an item in our hands...
if ( gpItemPointer != NULL )
{
*puiNewEvent = A_ON_TERRAIN;
return;
}
// Switch on modes
switch( gCurrentUIMode )
{
case RUBBERBAND_MODE:
// ATE: Make sure!
if ( gRubberBandActive == FALSE )
{
*puiNewEvent = M_ON_TERRAIN;
}
else
{
*puiNewEvent = RB_ON_TERRAIN;
}
break;
case JUMPOVER_MODE:
// ATE: Make sure!
if ( gsJumpOverGridNo != usMapPos )
{
*puiNewEvent = A_CHANGE_TO_MOVE;
}
else
{
*puiNewEvent = JP_ON_TERRAIN;
}
break;
case LOCKUI_MODE:
*puiNewEvent = LU_ON_TERRAIN;
break;
case IDLE_MODE:
*puiNewEvent = I_ON_TERRAIN;
break;
case ENEMYS_TURN_MODE:
*puiNewEvent = ET_ON_TERRAIN;
break;
case LOOKCURSOR_MODE:
*puiNewEvent = LC_ON_TERRAIN;
break;
case TALKCURSOR_MODE:
if ( uiMoveTargetSoldierId != NOBODY )
{
if( gfUIFullTargetFound )
{
if ( gusUIFullTargetID != uiMoveTargetSoldierId )
{
*puiNewEvent = A_CHANGE_TO_MOVE;
return;
}
}
else
{
*puiNewEvent = A_CHANGE_TO_MOVE;
return;
}
}
*puiNewEvent = T_ON_TERRAIN;
break;
case GETTINGITEM_MODE:
break;
case TALKINGMENU_MODE:
if ( HandleTalkingMenu( ) )
{
*puiNewEvent = A_CHANGE_TO_MOVE;
}
break;
case EXITSECTORMENU_MODE:
if ( HandleSectorExitMenu( ) )
{
*puiNewEvent = A_CHANGE_TO_MOVE;
}
break;
case OPENDOOR_MENU_MODE:
if ( HandleOpenDoorMenu( ) )
{
*puiNewEvent = A_CHANGE_TO_MOVE;
}
break;
case HANDCURSOR_MODE:
*puiNewEvent = HC_ON_TERRAIN;
break;
case RADIOCURSOR_MODE:
//*puiNewEvent = A_CHANGE_TO_MOVE;
break;
case MOVE_MODE:
if ( usMapPos != usOldMapPos )
{
// Set off ALL move....
gfUIAllMoveOn = FALSE;
}
uiMoveTargetSoldierId = NOBODY;
// Check for being on terrain
if( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
UINT16 usItem;
UINT8 ubItemCursor;
// Alrighty, check what's in our hands = if a 'friendly thing', like med kit, look for our own guys
usItem = pSoldier->inv[HANDPOS].usItem;
// get cursor for item
ubItemCursor = GetActionModeCursor( pSoldier );
//
if ( IsValidJumpLocation( pSoldier, usMapPos, TRUE ) )
{
*puiNewEvent = JP_ON_TERRAIN;
gsJumpOverGridNo = usMapPos;
return;
}
else
{
if( gfUIFullTargetFound )
{
if ( IsValidTalkableNPC( gusUIFullTargetID, FALSE, FALSE, FALSE ) && !_KeyDown( SHIFT ) && !AM_AN_EPC( pSoldier ) && MercPtrs[ gusUIFullTargetID ]->bTeam != ENEMY_TEAM && !ValidQuickExchangePosition( ) )
{
uiMoveTargetSoldierId = gusUIFullTargetID;
*puiNewEvent = T_CHANGE_TO_TALKING;
return;
}
else if ( ubItemCursor == AIDCURS )
{
// IF it's an ememy, goto confirm action mode
if ( ( guiUIFullTargetFlags & OWNED_MERC ) && ( guiUIFullTargetFlags & VISIBLE_MERC ) && !( guiUIFullTargetFlags & DEAD_MERC ) )
{
//uiMoveTargetSoldierId = gusUIFullTargetID;
//*puiNewEvent = A_ON_TERRAIN;
//return;
}
}
else
{
// IF it's an ememy, goto confirm action mode
if ( ( guiUIFullTargetFlags & ENEMY_MERC ) && ( guiUIFullTargetFlags & VISIBLE_MERC ) && !( guiUIFullTargetFlags & DEAD_MERC ) )
{
uiMoveTargetSoldierId = gusUIFullTargetID;
*puiNewEvent = A_ON_TERRAIN;
return;
}
}
}
}
}
*puiNewEvent = M_ON_TERRAIN;
break;
case ACTION_MODE:
// First check if we are on a guy, if so, make selected if it's ours
// Check if the guy is visible
guiUITargetSoldierId = NOBODY;
fOnValidGuy = FALSE;
if ( gfUIFullTargetFound )
//if ( gfUIFullTargetFound )
{
if ( IsValidTargetMerc( gusUIFullTargetID ) )
{
guiUITargetSoldierId = gusUIFullTargetID;
if ( MercPtrs[ gusUIFullTargetID ]->bTeam != gbPlayerNum )
{
fOnValidGuy = TRUE;
}
else
{
if ( gUIActionModeChangeDueToMouseOver )
{
*puiNewEvent = A_CHANGE_TO_MOVE;
return;
}
}
}
}
else
{
if ( gUIActionModeChangeDueToMouseOver )
{
*puiNewEvent = A_CHANGE_TO_MOVE;
return;
}
}
*puiNewEvent = A_ON_TERRAIN;
break;
case CONFIRM_MOVE_MODE:
if ( usMapPos != usOldMapPos )
{
// Switch event out of confirm mode
// Set off ALL move....
gfUIAllMoveOn = FALSE;
*puiNewEvent = A_CHANGE_TO_MOVE;
}
break;
case CONFIRM_ACTION_MODE:
// DONOT CANCEL IF BURST
if( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
if ( pSoldier->bDoBurst )
{
pSoldier->sEndGridNo = usMapPos;
if ( pSoldier->sEndGridNo != pSoldier->sStartGridNo && fLeftButtonDown )
{
pSoldier->flags.fDoSpread = TRUE;
gfBeginBurstSpreadTracking = TRUE;
}
if ( pSoldier->flags.fDoSpread )
{
// Accumulate gridno
AccumulateBurstLocation( usMapPos );
*puiNewEvent = CA_ON_TERRAIN;
break;
}
}
}
// First check if we are on a guy, if so, make selected if it's ours
if ( gfUIFullTargetFound )
{
if ( guiUITargetSoldierId != gusUIFullTargetID )
{
// Switch event out of confirm mode
*puiNewEvent = CA_END_CONFIRM_ACTION;
}
else
{
*puiNewEvent = CA_ON_TERRAIN;
}
}
else
{
if ( ConfirmActionCancel( usMapPos, usOldMapPos ) )
{
// Switch event out of confirm mode
*puiNewEvent = CA_END_CONFIRM_ACTION;
}
else
{
*puiNewEvent = CA_ON_TERRAIN;
}
}
break;
}
//if ( gCurrentUIMode != CONFIRM_ACTION_MODE )
//{
// if( GetSoldier( &pSoldier, gusSelectedSoldier ) )
// {
// Change refine value back to 1
/// pSoldier->aiData.bShownAimTime = REFINE_AIM_1;
// }
//}
usOldMapPos = usMapPos;
}
}
//***13.02.2008*** place sandbags in tactics
//usSubIndex may be [ 1 .. 10 ]
//void PlaceSandbag (UINT16 usSubIndex)
//{
// INT16 sGridNo;
// UINT16 usIndex, cnt;
// INT8 bOverTerrainType;
// UINT32 uiType;
// //SECTORINFO *pSector;
//
// /*if( (gTacticalStatus.uiFlags & INCOMBAT) && (gTacticalStatus.uiFlags & TURNBASED) )
// {
// return;
// }
//
// if( gWorldSectorX != -1 && gWorldSectorY != -1 && gWorldSectorX != 0 && gWorldSectorY != 0 &&
// NumEnemiesInAnySector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ ) > 0 )
// {
// return;
// }
//
// if( gbWorldSectorZ > 0 || gsInterfaceLevel > 0)
// {
// return;
// }
//
// for(uiType = 0; uiType < giNumberOfTileTypes; uiType++)
// {
// if( !gTilesets[ giCurrentTilesetID].TileSurfaceFilenames[ uiType ][0] )
// {
// if( !_strnicmp(gTilesets[ 0 ].TileSurfaceFilenames[ uiType ], "sandbag.sti", 11) )
// break;
// }
// else
// {
// if( !_strnicmp(gTilesets[ giCurrentTilesetID ].TileSurfaceFilenames[ uiType ], "sandbag.sti", 11) )
// break;
// }
// }
//
// if(uiType >= giNumberOfTileTypes)
// return;*/
//
// if( GetMouseMapPos( &sGridNo ) )
// {
// //if( InARoom( sGridNo, NULL ) )
// // return;
//
// //bOverTerrainType = GetTerrainType( sGridNo );
// //if( bOverTerrainType == MED_WATER || bOverTerrainType == DEEP_WATER || bOverTerrainType == LOW_WATER )
// // return;
//
// //pSector = &SectorInfo[ SECTOR(gWorldSectorX, gWorldSectorY) ];
// //if( pSector->bUSUSED <= 0 ) //check the number of available sandbags
// //{
// // ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"No Sandbags");
// //}
//usIndex =1;
// //GetTileIndexFromTypeSubIndex( SECONDLARGEEXPDEBRIS, usSubIndex, &usIndex ); //only for tileset 0
//GetTileIndexFromTypeSubIndex( 150, usSubIndex, &usIndex ); //only for tileset 0
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"No Sandbags");
// //GetTileIndexFromTypeSubIndex( SECONDLARGEEXPDEBRIS, usSubIndex, &usIndex );
// ApplyMapChangesToMapTempFile( TRUE );
// AddStructToHead( sGridNo, usIndex);
// //if( pSector->bUSUSED <= 0 || !AddStructToHead( sGridNo, usIndex ) )
// //{
// //loop to delete all sandbags
// // for(cnt = 1; cnt <= 10; cnt++)
// // {
// // GetTileIndexFromTypeSubIndex( uiType, cnt, &usIndex );
// // if(RemoveStruct( sGridNo, usIndex ))
// // {
// // RecompileLocalMovementCosts(sGridNo);
// // pSector->bUSUSED += 1;
// // break;
// // }
// // }
// //}
// //else
// //{
// RecompileLocalMovementCosts(sGridNo);
//// pSector->bUSUSED -= 1;
// //}
// ApplyMapChangesToMapTempFile( FALSE );
// SetRenderFlags( RENDER_FLAG_FULL );
// }
//
//}
//
//
//
void QueryRTMButton( UINT32 *puiNewEvent )
{
INT32 sMapPos;
if ( gViewportRegion.uiFlags & MSYS_MOUSE_IN_AREA )
{
if (!GetMouseMapPos( &sMapPos ) )
return;
if (gViewportRegion.ButtonState & MSYS_MIDDLE_BUTTON) // MID MOUSE BUTTON
{
if ( !fMiddleButtonDown )
{
fMiddleButtonDown = TRUE;
//RESETCOUNTER( RMOUSECLICK_DELAY_COUNTER );
}
}
else if ( fMiddleButtonDown )
{
if(gGameExternalOptions.bAlternateMouseCommands)
HandleAltMouseRTMButton( puiNewEvent );
else
HandleMouseRTMButton( puiNewEvent );
fMiddleButtonDown = FALSE;
// Reset counter
//RESETCOUNTER( RMOUSECLICK_DELAY_COUNTER );
}
}
}//void QueryRTMButton( UINT32 *puiNewEvent )
void QueryRTWheels( UINT32 *puiNewEvent )
{
SOLDIERTYPE *pSoldier;
INT32 sMapPos=0;
gViewportRegion.WheelState = gViewportRegion.WheelState * ( gGameSettings.fOptions[TOPTION_INVERT_WHEEL] ? -1 : 1 );
if ( gViewportRegion.uiFlags & MSYS_MOUSE_IN_AREA )
{
if (!GetMouseMapPos( &sMapPos ) )
return;
if ( gViewportRegion.WheelState != 0 )
{
// printf("wheel %d\n", gViewportRegion.WheelState);MessageBeep(0x00000040L);
if ( gpItemPointer == NULL )
{
if ( gusSelectedSoldier != NOBODY )
{
// Switch on UI mode
switch( gCurrentUIMode )
{
case IDLE_MODE:
case MOVE_MODE:
case HANDCURSOR_MODE:
case RADIOCURSOR_MODE:
if(gGameExternalOptions.bAlternateMouseCommands)
HandleAltMouseRTWheel();
else
HandleMouseRTWheel();
break;
case ACTION_MODE:
case CONFIRM_MOVE_MODE:
case LOOKCURSOR_MODE:
case TALKCURSOR_MODE:
case MENU_MODE:
break;
case CONFIRM_ACTION_MODE: //shoot here. but is never gets here :)
if (GetSoldier(&pSoldier, gusSelectedSoldier))
{
HandleWheelAdjustCursorWOAB(pSoldier, sMapPos, -gViewportRegion.WheelState);
}
break;
break;
}//switch
}//if ( gusSelectedSoldier != NOBODY )
}//if ( gpItemPointer == NULL
ResetWheelState( &gViewportRegion );
}//if ( gViewportRegion.WheelState != 0 )
}
}//void QueryRTWheels( UINT32 *puiNewEvent )
void QueryRTX1Button( UINT32 *puiNewEvent )
{
INT32 sMapPos;
if ( gViewportRegion.uiFlags & MSYS_MOUSE_IN_AREA )
{
if (!GetMouseMapPos( &sMapPos ) )
return;
if (gViewportRegion.ButtonState & MSYS_X1_BUTTON) // MID MOUSE BUTTON
{
if ( !fX1ButtonDown )
{
fX1ButtonDown = TRUE;
}
}
else if ( fX1ButtonDown )
{
fX1ButtonDown = FALSE;
if(gGameExternalOptions.bAlternateMouseCommands)
HandleAltMouseRTX1Button( puiNewEvent );
else
HandleMouseRTX1Button( puiNewEvent );
}
}
}
void QueryRTX2Button( UINT32 *puiNewEvent )
{
INT32 sMapPos;
if ( gViewportRegion.uiFlags & MSYS_MOUSE_IN_AREA )
{
if (!GetMouseMapPos( &sMapPos ) )
return;
if (gViewportRegion.ButtonState & MSYS_X2_BUTTON) // MID MOUSE BUTTON
{
if ( !fX2ButtonDown )
{
fX2ButtonDown = TRUE;
}
}
else if ( fX2ButtonDown )
{
fX2ButtonDown = FALSE;
if(gGameExternalOptions.bAlternateMouseCommands)
HandleAltMouseRTX2Button( puiNewEvent );
else
HandleMouseRTX2Button( puiNewEvent );
}
}
}
// sevenfm: new mouse commands
void HandleAltMouseRTWheel(void)
{
if (!(gTacticalStatus.uiFlags & ENGAGED_IN_CONV) &&
((gsCurInterfacePanel != SM_PANEL) || (ButtonList[iSMPanelButtons[NEXTMERC_BUTTON]]->uiFlags & BUTTON_ENABLED)))
{
if (gViewportRegion.WheelState > 0) // wheel up
{
if (_KeyDown(ALT))
if (_KeyDown(SHIFT))
{
if (_KeyDown(CTRL)) // SHIFT+CTRL+ALT
;
else // SHIFT+ALT
;
}
else if (_KeyDown(CTRL)) // CTRL+ALT
HandleTBPickUpBackpacks();
else // ALT
HandleTBGotoHigherStance();
else if (_KeyDown(CTRL))
{
if (_KeyDown(SHIFT)) // SHIFT+CTRL
;
else // CTRL
HandleTBLocatePrevMerc();
}
else if (_KeyDown(SHIFT)) // SHIFT
HandleTBCycleThroughVisibleEnemiesBackward();
else
HandleTBLevelUp();
}
else // wheel down
{
if (_KeyDown(ALT))
if (_KeyDown(SHIFT))
{
if (_KeyDown(CTRL)) // SHIFT+CTRL+ALT
;
else // SHIFT+ALT
;
}
else if (_KeyDown(CTRL)) // CTRL+ALT
HandleTBDropBackpacks();
else // ALT
HandleTBGotoLowerStance();
else if (_KeyDown(CTRL))
{
if (_KeyDown(SHIFT)) // SHIFT+CTRL
;
else // CTRL
HandleTBLocateNextMerc();
}
else if (_KeyDown(SHIFT)) // SHIFT
HandleTBCycleThroughVisibleEnemies();
else
HandleTBLevelDown();
}
}
}
void HandleAltMouseRTMButton(UINT32 *puiNewEvent)
{
INT32 usMapPos;
GetMouseMapPos(&usMapPos);
if (_KeyDown(ALT))
if (_KeyDown(SHIFT))
{
if (_KeyDown(CTRL)) // SHIFT+CTRL+ALT
;
else // SHIFT+ALT
;// reserved
}
else if (_KeyDown(CTRL)) // CTRL+ALT
HandleTacticalReload();
else // ALT
HandleRTToggleFireMode();
else if (_KeyDown(CTRL))
{
if (_KeyDown(SHIFT)) // SHIFT+CTRL
;
else // CTRL
SetScopeMode(usMapPos);
}
else if (_KeyDown(SHIFT)) // SHIFT
HandleTacticalTransformItem();
else // Button
HandleRTLook(puiNewEvent);
}
void HandleAltMouseRTX1Button(UINT32 *puiNewEvent)
{
if (_KeyDown(ALT))
if (_KeyDown(SHIFT))
{
if (_KeyDown(CTRL)) // SHIFT+CTRL+ALT
;
else // SHIFT+ALT
;
}
else if (_KeyDown(CTRL)) // CTRL+ALT
ToggleTrapNetworkView();
else // ALT
HandleTBSwapGunsling();
else if (_KeyDown(CTRL))
{
if (_KeyDown(SHIFT)) // SHIFT+CTRL
;
else // CTRL
HandleTBSwapHands();
}
else if (_KeyDown(SHIFT)) // SHIFT
HandleTBSelectAllMercs();
else // Button
HandleTBShowLOS();
}
void HandleAltMouseRTX2Button(UINT32 *puiNewEvent)
{
if (_KeyDown(ALT))
if (_KeyDown(SHIFT))
{
if (_KeyDown(CTRL)) // SHIFT+CTRL+ALT
;
else // SHIFT+ALT
;
}
else if (_KeyDown(CTRL)) // CTRL+ALT
ToggleHostileTrapsView();
else // ALT
HandleTBToggleFormation();
else if (_KeyDown(CTRL))
{
if (_KeyDown(SHIFT)) // SHIFT+CTRL
;
else // CTRL
HandleRTJump();
}
else if (_KeyDown(SHIFT)) // SHIFT
HandleRTJumpThroughWindow();
else // Button
HandleTBShowCover();
}
// sevenfm: original mouse commands functionality
void HandleMouseRTWheel( void )
{
SoldierID bID;
// nothing in hand and either not in SM panel, or the matching button is enabled if we are in SM panel
if ( !( gTacticalStatus.uiFlags & ENGAGED_IN_CONV ) &&
( ( gsCurInterfacePanel != SM_PANEL ) || ( ButtonList[ iSMPanelButtons[ NEXTMERC_BUTTON ] ]->uiFlags & BUTTON_ENABLED ) ) )
{
if ( gViewportRegion.WheelState > 0 ) //wheel up
{
//change stance ->DOWN
if ( _KeyDown( ALT ) )
{
if ( (gusSelectedSoldier != NOBODY) && ( gpItemPointer == NULL ) )
GotoLowerStance(gusSelectedSoldier);
return;
}
if ( gusSelectedSoldier != NOBODY )
{ //Select prev merc
bID = FindPrevActiveAndAliveMerc( gusSelectedSoldier, TRUE, TRUE );
HandleLocateSelectMerc( bID, LOCATEANDSELECT_MERC );
// Center to guy....
LocateSoldier( gusSelectedSoldier, SETLOCATOR );
}
}
else
{
//change stance ->UP
if ( _KeyDown( ALT ) )
{
if ( (gusSelectedSoldier != NOBODY) && ( gpItemPointer == NULL ) )
GotoHeigherStance( gusSelectedSoldier );
return;
}
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"wheel %d", gViewportRegion.WheelState);
if ( gusSelectedSoldier != NOBODY )
{ //Select next merc
bID = FindNextMercInTeamPanel( gusSelectedSoldier, FALSE, FALSE );
HandleLocateSelectMerc( bID, LOCATEANDSELECT_MERC );
// Center to guy....
LocateSoldier( gusSelectedSoldier, SETLOCATOR );
}
}
//*puiNewEvent = M_ON_TERRAIN; ????????????????
}
}
void HandleMouseRTMButton( UINT32 *puiNewEvent )
{
if ( _KeyDown( ALT ) )
{
// toggle fire mode
if ( ( gpItemPointer == NULL ) && ( gusSelectedSoldier != NOBODY ) &&
( ( gsCurInterfacePanel != SM_PANEL ) || ( ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->uiFlags & BUTTON_ENABLED ) ) )
ChangeWeaponMode( gusSelectedSoldier );
}
else
*puiNewEvent = LC_LOOK;
}
void HandleMouseRTX1Button( UINT32 *puiNewEvent )
{
if ( !_KeyDown( ALT ) && !_KeyDown( SHIFT ))
{
UIHandleChangeLevel( NULL );
}
else if( _KeyDown( SHIFT ) )
{
// WANNE: Jump through window?
if (gGameExternalOptions.fCanJumpThroughWindows == TRUE )
{
INT8 bDirection;
SOLDIERTYPE *lSoldier;
if ( GetSoldier( &lSoldier, gusSelectedSoldier ) )
{
if ( FindWindowJumpDirection( lSoldier, lSoldier->sGridNo, lSoldier->ubDirection, &bDirection ) )
{
lSoldier->BeginSoldierClimbWindow( );
}
}
}
}
else if (_KeyDown( ALT ) )
{
// Climb on roofs
SOLDIERTYPE *pjSoldier;
if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
{
BOOLEAN fNearHeigherLevel;
BOOLEAN fNearLowerLevel;
INT8 bDirection;
// CHRISL: Turn off manual jumping while wearing a backpack
if (!pjSoldier->CanClimbWithCurrentBackpack())
return;
// Make sure the merc is not collapsed!
if (!IsValidStance(pjSoldier, ANIM_CROUCH) )
{
if ( pjSoldier->bCollapsed && pjSoldier->bBreath < OKBREATH )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 4 ], pjSoldier->name );
return;
}
GetMercClimbDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
if ( fNearLowerLevel )
pjSoldier->BeginSoldierClimbDownRoof( );
if ( fNearHeigherLevel )
pjSoldier->BeginSoldierClimbUpRoof( );
if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
pjSoldier->BeginSoldierClimbFence( );
}
}
}
void HandleMouseRTX2Button( UINT32 *puiNewEvent )
{
if ( _KeyDown( ALT ) )
AutoReload( gusSelectedSoldier );
else
// Toggle squad's stealth mode.....
// For each guy on squad...
{
SOLDIERTYPE *pTeamSoldier;
INT16 bLoop;
BOOLEAN fStealthOn = FALSE;
// Check if at least one guy is on stealth....
for (bLoop=gTacticalStatus.Team[gbPlayerNum].bFirstID, pTeamSoldier=MercPtrs[bLoop]; bLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; bLoop++, pTeamSoldier++)
{
if ( OK_CONTROLLABLE_MERC( pTeamSoldier ) && pTeamSoldier->bAssignment == CurrentSquad( ) )
{
if ( pTeamSoldier->bStealthMode )
{
fStealthOn = TRUE;
}
}
}
fStealthOn = !fStealthOn;
for (bLoop=gTacticalStatus.Team[gbPlayerNum].bFirstID, pTeamSoldier=MercPtrs[bLoop]; bLoop <= gTacticalStatus.Team[gbPlayerNum].bLastID; bLoop++, pTeamSoldier++)
{
if ( OK_CONTROLLABLE_MERC( pTeamSoldier ) && pTeamSoldier->bAssignment == CurrentSquad( ) && !AM_A_ROBOT( pTeamSoldier ) )
{
if ( gpSMCurrentMerc != NULL && bLoop == gpSMCurrentMerc->ubID )
{
gfUIStanceDifferent = TRUE;
}
pTeamSoldier->bStealthMode = fStealthOn;
}
}
fInterfacePanelDirty = DIRTYLEVEL2;
// OK, display message
if ( fStealthOn )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_ON_STEALTHMODE ] );
}
else
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_SQUAD_OFF_STEALTHMODE ] );
}
}
}
// sevenfm: common functionality
void HandleRTLook( UINT32 *puiNewEvent )
{
*puiNewEvent = LC_LOOK;
}
void HandleRTJump( void )
{
// Climb on roofs
SOLDIERTYPE *pjSoldier;
if ( GetSoldier( &pjSoldier, gusSelectedSoldier ) )
{
BOOLEAN fNearHeigherLevel;
BOOLEAN fNearLowerLevel;
INT8 bDirection;
// CHRISL: Turn off manual jumping while wearing a backpack
if (!pjSoldier->CanClimbWithCurrentBackpack())
return;
// Make sure the merc is not collapsed!
if (!IsValidStance(pjSoldier, ANIM_CROUCH) )
{
if ( pjSoldier->bCollapsed && pjSoldier->bBreath < OKBREATH )
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 4 ], pjSoldier->name );
return;
}
GetMercClimbDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
if ( fNearLowerLevel )
pjSoldier->BeginSoldierClimbDownRoof( );
if ( fNearHeigherLevel )
pjSoldier->BeginSoldierClimbUpRoof( );
if ( FindFenceJumpDirection( pjSoldier, pjSoldier->sGridNo, pjSoldier->ubDirection, &bDirection ) )
pjSoldier->BeginSoldierClimbFence( );
}
}
void HandleRTJumpThroughWindow( void )
{
if (gGameExternalOptions.fCanJumpThroughWindows == TRUE )
{
INT8 bDirection;
SOLDIERTYPE *lSoldier;
if ( GetSoldier( &lSoldier, gusSelectedSoldier ) )
{
if ( FindWindowJumpDirection( lSoldier, lSoldier->sGridNo, lSoldier->ubDirection, &bDirection ) )
{
lSoldier->BeginSoldierClimbWindow( );
}
}
}
}
void HandleRTToggleFireMode( void )
{
// toggle fire mode
if ( ( gpItemPointer == NULL ) && ( gusSelectedSoldier != NOBODY ) &&
( ( gsCurInterfacePanel != SM_PANEL ) || ( ButtonList[ iSMPanelButtons[ BURSTMODE_BUTTON ] ]->uiFlags & BUTTON_ENABLED ) ) )
ChangeWeaponMode( gusSelectedSoldier );
}
void HandleRTLocateSoldier( void )
{
if ( gusSelectedSoldier != NOBODY )
{
LocateSoldier( gusSelectedSoldier, 10 );
}
}