upon decapitating or gutting, a knife may take damage

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5952 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2013-03-24 18:56:09 +00:00
parent 401323b524
commit 90be8171ec
3 changed files with 52 additions and 18 deletions
+24 -4
View File
@@ -4948,15 +4948,21 @@ void CorpseMessageBoxCallBack( UINT8 ubExitValue )
INT16 sAPCost = CalcTotalAPsToAttack( gpTempSoldier, nextGridNoinSight, FALSE, gpTempSoldier->aiData.bAimTime ); INT16 sAPCost = CalcTotalAPsToAttack( gpTempSoldier, nextGridNoinSight, FALSE, gpTempSoldier->aiData.bAimTime );
BOOLEAN fDamageKnife = FALSE;
switch (ubExitValue) switch (ubExitValue)
{ {
case 1: case 1:
DecapitateCorpse( gpTempSoldier, nextGridNoinSight, level ); if ( DecapitateCorpse( gpTempSoldier, nextGridNoinSight, level ) )
DeductPoints( gpTempSoldier, sAPCost, 0 ); fDamageKnife = TRUE;
DeductPoints( gpTempSoldier, sAPCost, 0 );
break; break;
case 2: case 2:
GutCorpse( gpTempSoldier, nextGridNoinSight, level ); if ( GutCorpse( gpTempSoldier, nextGridNoinSight, level ) )
DeductPoints( gpTempSoldier, sAPCost, 0 ); fDamageKnife = TRUE;
DeductPoints( gpTempSoldier, sAPCost, 0 );
break; break;
case 3: case 3:
StripCorpse( gpTempSoldier, nextGridNoinSight, level ); StripCorpse( gpTempSoldier, nextGridNoinSight, level );
@@ -4969,6 +4975,20 @@ void CorpseMessageBoxCallBack( UINT8 ubExitValue )
default: default:
break; break;
} }
// 35% chance to damage our knife a bit
if ( fDamageKnife && Chance(35) )
{
if ( Item[ gpTempSoldier->inv[HANDPOS].usItem ].usItemClass & IC_BLADE )
{
gpTempSoldier->inv[HANDPOS][0]->data.objectStatus--;
if ( Random(100) < Item[ gpTempSoldier->inv[HANDPOS].usItem ].usDamageChance )
{
gpTempSoldier->inv[HANDPOS][0]->data.sRepairThreshold--;
}
}
}
} }
} }
+24 -10
View File
@@ -1811,7 +1811,7 @@ ROTTING_CORPSE *GetCorpseAtGridNo( INT32 sGridNo, INT8 bLevel )
} }
void DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) BOOLEAN DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
{ {
ROTTING_CORPSE *pCorpse; ROTTING_CORPSE *pCorpse;
ROTTING_CORPSE_DEFINITION CorpseDef; ROTTING_CORPSE_DEFINITION CorpseDef;
@@ -1821,9 +1821,7 @@ void DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
pCorpse = GetCorpseAtGridNo( sGridNo, bLevel ); pCorpse = GetCorpseAtGridNo( sGridNo, bLevel );
if ( pCorpse == NULL ) if ( pCorpse == NULL )
{ return FALSE;
return;
}
if ( IsValidDecapitationCorpse( pCorpse ) ) if ( IsValidDecapitationCorpse( pCorpse ) )
{ {
@@ -1894,12 +1892,16 @@ void DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
// All teams lok for this... // All teams lok for this...
NotifySoldiersToLookforItems( ); NotifySoldiersToLookforItems( );
return TRUE;
} }
else else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_HEAD_ITEM] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_HEAD_ITEM] );
} }
else else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_DECAPITATION] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_DECAPITATION] );
return FALSE;
} }
// Flugente: can this corpse be gutted? // Flugente: can this corpse be gutted?
@@ -1912,12 +1914,12 @@ BOOLEAN IsValidGutCorpse( ROTTING_CORPSE *pCorpse )
} }
// Flugente: gut a corpse // Flugente: gut a corpse
void GutCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) BOOLEAN GutCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
{ {
ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel ); ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel );
if ( pCorpse == NULL ) if ( pCorpse == NULL )
return; return FALSE;
// can this thing be gutted? // can this thing be gutted?
if ( IsValidGutCorpse( pCorpse ) ) if ( IsValidGutCorpse( pCorpse ) )
@@ -1947,12 +1949,16 @@ void GutCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
// All teams lok for this... // All teams lok for this...
NotifySoldiersToLookforItems( ); NotifySoldiersToLookforItems( );
return TRUE;
} }
else else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_MEAT_ITEM] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_MEAT_ITEM] );
} }
else else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_GUTTING] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_GUTTING] );
return FALSE;
} }
// Flugente: can clothes be taken off of this corpse? // Flugente: can clothes be taken off of this corpse?
@@ -1966,12 +1972,12 @@ BOOLEAN IsValidStripCorpse( ROTTING_CORPSE *pCorpse )
// Flugente: take the clothes off a corpse // Flugente: take the clothes off a corpse
void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) BOOLEAN StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
{ {
ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel ); ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel );
if ( pCorpse == NULL || !pSoldier ) if ( pCorpse == NULL || !pSoldier )
return; return FALSE;
// can this thing be stripped? // can this thing be stripped?
if ( IsValidStripCorpse( pCorpse ) ) if ( IsValidStripCorpse( pCorpse ) )
@@ -2005,9 +2011,13 @@ void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
// we took the clothes, mark this // we took the clothes, mark this
pCorpse->def.usFlags |= (ROTTING_CORPSE_NO_VEST|ROTTING_CORPSE_NO_PANTS); pCorpse->def.usFlags |= (ROTTING_CORPSE_NO_VEST|ROTTING_CORPSE_NO_PANTS);
return TRUE;
} }
else else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_CLOTHESFOUND] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_CLOTHESFOUND] );
return FALSE;
} }
// Flugente: can this corpse be carried? // Flugente: can this corpse be carried?
@@ -2020,12 +2030,12 @@ BOOLEAN IsValidTakeCorpse( ROTTING_CORPSE *pCorpse )
} }
// Flugente: take a corpse into your hand, thereby removing it from the field // Flugente: take a corpse into your hand, thereby removing it from the field
void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) BOOLEAN TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
{ {
ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel ); ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel );
if ( pCorpse == NULL || !pSoldier ) if ( pCorpse == NULL || !pSoldier )
return; return FALSE;
// can this corpse be picked up? // can this corpse be picked up?
if ( IsValidTakeCorpse( pCorpse ) ) if ( IsValidTakeCorpse( pCorpse ) )
@@ -2175,6 +2185,8 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
RemoveCorpse( pCorpse->iID ); RemoveCorpse( pCorpse->iID );
} }
} }
return TRUE;
} }
else else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_FREEHAND] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_FREEHAND] );
@@ -2184,6 +2196,8 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel )
} }
else else
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_TAKING] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_TAKING] );
return FALSE;
} }
// Flugente: create a corpse from an object and place it in the world // Flugente: create a corpse from an object and place it in the world
+4 -4
View File
@@ -199,15 +199,15 @@ extern UINT8 gb4DirectionsFrom8[8];
ROTTING_CORPSE *GetCorpseAtGridNo( INT32 sGridNo , INT8 bLevel ); ROTTING_CORPSE *GetCorpseAtGridNo( INT32 sGridNo , INT8 bLevel );
BOOLEAN IsValidDecapitationCorpse( ROTTING_CORPSE *pCorpse ); BOOLEAN IsValidDecapitationCorpse( ROTTING_CORPSE *pCorpse );
void DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ); BOOLEAN DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel );
// Flugente: actions for the covert opts trait // Flugente: actions for the covert opts trait
BOOLEAN IsValidGutCorpse( ROTTING_CORPSE *pCorpse ); BOOLEAN IsValidGutCorpse( ROTTING_CORPSE *pCorpse );
void GutCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ); BOOLEAN GutCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel );
BOOLEAN IsValidStripCorpse( ROTTING_CORPSE *pCorpse ); BOOLEAN IsValidStripCorpse( ROTTING_CORPSE *pCorpse );
void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ); BOOLEAN StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel );
BOOLEAN IsValidTakeCorpse( ROTTING_CORPSE *pCorpse ); BOOLEAN IsValidTakeCorpse( ROTTING_CORPSE *pCorpse );
void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ); BOOLEAN TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel );
BOOLEAN AddCorpseFromObject(OBJECTTYPE* pObj, INT32 sGridNo, INT8 bLevel ); BOOLEAN AddCorpseFromObject(OBJECTTYPE* pObj, INT32 sGridNo, INT8 bLevel );