diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index e24d1d30..9cf39cf1 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -2135,10 +2135,14 @@ void SoldierGetItemFromWorld( SOLDIERTYPE *pSoldier, INT32 iItemIndex, INT32 sGr INT32 iItemIndexToDelete; BOOLEAN fShouldSayCoolQuote = FALSE; BOOLEAN fDidSayCoolQuote = FALSE; - BOOLEAN fSaidBoobyTrapQuote = FALSE; + BOOLEAN fSaidBoobyTrapQuote = FALSE; + UINT16 sAPCost;//Moa: added for deduct points + BOOLEAN fItemTaken = FALSE;//Moa: added for deduct points #ifdef JA2UB UINT16 usItem=0; #endif + + sAPCost = GetAPsToPickupItem( pSoldier, sGridNo ); // OK. CHECK IF WE ARE DOING ALL IN THIS POOL.... if ( iItemIndex == ITEM_PICKUP_ACTION_ALL || iItemIndex == ITEM_PICKUP_SELECTION ) { @@ -2245,6 +2249,10 @@ void SoldierGetItemFromWorld( SOLDIERTYPE *pSoldier, INT32 iItemIndex, INT32 sGr // continue, to try and place ay others... continue; } + else + { + fItemTaken = TRUE; + } /* // handle theft.. will return true if theft has failed ( if soldier was caught ) if( pSoldier->bTeam == OUR_TEAM ) @@ -2395,12 +2403,22 @@ void SoldierGetItemFromWorld( SOLDIERTYPE *pSoldier, INT32 iItemIndex, INT32 sGr gfDontChargeAPsToPickup = TRUE; HandleAutoPlaceFail( pSoldier, iItemIndex, sGridNo ); } + else + { + fItemTaken = TRUE; + } } } } } + if (fItemTaken) + { + //deduct Points + DeductPoints( pSoldier, sAPCost, 0 ); + } + // OK, check if potentially a good candidate for cool quote if ( fShouldSayCoolQuote && pSoldier->bTeam == gbPlayerNum ) { diff --git a/Tactical/PATHAI.cpp b/Tactical/PATHAI.cpp index d4be3eca..a18dd476 100644 --- a/Tactical/PATHAI.cpp +++ b/Tactical/PATHAI.cpp @@ -2618,7 +2618,7 @@ if(!GridNoOnVisibleWorldTile(iDestination)) fTurnBased = ( (gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT) ); fPathingForPlayer = ( (s->bTeam == gbPlayerNum) && (!gTacticalStatus.fAutoBandageMode) && !(s->flags.uiStatusFlags & SOLDIER_PCUNDERAICONTROL) ); - fNonFenceJumper = !( IS_MERC_BODY_TYPE( s ) ); + fNonFenceJumper = !( IS_MERC_BODY_TYPE( s ) ) || (UsingNewInventorySystem() == true && FindBackpackOnSoldier( s ) != ITEM_NOT_FOUND);//Moa: added backpack check fNonSwimmer = !( IS_MERC_BODY_TYPE( s ) ); if ( fNonSwimmer ) { @@ -3570,11 +3570,56 @@ if(!GridNoOnVisibleWorldTile(iDestination)) { ubAPCost = max(1, (INT16)((ubAPCost * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); } - /////////////////////////////////////////////////////////////////////////////////////////////// - // SANDRO - moved backpack check to here - if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( s ) != ITEM_NOT_FOUND ) + + // Moa: scuba fins and swimming background + if ( s->inv[LEGPOS].exists() && HasItemFlag( s->inv[LEGPOS].usItem, SCUBA_FINS ) ) { - ubAPCost += APBPConstants[AP_MODIFIER_PACK]; + if ( TERRAIN_IS_HIGH_WATER( gpWorldLevelData[ newLoc ].ubTerrainID) ) + { + ubAPCost /= 2; + } + else + { + ubAPCost *= 2; + } + } + if ( TERRAIN_IS_HIGH_WATER( gpWorldLevelData[ newLoc ].ubTerrainID ) ) + ubAPCost = (ubAPCost * (100 + s->GetBackgroundValue(BG_SWIMMING))) / 100; + + // SANDRO - moved backpack check to here + // Moa: backpack penalty + //if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( s ) != ITEM_NOT_FOUND ) + //{ + // ubAPCost += APBPConstants[AP_MODIFIER_PACK]; + //} + if ( UsingNewInventorySystem() == true && gGameExternalOptions.fBackPackWeightLowersAP ) + { + INT8 bSlot= FindBackpackOnSoldier( s ); + if ( bSlot != ITEM_NOT_FOUND ) + { + UINT16 usBPPenalty = APBPConstants[AP_MODIFIER_PACK]; + if ( bSlot == BPACKPOCKPOS ) //Backpack caried on back + { + OBJECTTYPE * pObj = &( s->inv[ BPACKPOCKPOS ] ); + UINT16 usBackPackWeight = CalculateObjectWeight( pObj ); + // CalculateObjectWeight checks for active LBE gear. Unfortunatly our backpack is not active since we are carying it. + // Sounds not intuitive at all, active means the LBE caries items (marked with blue *), but when put on the LBE adittional slots of our soldier + // are activated where something can be carried. So we have to add the weights of those slots as well. + std::vector vbLBESlots; + GetLBESlots( BPACKPOCKPOS, vbLBESlots ); + for ( UINT8 i = 0; i < vbLBESlots.size() ; i++ ) + { + pObj = &( s->inv[ vbLBESlots[ i ] ] ); + usBackPackWeight += CalculateObjectWeight( pObj ); + } + usBPPenalty = min( ( usBackPackWeight / 50 ), usBPPenalty ); //1 AP penalty for each 5kg of weight up to the penalty defined by AP_MODIFIER_PACK (default = 4) + } + else //Backpack caried not on back (maybe somewhere inside another LBE or in Hand?) + { + //apply full penalty + } + ubAPCost += usBPPenalty; + } } if (nextCost == TRAVELCOST_FENCE) @@ -4579,6 +4624,18 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl { sMovementAPsCost = max(1, (INT16)((sMovementAPsCost * (100 - gSkillTraitValues.ubATAPsMovementReduction) / 100) + 0.5)); } + + // Moa: scuba fins and swimming background + if ( pSold->inv[LEGPOS].exists() && HasItemFlag( pSold->inv[LEGPOS].usItem, SCUBA_FINS ) ) + { + if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) + sMovementAPsCost /= 2; + else + sMovementAPsCost *= 2; + } + if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) + sMovementAPsCost = (sMovementAPsCost * (100 + pSold->GetBackgroundValue(BG_SWIMMING))) / 100; + // Check if doors if not player's merc (they have to open them manually) if ( sSwitchValue == TRAVELCOST_DOOR && pSold->bTeam != gbPlayerNum ) { @@ -4598,8 +4655,37 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl } } // Check for backpack - if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( pSold ) != ITEM_NOT_FOUND ) - sMovementAPsCost += APBPConstants[AP_MODIFIER_PACK]; + //if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( pSold ) != ITEM_NOT_FOUND ) + // sMovementAPsCost += APBPConstants[AP_MODIFIER_PACK]; + if ( UsingNewInventorySystem() == true && gGameExternalOptions.fBackPackWeightLowersAP ) + { + INT8 bSlot= FindBackpackOnSoldier( pSold ); + if ( bSlot != ITEM_NOT_FOUND ) + { + UINT16 usBPPenalty = APBPConstants[AP_MODIFIER_PACK]; + if ( bSlot == BPACKPOCKPOS ) //Backpack caried on back + { + OBJECTTYPE * pObj = &( pSold->inv[ BPACKPOCKPOS ] ); + UINT16 usBackPackWeight = CalculateObjectWeight( pObj ); + // CalculateObjectWeight checks for active LBE gear. Unfortunatly our backpack is not active since we are carying it. + // Sounds not intuitive at all, active means the LBE caries items (marked with blue *), but when put on the LBE adittional slots of our soldier + // are activated where something can be carried. So we have to add the weights of those slots as well. + std::vector vbLBESlots; + GetLBESlots( BPACKPOCKPOS, vbLBESlots ); + for ( UINT8 i = 0; i < vbLBESlots.size() ; i++ ) + { + pObj = &( pSold->inv[ vbLBESlots[ i ] ] ); + usBackPackWeight += CalculateObjectWeight( pObj ); + } + usBPPenalty = min( ( usBackPackWeight / 50 ), usBPPenalty ); //1 AP penalty for each 5kg of weight up to the penalty defined by AP_MODIFIER_PACK (default = 4) + } + else //Backpack caried not on back (maybe somewhere inside another LBE or in Hand?) + { + //apply full penalty + } + sMovementAPsCost += usBPPenalty; + } + } sPoints += sMovementAPsCost + sExtraCostStand; /////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -4637,6 +4723,32 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl sPointsSwat += sMovementAPsCost + APBPConstants[AP_MODIFIER_SWAT]; sPointsRun += sMovementAPsCost + APBPConstants[AP_MODIFIER_RUN]; } + + // Moa: scuba fins and swimming background + if ( pSold->inv[LEGPOS].exists() && HasItemFlag( pSold->inv[LEGPOS].usItem, SCUBA_FINS ) ) + { + if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) + { + sPointsWalk /= 2; + sPointsCrawl /= 2; + sPointsSwat /= 2; + sPointsRun /= 2; + } + else + { + sPointsWalk *= 2; + sPointsCrawl *= 2; + sPointsSwat *= 2; + sPointsRun *= 2; + } + } + if ( TERRAIN_IS_HIGH_WATER( ubTerrainID) ) + { + sPointsWalk = (sPointsWalk * (100 + pSold->GetBackgroundValue(BG_SWIMMING))) / 100; + sPointsCrawl = (sPointsCrawl * (100 + pSold->GetBackgroundValue(BG_SWIMMING))) / 100; + sPointsSwat = (sPointsSwat * (100 + pSold->GetBackgroundValue(BG_SWIMMING))) / 100; + sPointsRun = (sPointsRun * (100 + pSold->GetBackgroundValue(BG_SWIMMING))) / 100; + } // walking with weapon raised? if (!(pSold->MercInWater()) && ( (gAnimControl[ pSold->usAnimState ].uiFlags & ANIM_FIREREADY ) || (gAnimControl[ pSold->usAnimState ].uiFlags & ANIM_FIRE ) )) { @@ -4662,12 +4774,45 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl } } // Check for backpack - if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( pSold ) != ITEM_NOT_FOUND ) + //if((UsingNewInventorySystem() == true) && FindBackpackOnSoldier( pSold ) != ITEM_NOT_FOUND ) + //{ + // sPointsWalk += APBPConstants[AP_MODIFIER_PACK]; + // sPointsCrawl += APBPConstants[AP_MODIFIER_PACK]; + // sPointsSwat += APBPConstants[AP_MODIFIER_PACK]; + // sPointsRun += APBPConstants[AP_MODIFIER_PACK]; + //} + // Moa: apply penalty for heavily packed backpack (wobble penalty) + if ( UsingNewInventorySystem() == true && gGameExternalOptions.fBackPackWeightLowersAP ) { - sPointsWalk += APBPConstants[AP_MODIFIER_PACK]; - sPointsCrawl += APBPConstants[AP_MODIFIER_PACK]; - sPointsSwat += APBPConstants[AP_MODIFIER_PACK]; - sPointsRun += APBPConstants[AP_MODIFIER_PACK]; + INT8 bSlot= FindBackpackOnSoldier( pSold ); + if ( bSlot != ITEM_NOT_FOUND ) + { + UINT16 usBPPenalty = APBPConstants[AP_MODIFIER_PACK]; + if ( bSlot == BPACKPOCKPOS ) //Backpack caried on back + { + OBJECTTYPE * pObj = &( pSold->inv[ BPACKPOCKPOS ] ); + UINT16 usBackPackWeight = CalculateObjectWeight( pObj ); + // CalculateObjectWeight checks for active LBE gear. Unfortunatly our backpack is not active since we are carying it. + // Sounds not intuitive at all, active means the LBE caries items (marked with blue *), but when put on the LBE adittional slots of our soldier + // are activated where something can be carried. So we have to add the weights of those slots as well. + std::vector vbLBESlots; + GetLBESlots( BPACKPOCKPOS, vbLBESlots ); + for ( UINT8 i = 0; i < vbLBESlots.size() ; i++ ) + { + pObj = &( pSold->inv[ vbLBESlots[ i ] ] ); + usBackPackWeight += CalculateObjectWeight( pObj ); + } + usBPPenalty = min( ( usBackPackWeight / 50 ), usBPPenalty ); //1 AP penalty for each 5kg of weight up to the penalty defined by AP_MODIFIER_PACK (default = 4) + } + else //Backpack caried not on back (maybe somewhere inside another LBE or in Hand?) + { + //apply full penalty + } + sPointsWalk += usBPPenalty; + sPointsCrawl += usBPPenalty; + sPointsSwat += usBPPenalty; + sPointsRun += usBPPenalty; + } } if ( sExtraCostStand ) { diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index 90232ac9..3527be6a 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -510,7 +510,7 @@ INT16 ActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, UINT16 u INT8 bSlot= FindBackpackOnSoldier( pSoldier ); if ( bSlot != ITEM_NOT_FOUND ) { - UINT16 usBPPenalty = APBPConstants[ AP_MODIFIER_PACK ]; + UINT16 usBPPenalty = APBPConstants[AP_MODIFIER_PACK]; if ( bSlot == BPACKPOCKPOS ) //Backpack caried on back { OBJECTTYPE * pObj = &( pSoldier->inv[ BPACKPOCKPOS ] ); @@ -582,6 +582,51 @@ INT16 EstimateActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, // Get switch value... sSwitchValue = gubWorldMovementCosts[ sGridNo ][ bDir ][ pSoldier->pathing.bLevel ]; +#if 1 //Moa: set to 0 to use original copy and paste code from ActionPointCost() + if ( sSwitchValue == TRAVELCOST_FENCE ) + { + // If we are changeing stance ( either before or after getting there.... + // We need to reflect that... + switch(usMovementMode) + { + case SIDE_STEP: + case SIDE_STEP_WEAPON_RDY: + case SIDE_STEP_DUAL_RDY: + case WALK_BACKWARDS: + case RUNNING: + case WALKING : + case WALKING_WEAPON_RDY: + case WALKING_DUAL_RDY: + case WALKING_ALTERNATIVE_RDY : + case SIDE_STEP_ALTERNATIVE_RDY: + + // Add here cost to go from crouch to stand AFTER fence hop.... + // Since it's AFTER.. make sure we will be moving after jump... + if ( ( bPathIndex + 2 ) < bPathLength ) + { + sPoints += GetAPsCrouch(pSoldier, TRUE); // SANDRO changed.. + } + break; + + case SWATTING: + case START_SWAT: + case SWAT_BACKWARDS: + + // Add cost to stand once there BEFORE.... + sPoints += GetAPsCrouch(pSoldier, TRUE); // SANDRO changed.. + break; + + case CRAWLING: + + // Can't do it here..... + break; + } + } + + sPoints += ActionPointCost( pSoldier, sGridNo, bDir, usMovementMode ); + + return (sPoints); +#else // Tile cost should not be reduced based on movement mode... if ( sSwitchValue == TRAVELCOST_FENCE ) { @@ -756,6 +801,7 @@ INT16 EstimateActionPointCost( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bDir, } return( sPoints ); +#endif } diff --git a/Tactical/Points.h b/Tactical/Points.h index 9caba7d8..05fd43e6 100644 --- a/Tactical/Points.h +++ b/Tactical/Points.h @@ -309,13 +309,9 @@ INT16 CalcTotalAPsToAttack( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTur INT16 CalcAPsToBurst( INT16 bBaseActionPoints, OBJECTTYPE * pObj, SOLDIERTYPE* pSoldier ); // HEADROCK HAM 4: Same as above, without percent modifiers. INT16 CalcAPsToBurstNoModifier( INT16 bBaseActionPoints, OBJECTTYPE * pObj ); -// HEADROCK HAM 4: Same as above, without percent modifiers. -INT16 CalcAPsToBurstNoModifier( INT16 bBaseActionPoints, OBJECTTYPE * pObj ); INT16 CalcAPsToAutofire( INT16 bBaseActionPoints, OBJECTTYPE * pObj, UINT8 bDoAutofire, SOLDIERTYPE* pSoldier ); // HEADROCK HAM 4: Same as above, without modifiers INT16 CalcAPsToAutofireNoModifier( INT16 bBaseActionPoints, OBJECTTYPE * pObj, UINT8 bDoAutofire ); -// HEADROCK HAM 4: Same as above, without modifiers -INT16 CalcAPsToAutofireNoModifier( INT16 bBaseActionPoints, OBJECTTYPE * pObj, UINT8 bDoAutofire ); INT16 GetAPsToChangeStance( SOLDIERTYPE *pSoldier, INT8 bDesiredHeight ); // SANDRO - actually this procedure is nowhere used in the entire JA2 code - commented out //INT16 GetBPsToChangeStance( SOLDIERTYPE *pSoldier, INT8 bDesiredHeight ); diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index ef3beb49..dc89afb4 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -2856,8 +2856,11 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) { if((UsingNewInventorySystem() == true) && lSoldier->inv[BPACKPOCKPOS].exists() == true) { - sAPCost = GetAPsToJumpThroughWindows( lSoldier, TRUE ); - sBPCost = GetBPsToJumpThroughWindows( lSoldier, TRUE ); + //Moa: no jumping with backpack + //sAPCost = GetAPsToJumpThroughWindows( lSoldier, TRUE ); + //sBPCost = GetBPsToJumpThroughWindows( lSoldier, TRUE ); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_CLIMB] ); + break; } else { @@ -2946,8 +2949,11 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) { if((UsingNewInventorySystem() == true) && pjSoldier->inv[BPACKPOCKPOS].exists() == true) { - sAPCost = GetAPsToJumpFence( pjSoldier, TRUE ); - sBPCost = GetBPsToJumpFence( pjSoldier, TRUE ); + //Moa: no jumping whith backpack + //sAPCost = GetAPsToJumpFence( pjSoldier, TRUE ); + //sBPCost = GetBPsToJumpFence( pjSoldier, TRUE ); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, NewInvMessage[NIV_NO_CLIMB] ); + break; } else {