*********************************************************

*	2006/05/01					*
*	Little Alien					*
*	Developed in VS 2003				*
*********************************************************

Source:
- Added militia control in tactical (can be turned on/off in ja2.ini file)
- Aiming/readying gun: show in red points needed for readying gun

Data:
- Added new ja2.ini



git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@46 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
lalien
2006-05-01 20:59:34 +00:00
parent dc2b482a8f
commit cce975b6c1
16 changed files with 2454 additions and 205 deletions
+167 -152
View File
@@ -5520,6 +5520,7 @@ BOOLEAN HandleTalkInit( )
INT16 sDistVisible;
INT16 sActionGridNo;
UINT8 ubDirection;
UINT8 commandRange; //lal
// Get soldier
if ( !GetSoldier( &pSoldier, gusSelectedSoldier ) )
@@ -5535,189 +5536,203 @@ BOOLEAN HandleTalkInit( )
// Check if there is a guy here to talk to!
if ( gfUIFullTargetFound )
{
// Is he a valid NPC?
if ( IsValidTalkableNPC( (UINT8)gusUIFullTargetID, FALSE, TRUE , FALSE ) )
{
GetSoldier( &pTSoldier, gusUIFullTargetID );
// Is he a valid NPC?
if ( IsValidTalkableNPC( (UINT8)gusUIFullTargetID, FALSE, TRUE , FALSE ) )
{
GetSoldier( &pTSoldier, gusUIFullTargetID );
if ( pTSoldier->ubID != pSoldier->ubID )
{
//ATE: Check if we have good LOS
// is he close enough to see that gridno if he turns his head?
if ( pTSoldier->ubID != pSoldier->ubID )
{
if ( !(( pTSoldier->bTeam == MILITIA_TEAM ) && ( CheckIfRadioIsEquipped() )) ) //lal
{
//ATE: Check if we have good LOS
// is he close enough to see that gridno if he turns his head?
sDistVisible = DistanceVisible( pSoldier, DIRECTION_IRRELEVANT, DIRECTION_IRRELEVANT, pTSoldier->sGridNo, pTSoldier->bLevel, pTSoldier );
// Check LOS!
if ( !SoldierTo3DLocationLineOfSightTest( pSoldier, pTSoldier->sGridNo, pTSoldier->bLevel, 3, (UINT8) sDistVisible, TRUE ) )
{
if ( pTSoldier->ubProfile != NO_PROFILE )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_LOS_TO_TALK_TARGET ], pSoldier->name, pTSoldier->name );
}
else
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 45 ], pSoldier->name );
}
return( FALSE );
}
}
// Check LOS!
if ( !SoldierTo3DLocationLineOfSightTest( pSoldier, pTSoldier->sGridNo, pTSoldier->bLevel, 3, (UINT8) sDistVisible, TRUE ) )
{
if ( pTSoldier->ubProfile != NO_PROFILE )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_LOS_TO_TALK_TARGET ], pSoldier->name, pTSoldier->name );
}
else
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 45 ], pSoldier->name );
}
return( FALSE );
}
}
}
if ( pTSoldier->bCollapsed )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 21 ], pTSoldier->name );
return( FALSE );
}
if ( pTSoldier->bCollapsed )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 21 ], pTSoldier->name );
return( FALSE );
}
// If Q on, turn off.....
if ( guiCurrentScreen == DEBUG_SCREEN )
{
gfExitDebugScreen = TRUE;
// If Q on, turn off.....
if ( guiCurrentScreen == DEBUG_SCREEN )
{
gfExitDebugScreen = TRUE;
}
// ATE: if our own guy...
if ( pTSoldier->bTeam == gbPlayerNum && !AM_AN_EPC( pTSoldier ) )
{
if ( pTSoldier->ubProfile == DIMITRI )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 32 ], pTSoldier->name );
return( FALSE );
}
// ATE: if our own guy...
if ( pTSoldier->bTeam == gbPlayerNum && !AM_AN_EPC( pTSoldier ) )
// Randomize quote to use....
// If buddy had a social trait...
if ( gMercProfiles[ pTSoldier->ubProfile ].bAttitude != ATT_NORMAL )
{
if ( pTSoldier->ubProfile == DIMITRI )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 32 ], pTSoldier->name );
return( FALSE );
}
ubDiceRoll = (UINT8)Random( 3 );
}
else
{
ubDiceRoll = (UINT8)Random( 2 );
}
// Randomize quote to use....
// If we are a PC, only use 0
if ( pTSoldier->ubWhatKindOfMercAmI == MERC_TYPE__PLAYER_CHARACTER )
{
ubDiceRoll = 0;
}
// If buddy had a social trait...
if ( gMercProfiles[ pTSoldier->ubProfile ].bAttitude != ATT_NORMAL )
switch( ubDiceRoll )
{
case 0:
ubQuoteNum = QUOTE_NEGATIVE_COMPANY;
break;
case 1:
if ( QuoteExp_PassingDislike[ pTSoldier->ubProfile ] )
{
ubDiceRoll = (UINT8)Random( 3 );
ubQuoteNum = QUOTE_PASSING_DISLIKE;
}
else
{
ubDiceRoll = (UINT8)Random( 2 );
ubQuoteNum = QUOTE_NEGATIVE_COMPANY;
}
break;
// If we are a PC, only use 0
if ( pTSoldier->ubWhatKindOfMercAmI == MERC_TYPE__PLAYER_CHARACTER )
{
ubDiceRoll = 0;
}
switch( ubDiceRoll )
{
case 0:
case 2:
ubQuoteNum = QUOTE_NEGATIVE_COMPANY;
break;
ubQuoteNum = QUOTE_SOCIAL_TRAIT;
break;
case 1:
default:
if ( QuoteExp_PassingDislike[ pTSoldier->ubProfile ] )
{
ubQuoteNum = QUOTE_PASSING_DISLIKE;
}
else
{
ubQuoteNum = QUOTE_NEGATIVE_COMPANY;
}
break;
case 2:
ubQuoteNum = QUOTE_SOCIAL_TRAIT;
break;
default:
ubQuoteNum = QUOTE_NEGATIVE_COMPANY;
break;
}
if ( pTSoldier->ubProfile == IRA )
{
ubQuoteNum = QUOTE_PASSING_DISLIKE;
}
TacticalCharacterDialogue( pTSoldier, ubQuoteNum );
return( FALSE );
ubQuoteNum = QUOTE_NEGATIVE_COMPANY;
break;
}
// Check distance
uiRange = GetRangeFromGridNoDiff( pSoldier->sGridNo, usMapPos );
// Double check path
if ( GetCivType( pTSoldier ) != CIV_TYPE_NA )
if ( pTSoldier->ubProfile == IRA )
{
// ATE: If one is already active, just remove it!
if ( ShutDownQuoteBoxIfActive( ) )
{
return( FALSE );
}
ubQuoteNum = QUOTE_PASSING_DISLIKE;
}
if ( uiRange > NPC_TALK_RADIUS )
{
// First get an adjacent gridno....
sActionGridNo = FindAdjacentGridEx( pSoldier, pTSoldier->sGridNo, &ubDirection, NULL, FALSE, TRUE );
if ( sActionGridNo == -1 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_PATH ] );
return( FALSE );
}
if ( UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, FALSE, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ) == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_PATH ] );
return( FALSE );
}
TacticalCharacterDialogue( pTSoldier, ubQuoteNum );
// Walk up and talk to buddy....
gfNPCCircularDistLimit = TRUE;
sGoodGridNo = FindGridNoFromSweetSpotWithStructData( pSoldier, pSoldier->usUIMovementMode, pTSoldier->sGridNo, (NPC_TALK_RADIUS-1), &ubNewDirection, TRUE );
gfNPCCircularDistLimit = FALSE;
return( FALSE );
}
// First calculate APs and validate...
sAPCost = AP_TALK;
//sAPCost += UIPlotPath( pSoldier, sGoodGridNo, NO_COPYROUTE, FALSE, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints );
// Check distance
uiRange = GetRangeFromGridNoDiff( pSoldier->sGridNo, usMapPos );
// Check AP cost...
if ( !EnoughPoints( pSoldier, sAPCost, 0, TRUE ) )
{
return( FALSE );
}
// Now walkup to talk....
pSoldier->ubPendingAction = MERC_TALK;
pSoldier->uiPendingActionData1 = pTSoldier->ubID;
pSoldier->ubPendingActionAnimCount = 0;
// WALK UP TO DEST FIRST
EVENT_InternalGetNewSoldierPath( pSoldier, sGoodGridNo, pSoldier->usUIMovementMode , TRUE , pSoldier->fNoAPToFinishMove );
return( FALSE );
}
else
{
sAPCost = AP_TALK;
// Check AP cost...
if ( !EnoughPoints( pSoldier, sAPCost, 0, TRUE ) )
{
return( FALSE );
}
// OK, startup!
PlayerSoldierStartTalking( pSoldier, pTSoldier->ubID, FALSE );
}
if ( GetCivType( pTSoldier ) != CIV_TYPE_NA )
// Double check path
if ( GetCivType( pTSoldier ) != CIV_TYPE_NA )
{
// ATE: If one is already active, just remove it!
if ( ShutDownQuoteBoxIfActive( ) )
{
return( FALSE );
}
else
{
return( TRUE );
}
}
//lal
if ( pTSoldier->bTeam == MILITIA_TEAM )
{
commandRange = NPC_TALK_RADIUS*3;
}
else
{
commandRange = NPC_TALK_RADIUS;
}
if ( ( uiRange > commandRange ) && ( !CheckIfRadioIsEquipped() ) ) //lal
{
// First get an adjacent gridno....
sActionGridNo = FindAdjacentGridEx( pSoldier, pTSoldier->sGridNo, &ubDirection, NULL, FALSE, TRUE );
if ( sActionGridNo == -1 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_PATH ] );
return( FALSE );
}
if ( UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, FALSE, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ) == 0 )
{
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, TacticalStr[ NO_PATH ] );
return( FALSE );
}
// Walk up and talk to buddy....
gfNPCCircularDistLimit = TRUE;
sGoodGridNo = FindGridNoFromSweetSpotWithStructData( pSoldier, pSoldier->usUIMovementMode, pTSoldier->sGridNo, (NPC_TALK_RADIUS-1), &ubNewDirection, TRUE );
gfNPCCircularDistLimit = FALSE;
// First calculate APs and validate...
sAPCost = AP_TALK;
//sAPCost += UIPlotPath( pSoldier, sGoodGridNo, NO_COPYROUTE, FALSE, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints );
// Check AP cost...
if ( !EnoughPoints( pSoldier, sAPCost, 0, TRUE ) )
{
return( FALSE );
}
// Now walkup to talk....
pSoldier->ubPendingAction = MERC_TALK;
pSoldier->uiPendingActionData1 = pTSoldier->ubID;
pSoldier->ubPendingActionAnimCount = 0;
// WALK UP TO DEST FIRST
EVENT_InternalGetNewSoldierPath( pSoldier, sGoodGridNo, pSoldier->usUIMovementMode , TRUE , pSoldier->fNoAPToFinishMove );
return( FALSE );
}
else
{
sAPCost = AP_TALK;
// Check AP cost...
if ( !EnoughPoints( pSoldier, sAPCost, 0, TRUE ) )
{
return( FALSE );
}
// OK, startup!
PlayerSoldierStartTalking( pSoldier, pTSoldier->ubID, FALSE );
}
if ( GetCivType( pTSoldier ) != CIV_TYPE_NA )
{
return( FALSE );
}
else
{
return( TRUE );
}
}
}
return( FALSE );
+1
View File
@@ -340,6 +340,7 @@ void GotoHeigherStance( SOLDIERTYPE *pSoldier );
BOOLEAN IsValidJumpLocation( SOLDIERTYPE *pSoldier, INT16 sGridNo , BOOLEAN fCheckForPath);
void PopupAssignmentMenuInTactical( SOLDIERTYPE *pSoldier );
void PopupMilitiaControlMenu( SOLDIERTYPE *pSoldier ); //lal
void PreventFromTheFreezingBug(SOLDIERTYPE* pSoldier);
+5
View File
@@ -78,6 +78,7 @@ BOOLEAN gfPausedTacticalRenderFlags = FALSE;
// which assignment menu can be shown?
extern void DetermineWhichAssignmentMenusCanBeShown( void );
extern void DetermineWhichMilitiaControlMenusCanBeShown( void ); //lal
extern void HandleAnyMercInSquadHasCompatibleStuff( UINT8 ubSquad, OBJECTTYPE *pObject, BOOLEAN fReset );
extern BOOLEAN RemoveFlashItemSlot( ITEM_POOL *pItemPool );
@@ -346,6 +347,10 @@ void ResetInterface( )
DetermineWhichAssignmentMenusCanBeShown();
CreateDestroyAssignmentPopUpBoxes( );
DetermineWhichMilitiaControlMenusCanBeShown( ); //lal
CreateDestroyMilitiaControlPopUpBoxes( );
HideUICursor( );
ResetPhysicsTrajectoryUI( );
File diff suppressed because it is too large Load Diff
+20
View File
@@ -1,6 +1,11 @@
#ifndef __MILITIA_CONTROL_H
#define __MILITIA_CONTROL_H
#include "Types.h"
#include "Soldier Control.h"
#include "mousesystem.h"
#include "Strategic Movement.h"
void PrepareMilitiaForTactical();
void RemoveMilitiaFromTactical();
void ResetMilitia();
@@ -8,4 +13,19 @@ void HandleMilitiaPromotions();
extern BOOLEAN gfStrategicMilitiaChangesMade;
extern INT32 ghMilitiaControlBox;
//extern INT32 ghTalkToAllBox;
extern BOOLEAN fFirstClickInMilitiaControlScreenMask;
// figure out the assignment menu pop up box positions
void DetermineMilitiaControlBoxPositions( void );
// set x,y position in tactical
void SetTacticalPopUpMilitiaControlBoxXY( SOLDIERTYPE *pSoldier );
BOOLEAN CreateDestroyMilitiaControlPopUpBoxes( void );
BOOLEAN CheckIfRadioIsEquipped( void );
#endif
+2 -2
View File
@@ -151,7 +151,7 @@ BOOLEAN IsItAllowedToRenderRain()
{
if( !gfAllowRain )return FALSE;
if( !( guiEnvWeather & WEATHER_FORECAST_THUNDERSHOWERS | WEATHER_FORECAST_SHOWERS ) )return FALSE;
if( !( guiEnvWeather & (WEATHER_FORECAST_THUNDERSHOWERS | WEATHER_FORECAST_SHOWERS) ) )return FALSE;
if( guiCurrentScreen != GAME_SCREEN && guiCurrentScreen != SHOPKEEPER_SCREEN ) return FALSE;
@@ -198,7 +198,7 @@ void ResetRain()
void GenerateRainDropsList()
{
guiCurrMaxAmountOfRainDrops = (UINT32)(BASE_MAXIMUM_DROPS * gbCurrentRainIntensity);
guiCurrMaxAmountOfRainDrops = (UINT32)BASE_MAXIMUM_DROPS * gbCurrentRainIntensity;
pRainDrops = (TRainDrop *)MemAlloc( sizeof( TRainDrop ) * guiCurrMaxAmountOfRainDrops );
memset( pRainDrops, 0, sizeof( TRainDrop ) * guiCurrMaxAmountOfRainDrops );
+32 -27
View File
@@ -70,6 +70,7 @@ extern BOOLEAN fIgnoreLeftUp;
extern UINT32 guiCurrentEvent;
extern UINT32 guiCurrentUICursor;
extern void DetermineWhichAssignmentMenusCanBeShown( void );
extern void DetermineWhichMilitiaControlMenusCanBeShown( void );
extern BOOLEAN gfIgnoreOnSelectedGuy;
extern INT16 gsOverItemsGridNo;
extern INT16 gsOverItemsLevel;
@@ -1023,34 +1024,38 @@ void QueryRTRightButton( UINT32 *puiNewEvent )
case TALKCURSOR_MODE:
case MOVE_MODE:
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
if ( ( guiUIFullTargetFlags & OWNED_MERC ) && ( guiUIFullTargetFlags & VISIBLE_MERC ) && !( guiUIFullTargetFlags & DEAD_MERC )&&!( pSoldier ? pSoldier->uiStatusFlags & SOLDIER_VEHICLE : 0 ) )
{
//if( pSoldier->bAssignment >= ON_DUTY )
{
PopupAssignmentMenuInTactical( pSoldier );
fClickHoldIntercepted = TRUE;
}
break;
}
else
{
fShowAssignmentMenu = FALSE;
CreateDestroyAssignmentPopUpBoxes( );
DetermineWhichAssignmentMenusCanBeShown( );
}
if ( GetSoldier( &pSoldier, gusSelectedSoldier ) )
{
if ( ( guiUIFullTargetFlags & OWNED_MERC ) && ( guiUIFullTargetFlags & VISIBLE_MERC ) && !( guiUIFullTargetFlags & DEAD_MERC )&&!( pSoldier ? pSoldier->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;
}
}
// ATE:
if ( !fClickHoldIntercepted )
{
*puiNewEvent = U_MOVEMENT_MENU;
fClickHoldIntercepted = TRUE;
}
break;
}
}
if ( gCurrentUIMode == ACTION_MODE || gCurrentUIMode == TALKCURSOR_MODE )
{
PauseRT( FALSE );
+32 -12
View File
@@ -93,6 +93,8 @@ UINT8 gubMilitiaTurnSpeedUpFactor = 1;
UINT8 gubCivTurnSpeedUpFactor = 1;
//turnspeed
extern BOOLEAN fAllowTacticalMilitiaCommand; //lal
extern INT16 DirIncrementer[8];
#define PALETTEFILENAME "BINARYDATA\\ja2pal.dat"
@@ -10755,6 +10757,7 @@ void MercStealFromMerc( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pTarget )
}
}
SOLDIERTYPE *pTMilitiaSoldier;
BOOLEAN PlayerSoldierStartTalking( SOLDIERTYPE *pSoldier, UINT8 ubTargetID, BOOLEAN fValidate )
{
INT16 sFacingDir, sXPos, sYPos, sAPCost;
@@ -10795,28 +10798,45 @@ BOOLEAN PlayerSoldierStartTalking( SOLDIERTYPE *pSoldier, UINT8 ubTargetID, BOOL
// Deduct points from our guy....
DeductPoints( pSoldier, sAPCost, 0 );
ConvertGridNoToXY( pTSoldier->sGridNo, &sXPos, &sYPos );
if ( !(gTacticalStatus.uiFlags & INCOMBAT) || (gTacticalStatus.uiFlags & REALTIME) ) //lal
{
ConvertGridNoToXY( pTSoldier->sGridNo, &sXPos, &sYPos );
// Get direction from mouse pos
sFacingDir = GetDirectionFromXY( sXPos, sYPos, pSoldier );
// Get direction from mouse pos
sFacingDir = GetDirectionFromXY( sXPos, sYPos, pSoldier );
// Set our guy facing
SendSoldierSetDesiredDirectionEvent( pSoldier, sFacingDir );
// Set our guy facing
SendSoldierSetDesiredDirectionEvent( pSoldier, sFacingDir );
// Set NPC facing
SendSoldierSetDesiredDirectionEvent( pTSoldier, gOppositeDirection[ sFacingDir ] );
// Stop our guys...
EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection );
// Set NPC facing
SendSoldierSetDesiredDirectionEvent( pTSoldier, gOppositeDirection[ sFacingDir ] );
// Stop our guys...
EVENT_StopMerc( pSoldier, pSoldier->sGridNo, pSoldier->bDirection );
}
pTMilitiaSoldier = pTSoldier; //lal
//lal
// ATE; Check for normal civs...
if ( GetCivType( pTSoldier ) != CIV_TYPE_NA )
{
StartCivQuote( pTSoldier );
return( FALSE );
//lal
if ( ( pTSoldier->bTeam == MILITIA_TEAM ) && ( fAllowTacticalMilitiaCommand == TRUE ) )
{
PopupMilitiaControlMenu( pTSoldier );
return( FALSE );
}
else
{
StartCivQuote( pTSoldier );
return( FALSE );
}
}
// Are we an EPC that is being escorted?
if ( pTSoldier->ubProfile != NO_PROFILE && pTSoldier->ubWhatKindOfMercAmI == MERC_TYPE__EPC )
{
+14
View File
@@ -227,6 +227,7 @@ UINT8 gubCheatLevel = STARTING_CHEAT_LEVEL;
extern void DetermineWhichAssignmentMenusCanBeShown( void );
extern void DetermineWhichMilitiaControlMenusCanBeShown( void ); //lal
void GetTBMouseButtonInput( UINT32 *puiNewEvent )
{
@@ -4985,3 +4986,16 @@ void PopupAssignmentMenuInTactical( SOLDIERTYPE *pSoldier )
fFirstClickInAssignmentScreenMask = TRUE;
gfIgnoreScrolling = TRUE;
}
//lal
void PopupMilitiaControlMenu( SOLDIERTYPE *pSoldier )
{
// do something
fShowMilitiaControlMenu = TRUE;
CreateDestroyMilitiaControlPopUpBoxes( );
SetTacticalPopUpMilitiaControlBoxXY( pSoldier );
DetermineMilitiaControlBoxPositions();
DetermineWhichMilitiaControlMenusCanBeShown( );
fFirstClickInMilitiaControlScreenMask = TRUE;
gfIgnoreScrolling = TRUE;
}