diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index bc3a12c5..3d4f86ae 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -4948,15 +4948,21 @@ void CorpseMessageBoxCallBack( UINT8 ubExitValue ) INT16 sAPCost = CalcTotalAPsToAttack( gpTempSoldier, nextGridNoinSight, FALSE, gpTempSoldier->aiData.bAimTime ); + BOOLEAN fDamageKnife = FALSE; + switch (ubExitValue) { case 1: - DecapitateCorpse( gpTempSoldier, nextGridNoinSight, level ); - DeductPoints( gpTempSoldier, sAPCost, 0 ); + if ( DecapitateCorpse( gpTempSoldier, nextGridNoinSight, level ) ) + fDamageKnife = TRUE; + + DeductPoints( gpTempSoldier, sAPCost, 0 ); break; case 2: - GutCorpse( gpTempSoldier, nextGridNoinSight, level ); - DeductPoints( gpTempSoldier, sAPCost, 0 ); + if ( GutCorpse( gpTempSoldier, nextGridNoinSight, level ) ) + fDamageKnife = TRUE; + + DeductPoints( gpTempSoldier, sAPCost, 0 ); break; case 3: StripCorpse( gpTempSoldier, nextGridNoinSight, level ); @@ -4969,6 +4975,20 @@ void CorpseMessageBoxCallBack( UINT8 ubExitValue ) default: 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--; + } + } + } } } diff --git a/Tactical/Rotting Corpses.cpp b/Tactical/Rotting Corpses.cpp index 09fbc5c9..aa9e3c1a 100644 --- a/Tactical/Rotting Corpses.cpp +++ b/Tactical/Rotting Corpses.cpp @@ -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_DEFINITION CorpseDef; @@ -1821,9 +1821,7 @@ void DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) pCorpse = GetCorpseAtGridNo( sGridNo, bLevel ); if ( pCorpse == NULL ) - { - return; - } + return FALSE; if ( IsValidDecapitationCorpse( pCorpse ) ) { @@ -1894,12 +1892,16 @@ void DecapitateCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) // All teams lok for this... NotifySoldiersToLookforItems( ); + + return TRUE; } else ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_HEAD_ITEM] ); } else ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_DECAPITATION] ); + + return FALSE; } // Flugente: can this corpse be gutted? @@ -1912,12 +1914,12 @@ BOOLEAN IsValidGutCorpse( ROTTING_CORPSE *pCorpse ) } // 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 ); if ( pCorpse == NULL ) - return; + return FALSE; // can this thing be gutted? if ( IsValidGutCorpse( pCorpse ) ) @@ -1947,12 +1949,16 @@ void GutCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) // All teams lok for this... NotifySoldiersToLookforItems( ); + + return TRUE; } else ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_MEAT_ITEM] ); } else ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_GUTTING] ); + + return FALSE; } // 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 -void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) +BOOLEAN StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) { ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel ); if ( pCorpse == NULL || !pSoldier ) - return; + return FALSE; // can this thing be stripped? if ( IsValidStripCorpse( pCorpse ) ) @@ -2005,9 +2011,13 @@ void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) // we took the clothes, mark this pCorpse->def.usFlags |= (ROTTING_CORPSE_NO_VEST|ROTTING_CORPSE_NO_PANTS); + + return TRUE; } else ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_CLOTHESFOUND] ); + + return FALSE; } // 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 -void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) +BOOLEAN TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) { ROTTING_CORPSE *pCorpse = GetCorpseAtGridNo( sGridNo, bLevel ); if ( pCorpse == NULL || !pSoldier ) - return; + return FALSE; // can this corpse be picked up? if ( IsValidTakeCorpse( pCorpse ) ) @@ -2175,6 +2185,8 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) RemoveCorpse( pCorpse->iID ); } } + + return TRUE; } else ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCorpseTextStr[STR_CORPSE_NO_FREEHAND] ); @@ -2184,6 +2196,8 @@ void TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) } else 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 diff --git a/Tactical/Rotting Corpses.h b/Tactical/Rotting Corpses.h index 6a2955d4..542adcc4 100644 --- a/Tactical/Rotting Corpses.h +++ b/Tactical/Rotting Corpses.h @@ -199,15 +199,15 @@ extern UINT8 gb4DirectionsFrom8[8]; ROTTING_CORPSE *GetCorpseAtGridNo( INT32 sGridNo , INT8 bLevel ); 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 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 ); -void StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ); +BOOLEAN StripCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ); 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 );