From 18a1d0e5192f0f99c6d2a002e2f88f07c7042265 Mon Sep 17 00:00:00 2001 From: Wanne Date: Sun, 17 Sep 2006 07:31:34 +0000 Subject: [PATCH] - bugfix: Getting incorrect data & CTDs when using multiple IMP characters with same voices. Now it is possible to have up to 6 merc with the same voice without getting incorrect data. No more need to use different voices! (IF YOU PLAY WITH MULTIPLE IMPS, YOU SHOULD START A NEW GAME, BECAUSE THE IMP CHARACTERS GAME DATA IS INCORRECT!) - bugfix: CTD when using Random personality in I.M.P creation - moved Random personality flag from INI to option screen - added MAX_IMP_CHARACTERS entry in the ja2_options.ini (Range: 0 - 6) git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@528 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 6 +- GameSettings.h | 4 +- JA2.suo | Bin 101376 -> 124416 bytes Laptop/IMP Begin Screen.cpp | 3 + Laptop/IMP Compile Character.cpp | 241 +++++++++++++++---------------- Laptop/IMP Confirm.cpp | 52 ++++++- Laptop/IMP Confirm.h | 4 + Laptop/IMP HomePage.cpp | 66 +++++---- Laptop/IMP Voices.cpp | 23 ++- Laptop/IMPVideoObjects.cpp | 7 +- Utils/_DutchText.cpp | 2 + Utils/_EnglishText.cpp | 13 +- Utils/_FrenchText.cpp | 5 +- Utils/_GermanText.cpp | 6 +- Utils/_ItalianText.cpp | 3 +- Utils/_PolishText.cpp | 3 +- Utils/_RussianText.cpp | 4 +- 17 files changed, 264 insertions(+), 178 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index 6ab331ece..f8692eb3d 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -257,6 +257,7 @@ void InitGameSettings() gGameSettings.fOptions[ TOPTION_TRACERS_FOR_SINGLE_FIRE ] = FALSE; gGameSettings.fOptions[ TOPTION_RAIN_SOUND ] = TRUE; gGameSettings.fOptions[ TOPTION_ALLOW_CROWS ] = TRUE; + gGameSettings.fOptions[ TOPTION_USE_RANDOM_PERSONALITY ] = FALSE; gGameSettings.ubSizeOfDisplayCover = 4; gGameSettings.ubSizeOfLOS = 4; @@ -290,6 +291,9 @@ void LoadGameExternalOptions() //################# Laptop Settings ################# + // WANNE: Maximum number of imp characters (0 to 6) + gGameExternalOptions.iMaxIMPCharacters = iniReader.ReadInteger("JA2 Laptop Settings","MAX_IMP_CHARACTERS",1); + //Character generation gGameExternalOptions.iMinAttribute = iniReader.ReadInteger("JA2 Laptop Settings","MIN_ATTRIBUTE_POINT",35); gGameExternalOptions.iMaxAttribute = iniReader.ReadInteger("JA2 Laptop Settings","MAX_ATTRIBUTE_POINT",90); @@ -297,7 +301,7 @@ void LoadGameExternalOptions() gGameExternalOptions.iMaxZeroBonus = iniReader.ReadInteger("JA2 Laptop Settings","MAX_ZERO_BONUS",15); gGameExternalOptions.iStartAttribute = iniReader.ReadInteger("JA2 Laptop Settings","START_ATTRIBUTE",55); - gGameExternalOptions.fPers_att = iniReader.ReadBoolean("JA2 Laptop Settings","USE_RANDOM_PERSONALITY",FALSE); + //gGameExternalOptions.fPers_att = iniReader.ReadBoolean("JA2 Laptop Settings","USE_RANDOM_PERSONALITY",FALSE); gGameExternalOptions.iCustomPersonality = iniReader.ReadInteger("JA2 Laptop Settings","CUSTOM_PERSONALITY",0); gGameExternalOptions.iCustomAttitude = iniReader.ReadInteger("JA2 Laptop Settings","CUSTOM_ATTITUDE",0); diff --git a/GameSettings.h b/GameSettings.h index 65c962245..a7bf15075 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -51,6 +51,7 @@ enum TOPTION_TRACERS_FOR_SINGLE_FIRE, TOPTION_RAIN_SOUND, TOPTION_ALLOW_CROWS, + TOPTION_USE_RANDOM_PERSONALITY, NUM_GAME_OPTIONS, //Toggle up this will be able to be Toggled by the player @@ -142,6 +143,7 @@ typedef struct BOOLEAN fSellAll; INT16 iPriceModifier; + INT32 iMaxIMPCharacters; INT32 iMinAttribute; INT32 iMaxAttribute; INT32 iImpAttributePoints; @@ -177,7 +179,7 @@ typedef struct BOOLEAN fMercDayOne; BOOLEAN fAllMercsAvailable; - BOOLEAN fPers_att; + //BOOLEAN fPers_att; INT8 iCustomPersonality; INT8 iCustomAttitude; diff --git a/JA2.suo b/JA2.suo index 9c4fad09bc7c698da4205dee7dc43d4b066f620f..7abb5d38c838da3d8607144d1e5080a1338b304f 100644 GIT binary patch delta 11798 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 bMCZoP|M3i0#gZx#uJr^2wTxlMM8)hsS_Y0N diff --git a/Laptop/IMP Begin Screen.cpp b/Laptop/IMP Begin Screen.cpp index a2f1879f5..b2e82b8f4 100644 --- a/Laptop/IMP Begin Screen.cpp +++ b/Laptop/IMP Begin Screen.cpp @@ -362,10 +362,13 @@ void BtnIMPBeginScreenDoneCallback(GUI_BUTTON *btn,INT32 reason) } else { + // WANNE: + /* if( CheckCharacterInputForEgg( ) ) { fEggOnYouFace = TRUE; } + */ } diff --git a/Laptop/IMP Compile Character.cpp b/Laptop/IMP Compile Character.cpp index a4dfa4e8c..00cdd81ae 100644 --- a/Laptop/IMP Compile Character.cpp +++ b/Laptop/IMP Compile Character.cpp @@ -249,84 +249,85 @@ BOOLEAN DoesCharacterHaveAPersoanlity( void ) void CreatePlayerAttitude( void ) { + // WANNE + if (gGameSettings.fOptions[ TOPTION_USE_RANDOM_PERSONALITY ] == TRUE) + //if(gGameExternalOptions.fPers_att) + { + AddAnAttitudeToAttitudeList( ATT_OPTIMIST ); + AddAnAttitudeToAttitudeList( ATT_LONER ); + AddAnAttitudeToAttitudeList( ATT_FRIENDLY ); + AddAnAttitudeToAttitudeList( ATT_ARROGANT ); + AddAnAttitudeToAttitudeList( ATT_NORMAL ); + AddAnAttitudeToAttitudeList( ATT_ASSHOLE ); + AddAnAttitudeToAttitudeList( ATT_COWARD ); + AddAnAttitudeToAttitudeList( ATT_AGGRESSIVE ); + AddAnAttitudeToAttitudeList( ATT_PESSIMIST ); + AddAnAttitudeToAttitudeList( ATT_BIG_SHOT ); - if(gGameExternalOptions.fPers_att) + // this function will 'roll a die' and decide if any attitude does exists + INT32 iDiceValue = 0; + INT32 iCounter = 0, iCounter2 = 0; + + INT32 iAttitudeHits[NUM_ATTITUDES] = { 0 }; + INT32 iHighestHits = 0; + INT32 iNumAttitudesWithHighestHits = 0; + + iAttitude = ATT_NORMAL; + + if ( iLastElementInAttitudeList == 0 ) { - AddAnAttitudeToAttitudeList( ATT_OPTIMIST ); - AddAnAttitudeToAttitudeList( ATT_LONER ); - AddAnAttitudeToAttitudeList( ATT_FRIENDLY ); - AddAnAttitudeToAttitudeList( ATT_ARROGANT ); - AddAnAttitudeToAttitudeList( ATT_NORMAL ); - AddAnAttitudeToAttitudeList( ATT_ASSHOLE ); - AddAnAttitudeToAttitudeList( ATT_COWARD ); - AddAnAttitudeToAttitudeList( ATT_AGGRESSIVE ); - AddAnAttitudeToAttitudeList( ATT_PESSIMIST ); - AddAnAttitudeToAttitudeList( ATT_BIG_SHOT ); + return; + } - // this function will 'roll a die' and decide if any attitude does exists - INT32 iDiceValue = 0; - INT32 iCounter = 0, iCounter2 = 0; + // count # of hits for each attitude + for ( iCounter = 0; iCounter < iLastElementInAttitudeList; iCounter++ ) + { + iAttitudeHits[ AttitudeList[ iCounter ] ]++; + } - INT32 iAttitudeHits[NUM_ATTITUDES] = { 0 }; - INT32 iHighestHits = 0; - INT32 iNumAttitudesWithHighestHits = 0; - - iAttitude = ATT_NORMAL; - - if ( iLastElementInAttitudeList == 0 ) + // find highest # of hits for any attitude + for ( iCounter = 0; iCounter < NUM_ATTITUDES; iCounter++ ) + { + if ( iAttitudeHits[ iCounter ] ) { - return; - } - - // count # of hits for each attitude - for ( iCounter = 0; iCounter < iLastElementInAttitudeList; iCounter++ ) - { - iAttitudeHits[ AttitudeList[ iCounter ] ]++; - } - - // find highest # of hits for any attitude - for ( iCounter = 0; iCounter < NUM_ATTITUDES; iCounter++ ) - { - if ( iAttitudeHits[ iCounter ] ) + if ( iAttitudeHits[ iCounter ] > iHighestHits ) { - if ( iAttitudeHits[ iCounter ] > iHighestHits ) - { - iHighestHits = __max( iHighestHits, iAttitudeHits[ iCounter ] ); - iNumAttitudesWithHighestHits = 1; - } - else if ( iAttitudeHits[ iCounter ] == iHighestHits ) - { - iNumAttitudesWithHighestHits++; - } + iHighestHits = __max( iHighestHits, iAttitudeHits[ iCounter ] ); + iNumAttitudesWithHighestHits = 1; } - } - - // roll dice - iDiceValue = Random( iNumAttitudesWithHighestHits + 1 ); - - // find attitude - for ( iCounter = 0; iCounter < NUM_ATTITUDES; iCounter++ ) - { - if ( iAttitudeHits[ iCounter ] == iHighestHits ) + else if ( iAttitudeHits[ iCounter ] == iHighestHits ) { - if ( iCounter2 == iDiceValue ) - { - // this is it! - iAttitude = iCounter2; - break; - } - else - { - // one of the next attitudes... - iCounter2++; - } + iNumAttitudesWithHighestHits++; } } } - else + + // roll dice + iDiceValue = Random( iNumAttitudesWithHighestHits + 1 ); + + // find attitude + for ( iCounter = 0; iCounter < NUM_ATTITUDES; iCounter++ ) { - iAttitude = gGameExternalOptions.iCustomAttitude; + if ( iAttitudeHits[ iCounter ] == iHighestHits ) + { + if ( iCounter2 == iDiceValue ) + { + // this is it! + iAttitude = iCounter2; + break; + } + else + { + // one of the next attitudes... + iCounter2++; + } + } } + } + else + { + iAttitude = gGameExternalOptions.iCustomAttitude; + } } @@ -592,84 +593,82 @@ void AddAPersonalityToPersonalityList( INT8 bPersonlity ) void CreatePlayerPersonality( void ) { + // WANNE + if (gGameSettings.fOptions[ TOPTION_USE_RANDOM_PERSONALITY ] == TRUE) // Kaiden: Added for optional Mercenary personalities and attitudes + //if(gGameExternalOptions.fPers_att) + { + // Kaiden: More chances for Psycho and Normal. + AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); + AddAPersonalityToPersonalityList( PSYCHO ); + AddAPersonalityToPersonalityList( FORGETFUL ); + AddAPersonalityToPersonalityList( NERVOUS ); + AddAPersonalityToPersonalityList( HEAT_INTOLERANT ); + AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); + AddAPersonalityToPersonalityList( PSYCHO ); + AddAPersonalityToPersonalityList( CLAUSTROPHOBIC ); + AddAPersonalityToPersonalityList( NONSWIMMER ); + AddAPersonalityToPersonalityList( FEAR_OF_INSECTS ); + AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); + AddAPersonalityToPersonalityList( PSYCHO ); + AddAPersonalityToPersonalityList( FORGETFUL ); + AddAPersonalityToPersonalityList( NERVOUS ); + AddAPersonalityToPersonalityList( HEAT_INTOLERANT ); + AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); + AddAPersonalityToPersonalityList( PSYCHO ); + AddAPersonalityToPersonalityList( CLAUSTROPHOBIC ); + AddAPersonalityToPersonalityList( NONSWIMMER ); + AddAPersonalityToPersonalityList( FEAR_OF_INSECTS ); - if(gGameExternalOptions.fPers_att) + INT32 iDiceValue = 0; + INT32 iCounter = 0; + INT32 iCounter2 = 0; + + // Kaiden: Roll dice 20 times just to be on the safe side + // was getting too many repeats. Will end up scrapping + // rand() later anyway so will worry about fixing it then. + + // WANNE: No need to make a 20 times repeat + /*for (iCounter2 = 0; iCounter2 < 20; iCounter2++) { - // Kaiden: More chances for Psycho and Normal. - AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); - AddAPersonalityToPersonalityList( PSYCHO ); - AddAPersonalityToPersonalityList( FORGETFUL ); - AddAPersonalityToPersonalityList( NERVOUS ); - AddAPersonalityToPersonalityList( HEAT_INTOLERANT ); - AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); - AddAPersonalityToPersonalityList( PSYCHO ); - AddAPersonalityToPersonalityList( CLAUSTROPHOBIC ); - AddAPersonalityToPersonalityList( NONSWIMMER ); - AddAPersonalityToPersonalityList( FEAR_OF_INSECTS ); - AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); - AddAPersonalityToPersonalityList( PSYCHO ); - AddAPersonalityToPersonalityList( FORGETFUL ); - AddAPersonalityToPersonalityList( NERVOUS ); - AddAPersonalityToPersonalityList( HEAT_INTOLERANT ); - AddAPersonalityToPersonalityList( NO_PERSONALITYTRAIT ); - AddAPersonalityToPersonalityList( PSYCHO ); - AddAPersonalityToPersonalityList( CLAUSTROPHOBIC ); - AddAPersonalityToPersonalityList( NONSWIMMER ); - AddAPersonalityToPersonalityList( FEAR_OF_INSECTS ); + iDiceValue = Random( iLastElementInPersonalityList + 1 ); + }*/ + iDiceValue = Random( iLastElementInPersonalityList + 1 ); - INT32 iDiceValue = 0; - INT32 iCounter = 0; - INT32 iCounter2 = 0; + // Kaiden two chances to avoid a normal personality. As IMP + // says, They check it twice just to make sure :p + for( iCounter = 0; iCounter < iLastElementInPersonalityList; iCounter++ ) + { + DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("iDiceValue = %d",iDiceValue)); - // Kaiden: Roll dice 20 times just to be on the safe side - // was getting too many repeats. Will end up scrapping - // rand() later anyway so will worry about fixing it then. - for (iCounter2 = 0; iCounter < 20; iCounter2++) + if( PersonalityList[ iDiceValue ] == NO_PERSONALITYTRAIT ) { + //Kaiden: Roll one more time for good measure: iDiceValue = Random( iLastElementInPersonalityList + 1 ); } - - // Kaiden two chances to avoid a normal personality. As IMP - // says, They check it twice just to make sure :p - for( iCounter = 0; iCounter < iLastElementInPersonalityList; iCounter++ ) - { - - DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("iDiceValue = %d",iDiceValue)); - - if( PersonalityList[ iDiceValue ] = NO_PERSONALITYTRAIT ) - { - //Kaiden: Roll one more time for good measure: - iDiceValue = Random( iLastElementInPersonalityList + 1 ); - } - } - DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("And our Personality is... = %d",PersonalityList[ iDiceValue ])); - iPersonality = PersonalityList[ iDiceValue ]; - } - else - { - iPersonality = gGameExternalOptions.iCustomPersonality; } + DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("And our Personality is... = %d",PersonalityList[ iDiceValue ])); + iPersonality = PersonalityList[ iDiceValue ]; + } + else + { + iPersonality = gGameExternalOptions.iCustomPersonality; + } return; - } void CreatePlayersPersonalitySkillsAndAttitude( void ) { - - - - // creates personality, skills and attitudes from curretly built list // personality CreatePlayerPersonality( ); // skills are now created later after stats have been chosen - //CreatePlayerSkills( ); + //CreatePlayerSkills( ); // attitude CreatePlayerAttitude( ); @@ -933,7 +932,7 @@ void HandleMercStatsForChangesInFace( ) return; } - //add the skills to the skills list + //add the skills to the skills listgMercProfiles AddSelectedSkillsToSkillsList(); // now figure out skills diff --git a/Laptop/IMP Confirm.cpp b/Laptop/IMP Confirm.cpp index 8a4239b37..84ab0977c 100644 --- a/Laptop/IMP Confirm.cpp +++ b/Laptop/IMP Confirm.cpp @@ -210,11 +210,46 @@ void DestroyConfirmButtons( void ) return; } +INT32 GetCurrentIMPSlot( void ) +{ + INT16 iFilledSlot = PLAYER_GENERATED_CHARACTER_ID; + INT16 i; + + for (i = PLAYER_GENERATED_CHARACTER_ID + gGameExternalOptions.iMaxIMPCharacters - 1; i >= PLAYER_GENERATED_CHARACTER_ID; i--) + { + // We found the current imp + if (wcscmp( gMercProfiles[i].zName, L"") != 0) + { + iFilledSlot = i; + break; + } + } + + return iFilledSlot; +} + +// WANNE 10: +INT32 GetNextFreeIMPSlot( void ) +{ + INT16 iFreeSlot = -1; + INT16 i; + + for (i = PLAYER_GENERATED_CHARACTER_ID; i < PLAYER_GENERATED_CHARACTER_ID + gGameExternalOptions.iMaxIMPCharacters; i++) + { + if (wcscmp( gMercProfiles[i].zName, L"") == 0) + { + iFreeSlot = i; + break; + } + } + + return iFreeSlot; +} BOOLEAN AddCharacterToPlayersTeam( void ) { - + INT32 iFreeIMPSlot = 0; MERC_HIRE_STRUCT HireMercStruct; @@ -225,7 +260,10 @@ BOOLEAN AddCharacterToPlayersTeam( void ) memset(&HireMercStruct, 0, sizeof(MERC_HIRE_STRUCT)); - HireMercStruct.ubProfileID = ( UINT8 )( PLAYER_GENERATED_CHARACTER_ID + LaptopSaveInfo.iVoiceId ) ; + //HireMercStruct.ubProfileID = ( UINT8 )( PLAYER_GENERATED_CHARACTER_ID + LaptopSaveInfo.iVoiceId ) ; + + // Get the current imp slot (imp is already stored) + HireMercStruct.ubProfileID = GetCurrentIMPSlot(); if( fLoadingCharacterForPreviousImpProfile == FALSE ) { @@ -755,6 +793,9 @@ void LoadImpCharacter( STR nickName ) return; } + // WANNE 10: set the next free profile id for the new imp + iProfileId = GetNextFreeIMPSlot(); + // read in the profile if (!FileRead(hFile, &gMercProfiles[ iProfileId ] ,sizeof( MERCPROFILESTRUCT ), &uiBytesRead)) { @@ -777,8 +818,11 @@ void LoadImpCharacter( STR nickName ) fLoadingCharacterForPreviousImpProfile = TRUE; AddTransactionToPlayersBook(IMP_PROFILE,0, GetWorldTotalMin( ), - ( COST_OF_PROFILE ) ); AddHistoryToPlayersLog( HISTORY_CHARACTER_GENERATED, 0,GetWorldTotalMin( ), -1, -1 ); - LaptopSaveInfo.iVoiceId = iProfileId - PLAYER_GENERATED_CHARACTER_ID; - AddCharacterToPlayersTeam( ); + + + LaptopSaveInfo.iVoiceId = iProfileId - PLAYER_GENERATED_CHARACTER_ID; + + AddCharacterToPlayersTeam( ); AddFutureDayStrategicEvent( EVENT_DAY2_ADD_EMAIL_FROM_IMP, 60 * 7, 0, 2 ); LaptopSaveInfo.fIMPCompletedFlag = TRUE; fPausedReDrawScreenFlag = TRUE; diff --git a/Laptop/IMP Confirm.h b/Laptop/IMP Confirm.h index 9ae17f333..52e3e8f44 100644 --- a/Laptop/IMP Confirm.h +++ b/Laptop/IMP Confirm.h @@ -15,5 +15,9 @@ void ResetIMPCharactersEyesAndMouthOffsets( UINT8 ubMercProfileID ); BOOLEAN ImpExists ( STR fileName ); +// WANNE 10: +INT32 GetNextFreeIMPSlot( void ); +INT32 GetCurrentIMPSlot( void ); + #endif diff --git a/Laptop/IMP HomePage.cpp b/Laptop/IMP HomePage.cpp index b8bb03f8c..ffe767bc7 100644 --- a/Laptop/IMP HomePage.cpp +++ b/Laptop/IMP HomePage.cpp @@ -382,6 +382,8 @@ void HandleTextEvent( UINT32 uiKey ) void ProcessPlayerInputActivationString( void ) { + INT16 iNextSlot = -1; + // prcess string to see if it matches activation string if( NumberOfMercsOnPlayerTeam() >= 18 ) @@ -390,39 +392,47 @@ void ProcessPlayerInputActivationString( void ) char charPlayerActivationString[32]; wcstombs(charPlayerActivationString,pPlayerActivationString,32); -//Madd multiple imps if( ( ( wcscmp(pPlayerActivationString, L"XEP624") == 0 ) || ( wcscmp(pPlayerActivationString, L"xep624") == 0 ) )&&( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) &&( LaptopSaveInfo.gfNewGameLaptop < 2 ) ) - if( ( ( wcscmp(pPlayerActivationString, L"XEP624") == 0 ) || ( wcscmp(pPlayerActivationString, L"xep624") == 0 ) ) &&( LaptopSaveInfo.gfNewGameLaptop < 2 ) ) + iNextSlot = GetNextFreeIMPSlot(); + + // We have at least one more free slot for a imp character + if (iNextSlot != -1) { - // Kaiden: Need to reset skills, attributes and personalities with the new UB Method. - ResetSkillsAttributesAndPersonality( ); - ClearAllSkillsList( ); - iCurrentImpPage = IMP_MAIN_PAGE; - + //Madd multiple imps if( ( ( wcscmp(pPlayerActivationString, L"XEP624") == 0 ) || ( wcscmp(pPlayerActivationString, L"xep624") == 0 ) )&&( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) &&( LaptopSaveInfo.gfNewGameLaptop < 2 ) ) + if( ( ( wcscmp(pPlayerActivationString, L"XEP624") == 0 ) || ( wcscmp(pPlayerActivationString, L"xep624") == 0 ) ) &&( LaptopSaveInfo.gfNewGameLaptop < 2 ) ) + { + // Kaiden: Need to reset skills, attributes and personalities with the new UB Method. + ResetSkillsAttributesAndPersonality( ); + ClearAllSkillsList( ); + iCurrentImpPage = IMP_MAIN_PAGE; + + } + //Madd multiple imps else if( ( wcscmp(pPlayerActivationString, L"90210") == 0 ) && ( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) ) + else if( wcscmp(pPlayerActivationString, L"90210") == 0 ) + { + LoadImpCharacter( IMP_MERC_FILENAME ); + } + // Madd: load characters by name + else if ( ImpExists( charPlayerActivationString ) ) + { + LoadImpCharacter( charPlayerActivationString ); + } + else + { + if( ( ( wcscmp(pPlayerActivationString, L"XEP624") != 0 ) && ( wcscmp(pPlayerActivationString, L"xep624") != 0 ) ) ) + { + DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 0 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); + } + else if( LaptopSaveInfo.fIMPCompletedFlag == TRUE ) + { + DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 6 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); + } + } } - //Madd multiple imps else if( ( wcscmp(pPlayerActivationString, L"90210") == 0 ) && ( LaptopSaveInfo.fIMPCompletedFlag == FALSE ) ) - else if( wcscmp(pPlayerActivationString, L"90210") == 0 ) + else { - LoadImpCharacter( IMP_MERC_FILENAME ); - } - // Madd: load characters by name - else if ( ImpExists( charPlayerActivationString ) ) - { - LoadImpCharacter( charPlayerActivationString ); + DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 7 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); } - else - { - if( ( ( wcscmp(pPlayerActivationString, L"XEP624") != 0 ) && ( wcscmp(pPlayerActivationString, L"xep624") != 0 ) ) ) - { - DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 0 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); - } - else if( LaptopSaveInfo.fIMPCompletedFlag == TRUE ) - { - DoLapTopMessageBox( MSG_BOX_IMP_STYLE, pImpPopUpStrings[ 6 ], LAPTOP_SCREEN, MSG_BOX_FLAG_OK, NULL); - } - - - } return; } diff --git a/Laptop/IMP Voices.cpp b/Laptop/IMP Voices.cpp index 3356e2710..337236804 100644 --- a/Laptop/IMP Voices.cpp +++ b/Laptop/IMP Voices.cpp @@ -2,6 +2,7 @@ #include "Laptop All.h" #else #include "CharProfile.h" + #include "IMP Confirm.h" #include "IMP Voices.h" #include "IMP MainPage.h" #include "IMP HomePage.h" @@ -383,14 +384,20 @@ void BtnIMPVoicesDoneCallback(GUI_BUTTON *btn,INT32 reason) } */ // set voice id, to grab character slot - if( fCharacterIsMale == TRUE ) - { - LaptopSaveInfo.iVoiceId = iCurrentVoices; - } - else - { - LaptopSaveInfo.iVoiceId = iCurrentVoices + 3; - } + + // WANNE 10: + //if( fCharacterIsMale == TRUE ) + //{ + // LaptopSaveInfo.iVoiceId = iCurrentVoices; + //} + //else + //{ + // LaptopSaveInfo.iVoiceId = iCurrentVoices + 3; + //} + + // Get the next free imp slot + LaptopSaveInfo.iVoiceId = GetNextFreeIMPSlot() - PLAYER_GENERATED_CHARACTER_ID; + // set button up image pending fButtonPendingFlag = TRUE; diff --git a/Laptop/IMPVideoObjects.cpp b/Laptop/IMPVideoObjects.cpp index baf08c4f9..38b815317 100644 --- a/Laptop/IMPVideoObjects.cpp +++ b/Laptop/IMPVideoObjects.cpp @@ -98,18 +98,19 @@ void RenderProfileBackGround( void ) // get the video object GetVideoObject(&hHandle, guiBACKGROUND); - + + // WANNE // render each row 5 times wide, 5 tiles high for(iCounter = 0; iCounter < 4; iCounter++) { - // blt background to screen from left to right BltVideoObject(FRAME_BUFFER, hHandle, 0,LAPTOP_SCREEN_UL_X + 0 * CHAR_PROFILE_BACKGROUND_TILE_WIDTH, LAPTOP_SCREEN_WEB_UL_Y + iCounter * CHAR_PROFILE_BACKGROUND_TILE_HEIGHT, VO_BLT_SRCTRANSPARENCY,NULL); - BltVideoObject(FRAME_BUFFER, hHandle, 0,LAPTOP_SCREEN_UL_X + 1 * CHAR_PROFILE_BACKGROUND_TILE_WIDTH, LAPTOP_SCREEN_WEB_UL_Y + iCounter * CHAR_PROFILE_BACKGROUND_TILE_HEIGHT, VO_BLT_SRCTRANSPARENCY,NULL); + BltVideoObject(FRAME_BUFFER, hHandle, 0,LAPTOP_SCREEN_UL_X + 1 * CHAR_PROFILE_BACKGROUND_TILE_WIDTH, LAPTOP_SCREEN_WEB_UL_Y + iCounter * CHAR_PROFILE_BACKGROUND_TILE_HEIGHT, VO_BLT_SRCTRANSPARENCY,NULL); BltVideoObject(FRAME_BUFFER, hHandle, 0,LAPTOP_SCREEN_UL_X + 2 * CHAR_PROFILE_BACKGROUND_TILE_WIDTH, LAPTOP_SCREEN_WEB_UL_Y + iCounter * CHAR_PROFILE_BACKGROUND_TILE_HEIGHT, VO_BLT_SRCTRANSPARENCY,NULL); BltVideoObject(FRAME_BUFFER, hHandle, 0,LAPTOP_SCREEN_UL_X + 3 * CHAR_PROFILE_BACKGROUND_TILE_WIDTH, LAPTOP_SCREEN_WEB_UL_Y + iCounter * CHAR_PROFILE_BACKGROUND_TILE_HEIGHT, VO_BLT_SRCTRANSPARENCY,NULL); } + // dirty buttons MarkButtonsDirty( ); diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 95fd40da7..fec915965 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -2075,6 +2075,7 @@ STR16 pImpPopUpStrings[] = L"Geen geldige optie op dit moment.", L"Om een nauwkeurig profiel te maken, moet je ruimte hebben voor tenminste één teamlid.", L"Profiel is al gemaakt.", + L"You have already reached the maximum number of I.M.P. characters.", }; @@ -3530,6 +3531,7 @@ STR16 zOptionsScreenHelpText[] = L"When ON, weapon ranges will be shown in tiles.", L"When ON, tracer effect will be shown for single shots.", L"When ON, you will hear rain noises when it is raining.", + L"When ON, I.M.P characters will get random personality and attitude.", }; diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 08edbc2d6..cea7ae4bf 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -2069,13 +2069,14 @@ STR16 pMercContractOverStrings[] = STR16 pImpPopUpStrings[] = { - L"Invalid Authorization Code", - L"You Are About To Restart The Entire Profiling Process. Are You Certain?", - L"Please Enter A Valid Full Name and Gender", + L"Invalid authorization code", + L"You are about to restart the entire profiling process. Are you certain?", + L"Please enter a valid full name and gender", L"Preliminary analysis of your financial status shows that you cannot afford a profile analysis.", - L"Not A Valid Option At This Time.", + L"Not a valid option at this time.", L"To complete an accurate profile, you must have room for at least one team member.", - L"Profile Already Completed.", + L"Profile already completed.", + L"You have already reached the maximum number of I.M.P. characters.", }; @@ -3458,6 +3459,7 @@ STR16 zOptionsToggleText[] = L"Tracer effect for single shot", L"Rain noises", L"Allow crows", + L"Random I.M.P personality", }; //This is the help text associated with the above toggles. @@ -3534,6 +3536,7 @@ STR16 zOptionsScreenHelpText[] = L"When ON, tracer effect will be shown for single shots.", L"When ON, you will hear rain noises when it is raining.", L"When ON, the crows are present in game.", + L"When ON, I.M.P characters will get random personality and attitude.", }; diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 13e5cff22..e6bbaebd3 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -2061,9 +2061,10 @@ STR16 pImpPopUpStrings[] = L"Vous allez établir un nouveau profil. Etes-vous sûr de vouloir recommencer ?", L"Veuillez entrer votre nom et votre sexe.", L"Vous n'avez pas les moyens de vous offrir une analyse de profil.", -L"Option inaccessible pour le moment.", + L"Option inaccessible pour le moment.", L"Pour que cette analyse soit efficace, il doit vous rester au moins une place dans votre escouade.", L"Profil déjà établi.", + L"You have already reached the maximum number of I.M.P. characters.", }; @@ -3519,7 +3520,7 @@ STR16 zOptionsScreenHelpText[] = L"When ON, weapon ranges will be shown in tiles.", L"When ON, tracer effect will be shown for single shots.", L"When ON, you will hear rain noises when it is raining.", - + L"When ON, I.M.P characters will get random personality and attitude.", }; diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 63be6d8e0..9420e8e45 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -1992,6 +1992,7 @@ STR16 pImpPopUpStrings[] = L"Option zur Zeit nicht gültig.", L"Um eine genaue Evaluierung durchzuführen, müssen Sie mindestens noch ein Teammitglied aufnehmen können.", L"Evaluierung bereits durchgeführt.", + L"Sie habe bereits die maximale Anzahl an B.S.E Charakteren.", }; // button labels used on the IMP site @@ -2665,10 +2666,10 @@ STR16 BobbyRFilter[] = // Guns L"Schwere W.", L"Pistole", - L"M. Pistole", + L"MP", L"SMG", L"Gewehr", - L"SS Gewehr", + L"SSG", L"Sturmgew.", L"MG", L"Schrotfl.", @@ -3340,6 +3341,7 @@ STR16 zOptionsScreenHelpText[] = L"Wenn diese Funktion aktiviert ist, wird Tracereffekt auch für Einzelschüsse angezeigt.", L"Wenn diese Funktion aktiviert ist, werden Regengeräusche hörbar falls es regnet.", L"Wenn diese Funktion aktiviert ist, sind Krähen im Spiel vorhanden.", + L"Wenn diese Funktion aktiviert ist, erhalten B.S.E Charaktere zufällige Persönlichkeit und Einstellung.", }; STR16 gzGIOScreenText[] = diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 6dad93def..60ef8d517 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -2055,9 +2055,10 @@ STR16 pImpPopUpStrings[] = L"State per riiniziare l'intero processo di profilo. Ne siete certi?", L"Inserite nome e cognome corretti oltre che al sesso", L"L'analisi preliminare del vostro stato finanziario mostra che non potete offrire un'analisi di profilo.", - L"Opzione non valida questa volta.", + L"Opzione non valida questa volta.", L"Per completare un profilo accurato, dovete aver spazio per almeno uno dei membri della squadra.", L"Profilo già completato.", + L"You have already reached the maximum number of I.M.P. characters.", }; diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index d5733899a..3b1e692f9 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -2058,6 +2058,7 @@ STR16 pImpPopUpStrings[] = L"Opcja tym razem nieaktywna.", L"Aby wykonaæ profil, musisz mieæ miejsce dla przynajmniej jednego cz³onka za³ogi.", L"Profil zosta³ ju¿ wykonany.", + L"You have already reached the maximum number of I.M.P. characters.", }; @@ -3512,7 +3513,7 @@ STR16 zOptionsScreenHelpText[] = L"When ON, weapon ranges will be shown in tiles.", L"When ON, tracer effect will be shown for single shots.", L"When ON, you will hear rain noises when it is raining.", - + L"When ON, I.M.P characters will get random personality and attitude.", }; diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index d0f5390f8..7518515e8 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -2064,9 +2064,10 @@ STR16 pImpPopUpStrings[] = L"Âû óâåðåíû, ÷òî õîòèòå íà÷àòü ïðîöåññ çàïèñè ïðîôàéëà çàíîâî?", L"Ââåäèòå ïîëíîå èìÿ è ïîë", L"Ïðåäâàðèò.àíàëèç âàøèõ ôèíàíñîâ ïîêàçàë, ÷òî ó âàñ íåäîñòàòî÷íî äåíåã íà àíàëèç.", - L"Ñåé÷àñ âû íå ìîæåòå âûáðàòü ýòî.", + L"Ñåé÷àñ âû íå ìîæåòå âûáðàòü ýòî.", L"×òîáû çàêîí÷èòü àíàëèç,íóæíî èìåòü ìåñòî åùå õîòÿ áû äëÿ îäíîãî ÷ëåíà êîìàíäû.", L"Àíàëèç óæå çàâåðøåí.", + L"You have already reached the maximum number of I.M.P. characters.", }; @@ -3524,6 +3525,7 @@ STR16 zOptionsScreenHelpText[] = L"When ON, tracer effect will be shown for single shots.", L"When ON, you will hear rain noises when it is raining.", L"When ON, the crows are present in game.", + L"When ON, I.M.P characters will get random personality and attitude.", };