mirror of
https://github.com/1dot13/source.git
synced 2026-07-29 13:52:17 +02:00
Merged from revision: 7114
Updates/Fixes (by Sevenfm) 1. Added grenade throwing range modifier to item_settings.ini: RANGE_GRENADE_MODIFIER = 1.0 This modifier is applied to grenades and regular thrown items. 2. Changed 100 to bBreathMax in throwing range penalty calculation. This should make grenades more useful. 3. Minor visual fixes (alt healthbar placement, 'roof' text placement when SHOW_ENEMY_WEAPON is true ) 4. Added xml tags for merge type <13>: you can use u.knife on tripwire roll to get 2 tripwires. Status of tripwire roll will be reduced by 2 points. Also lookup table for merges is updated for xml editor to work correctly. 5. Added several new loadscreenhints. 6. Press 'y' in tactical for quick transformation of item in hand - useful for switching flashlights on and off. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7116 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -2804,6 +2804,8 @@ void LoadItemSettings()
|
||||
gItemSettings.fRangeModifierGun[GUN_SHOTGUN] = iniReader.ReadFloat ("Weapon Settings","RANGE_SHOTGUN_MODIFIER", 1.0f, 0.1f, 5.0f);
|
||||
// -------- LAUNCHERs ---------
|
||||
gItemSettings.fRangeModifierLauncher = iniReader.ReadFloat ("Weapon Settings","RANGE_LAUNCHER_MODIFIER", 1.0f, 0.1f, 5.0f);
|
||||
// throwing hand grenades
|
||||
gItemSettings.fRangeModifierGrenade = iniReader.ReadFloat ("Weapon Settings","RANGE_GRENADE_MODIFIER", 1.0f, 0.1f, 5.0f);
|
||||
|
||||
// weapon damage modifiers
|
||||
// ----------- GUNS -----------
|
||||
|
||||
@@ -2197,6 +2197,8 @@ typedef struct
|
||||
// range modifiers
|
||||
FLOAT fRangeModifierGun[9];
|
||||
FLOAT fRangeModifierLauncher;
|
||||
FLOAT fRangeModifierGrenade;
|
||||
|
||||
// damage modifiers
|
||||
FLOAT fDamageModifierGun[9];
|
||||
FLOAT fDamageModifierBlade;
|
||||
|
||||
@@ -3675,7 +3675,7 @@ INT16 IsMercInTheSector( UINT16 usMercID )
|
||||
return( FALSE );
|
||||
|
||||
UINT8 cnt;
|
||||
for ( cnt=0; cnt <= TOTAL_SOLDIERS; cnt++ )
|
||||
for ( cnt=0; cnt < TOTAL_SOLDIERS; cnt++ )
|
||||
{
|
||||
//if the merc is active
|
||||
if( Menptr[ cnt ].ubProfile == usMercID )
|
||||
|
||||
+175
-143
@@ -1944,7 +1944,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
fRaiseName = TRUE;
|
||||
}
|
||||
else if ( gfUIMouseOnValidCatcher == 3 && pSoldier->ubID == gubUIValidCatcherID )
|
||||
@@ -1953,7 +1952,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
fRaiseName = TRUE;
|
||||
}
|
||||
else if ( gfUIMouseOnValidCatcher == 4 && pSoldier->ubID == gubUIValidCatcherID )
|
||||
@@ -1962,7 +1960,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
fRaiseName = TRUE;
|
||||
}
|
||||
else if ( pSoldier->bAssignment >= ON_DUTY )
|
||||
@@ -1972,7 +1969,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
fRaiseName = TRUE;
|
||||
}
|
||||
else if ( pSoldier->bTeam == gbPlayerNum && pSoldier->bAssignment < ON_DUTY && pSoldier->bAssignment != CurrentSquad() && !( pSoldier->flags.uiStatusFlags & SOLDIER_MULTI_SELECTED ) )
|
||||
@@ -1985,7 +1981,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
fRaiseName = TRUE;
|
||||
}
|
||||
|
||||
@@ -2043,7 +2038,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos - 10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2081,7 +2075,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, sYPos, (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2096,7 +2089,7 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
INT16 interval = gGameExternalOptions.ubShowHealthBarsOnHead;
|
||||
//if( interval > 3 )
|
||||
// interval -= 2;
|
||||
sXPos += 27;
|
||||
sXPos += 28;
|
||||
sYPos += 7;
|
||||
iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sXPos, sYPos-1, (INT16)(sXPos + 24 ), (INT16)(sYPos + 3 + interval*3 ) );
|
||||
if ( iBack != -1 )
|
||||
@@ -2120,7 +2113,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
SetFontForeground( FONT_MCOLOR_DKRED );
|
||||
gprintfdirty( sXPos-2-len, sYPos-2, NameStr );
|
||||
mprintf( sXPos-2-len, sYPos-2, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -2173,7 +2165,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos + 10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2186,7 +2177,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 10 ), (INT16)(80 ), 1, pStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, pStr );
|
||||
mprintf( sX, sY, pStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
|
||||
//-----------------
|
||||
if ( pSoldier->bInSector && pSoldier->ubProfile == NO_PROFILE )
|
||||
@@ -2205,7 +2195,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
else if (gGameExternalOptions.fEnemyNames == TRUE && gGameExternalOptions.fEnemyRank == FALSE)
|
||||
{
|
||||
@@ -2225,7 +2214,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -2250,7 +2238,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -2271,7 +2258,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
else if (gGameExternalOptions.fCivGroupName == TRUE && pSoldier->ubCivilianGroup > 0 )
|
||||
{
|
||||
@@ -2287,7 +2273,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2297,18 +2282,21 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
}
|
||||
else //pSoldier->ubProfile != NO_PROFILE || ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE )
|
||||
{
|
||||
// show (roof) text
|
||||
if ( pSoldier->pathing.bLevel != 0 )
|
||||
{
|
||||
// Display name
|
||||
// sevenfm: fix for overlapping with SHOW_ENEMY_WEAPON feature
|
||||
if( !gGameExternalOptions.fShowEnemyWeapon || !gfUIFullTargetFound )
|
||||
{
|
||||
SetFont( TINYFONT1 );
|
||||
SetFontBackground( FONT_MCOLOR_BLACK );
|
||||
SetFontForeground( FONT_YELLOW );
|
||||
|
||||
swprintf( NameStr, gzLateLocalizedString[ 15 ] );
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos + 10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
FindFontCenterCoordinates( sXPos, (INT16)(sYPos + 10), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
}
|
||||
|
||||
pStr = GetSoldierHealthString( pSoldier );
|
||||
@@ -2326,7 +2314,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, sYPos, (INT16)(80 ), 1, pStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, pStr );
|
||||
mprintf( sX, sY, pStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
|
||||
//-----------------
|
||||
if ( pSoldier->bInSector && pSoldier->ubProfile == NO_PROFILE )
|
||||
@@ -2345,7 +2332,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos -10 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
@@ -2364,7 +2350,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
}
|
||||
else if (gGameExternalOptions.fEnemyNames == TRUE)
|
||||
{
|
||||
@@ -2384,7 +2369,6 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + 20 ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -2416,135 +2400,21 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
//legion2
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// show weapon name and additional info
|
||||
BOOLEAN showExactInfo = FALSE;
|
||||
INT16 height = 0;
|
||||
SOLDIERTYPE *pSelectedSoldier, *pTargetSoldier;
|
||||
|
||||
pSelectedSoldier = MercPtrs[ gusSelectedSoldier ];
|
||||
pTargetSoldier = pSoldier;
|
||||
// calc max range for exact info
|
||||
if ( gusSelectedSoldier != NOBODY )
|
||||
showExactInfo = ShowExactInfo( pSelectedSoldier, pTargetSoldier );
|
||||
//FindFontCenterCoordinates( sXPos, (INT16)( sYPos ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY );
|
||||
|
||||
// show weapon/armour/items info
|
||||
if ( gGameExternalOptions.fShowEnemyWeapon && gTacticalStatus.ubCurrentTeam == OUR_TEAM && pTargetSoldier->ubBodyType <= REGFEMALE )
|
||||
{
|
||||
height = 30;
|
||||
|
||||
SetFont( TINYFONT1 );
|
||||
SetFontBackground( FONT_MCOLOR_BLACK );
|
||||
|
||||
if( !gGameExternalOptions.fEnemyRank || !gGameExternalOptions.fEnemyNames )
|
||||
height = 10;
|
||||
|
||||
swprintf( NameStr, L"" );
|
||||
GetEnemyInfoString( pSelectedSoldier, pTargetSoldier, showExactInfo, NameStr );
|
||||
// print item name
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + height ), (INT16)(80 ), 1, NameStr, TINYFONT1, &sX, &sY );
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
maxWidth = __max( maxWidth, StringPixLength ( NameStr, TINYFONT1 ) );
|
||||
// sevenfm: show weapon name and additional info
|
||||
ShowEnemyWeapon( sX, sY, pSoldier );
|
||||
ShowEnemyHealthBar( sX, sY, pSoldier );
|
||||
ShowAdditionalInfo( sX, sY, pSoldier );
|
||||
ShowRankIcon( sXPos, sYPos, pSoldier );
|
||||
}
|
||||
|
||||
height = 0;
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + height ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY );
|
||||
|
||||
// show enemy health bar
|
||||
if( gGameExternalOptions.ubShowEnemyHealth > 1 && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
|
||||
{
|
||||
UINT8 ubLines = gGameExternalOptions.ubShowEnemyHealth - 1;
|
||||
INT32 iBarWidth = 24;
|
||||
INT32 iBarHeight;
|
||||
|
||||
iBarHeight = 2 + 3 * ubLines - 1;
|
||||
sY += 10;
|
||||
sY -= iBarHeight;
|
||||
sX -= iBarWidth / 2;
|
||||
|
||||
iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + iBarWidth), (INT16)(sY + iBarHeight ) );
|
||||
if ( iBack != -1 )
|
||||
SetBackgroundRectFilled( iBack );
|
||||
|
||||
DrawEnemyHealthBar( pSoldier, sX, sY, ubLines, iBarWidth - 2, iBarHeight );
|
||||
}
|
||||
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos + height ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY );
|
||||
sX-=maxWidth / 2 + StringPixLength ( L"***", TINYFONT1 );
|
||||
|
||||
// show additional info
|
||||
if( gGameExternalOptions.fShowEnemyAwareness && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
|
||||
{
|
||||
SetFont( TINYFONT1 );
|
||||
SetFontBackground( FONT_MCOLOR_BLACK );
|
||||
// show awareness sign only when in stealth mode or disguised
|
||||
if( ( gusSelectedSoldier != NOBODY ) &&
|
||||
( MercPtrs[ gusSelectedSoldier ]->bStealthMode || MercPtrs[ gusSelectedSoldier ]->bSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER ) ) )
|
||||
{
|
||||
if( pSoldier->aiData.bOppList[ MercPtrs[ gusSelectedSoldier ]->ubID ] == SEEN_CURRENTLY )
|
||||
swprintf( NameStr, L"%s", L"<*>" );
|
||||
else
|
||||
swprintf( NameStr, L"%s", L"<->" );
|
||||
|
||||
SetFontForeground( FONT_GRAY1 );
|
||||
switch ( pSoldier->aiData.bAlertStatus )
|
||||
{
|
||||
case STATUS_GREEN: // everything's OK, no suspicion
|
||||
SetFontForeground( FONT_GREEN );
|
||||
break;
|
||||
case STATUS_YELLOW: // he or his friend heard something
|
||||
SetFontForeground( FONT_YELLOW );
|
||||
break;
|
||||
case STATUS_RED: // has definite evidence of opponent
|
||||
SetFontForeground( FONT_ORANGE );
|
||||
break;
|
||||
case STATUS_BLACK: // currently sees an active opponent
|
||||
SetFontForeground( FONT_DKRED );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( showExactInfo )
|
||||
{
|
||||
if( gGameExternalOptions.ubShowEnemyHealth > 1 )
|
||||
{
|
||||
gprintfdirty( sX + maxWidth / 2 - 15, sY + height, NameStr );
|
||||
mprintf( sX + maxWidth / 2 - 13, sY + height, NameStr );
|
||||
}
|
||||
else
|
||||
{
|
||||
gprintfdirty( sX, sY + height, NameStr );
|
||||
mprintf( sX, sY + height, NameStr );
|
||||
}
|
||||
height += 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
// show rank icon
|
||||
if( gGameExternalOptions.ubShowEnemyRankIcon && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
|
||||
//&& (!gGameExternalOptions.fEnemyNames) && (!gGameExternalOptions.fEnemyRank))
|
||||
{
|
||||
sX = sXPos + 50;
|
||||
sY = sYPos + 17;
|
||||
if(gGameExternalOptions.fEnemyNames)
|
||||
sY+=10;
|
||||
if(gGameExternalOptions.fEnemyRank)
|
||||
sY+=10;
|
||||
|
||||
iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + 22 ), (INT16)(sY + 14 ) );
|
||||
if ( iBack != -1 )
|
||||
SetBackgroundRectFilled( iBack );
|
||||
|
||||
DrawRankIcon( pSoldier->stats.bExpLevel, sX, sY );
|
||||
}
|
||||
}
|
||||
// Flugente: soldier profiles
|
||||
else if ( pSoldier->bTeam == MILITIA_TEAM && gGameExternalOptions.fSoldierProfiles_Militia && pSoldier->usSoldierProfile )
|
||||
{
|
||||
@@ -2574,6 +2444,9 @@ void DrawSelectedUIAboveGuy( UINT16 usSoldierID )
|
||||
gprintfdirty( sX, sY, NameStr );
|
||||
mprintf( sX, sY, NameStr );
|
||||
}
|
||||
// sevenfm: show weapon name and additional info
|
||||
FindFontCenterCoordinates( sXPos, (INT16)( sYPos ), (INT16)(80 ), 1, L"", TINYFONT1, &sX, &sY );
|
||||
ShowEnemyWeapon( sX, sY, pSoldier );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6316,12 +6189,15 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold
|
||||
{
|
||||
case AIM_SHOT_HEAD:
|
||||
swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_HELMET] );
|
||||
//swprintf( NameStr, L"%s", L"Helmet" );
|
||||
break;
|
||||
case AIM_SHOT_TORSO:
|
||||
swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_VEST] );
|
||||
//swprintf( NameStr, L"%s", L"Vest" );
|
||||
break;
|
||||
case AIM_SHOT_LEGS:
|
||||
swprintf( NameStr, L"%s", gzTooltipStrings[STR_TT_LEGGINGS] );
|
||||
//swprintf( NameStr, L"%s", L"Leggings" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -6424,6 +6300,162 @@ void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSold
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShowEnemyWeapon( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier )
|
||||
{
|
||||
SOLDIERTYPE *pSelectedSoldier;
|
||||
BOOLEAN showExactInfo = FALSE;
|
||||
CHAR16 NameStr[ MAX_ENEMY_NAMES_CHARS ];
|
||||
UINT16 usTotalWidth;
|
||||
INT32 iRange;
|
||||
INT32 iVisibleDistance;
|
||||
|
||||
if ( gusSelectedSoldier != NOBODY )
|
||||
pSelectedSoldier = MercPtrs[ gusSelectedSoldier ];
|
||||
else
|
||||
return;
|
||||
|
||||
if( gGameExternalOptions.fEnemyRank || gGameExternalOptions.fEnemyNames )
|
||||
return;
|
||||
|
||||
iRange = GetRangeInCellCoordsFromGridNoDiff( pSelectedSoldier->sGridNo, pTargetSoldier->sGridNo ) / 10;
|
||||
iVisibleDistance = (INT32)( pSelectedSoldier->GetMaxDistanceVisible( pTargetSoldier->sGridNo, 0, CALC_FROM_WANTED_DIR) ) ;
|
||||
|
||||
if( iRange > iVisibleDistance )
|
||||
return;
|
||||
|
||||
if( !pTargetSoldier->bVisible )
|
||||
return;
|
||||
|
||||
// calc max range for exact info
|
||||
if ( gusSelectedSoldier != NOBODY )
|
||||
showExactInfo = ShowExactInfo( pSelectedSoldier, pTargetSoldier );
|
||||
|
||||
// show weapon/armour/items info
|
||||
if ( gGameExternalOptions.fShowEnemyWeapon && gTacticalStatus.ubCurrentTeam == OUR_TEAM && pTargetSoldier->ubBodyType <= REGFEMALE )
|
||||
{
|
||||
SetFont( TINYFONT1 );
|
||||
SetFontBackground( FONT_MCOLOR_BLACK );
|
||||
|
||||
swprintf( NameStr, L"" );
|
||||
GetEnemyInfoString( pSelectedSoldier, pTargetSoldier, showExactInfo, NameStr );
|
||||
usTotalWidth = StringPixLength ( NameStr, TINYFONT1 );
|
||||
sX -= usTotalWidth/2;
|
||||
|
||||
// print item name
|
||||
gprintfdirty( sX, sY + 10, NameStr );
|
||||
mprintf( sX, sY + 10, NameStr );
|
||||
}
|
||||
}
|
||||
|
||||
void ShowAdditionalInfo( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier )
|
||||
{
|
||||
BOOLEAN showExactInfo;
|
||||
CHAR16 NameStr[ MAX_ENEMY_NAMES_CHARS ];
|
||||
SOLDIERTYPE *pSelectedSoldier;
|
||||
|
||||
if ( gusSelectedSoldier != NOBODY )
|
||||
pSelectedSoldier = MercPtrs[ gusSelectedSoldier ];
|
||||
else
|
||||
return;
|
||||
|
||||
if( gGameExternalOptions.fEnemyRank || gGameExternalOptions.fEnemyNames )
|
||||
return;
|
||||
|
||||
// calc max range for exact info
|
||||
if ( gusSelectedSoldier != NOBODY )
|
||||
showExactInfo = ShowExactInfo( pSelectedSoldier, pTargetSoldier );
|
||||
|
||||
sX -= StringPixLength ( L"*", TINYFONT1 );
|
||||
if( gGameExternalOptions.fShowEnemyAwareness && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
|
||||
{
|
||||
SetFont( TINYFONT1 );
|
||||
SetFontBackground( FONT_MCOLOR_BLACK );
|
||||
// show awareness sign only when in stealth mode or disguised
|
||||
if( ( gusSelectedSoldier != NOBODY ) &&
|
||||
( MercPtrs[ gusSelectedSoldier ]->bStealthMode || MercPtrs[ gusSelectedSoldier ]->bSoldierFlagMask & ( SOLDIER_COVERT_CIV | SOLDIER_COVERT_SOLDIER ) ) )
|
||||
{
|
||||
if( pTargetSoldier->aiData.bOppList[ MercPtrs[ gusSelectedSoldier ]->ubID ] == SEEN_CURRENTLY )
|
||||
swprintf( NameStr, L"%s", L"*" );
|
||||
else
|
||||
swprintf( NameStr, L"%s", L"-" );
|
||||
|
||||
SetFontForeground( FONT_GRAY1 );
|
||||
switch ( pTargetSoldier->aiData.bAlertStatus )
|
||||
{
|
||||
case STATUS_GREEN: // everything's OK, no suspicion
|
||||
SetFontForeground( FONT_GREEN );
|
||||
break;
|
||||
case STATUS_YELLOW: // he or his friend heard something
|
||||
SetFontForeground( FONT_YELLOW );
|
||||
break;
|
||||
case STATUS_RED: // has definite evidence of opponent
|
||||
SetFontForeground( FONT_ORANGE );
|
||||
break;
|
||||
case STATUS_BLACK: // currently sees an active opponent
|
||||
SetFontForeground( FONT_DKRED );
|
||||
break;
|
||||
}
|
||||
|
||||
if ( showExactInfo )
|
||||
{
|
||||
// this feature is a part of 'show enemy health bar'
|
||||
if( gGameExternalOptions.ubShowEnemyHealth > 1 )
|
||||
{
|
||||
gprintfdirty( sX - 15, sY, NameStr );
|
||||
mprintf( sX - 15, sY, NameStr );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShowEnemyHealthBar( INT16 sX, INT16 sY, SOLDIERTYPE* pSoldier )
|
||||
{
|
||||
INT32 iBack;
|
||||
UINT8 ubLines = gGameExternalOptions.ubShowEnemyHealth - 1;
|
||||
INT32 iBarWidth = 24;
|
||||
INT32 iBarHeight;
|
||||
|
||||
// show enemy health bar
|
||||
if( gGameExternalOptions.ubShowEnemyHealth > 1 && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
|
||||
{
|
||||
iBarHeight = 2 + 3 * ubLines - 1;
|
||||
sY += 10;
|
||||
sY -= iBarHeight;
|
||||
sX -= iBarWidth / 2;
|
||||
|
||||
iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + iBarWidth), (INT16)(sY + iBarHeight ) );
|
||||
if ( iBack != -1 )
|
||||
SetBackgroundRectFilled( iBack );
|
||||
|
||||
DrawEnemyHealthBar( pSoldier, sX, sY, ubLines, iBarWidth - 2, iBarHeight );
|
||||
}
|
||||
}
|
||||
|
||||
void ShowRankIcon( INT16 sXPos, INT16 sYPos, SOLDIERTYPE* pSoldier )
|
||||
{
|
||||
INT32 iBack;
|
||||
INT16 sX, sY;
|
||||
|
||||
if( gGameExternalOptions.ubShowEnemyRankIcon && gTacticalStatus.ubCurrentTeam == OUR_TEAM )
|
||||
//&& (!gGameExternalOptions.fEnemyNames) && (!gGameExternalOptions.fEnemyRank))
|
||||
{
|
||||
sX = sXPos + 50;
|
||||
sY = sYPos + 17;
|
||||
if(gGameExternalOptions.fEnemyNames)
|
||||
sY+=10;
|
||||
if(gGameExternalOptions.fEnemyRank)
|
||||
sY+=10;
|
||||
|
||||
iBack = RegisterBackgroundRect(BGND_FLAG_SINGLE, NULL, sX, sY, (INT16)(sX + 11 ), (INT16)(sY + 14 ) );
|
||||
if ( iBack != -1 )
|
||||
SetBackgroundRectFilled( iBack );
|
||||
|
||||
DrawRankIcon( pSoldier->stats.bExpLevel, sX, sY );
|
||||
}
|
||||
}
|
||||
|
||||
void DrawLine( INT32 x1, INT32 y1, INT32 x2, INT32 y2, UINT16 color8, UINT16 color16, UINT8 *pDestBuf )
|
||||
{
|
||||
if(gbPixelDepth==16)
|
||||
|
||||
@@ -544,4 +544,9 @@ void DrawNCTHCursorItemPics( INT16 sStartScreenX, INT16 sStartScreenY );
|
||||
|
||||
void GetEnemyInfoString( SOLDIERTYPE* pSelectedSoldier, SOLDIERTYPE* pTargetSoldier, BOOLEAN showExactInfo, CHAR16 *NameStr );
|
||||
|
||||
void ShowEnemyWeapon( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier );
|
||||
void ShowAdditionalInfo( INT16 sX, INT16 sY, SOLDIERTYPE* pTargetSoldier );
|
||||
void ShowRankIcon( INT16 sXPos, INT16 sYPos, SOLDIERTYPE* pSoldier );
|
||||
void ShowEnemyHealthBar( INT16 sX, INT16 sY, SOLDIERTYPE* pSoldier );
|
||||
|
||||
#endif
|
||||
@@ -333,6 +333,8 @@ void TacticalInventoryMessageBoxCallBack( UINT8 ubExitValue );
|
||||
void HandleTacticalCoverMenu( void );
|
||||
void TacticalCoverMessageBoxCallBack( UINT8 ubExitValue );
|
||||
void HandleTacticalAmmoCrates( UINT8 magType );
|
||||
void HandleTacticalTransformItem( void );
|
||||
BOOLEAN FindTransformation( UINT16 usItem, TransformInfoStruct **pTransformation );
|
||||
|
||||
void GetTBMouseButtonInput( UINT32 *puiNewEvent )
|
||||
{
|
||||
@@ -4117,6 +4119,10 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
|
||||
{
|
||||
*puiNewEvent = I_LOSDEBUG;
|
||||
}
|
||||
else
|
||||
{
|
||||
HandleTacticalTransformItem();
|
||||
}
|
||||
}
|
||||
//else if( gusSelectedSoldier != NOBODY )
|
||||
break;
|
||||
@@ -7901,5 +7907,79 @@ void TacticalCoverMessageBoxCallBack( UINT8 ubExitValue )
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szTacticalCoverDialogPrintString[ubExitValue-1]);
|
||||
}
|
||||
|
||||
void HandleTacticalTransformItem( void )
|
||||
{
|
||||
UINT16 usItem;
|
||||
TransformInfoStruct *pTransformation;
|
||||
OBJECTTYPE* pObj;
|
||||
|
||||
SOLDIERTYPE* pSoldier;
|
||||
if( !GetSoldier( &pSoldier, gusSelectedSoldier ) )
|
||||
return;
|
||||
if( !pSoldier->inv[ HANDPOS ].exists() )
|
||||
return;
|
||||
|
||||
usItem = pSoldier->inv[ HANDPOS ].usItem;
|
||||
|
||||
if( FindTransformation( usItem, &pTransformation ) )
|
||||
{
|
||||
|
||||
if ( pTransformation->usAPCost > 0 && gTacticalStatus.uiFlags & INCOMBAT && gTacticalStatus.uiFlags & TURNBASED )
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s (%d AP)", pTransformation->szMenuRowText, pTransformation->usAPCost );
|
||||
else
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pTransformation->szMenuRowText);
|
||||
|
||||
pSoldier->inv[ HANDPOS ].TransformObject( pSoldier, 0, pTransformation, NULL );
|
||||
}
|
||||
// sevenfm: failed to make attachment transformation to work correctly
|
||||
/*
|
||||
else // not found transformation for the item - search transformations for attachments
|
||||
{
|
||||
attachmentList::iterator iterend;
|
||||
attachmentList::iterator iter;
|
||||
pObj = &(pSoldier->inv[ HANDPOS ]);
|
||||
|
||||
// check all attachments, search for available transformations
|
||||
iterend = (*pObj)[0]->attachments.end();
|
||||
for (iter = (*pObj)[0]->attachments.begin(); iter != iterend; ++iter)
|
||||
{
|
||||
if ( iter->exists() && Item[iter->usItem].usItemClass == IC_MISC )
|
||||
{
|
||||
usItem = Item[iter->usItem].uiIndex;
|
||||
|
||||
if( FindTransformation( usItem, &pTransformation ) )
|
||||
{
|
||||
if ( pTransformation->usAPCost > 0 && gTacticalStatus.uiFlags & INCOMBAT && gTacticalStatus.uiFlags & TURNBASED )
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s (%d AP)", pTransformation->szMenuRowText, pTransformation->usAPCost );
|
||||
else
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pTransformation->szMenuRowText);
|
||||
|
||||
// RENDER_ITEM_NOSTATUS = 20
|
||||
// RENDER_ITEM_ATTACHMENT1 = 200
|
||||
iter->TransformObject( pSoldier, 0, pTransformation, pObj );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
BOOLEAN FindTransformation( UINT16 usItem, TransformInfoStruct **pTransformation )
|
||||
{
|
||||
// find transformation
|
||||
for (INT32 x = 0; x < MAXITEMS; x++)
|
||||
{
|
||||
if ( Transform[x].usItem == (UINT16)-1 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
if ( Transform[x].usItem == usItem )
|
||||
{
|
||||
*pTransformation = &Transform[x];
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -11310,8 +11310,14 @@ INT32 CalcMaxTossRange( SOLDIERTYPE * pSoldier, UINT16 usItem, BOOLEAN fArmed, O
|
||||
iRange = 2 + ( ( EffectiveStrength( pSoldier, FALSE ) / ( 5 + itemWeight) ) );
|
||||
}
|
||||
|
||||
// sevenfm: for grenades and aerodynamic items - apply modifier
|
||||
if ( ! Item[ usItem ].unaerodynamic )
|
||||
iRange = (INT32)( iRange * gItemSettings.fRangeModifierGrenade );
|
||||
|
||||
// adjust for thrower's remaining breath (lose up to 1/2 of range)
|
||||
iRange -= (iRange * (100 - pSoldier->bBreath)) / 200;
|
||||
// sevenfm changed max breath value to pSoldier->bBreathMax
|
||||
//iRange -= (iRange * (100 - pSoldier->bBreath)) / 200;
|
||||
iRange -= (iRange * ( pSoldier->bBreathMax - pSoldier->bBreath)) / 200;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// SANDRO - old/new traits
|
||||
|
||||
@@ -6520,8 +6520,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|作|战|裤: %s\n",
|
||||
// Limited, Basic
|
||||
L"|护|甲: ",
|
||||
L"头盔 ",
|
||||
L"防弹衣 ",
|
||||
L"头盔",
|
||||
L"防弹衣",
|
||||
L"作战裤",
|
||||
L"装备了",
|
||||
L"无护甲",
|
||||
|
||||
@@ -6526,8 +6526,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Leggings: %s\n",
|
||||
// Limited, Basic
|
||||
L"|Armor: ",
|
||||
L"Helmet ",
|
||||
L"Vest ",
|
||||
L"Helmet",
|
||||
L"Vest",
|
||||
L"Leggings",
|
||||
L"worn",
|
||||
L"no Armor",
|
||||
|
||||
@@ -6517,8 +6517,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Leggings: %s\n",
|
||||
// Limited, Basic
|
||||
L"|Armor: ",
|
||||
L"Helmet ",
|
||||
L"Vest ",
|
||||
L"Helmet",
|
||||
L"Vest",
|
||||
L"Leggings",
|
||||
L"worn",
|
||||
L"no Armor",
|
||||
|
||||
@@ -6523,8 +6523,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Pantalon : %s\n",
|
||||
// Limited, Basic
|
||||
L"|Armure : ",
|
||||
L"Casque ",
|
||||
L"Veste ",
|
||||
L"Casque",
|
||||
L"Veste",
|
||||
L"Pantalon",
|
||||
L"usé",
|
||||
L"pas d'armure",
|
||||
|
||||
@@ -6347,8 +6347,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Hose: %s\n",
|
||||
// Limited, Basic
|
||||
L"|Rüstung: ",
|
||||
L"Helm ",
|
||||
L"Weste ",
|
||||
L"Helm",
|
||||
L"Weste",
|
||||
L"Hose",
|
||||
L"getragen",
|
||||
L"keine Rüstung",
|
||||
|
||||
@@ -6517,8 +6517,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Leggings: %s\n",
|
||||
// Limited, Basic
|
||||
L"|Armor: ",
|
||||
L"Helmet ",
|
||||
L"Vest ",
|
||||
L"Helmet",
|
||||
L"Vest",
|
||||
L"Leggings",
|
||||
L"worn",
|
||||
L"no Armor",
|
||||
|
||||
@@ -6531,8 +6531,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Getry ochronne: %s\n",
|
||||
// Limited, Basic
|
||||
L"|Pancerz: ",
|
||||
L"hełm ",
|
||||
L"kamizelka ",
|
||||
L"hełm",
|
||||
L"kamizelka",
|
||||
L"getry ochronne",
|
||||
L"używane",
|
||||
L"brak pancerza",
|
||||
|
||||
@@ -6520,8 +6520,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Брюки: %s\n",
|
||||
// Limited, Basic
|
||||
L"|Броня: ",
|
||||
L"Каска ",
|
||||
L"Жилет ",
|
||||
L"Каска",
|
||||
L"Жилет",
|
||||
L"Брюки",
|
||||
L"Одет",
|
||||
L"нет брони",
|
||||
|
||||
@@ -6525,8 +6525,8 @@ STR16 gzTooltipStrings[] =
|
||||
L"%s|Leggings: %s\n",
|
||||
// Limited, Basic
|
||||
L"|Armor: ",
|
||||
L"Helmet ",
|
||||
L"Vest ",
|
||||
L"Helmet",
|
||||
L"Vest",
|
||||
L"Leggings",
|
||||
L"worn",
|
||||
L"no Armor",
|
||||
|
||||
Reference in New Issue
Block a user