I've asked QA to look into this.
Yoshiro, I can tell you from what I've done with my mod what the problem is.
You can take a look in the AUD_VOX_Chatter_GerNative_01 ,..02 etc. packages in the SDK and you can find a number of SoundCues labeled as follows:
DMG_INF_DyingFast_NOR_Cue
DMG_INF_DyingSlow_Heart_NOR_Cue
DMG_INF_DyingSlow_Neck_NOR_Cue
DMG_INF_DyingSlow_NOR_Cue
DMG_INF_DyingSlow_Stomach_NOR_Cue
DMG_INF_SlowDying_HER_Cue
DMG_INF_SlowDying_NOR_Cue
Each voice package has these cues, one for each voice actor. They contain ALL the death sounds, including the unused ones.
Now, I will describe how these sounds are used and why most are not used.
This is the HandleDeathShot function from ROPawn.uc:
Code:
function HandleDeathShot(EHitZoneType HitZoneType, name ZoneName)
{
// If we've already taken a worse hit, ignore this hit
if ( DeathHitZoneType > HitZoneType )
{
return;
}
if ( HitZoneType == HZT_Critical && CanEnterSlowDeath() && FRand() > 0.33 )
{
// Store the HitZoneType that killed us(must be done BEFORE entering Slowly Dying state)
DeathHitZoneType = HitZoneType;
// Send them into a Slow Death state instead of normal death
ClientSlowlyDying(DeathHitZoneType);
GotoState('SlowlyDying');
}
// If this hit is in a Lethal or Critical Zone and we're not already SlowlyDying
else if ( HitZoneType == HZT_Lethal && CanEnterSlowDeath() && FRand() > 0.66 )
{
// Store the HitZoneType that killed us(must be done BEFORE entering Slowly Dying state)
DeathHitZoneType = HitZoneType;
// Send them into a Slow Death state instead of normal death
ClientSlowlyDying(DeathHitZoneType);
GotoState('SlowlyDying');
}
//Otherwise, if this is an Instant Death shot(or a second Lethal shot)
else if ( HitZoneType == HZT_InstantDeath || (HitZoneType == HZT_Lethal && DeathHitZoneType == HZT_Lethal))
{
// If this Pawn is controlled by a Player(not a Bot)
if ( ROPlayerController(Controller) != none )
{
// Do the instant death fade for the first person
ROPlayerController(Controller).DoDeathFade(true, InstantDeathFadeTime);
}
if ( ZoneName != 'Head' )
{
ROGameInfo(WorldInfo.Game).HandleBattleChatterEvent(self, `BATTLECHATTER_DyingSlow);
}
// Force the Second Lethal shot to be treated like Instant Death
DeathHitZoneType = HZT_InstantDeath;
}
else
{
// Scream
ROGameInfo(WorldInfo.Game).HandleBattleChatterEvent(self, `BATTLECHATTER_DyingFast);
// Store the HitZoneType that killed us
DeathHitZoneType = HitZoneType;
}
}
The relevant part of this function is here:
Code:
else if ( HitZoneType == HZT_InstantDeath || (HitZoneType == HZT_Lethal && DeathHitZoneType == HZT_Lethal))
{
// If this Pawn is controlled by a Player(not a Bot)
if ( ROPlayerController(Controller) != none )
{
// Do the instant death fade for the first person
ROPlayerController(Controller).DoDeathFade(true, InstantDeathFadeTime);
}
if ( ZoneName != 'Head' )
{
ROGameInfo(WorldInfo.Game).HandleBattleChatterEvent(self, `BATTLECHATTER_DyingSlow);
}
// Force the Second Lethal shot to be treated like Instant Death
DeathHitZoneType = HZT_InstantDeath;
}
else
{
// Scream
ROGameInfo(WorldInfo.Game).HandleBattleChatterEvent(self, `BATTLECHATTER_DyingFast);
// Store the HitZoneType that killed us
DeathHitZoneType = HitZoneType;
}
Note the two macros, `BATTLECHATTER_DyingSlow and `BATTLECHATTER_DyingFast. These produce indices to an array in ROGameInfo.uc.
This array is called 'BattleChatterEvents' and it is an array of the struct BattleChatterEvent, defined in ROGameInfo.uc. In the defaultproperties of ROGameInfo.uc you can find the values of the BattleChatterEvents array. Here are our interesting values:
Code:
BattleChatterEvents[`BATTLECHATTER_DyingFast]=(VoiceComIndices[0]=`VOICECOM_DyingFast,VoiceComIndices[1]=`VOICECOM_DyingFast,VoiceComIndices[2]=`VOICECOM_DyingFast,VoiceComIndices[3]=`VOICECOM_DyingFast,VoiceComIndices[4]=`VOICECOM_DyingFast,bOnlyInGroup=false,ChanceEventCausesChatter[0]=1.0,ChanceEventCausesChatter[1]=1.0,ChanceEventCausesChatter[2]=1.0,ChanceEventCausesChatter[3]=1.0,ChanceEventCausesChatter[4]=1.0,MinIntervalBetweenEvents=1.0,bUseEventRadiusList=false,EventRadiusSq=2250000)
BattleChatterEvents[`BATTLECHATTER_DyingSlow]=(VoiceComIndices[0]=`VOICECOM_DyingSlow,VoiceComIndices[1]=`VOICECOM_DyingSlow,VoiceComIndices[2]=`VOICECOM_DyingSlow,VoiceComIndices[3]=`VOICECOM_DyingSlow,VoiceComIndices[4]=`VOICECOM_DyingSlow,bOnlyInGroup=false,ChanceEventCausesChatter[0]=1.0,ChanceEventCausesChatter[1]=1.0,ChanceEventCausesChatter[2]=1.0,ChanceEventCausesChatter[3]=1.0,ChanceEventCausesChatter[4]=1.0,MinIntervalBetweenEvents=1.0,bUseEventRadiusList=false,EventRadiusSq=2250000)
Notice the macros `VOICECOM_DyingSlow and `VOICECOM_DyingFast. These produce indices for the VoiceComs array found in ROVoicePack.
The two relevant entries are here:
Code:
VoiceComs[`VOICECOM_DyingFast]=(Type=ROVCT_TeamRadius,CRef_Sound="Infantry.DMG_INF_DyingFast_NOR_Cue",Priority=Speech_DeathSounds)
VoiceComs[`VOICECOM_DyingSlow]=(Type=ROVCT_TeamRadius,CRef_Sound="Infantry.DMG_INF_DyingSlow_NOR_Cue",Priority=Speech_DeathSounds)
These array elements contain strings that the game uses to load the SoundCues. If you examine the array, you can see that nowhere are these SoundCues used:
DMG_INF_DyingSlow_Heart_NOR_Cue
DMG_INF_DyingSlow_Neck_NOR_Cue
DMG_INF_DyingSlow_Stomach_NOR_Cue
Now, the DMG_INF_DyingSlow_NOR_Cue contains a few of the more graphic sounds that people remember and it IS used currently but ONLY when the victim is shot in the heart, neck, or nuts because they are instant death hitzones (as you can see from HandleDeathShot.) Other than that there is currently no special handling of death sounds. Interestingly, the RS team copied the format of the original voice packages, and created all of these cues even though they aren't used! However there is much less variety to the RS death sounds in that they reuse the sounds from the used SoundCues in the unused SoundCues and therefore would not have noticed a discrepancy.
My mod has addressed this, adding the functionality to play the neck sounds when shot in the neck, the heart sounds when shot in the heart, and so on.