mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
Bugfix: AP deduct is different then shown (by Moa)
- no more jump with backpack (keys 'j' and 'J'). This is more consistent. Sometimes the soldier got stuck in the fence as some functions did not allow jumping and others did. - Pickup items from ground will now cost AP. - Backpack, Scubba fins and swimming background AP modificattion is now shown in path and is considered when calculating new path. No pathing through fences when wearing backpack. More likely to create path through water when wearing scubba fins. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6543 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -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 )
|
||||
{
|
||||
|
||||
+157
-12
@@ -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<INT8> 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<INT8> 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<INT8> 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 )
|
||||
{
|
||||
|
||||
+47
-1
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user