New feature: Voicesets are now independent fom profile slots. Voiceset is set in MercProfiles.xml with <usVoiceIndex>. IMP voices are defined in IMPVoices.xml.

This feature is savegame compatible.

Requires GameDir >= r2357

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8364 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2017-01-14 20:20:11 +00:00
parent e2c05ce1c6
commit efd9ab4723
30 changed files with 425 additions and 462 deletions
+63 -56
View File
@@ -2021,11 +2021,11 @@ BOOLEAN ExecuteCharacterDialogue( UINT8 ubCharacterNum, UINT16 usQuoteNum, INT32
// Check face index
CHECKF( iFaceIndex != -1 );
if ( !GetDialogue( ubCharacterNum,
usQuoteNum, DIALOGUESIZE, gzQuoteStr, &uiSoundID, zSoundString) )
{
return( FALSE );
return( FALSE );
}
if( bUIHandlerID == DIALOGUE_EXTERNAL_NPC_UI )
@@ -2142,9 +2142,12 @@ CHAR8 *GetDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, BOOLEAN
{
static CHAR8 zFileName[164];
static CHAR8 zFileNameExists[164];
UINT8 ubFileNumID;
UINT32 ubFileNumID;
BOOLEAN isBartenderSantos = FALSE;
// Flugente: For the voice set itself, use this number
UINT32 usVoiceSet = gMercProfiles[ubCharacterNum].usVoiceIndex;
// Are we an NPC OR an RPC that has not been recruited?
// ATE: Did the || clause here to allow ANY RPC that talks while the talking menu is up to use an npc quote file
if ( gfUseAlternateDialogueFile )
@@ -2163,10 +2166,10 @@ CHAR8 *GetDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, BOOLEAN
// #else
if ( gSoundProfileValue[ubCharacterNum].EnabledSound == TRUE )
{
sprintf( zFileName,"NPC_SPEECH\\d_%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
sprintf( zFileName, "NPC_SPEECH\\d_%03d_%03d.ogg", usVoiceSet, usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"NPC_SPEECH\\d_%03d_%03d.wav",ubCharacterNum,usQuoteNum );
sprintf( zFileName, "NPC_SPEECH\\d_%03d_%03d.wav", usVoiceSet, usQuoteNum );
}
}
// #endif
@@ -2174,7 +2177,7 @@ CHAR8 *GetDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, BOOLEAN
else
{
// assume EDT files are in EDT directory on HARD DRIVE
sprintf( zFileName,"NPCDATA\\d_%03d.EDT", ubCharacterNum );
sprintf( zFileName, "NPCDATA\\d_%03d.EDT", usVoiceSet );
}
}
//else if ( ubCharacterNum >= FIRST_RPC && ubCharacterNum < GASTON &&
@@ -2186,7 +2189,7 @@ CHAR8 *GetDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, BOOLEAN
)
{
ubFileNumID = ubCharacterNum;
ubFileNumID = usVoiceSet;
if ( ubCharacterNum == HERVE )
{
@@ -2221,7 +2224,7 @@ CHAR8 *GetDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, BOOLEAN
ubFileNumID = CARLO;
}
#ifdef JA2UB
#ifdef JA2UB
if ( ubCharacterNum == MANUEL_UB )
{
sprintf( (char *)zFileNameExists,"NPCDATA\\%03d.EDT", MANUEL_UB );
@@ -2294,7 +2297,7 @@ CHAR8 *GetDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, BOOLEAN
ubFileNumID = RUDY_UB;
}
#endif
#endif
// If we are character #155, check fact!
if ( ubCharacterNum == MANNY && !gubFact[ FACT_MANNY_IS_BARTENDER ] )
@@ -2339,68 +2342,69 @@ CHAR8 *GetDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, BOOLEAN
{
if ( fWavFile )
{
#ifdef RUSSIAN
#ifdef RUSSIAN
// if( ubCharacterNum >= FIRST_RPC && ubCharacterNum < GASTON && gMercProfiles[ ubCharacterNum ].ubMiscFlags & PROFILE_MISC_FLAG_RECRUITED )
//new profiles by Jazz
if ( ( gProfilesRPC[ubCharacterNum].ProfilId == ubCharacterNum || gProfilesNPC[ubCharacterNum].ProfilId == ubCharacterNum || gProfilesVehicle[ubCharacterNum].ProfilId == ubCharacterNum ) && gMercProfiles[ ubCharacterNum ].ubMiscFlags & PROFILE_MISC_FLAG_RECRUITED )
{
//inshy: fix for UB-1.13 version only sprintf( zFileName,"SPEECH\\r_%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
if ( gSoundProfileValue[ubCharacterNum].EnabledSound == TRUE )
{
#ifdef JA2UB
sprintf( zFileName,"SPEECH\\%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
}
#else
sprintf( zFileName,"SPEECH\\r_%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
#endif
if ( !FileExists( zFileName ) )
{
//inshy: fix for UB-1.13 version only
#ifdef JA2UB
sprintf( zFileName,"SPEECH\\%03d_%03d.wav",ubCharacterNum,usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\%03d_%03d.wav",ubCharacterNum,usQuoteNum );
}
#else
sprintf( zFileName,"SPEECH\\r_%03d_%03d.wav",ubCharacterNum,usQuoteNum );
#endif
//<SB> Also check for Russian Gold sound files (identical to international ones)
if(! FileExists( zFileName ) )
//inshy: fix for UB-1.13 version only sprintf( zFileName,"SPEECH\\r_%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
if ( gSoundProfileValue[ubCharacterNum].EnabledSound == TRUE )
{
#ifdef JA2UB
sprintf( zFileName,"SPEECH\\%03d_%03d.ogg",usVoiceSet,usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
sprintf( zFileName,"SPEECH\\%03d_%03d.ogg",usVoiceSet,usQuoteNum );
}
#else
sprintf( zFileName,"SPEECH\\r_%03d_%03d.ogg",usVoiceSet,usQuoteNum );
#endif
if ( !FileExists( zFileName ) )
{
//inshy: fix for UB-1.13 version only
#ifdef JA2UB
sprintf( zFileName,"SPEECH\\%03d_%03d.wav",usVoiceSet,usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\%03d_%03d.wav",ubCharacterNum,usQuoteNum );
sprintf( zFileName,"SPEECH\\%03d_%03d.wav",usVoiceSet,usQuoteNum );
}
#else
sprintf( zFileName,"SPEECH\\r_%03d_%03d.wav",usVoiceSet,usQuoteNum );
#endif
//<SB> Also check for Russian Gold sound files (identical to international ones)
if(! FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\%03d_%03d.ogg",usVoiceSet,usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\%03d_%03d.wav",usVoiceSet,usQuoteNum );
}
}
}
//</SB>
}
}
}
}
else
#endif
#endif
{
if ( gSoundProfileValue[ubCharacterNum].EnabledSound == TRUE )
{
// build name of wav file (characternum + quotenum)
sprintf( zFileName,"SPEECH\\%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\%03d_%03d.wav",ubCharacterNum,usQuoteNum );
}
// build name of wav file (characternum + quotenum)
sprintf( zFileName, "SPEECH\\%03d_%03d.ogg", usVoiceSet, usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName, "SPEECH\\%03d_%03d.wav", usVoiceSet, usQuoteNum );
}
}
}
}
else
{
// assume EDT files are in EDT directory on HARD DRIVE
sprintf( zFileName,"MERCEDT\\%03d.EDT", ubCharacterNum );
sprintf( zFileName, "MERCEDT\\%03d.EDT", usVoiceSet );
}
}
@@ -2412,6 +2416,9 @@ CHAR8 *GetSnitchDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, B
static CHAR8 zFileName[164];
static CHAR8 zFileNameExists[164];
// Flugente: For the voice set itself, use this number
UINT32 usVoiceSet = gMercProfiles[ubCharacterNum].usVoiceIndex;
if ( fWavFile )
{
if ( gSoundProfileValue[ubCharacterNum].EnabledSound == TRUE )
@@ -2419,18 +2426,18 @@ CHAR8 *GetSnitchDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, B
// build name of wav file (characternum + quotenum)
if(fName)
{
sprintf( zFileName,"SPEECH\\SNITCH\\NAMES\\%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
sprintf( zFileName, "SPEECH\\SNITCH\\NAMES\\%03d_%03d.ogg", usVoiceSet, usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\SNITCH\\NAMES\\%03d_%03d.wav",ubCharacterNum,usQuoteNum );
sprintf( zFileName, "SPEECH\\SNITCH\\NAMES\\%03d_%03d.wav", usVoiceSet, usQuoteNum );
}
}
else
{
sprintf( zFileName,"SPEECH\\SNITCH\\%03d_%03d.ogg",ubCharacterNum,usQuoteNum );
sprintf( zFileName, "SPEECH\\SNITCH\\%03d_%03d.ogg", usVoiceSet, usQuoteNum );
if ( !FileExists( zFileName ) )
{
sprintf( zFileName,"SPEECH\\SNITCH\\%03d_%03d.wav",ubCharacterNum,usQuoteNum );
sprintf( zFileName, "SPEECH\\SNITCH\\%03d_%03d.wav", usVoiceSet, usQuoteNum );
}
}
}
@@ -2439,9 +2446,9 @@ CHAR8 *GetSnitchDialogueDataFilename( UINT8 ubCharacterNum, UINT16 usQuoteNum, B
{
// assume EDT files are in EDT directory on HARD DRIVE
if(fName)
sprintf( zFileName,"MERCEDT\\SNITCH\\NAMES\\%03d.EDT", ubCharacterNum );
sprintf( zFileName, "MERCEDT\\SNITCH\\NAMES\\%03d.EDT", usVoiceSet );
else
sprintf( zFileName,"MERCEDT\\SNITCH\\%03d.EDT", ubCharacterNum );
sprintf( zFileName, "MERCEDT\\SNITCH\\%03d.EDT", usVoiceSet );
}
return( zFileName );
+7 -2
View File
@@ -1548,6 +1548,8 @@ void MERCPROFILESTRUCT::initialize( )
memset( &usDynamicOpinionFlagmask, 0, sizeof(usDynamicOpinionFlagmask) );
memset( &sDynamicOpinionLongTerm, 0, sizeof(sDynamicOpinionLongTerm) );
memset( &usVoiceIndex, 0, sizeof(UINT32) );
}
// Initialize the soldier.
@@ -10749,11 +10751,14 @@ BOOLEAN SOLDIERTYPE::InternalDoMercBattleSound( UINT8 ubBattleSoundID, INT8 bSpe
// OK, build file and play!
if ( pSoldier->ubProfile != NO_PROFILE )
{
sprintf( zFilename, "BATTLESNDS\\%03d_%s.ogg", pSoldier->ubProfile, gBattleSndsData[ubSoundID].zName );
// Flugente: For the voice set itself, use this number
UINT32 usVoiceSet = gMercProfiles[pSoldier->ubProfile].usVoiceIndex;
sprintf( zFilename, "BATTLESNDS\\%03d_%s.ogg", usVoiceSet, gBattleSndsData[ubSoundID].zName );
if ( !FileExists( zFilename ) )
{
sprintf( zFilename, "BATTLESNDS\\%03d_%s.wav", pSoldier->ubProfile, gBattleSndsData[ubSoundID].zName );
sprintf( zFilename, "BATTLESNDS\\%03d_%s.wav", usVoiceSet, gBattleSndsData[ubSoundID].zName );
}
if ( !FileExists( zFilename ) )
+8 -1
View File
@@ -798,6 +798,12 @@ BOOLEAN LoadMercProfiles(void)
FileClose( fptr );
return(FALSE);
}
/// Flugente: until the introduction of a separate varriable for the voiceset, the voice was identical with the slot
// as we are loading from a .dat file, we always have to account for that
{
gMercProfiles[uiLoop].usVoiceIndex = uiLoop;
}
// WANNE: For the new WF merc, there is no entry in prof.dat, so we have to reset some flags manually!
if (uiLoop >= 170)
@@ -864,7 +870,7 @@ BOOLEAN LoadMercProfiles(void)
}
//if the Dialogue exists for the merc, allow the merc to be hired
if( DialogueDataFileExistsForProfile( (UINT8)uiLoop, 0, FALSE, NULL ) )
if ( DialogueDataFileExistsForProfile( gMercProfiles[uiLoop].usVoiceIndex, 0, FALSE, NULL ) )
{
gMercProfiles[uiLoop].bMercStatus = 0;
}
@@ -2742,6 +2748,7 @@ void OverwriteMercProfileWithXMLData( UINT32 uiLoop )
gMercProfiles[ uiLoop ].bTown = tempProfiles[uiLoop].bTown;
gMercProfiles[ uiLoop ].bTownAttachment = tempProfiles[uiLoop].bTownAttachment;
gMercProfiles[ uiLoop ].usBackground = tempProfiles[uiLoop].usBackground;
gMercProfiles[ uiLoop ].usVoiceIndex = tempProfiles[uiLoop].usVoiceIndex;
//None
if ( tempProfiles[uiLoop].Type == 0 )
+2
View File
@@ -420,6 +420,8 @@ typedef struct
// Flugente: backgrounds
UINT16 usBackground;
UINT32 usVoiceIndex;
} TEMPPROFILETYPE;
extern TEMPPROFILETYPE tempProfiles[NUM_PROFILES+1];
+2
View File
@@ -217,6 +217,7 @@ typedef PARSE_STAGE;
#define FACEGEARFILENAME "FaceGear.xml"
#define HIDDENNAMESFILENAME "HiddenNames.xml"
#define IMPPORTRAITS "IMPPortraits.xml"
#define IMPVOICES "IMPVoices.xml"
#define MERCAVAILABILITY "MercAvailability.xml"
#define MERCOPINIONSFILENAME "MercOpinions.xml"
#define MERCPROFILESFILENAME "MercProfiles.xml"
@@ -502,6 +503,7 @@ extern BOOLEAN ReadInSenderNameList(STR fileName, BOOLEAN localizedVersion);
extern BOOLEAN ReadInEnemyRank(STR fileName, BOOLEAN localizedVersion);
extern BOOLEAN WriteEnemyRank( STR fileName);
extern BOOLEAN ReadInIMPPortraits(STR fileName, BOOLEAN localizedVersion);
extern BOOLEAN ReadInIMPVoices( STR fileName );
extern void LoadIMPPortraitsTEMP();
// Flugente: backgrounds
+1 -1
View File
@@ -227,7 +227,7 @@ BOOLEAN ReadInMercOpinions(STR fileName)
{
CHAR8 errorBuf[511];
sprintf(errorBuf, "XML Parser Error in MercProfiles.xml: %s at line %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser));
sprintf(errorBuf, "XML Parser Error in MercOpinions.xml: %s at line %d", XML_ErrorString(XML_GetErrorCode(parser)), XML_GetCurrentLineNumber(parser));
LiveMessage(errorBuf);
MemFree(lpcBuffer);
+11 -5
View File
@@ -71,6 +71,7 @@ profileStartElementHandle(void *userData, const XML_Char *name, const XML_Char *
strcmp(name, "zNickname") == 0 ||
strcmp(name, "uiIndex") == 0 ||
strcmp(name, "ubFaceIndex") == 0 ||
strcmp(name, "usVoiceIndex" ) == 0 ||
strcmp(name, "usEyesX") == 0 ||
strcmp(name, "usEyesY") == 0 ||
strcmp(name, "usMouthX") == 0 ||
@@ -190,8 +191,8 @@ profileStartElementHandle(void *userData, const XML_Char *name, const XML_Char *
strcmp(name, "ubCivilianGroup") == 0 ||
strcmp(name, "bTown") == 0 ||
strcmp(name, "bTownAttachment") == 0 ||
strcmp(name, "usBackground") == 0
strcmp(name, "usBackground") == 0
))
{
pData->curElement = ELEMENT_PROPERTY;
@@ -358,7 +359,8 @@ profileEndElementHandle(void *userData, const XML_Char *name)
tempProfiles[pData->curIndex].bTown = pData->curProfile.bTown;
tempProfiles[pData->curIndex].bTownAttachment = pData->curProfile.bTownAttachment;
tempProfiles[pData->curIndex].usBackground = pData->curProfile.usBackground;
tempProfiles[pData->curIndex].usVoiceIndex = pData->curProfile.usVoiceIndex;
tempProfiles[pData->curIndex].fGoodGuy = pData->curProfile.fGoodGuy;
memcpy( &(tempProfiles[pData->curIndex].usApproachFactor), &(pData->curProfile.usApproachFactor), 4 * sizeof (UINT16));
@@ -1087,7 +1089,11 @@ profileEndElementHandle(void *userData, const XML_Char *name)
pData->curElement = ELEMENT;
pData->curProfile.usBackground = (UINT16) atol(pData->szCharData);
}
else if ( strcmp( name, "usVoiceIndex" ) == 0 )
{
pData->curElement = ELEMENT;
pData->curProfile.usVoiceIndex = (UINT32)atol( pData->szCharData );
}
pData->maxReadDepth--;
}
@@ -1328,6 +1334,7 @@ BOOLEAN WriteMercProfiles()
//
FilePrintf(hFile,"\t\t<ubFaceIndex>%d</ubFaceIndex>\r\n", gMercProfiles[ cnt ].ubFaceIndex);
FilePrintf(hFile,"\t\t<usVoiceIndex>%d</usVoiceIndex>\r\n", gMercProfiles[cnt].usVoiceIndex );
FilePrintf(hFile,"\t\t<usEyesX>%d</usEyesX>\r\n", gMercProfiles[ cnt ].usEyesX);
FilePrintf(hFile,"\t\t<usEyesY>%d</usEyesY>\r\n", gMercProfiles[ cnt ].usEyesY);
FilePrintf(hFile,"\t\t<usMouthX>%d</usMouthX>\r\n", gMercProfiles[ cnt ].usMouthX);
@@ -1664,7 +1671,6 @@ BOOLEAN WriteMercProfiles()
FilePrintf(hFile,"\t\t<bTownAttachment>%d</bTownAttachment>\r\n", gMercProfiles[ cnt ].bTownAttachment);
FilePrintf(hFile,"\t\t<usBackground>%d</usBackground>\r\n", gMercProfiles[ cnt ].usBackground);
FilePrintf(hFile,"\t</PROFILE>\r\n");
}
FilePrintf(hFile,"</MERCPROFILES>\r\n");
+2
View File
@@ -969,6 +969,8 @@ public:
INT8 sDynamicOpinionLongTerm[NUM_PROFILES];
// Flugente: voice set used
UINT32 usVoiceIndex;
}; // MERCPROFILESTRUCT;
// WANNE - BMP: DONE!