New feature: bear traps are mechanical traps that function like bombs, cause no explosion, can be reused, deal significant damage to legs and pin down the target.

GameDir >= r2338 is recommended.

For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&goto=346624&#msg_346624

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8287 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2016-08-12 20:48:34 +00:00
parent d000e8c1a3
commit c32bf09bbb
6 changed files with 252 additions and 47 deletions
+63 -20
View File
@@ -433,7 +433,7 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa
{
// first shot using "virgin" gun... set imprint ID
pSoldier->inv[ pSoldier->ubAttackingHand ][0]->data.ubImprintID = pSoldier->ubProfile;
// this could be an NPC (Krott)
if (pSoldier->bTeam == gbPlayerNum)
{
@@ -1876,14 +1876,24 @@ void HandleSoldierDropBomb( SOLDIERTYPE *pSoldier, INT32 sGridNo )
// We have something... all we do is place...
if ( ArmBomb( &(pSoldier->inv[ HANDPOS ]), 0 ) )
{
// Snap: Do a skill check here as well
INT32 iResult = SkillCheck( pSoldier, PLANTING_BOMB_CHECK, 0 );
INT32 iResult = 0;
if ( HasItemFlag( (pSoldier->inv[HANDPOS]).usItem, BEARTRAP ) )
{
iResult = SkillCheck( pSoldier, PLANTING_MECHANICAL_BOMB_CHECK, 0 );
}
else
{
iResult = SkillCheck( pSoldier, PLANTING_BOMB_CHECK, 0 );
}
if ( iResult >= 0 )
{
// Less explosives gain for placing tripwire
if ( Item[ pSoldier->inv[ HANDPOS ].usItem ].tripwire )
StatChange( pSoldier, EXPLODEAMT, 1, FALSE );
else if ( HasItemFlag( (pSoldier->inv[HANDPOS]).usItem, BEARTRAP ) )
StatChange( pSoldier, MECHANAMT, 10, FALSE );
else
// EXPLOSIVES GAIN (25): Place a bomb, or buried and armed a mine
StatChange( pSoldier, EXPLODEAMT, 25, FALSE );
@@ -1935,6 +1945,10 @@ void HandleSoldierDropBomb( SOLDIERTYPE *pSoldier, INT32 sGridNo )
}
else
{
// beartraps don't explode...
if ( HasItemFlag( (pSoldier->inv[HANDPOS]).usItem, BEARTRAP ) )
return;
// EXPLOSIVES GAIN (10): Failed to place a bomb, or bury and arm a mine
StatChange( pSoldier, EXPLODEAMT, 10, FROM_FAILURE );
@@ -5357,6 +5371,10 @@ void BombMessageBoxCallBack( UINT8 ubExitValue )
{
iResult = SkillCheck( gpTempSoldier, PLANTING_REMOTE_BOMB_CHECK, 0 );
}
else if ( HasItemFlag( (gpTempSoldier->inv[HANDPOS]).usItem, BEARTRAP ) )
{
iResult = SkillCheck( gpTempSoldier, PLANTING_MECHANICAL_BOMB_CHECK, 0 );
}
else
{
iResult = SkillCheck( gpTempSoldier, PLANTING_BOMB_CHECK, 0 );
@@ -5367,12 +5385,18 @@ void BombMessageBoxCallBack( UINT8 ubExitValue )
// Less explosives gain for placing tripwire
if ( Item[ gpTempSoldier->inv[ HANDPOS ].usItem ].tripwire == 1 )
StatChange( gpTempSoldier, EXPLODEAMT, 5, FALSE );
else if ( HasItemFlag( (gpTempSoldier->inv[HANDPOS]).usItem, BEARTRAP ) )
StatChange( gpTempSoldier, MECHANAMT, 10, FALSE );
else
// EXPLOSIVES GAIN (25): Place a bomb, or buried and armed a mine
StatChange( gpTempSoldier, EXPLODEAMT, 25, FALSE );
}
else
{
// beartraps don't explode...
if ( HasItemFlag( (gpTempSoldier->inv[HANDPOS]).usItem, BEARTRAP ) )
return;
// EXPLOSIVES GAIN (10): Failed to place a bomb, or bury and arm a mine
StatChange( gpTempSoldier, EXPLODEAMT, 10, FROM_FAILURE );
@@ -5809,7 +5833,6 @@ void BoobyTrapMessageBoxCallBack( UINT8 ubExitValue )
if ( CheckBombDisarmChance() >= 0)
{
if ( gTempObject[0]->data.misc.ubBombOwner > 1 && ( (INT32)gTempObject[0]->data.misc.ubBombOwner - 2 >= gTacticalStatus.Team[ OUR_TEAM ].bFirstID && gTempObject[0]->data.misc.ubBombOwner - 2 <= gTacticalStatus.Team[ OUR_TEAM ].bLastID ) )
{
if ( gTempObject[0]->data.misc.ubBombOwner - 2 == gpBoobyTrapSoldier->ubID )
@@ -5979,9 +6002,12 @@ void BoobyTrapMessageBoxCallBack( UINT8 ubExitValue )
else
{
// oops! trap goes off
StatChange( gpBoobyTrapSoldier, EXPLODEAMT, (INT8) (3 * gbTrapDifficulty ), FROM_FAILURE );
gpBoobyTrapSoldier->DoMercBattleSound( BATTLE_SOUND_CURSE1 );
if ( HasItemFlag( gTempObject.usItem, BEARTRAP ) )
return;
gpBoobyTrapSoldier->DoMercBattleSound( BATTLE_SOUND_CURSE1 );
StatChange( gpBoobyTrapSoldier, EXPLODEAMT, (INT8)(3 * gbTrapDifficulty), FROM_FAILURE );
if (gfDisarmingBuriedBomb)
{
@@ -6019,18 +6045,28 @@ void BoobyTrapInMapScreenMessageBoxCallBack( UINT8 ubExitValue )
if (ubExitValue == MSG_BOX_RETURN_YES)
{
INT32 iCheckResult;
iCheckResult = SkillCheck( gpBoobyTrapSoldier, DISARM_TRAP_CHECK, 0 );
if ( HasItemFlag( gpItemPointer->usItem, BEARTRAP ) )
{
iCheckResult = SkillCheck( gpBoobyTrapSoldier, DISARM_MECHANICAL_TRAP_CHECK, 0 );
}
else
{
iCheckResult = SkillCheck( gpBoobyTrapSoldier, DISARM_TRAP_CHECK, 0 );
}
if (iCheckResult >= 0)
{
// disarmed a boobytrap!
StatChange( gpBoobyTrapSoldier, EXPLODEAMT, (UINT16) (6 * gbTrapDifficulty), FALSE );
if ( HasItemFlag( gpItemPointer->usItem, BEARTRAP ) )
StatChange( gpBoobyTrapSoldier, MECHANAMT, (3 * gbTrapDifficulty), FALSE );
else
StatChange( gpBoobyTrapSoldier, EXPLODEAMT, (UINT16) (6 * gbTrapDifficulty), FALSE );
// SANDRO - merc records - trap removal count
if ( gpBoobyTrapSoldier->ubProfile != NO_PROFILE )
gMercProfiles[ gpBoobyTrapSoldier->ubProfile ].records.usTrapsRemoved++;
// have merc say this is good
gpBoobyTrapSoldier->DoMercBattleSound( BATTLE_SOUND_COOL1 );
@@ -6074,10 +6110,14 @@ void BoobyTrapInMapScreenMessageBoxCallBack( UINT8 ubExitValue )
else
{
// oops! trap goes off
StatChange( gpBoobyTrapSoldier, EXPLODEAMT, (INT8) (3 * gbTrapDifficulty ), FROM_FAILURE );
gpBoobyTrapSoldier->DoMercBattleSound( BATTLE_SOUND_CURSE1 );
// beartraps don't explode...
if ( HasItemFlag( gpItemPointer->usItem, BEARTRAP ) )
return;
StatChange( gpBoobyTrapSoldier, EXPLODEAMT, (INT8) (3 * gbTrapDifficulty ), FROM_FAILURE );
if (gfDisarmingBuriedBomb)
{
SetOffBombsInGridNo( gpBoobyTrapSoldier->ubID, gsBoobyTrapGridNo, TRUE, gbBoobyTrapLevel );
@@ -8646,24 +8686,27 @@ INT32 GetFirstObjectInSectorPosition( UINT16 ausItem )
INT32 CheckBombDisarmChance(void)
{
INT8 diff = 0;
// NB owner grossness... bombs 'owned' by the enemy are stored with side value 1 in
// the map. So if we want to detect a bomb placed by the player, owner is > 1, and
// owner - 2 gives the ID of the character who planted it
if ( gTempObject[0]->data.misc.ubBombOwner > 1 && ( (INT32)gTempObject[0]->data.misc.ubBombOwner - 2 >= gTacticalStatus.Team[ OUR_TEAM ].bFirstID && gTempObject[0]->data.misc.ubBombOwner - 2 <= gTacticalStatus.Team[ OUR_TEAM ].bLastID ) )
{
// my own boobytrap!
if ( gTempObject[0]->data.misc.ubBombOwner - 2 == gpBoobyTrapSoldier->ubID )
{
// my own boobytrap!
return SkillCheck( gpBoobyTrapSoldier, DISARM_TRAP_CHECK, 40 );
}
diff = 40;
// our team's boobytrap!
else
{
// our team's boobytrap!
return SkillCheck( gpBoobyTrapSoldier, DISARM_TRAP_CHECK, 20 );
}
diff = 20;
}
return SkillCheck( gpBoobyTrapSoldier, DISARM_TRAP_CHECK, 0 );
if ( HasItemFlag( gTempObject.usItem, BEARTRAP ) )
{
return SkillCheck( gpBoobyTrapSoldier, DISARM_MECHANICAL_TRAP_CHECK, diff );
}
return SkillCheck( gpBoobyTrapSoldier, DISARM_TRAP_CHECK, diff );
}
void ExtendedDisarmMessageBox(void)