If a tank just took a heavy hit, but cannot see an enemy to fire upon, it can detonate a smoke grenade on itself to hide.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8127 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2016-03-26 23:16:41 +00:00
parent 33ab9c5e82
commit 7bf2943849
7 changed files with 71 additions and 1 deletions
+5
View File
@@ -3422,6 +3422,11 @@ void EquipArmouredVehicle( SOLDIERCREATE_STRUCT *pp, BOOLEAN fTank )
CreateItems( MINIMI, (INT8)(80 + Random( 21 )), 1, &gTempObject );
gTempObject.fFlags |= OBJECT_UNDROPPABLE;
PlaceObjectInSoldierCreateStruct( pp, &gTempObject );
// smoke grenade
CreateItems( SMOKE_GRENADE, (INT8)(80 + Random( 21 )), 1, &gTempObject );
gTempObject.fFlags |= OBJECT_UNDROPPABLE;
PlaceObjectInSoldierCreateStruct( pp, &gTempObject );
}
else
{
+41
View File
@@ -7604,6 +7604,9 @@ void SOLDIERTYPE::EVENT_BeginMercTurn( BOOLEAN fFromRealTime, INT32 iRealTimeCou
// UnderFire now starts at 2 for "under fire this turn",
// down to 1 for "under fire last turn", to 0.
this->aiData.bUnderFire--;
if ( !this->aiData.bUnderFire )
this->usSoldierFlagMask2 &= ~SOLDIER_TAKEN_LARGE_HIT;
}
// Flugente: reset extra stats. Currently they only depend on drug effects, and those are reset every turn
@@ -9888,6 +9891,9 @@ UINT8 SOLDIERTYPE::SoldierTakeDamage( INT8 bHeight, INT16 sLifeDeduct, INT16 sBr
}
}
}
if ( sLifeDeduct > 30 )
this->usSoldierFlagMask2 |= SOLDIER_TAKEN_LARGE_HIT;
VehicleTakeDamage( this->bVehicleID, ubReason, sLifeDeduct, this->sGridNo, ubAttacker );
HandleTakeDamageDeath( this, bOldLife, ubReason );
@@ -18989,6 +18995,41 @@ FLOAT SOLDIERTYPE::GetConstructionPoints( )
return dval;
}
BOOLEAN SOLDIERTYPE::HasItem(UINT16 usItem)
{
INT8 invsize = (INT8)inv.size( );
for ( INT8 bLoop = 0; bLoop < invsize; ++bLoop )
{
if ( inv[bLoop].exists( ) == true && inv[bLoop].usItem == usItem )
return TRUE;
}
return FALSE;
}
// AI-only: heal self. Do NOT, repeat, NOT use this with mercs!
BOOLEAN SOLDIERTYPE::SelfDetonate( )
{
if ( !(this->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL) )
return FALSE;
INT8 invsize = (INT8)inv.size( );
for ( INT8 bLoop = 0; bLoop < invsize; ++bLoop )
{
if ( inv[bLoop].exists( ) == true && inv[bLoop].usItem == this->aiData.usActionData )
{
IgniteExplosion( this->ubID, this->sX, this->sY, (INT16)(gpWorldLevelData[this->sGridNo].sHeight), this->sGridNo, inv[bLoop].usItem, this->pathing.bLevel, this->ubDirection );
// Remove item!
DeleteObj( &(this->inv[bLoop]) );
return TRUE;
}
}
return FALSE;
}
INT32 CheckBleeding( SOLDIERTYPE *pSoldier )
{
INT8 bBandaged; //,savedOurTurn;
+5
View File
@@ -411,6 +411,7 @@ enum
#define SOLDIER_INTERROGATE_CIVILIAN 0x00000100 //256 // interrogate civilian
#define SOLDIER_POTENTIAL_VOLUNTEER 0x00000200 //512 // this civilian _might_ join us as a volunteer if conditions are right
#define SOLDIER_HUNGOVER 0x00000400 //1024 // we drank alcohol recently, and are now hungover
#define SOLDIER_TAKEN_LARGE_HIT 0x00000800 // we recently received a lot of damage in a single hit
#define SOLDIER_INTERROGATE_ALL 0x000001F8 // all interrogation flags
// ----------------------------------------------------------------
@@ -1918,6 +1919,10 @@ public:
// Flugente: fortification
FLOAT GetConstructionPoints( );
// Flugente: do we have a specific item in our inventory?
BOOLEAN HasItem( UINT16 usItem );
BOOLEAN SelfDetonate(); // AI-only: blow up explosive in own inventory. Do NOT, repeat, NOT use this with mercs!
//////////////////////////////////////////////////////////////////////////////
}; // SOLDIERTYPE;