From 6c9d6cec689ff9354bd376cc9064ca9b0f211b24 Mon Sep 17 00:00:00 2001 From: silversurfer Date: Thu, 7 Nov 2013 19:11:35 +0000 Subject: [PATCH] - fixed bug with CAMO_REMOVING = TRUE Too much of a camo kit was used when the character was wearing an outfit with different camo bonus. - fixed bug with DYNAMIC_IMP_PROFILE_COST = TRUE The game was always one step behind in cost display but charged the correct price. Now charged price and display match. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6565 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Laptop/IMP Confirm.cpp | 19 ++++++++++++++----- Tactical/Items.cpp | 8 ++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Laptop/IMP Confirm.cpp b/Laptop/IMP Confirm.cpp index e7c76bd59..a9e2b9444 100644 --- a/Laptop/IMP Confirm.cpp +++ b/Laptop/IMP Confirm.cpp @@ -338,7 +338,11 @@ void BtnIMPConfirmYes(GUI_BUTTON *btn,INT32 reason) */ // SANDRO - changed to find the actual profile cost //if( LaptopSaveInfo.iCurrentBalance < COST_OF_PROFILE ) - if( LaptopSaveInfo.iCurrentBalance < iGetProfileCost() ) + + // silversurfer: We need to store the profile cost here because right now our new IMP doesn't occupy a slot yet. + // However function iGetProfileCost() will already calculate price including that slot. We would charge too much money after the IMP is created below. + INT32 iIMPCost = iGetProfileCost(); + if( LaptopSaveInfo.iCurrentBalance < iIMPCost ) { // not enough return; @@ -352,7 +356,7 @@ void BtnIMPConfirmYes(GUI_BUTTON *btn,INT32 reason) // charge the player // SANDRO - changed to find the actual profile cost //AddTransactionToPlayersBook(IMP_PROFILE, (UINT8)(LaptopSaveInfo.iIMPIndex), GetWorldTotalMin( ), - ( COST_OF_PROFILE ) ); - AddTransactionToPlayersBook(IMP_PROFILE, (UINT8)(LaptopSaveInfo.iIMPIndex), GetWorldTotalMin( ), - ( iGetProfileCost() ) ); + AddTransactionToPlayersBook(IMP_PROFILE, (UINT8)(LaptopSaveInfo.iIMPIndex), GetWorldTotalMin( ), - ( iIMPCost ) ); AddHistoryToPlayersLog( HISTORY_CHARACTER_GENERATED, 0,GetWorldTotalMin( ), -1, -1 ); AddCharacterToPlayersTeam( ); @@ -1519,6 +1523,10 @@ BOOLEAN LoadImpCharacter( STR nickName ) { LaptopSaveInfo.iIMPIndex = iProfileId; + // silversurfer: Store current IMP cost. Function iGetProfileCost() already takes the new slot into account. + // If we create the IMP first we would charge too much. + INT32 iIMPCost = iGetProfileCost(); + // read in the profile //if ( !gMercProfiles[ iProfileId ].Load(hFile, false) ) if ( !gMercProfiles[ iProfileId ].Load(hFile, isOldVersion, false, false) ) @@ -1534,7 +1542,7 @@ BOOLEAN LoadImpCharacter( STR nickName ) DistributeInitialGear(&gMercProfiles[iProfileId]); // Changed to find actual IMP cost - SANDRO - if( LaptopSaveInfo.iCurrentBalance < iGetProfileCost() ) + if( LaptopSaveInfo.iCurrentBalance < iIMPCost ) { DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 3 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); @@ -1558,7 +1566,7 @@ BOOLEAN LoadImpCharacter( STR nickName ) fCharacterIsMale = ( gMercProfiles[ iProfileId ].bSex == MALE ); fLoadingCharacterForPreviousImpProfile = TRUE; // Changed to find actual IMP cost - SANDRO - AddTransactionToPlayersBook(IMP_PROFILE,0, GetWorldTotalMin( ), - ( iGetProfileCost() ) ); + AddTransactionToPlayersBook(IMP_PROFILE,0, GetWorldTotalMin( ), - ( iIMPCost ) ); AddHistoryToPlayersLog( HISTORY_CHARACTER_GENERATED, 0,GetWorldTotalMin( ), -1, -1 ); LaptopSaveInfo.iIMPIndex = iProfileId; AddCharacterToPlayersTeam( ); @@ -1773,7 +1781,8 @@ INT32 iGetProfileCost() { INT32 iIMPProfileCost; - iIMPProfileCost = gGameExternalOptions.iIMPProfileCost * CountFilledIMPSlots(-1); + // silversurfer: When we create an IMP he doesn't occupy a slot yet so we need to add 1 to get the correct price in advance. + iIMPProfileCost = gGameExternalOptions.iIMPProfileCost * ( CountFilledIMPSlots(-1) + 1 ); if (iIMPProfileCost >= gGameExternalOptions.iIMPProfileCost) return(iIMPProfileCost); diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index b313ef219..09cb1cc46 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -9194,6 +9194,8 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP { pSoldier->bCamo = __min( 100, pSoldier->bCamo + iJungleCamoAdded ); } + // update with amount that we really used + bPointsToUse = __min( bPointsToUse, (iJungleCamoAdded + 1) / 2 ); } // Second, check if we have an item with major URBAN camobonus else if ( (Item[pObj->usItem].urbanCamobonus > Item[pObj->usItem].camobonus) && @@ -9234,6 +9236,8 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP { pSoldier->urbanCamo = __min( 100, pSoldier->urbanCamo + iUrbanCamoAdded ); } + // update with amount that we really used + bPointsToUse = __min( bPointsToUse, (iUrbanCamoAdded + 1) / 2 ); } // Third, check if we have an item with major DESERT camobonus else if ( (Item[pObj->usItem].desertCamobonus > Item[pObj->usItem].camobonus) && @@ -9274,6 +9278,8 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP { pSoldier->desertCamo = __min( 100, pSoldier->desertCamo + iDesertCamoAdded ); } + // update with amount that we really used + bPointsToUse = __min( bPointsToUse, (iDesertCamoAdded + 1) / 2 ); } // Fourth, check if we have an item with major SNOW camobonus else if ( (Item[pObj->usItem].snowCamobonus > Item[pObj->usItem].camobonus) && @@ -9314,6 +9320,8 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP { pSoldier->snowCamo = __min( 100, pSoldier->snowCamo + iSnowCamoAdded ); } + // update with amount that we really used + bPointsToUse = __min( bPointsToUse, (iSnowCamoAdded + 1) / 2 ); } else // the item has no major camo, return return( FALSE );